递归神经网络

人类并不是每时每刻都从头开始思考。正如你阅读这篇文章的时候,你是在理解前面词语的基础上来理解每个词。你不会丢弃所有已知的信息而从头开始思考。你的思想具有持续性。

传统的神经网络不能做到这点,而且这似乎也是它的主要缺陷。比如,你想对电影中每个点发生的事件类型进行分类。目前还不清楚传统神经网络如何利用之前事件的推理来得出后来事件。

递归神经网络能够解决这一问题。这些网络中具有循环结构,能够使信息持续保存。

递归神经网络具有循环结构

在上图中,一组神经网络A,接收参数,输出,循环A可以使信息从网络的某个步骤中传递到下一个步骤。

这些循环使得递归神经网络有些不可思议。不过,如果你进一步思考,可以发现,它们与常规神经网络并非完全不同。可以将递归神经网络想象成是有多层相同网络的神经网络,每一层将信息传递给下一层。如果我们展开循环,就是这样:

展开的递归神经网络

这种链状的性质表明,递归神经网络与序列和列表密切相关。这是处理这种数据所使用的神经网络的自然结构。

人们当然使用了它们!在过去的几年里,在许多问题上使用RNNs已经取得了难以置信的成功,比如语音识别,语言建模,翻译,图像字幕,这样的例子不胜枚举。不过我不将讨论RNNs的惊人壮举,Andrej Karpathy对此写了篇非常棒的博客,递归神经网络不可思议的有效性(The Unreasonable Effectiveness of Recurrent Neural Networks)。它们真是太了不起了。

成功的关键是使用了“LSTMs”,一种特殊的递归神经网络,在许多任务中,它的表现要比标准递归神经网络出色许多。几乎所有基于递归神经网络令人振奋的结果都是由它们实现的。这篇文章就将探讨这些LSTMs。

长期依赖关系问题

RNNs呼吁的一点就是,它们可能将前期信息与当前任务连接,比如使用前面的视频帧可能得出对当前帧的理解。如果RNNs能够做到这点,它们会非常有用。但是它们能吗?这得看情况。

有些时候,在执行当前任务时,我们只需要查看最近的信息。比如,考虑一个语言模型,试图根据之前单词预测下一个。如果我们想要预测“the clouds are in the sky”中最后一个单词,我们不需要更多的上下文——很明显下一个单词会是“sky”。在这种情况下,如果相关信息与预测位置的间隔比较小,RNNs可以学会使用之前的信息。

但我们也有需要更多上下文的情况。考虑试图预测“I grew up in France… I speak fluent French.”中最后一个词。最近信息显示下一个词可能是一门语言的名字,但是如果我们想要缩小选择范围,我们需要包含“法国”的那段上下文,从前面的信息推断后面的单词。相关信息与预测位置的间隔很大是完全有可能的。

不幸的是,随着这种间隔的拉长,RNNs就会无法学习连接信息。

从理论上讲,RNNs绝对能够处理这样的“长期依赖关系”。一个人可以仔细挑选参数来解决这种简单的问题。不幸的是,实际上RNNs不能够学习它们。这种问题被Hochreiter (1991)【德国】Bengio等人深入探讨过,他们发现了造成这种可能的一些非常基本的原因。

值得庆幸的是,LSTMs没有这个问题!

LSTM网络

长短期记忆网络——通常简称“LSTMs”——是一种特殊的RNN,能够学习长期依赖关系。它们由Hochreiter和Schmidhuber (1997)提出,在后期工作中又由许多人进行了调整和普及(除了原始作者之外,许多人为现代LSTM做出了贡献,不完全统计:Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustian Gomez, Matteo Gagliolo 和 Alex Graves)。它们在大量问题上效果异常出色,现在正在广泛使用。

LSTMs明确设计成能够避免长期依赖关系问题。记住信息很长一段时间几乎是它们固有的行为,而不是努力去学习!

所有的递归神经网络都具有一连串重复神经网络模块的形式。在标准的RNNs中,这种重复模块有一种非常简单的结构,比如单个tanh层。

标准RNN中的重复模块包含单个层

LSTMs同样也有这种链状的结构,但是重复模块有着不同的结构。它有四层神经网络层以特殊的方式相互作用,而不是单个神经网络层。

LSTM中的重复模块包含四个相互作用的神经网络层

先别急着想问细节。我们之后会一步一步讲解LSTM图。现在,我们先来熟悉下我们将要使用到的符号。

在上面的图中,每条线表示一个完整向量,从一个节点的输出到其他节点的输入。粉红色圆圈代表逐点操作,比如向量加法,而黄色框框表示的是已学习的神经网络层。线条合并表示串联,线条分叉表示内容复制并输入到不同地方。

LSTMs核心理念

LSTMs的关键点是单元状态,就是穿过图中的水平线。

单元状态有点像是个传送带。它贯穿整个链条,只有一些小的线性相互作用。这很容易让信息以不变的方式向下流动。

LSTM有能力向单元状态中移除或添加信息,通过结构来仔细管理称为门限。

门限是有选择地让信息通过。它们由一个sigmoid神经网络层和逐点乘法运算组成。

sigmoid层输出0到1之间的数字,描述了每个成分应该通过门限的程度。0表示“不让任何成分通过”,而1表示“让所有成分通过!”。

LSTM有三种这样的门限,来保护和控制单元状态。

一步一步剖析LSTM

LSTM中第一步是决定哪些信息需要从单元状态中抛弃。这项决策是由一个称为“遗忘门限层”的sigmoid层决定的。它接收和,然后为单元状态中的每个数字计算一个0到1之间的数字。1表示“完全保留”,而0则表示“完全抛弃”。

我们来回顾一下那个语言模型的例子,试图根据前面所有的词语来预测下一个词。在这种问题中,单元状态可能包含当前主语的性别,所以可以使用正确的代词。当碰到一个新的主语时,我们希望它能够忘记旧主语的性别。

接下来我们需要决定在单元状态中需要存储哪些新信息。这分为两个部分。首先,一个叫做“输入门限层”的sigmoid层决定哪些值需要更新。接下来,一个tanh层创建一个向量,包含新候选值,这些值可以添加到这个状态中。下一步我们将会结合这两者来创建一个状态更新。

在语言模型的例子中,我们希望在单元状态中添加新主语的性别,来替换我们忘记的旧主语性别。

现在来更新旧单元状态了,输入到新单元状态。之前的步骤已经决定了需要做哪些事情,我们只需要实现这些事情就行了。

我们在旧状态上乘以,忘记之前决定需要忘记的。然后我们加上,这就是新的候选值,它的规模取决于我们决定每个状态值需要更新多少。

在语言模型的例子中,这里就是我们实际丢弃旧主语性别信息,根据之前步骤添加新信息的地方。

最后,我们需要决定需要输出什么。这个输出将会建立在单元状态的基础上,但是个过滤版本。首先,我们运行一个sigmoid层来决定单元状态中哪些部分需要输出。然后我们将单元状态输入到tanh函数(将值转换成-1到1之间)中,然后乘以输出的sigmoid门限值,所以我们只输出了我们想要输出的那部分。

对于语言模型例子来说,因为它只看到了一个主语,它可能想输出与动词相关的信息,为接下来出现的词做准备。比如,它可能输出主语是单数还是复数,那么我们知道接下来修饰动词的应该成对。

长短期记忆变体

我目前所讲述的还是非常常规的LSTM。但并不是所有的LSTMs都与上述的LSTM一样。实际上,几乎所有关于LSTMs的论文都稍有不同。虽然差异很小但也值得一谈。

一种流行的LSTM变种,由Gers和Schmidhuber (2000)提出,加入了“窥视孔连接”(peephole connections)。这意味着门限层也将单元状态作为输入。

上图中,所有的门限中都加入了窥视孔,但是许多论文都只使用部分窥视孔。

另一个变种就是使用耦合遗忘和输入门限。我们不单独决定遗忘哪些、添加哪些新信息,而是一起做出决定。在输入的时候才进行遗忘。在遗忘某些旧信息时才将新值添加到状态中。

稍微有戏剧性的LSTM变种是门限递归单元或GRU,由Cho等人(2014)提出。它将遗忘和输入门限结合输入到单个“更新门限”中。同样还将单元状态和隐藏状态合并,并做出一些其他变化。所得模型比标准LSTM模型要简单,这种做法越来越流行。

提出的深度门限RNNs(Depth Gated RNNs )。当然还有其他解决长短期依赖关系问题的方法,比如Koutnik等人(2014)提出的Clockwork RNNs 。

这些变种哪个是最好的?这些差异重要吗?Greff等人(2015)针对流行的变种做了良好对比,发现它们其实都一样。Jozefowicz等人(2015)对超过1万种RNN架构做了测试,发现其中某些在特定任务上效果比LSTMs要好。

结论

早些时候,我提到了人们使用RNNs取得的显著成效。基本上这些都是使用了LSTMs。对于大多数任务,它们真的可以达到更好的效果!

写了一堆方程式,LSTMs看起来很吓人。希望通过这篇文章中一步一步的剖析,能更好理解它们。

LSTMs是我们使用RNNs的一个飞跃。那么很自然地会想:还有其他飞跃吗?研究人员之间共同的想法是:“有的!还有其他飞跃,还有关注点(attention)!”。这个想法是,让RNN中每一步都从更大的信息集中挑选信息作为输入。比如,你使用RNN来创建一个标题来描述图像,它可能会挑选图像的一部分作为输入,然后输出信息。事实上,Xu等人(2015)这么做了——如果你想探索关注点这可能是个有趣的出发点!使用关注点还有一些其他令人兴奋的结果,而且似乎还有其他的效果还没被发现……

关注点并不是RNN研究中唯一令人振奋的地方。比如,Kalchbrenner等人(2015)提出的Grid LSTMs似乎非常有前途。在生产模型——比如Gregor等人(2015)Chung等人(2015)Bayer,Osendorfer(2015)中使用RNNs似乎同样有趣。过去的几年对递归神经网络来说是激动人心的时期,而且今后更会如此!

理解 LSTM 网络的更多相关文章

  1. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)

    @翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...

  2. [转] 理解 LSTM 网络

    [译] 理解 LSTM 网络 http://www.jianshu.com/p/9dc9f41f0b29 Recurrent Neural Networks 人类并不是每时每刻都从一片空白的大脑开始他 ...

  3. 【翻译】理解 LSTM 网络

    目录 理解 LSTM 网络 递归神经网络 长期依赖性问题 LSTM 网络 LSTM 的核心想法 逐步解析 LSTM 的流程 长短期记忆的变种 结论 鸣谢 本文翻译自 Christopher Olah ...

  4. [译] 理解 LSTM 网络

    原文链接:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 吴恩达版:http://www.ai-start.com/dl2017/h ...

  5. 『cs231n』RNN之理解LSTM网络

    概述 LSTM是RNN的增强版,1.RNN能完成的工作LSTM也都能胜任且有更好的效果:2.LSTM解决了RNN梯度消失或爆炸的问题,进而可以具有比RNN更为长时的记忆能力.LSTM网络比较复杂,而恰 ...

  6. Deep Learning基础--理解LSTM网络

    循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

  7. 机器学习:深入理解LSTM网络 (二)

    之前我们介绍了RNN 网络结构以及其所遇到的问题,RNN 结构对于关联度太长的时序问题可能无法处理, 简单来说,RNN对于太久远的信息不能有效地储存,为了解决这个问题,有人提出了LSTM的网络结构,L ...

  8. 机器学习:深入理解 LSTM 网络 (一)

    Recurrent Neural Network Long Short Term Memory Networks (LSTMs) 最近获得越来越多的关注,与传统的前向神经网络 (feedforward ...

  9. 理解LSTM网络--Understanding LSTM Networks(翻译一篇colah's blog)

    colah的一篇讲解LSTM比较好的文章,翻译过来一起学习,原文地址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ,Posted ...

随机推荐

  1. HDU 6083 度度熊的午饭时光(01背包+记录路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=6083 题意: 思路: 01背包+路径记录. 题目有点坑,我一开始逆序枚举菜品,然后一直WA,可能这样的话路径记录 ...

  2. UVa 11235 频繁出现的数值

    https://vjudge.net/problem/UVA-11235 题意: 给出一个非降序排列的整数数组a1,a2,...,an,你的任务是对于一系列询问(i,j),回答ai,ai+1,...a ...

  3. 指数循环节 求A的B次方模C

    phi(c)为欧拉函数, 欧拉定理 : 对于互质的正整数 a 和 n ,有 aφ(n)  ≡ 1 mod n  . A^x = A^(x % Phi(C) + Phi(C)) (mod C) (x & ...

  4. 安装 mysql8.0.13 (Ubuntu 16.04 desktop amd64)

    1.下载mysql deb https://dev.mysql.com/downloads/mysql/ #移动到/usr/local/src/目录,解压 sudo mv mysql-server_8 ...

  5. shell 字符串提取数字

    echo "2014年7月21日" | tr -cd "[0-9]" 这样就可以提取出2014721

  6. 转载:Nginx负载均衡的5种策略

    nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. nginx的upstre ...

  7. JQuery 自己主动触发事件

    经常使用模拟 有时候,须要通过模拟用户操作,来达到单击的效果.比如在用户进入页面后,就触发click事件,而不须要用户去主动单击. 在JQuery中.能够使用trigger()方法完毕模拟操作.比如能 ...

  8. Oracle学习笔记(一)——并发与锁

    1 并发 多用户数据库管理系统的一个主要任务是对 并发(concurrency)进行控制,即对多个用户同时访问同一数据进行控制.当缺乏有效的并发控制时,修改数据的操作就不能保证正常,从而危害数据完整性 ...

  9. 正则表达式中 (?=pattern) (?!pattern) (?<=pattern) (?<!pattern) 的使用

    2018-08-06 12:33:58 StackOverFlow上有个如下的问题: 这里就会用到正向肯定预查(?=pattern):

  10. 如何将新项目添加到github仓库中?只需简单几步~即可实现

    问题描述:新建了一个项目,如何将其设置为git项目?如何关联到github上的仓库? 只需简单几步,但前提是需要已经安装好了git,并且有github账户 本文使用IntelliJ IDEA 其他编辑 ...