理解LSTM网络
周期神经网络(Recurrent Neural Networks)
人类并非每一秒都在从头开始思考问题。当你阅读这篇文章时,你是基于之前的单词来理解每个单词。你并不会把所有内容都抛弃掉,然后从头开始理解。你的思考具有持久性。
传统的神经网络并不能做到这一点,这似乎是其一个主要的缺点。例如,想象你要把一部电影里面每个时间点所正在发生的事情进行分类。并不知道传统神经网络怎样才能把关于之前事件的推理运用到之后的事件中去。
周期神经网络解决了这个问题。它们是一种具有循环的网络,具有保持信息的能力。
如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110358_efQQ.jpg)
如上图所示,神经网络的模块A输入为 xi ,输出为 hi 。模块A的循环结构使得信息从网络的上一步传到了下一步。
这个循环使周期神经网络看起来有点神秘。然而,如果你仔细想想就会发现它与普通的神经网络并没有太大不同。周期神经网络可以被认为是相同网络的多重复制结构,每一个网络把消息传给其继承者。如果我们把循环体展开就是这样,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110358_zjwT.jpg)
这种链式属性表明,周期神经网络与序列之间有着紧密的联系。这也是运用这类数据最自然的结构。
当然它们已经得到了应用!过去几年中,RNNs已经被成功应用于各式各样的问题中:语音识别,语言建模,翻译,图像标注…等等。RNNs取得的各种瞩目成果可以参看Andrej Karpathy的博客:The Unreasonable Effectiveness of Recurrent Neural Networks。确实效果让人非常吃惊。
取得这项成功的一个要素是『LSTMs』,这是一种非常特殊的周期神经网络,对于许多任务,比标准的版本要有效得多。几乎所有基于周期神经网络的好成果都使用了它们。本文将着重介绍LSTMs。
长期依赖问题(The Problem of Long-Term Dependencies)
RNNs的一个想法是,它们可能会能够将之前的信息连接到现在的任务之中。例如用视频前一帧的信息可以用于理解当前帧的信息。如果RNNs能够做到这些,那么将会非常使用。但是它们可以吗?这要看情况。
有时候,我们处理当前任务仅需要查看当前信息。例如,设想又一个语言模型基于当前单词尝试着去预测下一个单词。如果我们尝试着预测『the clouds are i n thesky』的最后一个单词,我们并不需要任何额外的信息了-很显然下一个单词就是『天空』。这样的话,如果目标预测的点与其相关信息的点之间的间隔较小,RNNs可以学习利用过去的信息。
但是也有时候我们需要更多的上下文信息。设想预测这句话的最后一个单词:『I grew up in France… I speak fluent French』。最近的信息表明下一个单词似乎是一种语言的名字,但是如果我们希望缩小确定语言类型的范围,我们需要更早之前作为France 的上下文。而且需要预测的点与其相关点之间的间隔非常有可能变得很大,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110358_Nu8f.jpg)
不幸的是,随着间隔增长,RNNs变得难以学习连接之间的关系了,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110358_JcgI.jpg)
理论上来说,RNNs绝对能够处理这种『长期依赖』。人们可以小心选取参数来解决这种类型的小模型。悲剧的是,事实上,RNNs似乎并不能学习出来这些参数。这个问题已经在Hochreiter (1991) [German]与Bengio, et al. (1994)中被深入讨论,他们发现了为何RNNs不起作用的一些基本原因。
幸运的是,LSTMs可以解决这个问题!
LSTM网络
长短时间记忆网络(Long Short Term Memory networks)——通常成为『LSTMs』——是一种特殊的RNN,它能够学习长时间依赖。它们由Hochreiter & Schmidhuber (1997)提出,后来由很多人加以改进和推广。他们在大量的问题上都取得了巨大成功,现在已经被广泛应用。
LSTMs是专门设计用来避免长期依赖问题的。记忆长期信息是LSTMs的默认行为,而不是它们努力学习的东西!
所有的周期神经网络都具有链式的重复模块神经网络。在标准的RNNs中,这种重复模块具有非常简单的结构,比如是一个tanh层,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110358_9Rry.jpg)
LSTMs同样具有链式结构,但是其重复模块却有着不同的结构。不同于单独的神经网络层,它具有4个以特殊方式相互影响的神经网络层,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_ty87.jpg)
不要担心接下来涉及到的细节。我们将会一步步讲解LSTM的示意图。下面是我们将要用到的符号,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_zpkd.jpg)
在上图中,每一条线代表一个完整的向量,从一个节点的输出到另一个节点的输入。粉红色圆形代表了逐点操作,例如向量求和;黄色方框代表学习出得神经网络层。聚拢的线代表了串联,而分叉的线代表了内容复制去了不同的地方。
LSTMs背后的核心思想
LSTMs的关键在于细胞状态,在图中以水平线表示。
细胞状态就像一个传送带。它顺着整个链条从头到尾运行,中间只有少许线性的交互。信息很容易顺着它流动而保持不变。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_pFHB.jpg)
LSTM通过称之为门(gates)的结构来对细胞状态增加或者删除信息。
门是选择性让信息通过的方式。它们的输出有一个sigmoid层和逐点乘积操作,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_hsAf.jpg)
Sigmoid 层的输出在0到1之间,定义了各成分被放行通过的程度。0值意味着『不让任何东西过去』;1值意味着『让所有东西通过』。
一个LSTM具有3种门,用以保护和控制细胞状态。
逐步讲解LSTM
LSTM的第一步是决定我们要从细胞中抛弃何种信息。这个决定是由叫做『遗忘门』的sigmoid层决定的。它以 hi−1 和 xi 为输入,在 Ct−1 细胞输出一个介于0和1之间的数。其中1代表『完全保留』,0代表『完全遗忘』。
让我们回到之前那个语言预测模型的例子,这个模型尝试着根据之前的单词学习预测下一个单词。在这个问题中,细胞状态可能包括了现在主语的性别,因此能够使用正确的代词。当我们见到一个新的主语时,我们希望它能够忘记之前主语的性别。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_1R2F.jpg)
下一步是决定细胞中要存储何种信息。它有2个组成部分。首先,由一个叫做『输入门层』的sigmoid层决定我们将要更新哪些值。其次,一个tanh层创建一个新的候选向量 C̃ t ,它可以加在状态之中。在下一步我们将结合两者来生成状态的更新。
在语言模型的例子中,我们希望把新主语的性别加入到状态之中,从而取代我们打算遗忘的旧主语的性别,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_lekR.jpg)
现在我们可以将旧细胞状态 Ct−1 更新为 Ct 了。之前的步骤已经决定了该怎么做,我们现在实际操作一下。
我们把旧状态乘以 ft ,用以遗忘之前我们决定忘记的信息。然后我们加上 it∗C̃ t 。这是新的候选值,根据我们决定更新状态的程度来作为放缩系数。
在语言模型中,这里就是我们真正丢弃关于旧主语性别信息以及增添新信息的地方,如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110359_mFT3.jpg)
最终,我们可以决定输出哪些内容。输出取决于我们的细胞状态,但是以一个过滤后的版本。首先,我们使用sigmoid层来决定我们要输出细胞状态的哪些部分。然后,把用tanh处理细胞状态(将状态值映射到-1至1之间)。最后将其与sigmoid门的输出值相乘,从而我们能够输出我们决定输出的值。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110400_leAu.jpg)
对于语言模型,在预测下一个单词的例子中,当它输入一个主语,它可能会希望输出相关的动词。例如,当主语是单数或复数时,它可能会以相应形式的输出。
各种LSTM的变化形式
目前我所描述的都是普通的LSTM。然而并非所有的LSTM都是一样的。事实上,似乎每一篇使用LSTMs的文章都有些细微差别。这些差别很小,但是有些值得一提。
其中一个流行的LSTM变化形式是由Gers & Schmidhuber (2000)提出,增加了『窥视孔连接(peephole connections)』。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110400_k7Iu.jpg)
在上图中,所有的门都加上了窥视孔,但是许多论文中只在其中一些装了窥视孔。
另一个变种是使用了配对遗忘与输入门。与之前分别决定遗忘与添加信息不同,我们同时决定两者。只有当我们需要输入一些内容的时候我们才需要忘记。只有当早前信息被忘记之后我们才会输入。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110400_0A3I.jpg)
LSTM一个更加不错变种是 Gated Recurrent Unit(GRU),是由Cho, et al. (2014)提出的。这个模型将输入门与和遗忘门结合成了一个单独的『更新门』。而且同时还合并了细胞状态和隐含状态,同时也做了一下其他的修改。因此这个模型比标准LSTM模型要简单,并且越来越收到欢迎。如图所示:
![这里写图片描述](http://static.oschina.net/uploads/img/201606/15110400_FASy.jpg)
这些仅仅只是LSTM的少数几个著名变种。还有很多其他的种类,例如由Yao, et al. (2015) 提出的Depth Gated RNNs 。以及处理长期依赖问题的完全不同的手段,如Koutnik, et al. (2014)提出的Clockwork RNNs。
那种变种是最好的?这些不同重要吗?Greff, et al. (2015) 将各种著名的变种做了比较,发现其实基本上是差不多的。Jozefowicz, et al. (2015) 测试了超过一万种RNN结构,发现了一些在某些任务上表现良好的模型。
结论
最开始我提到的杰出成就都使用的是RNNs。本质上所有这些成果都是使用了LSTMs。在大多数任务中,确实它们的表现非常优秀!
以公式的形式写下来,LSTMs看起来非常令人胆怯。然而本文的逐步讲解使得LSTM变得平易近人了。
LSTMs 是我们使用RNNs的重要一步。我们很自然地想到:还有下一个重要的一大步吗?研究者的普遍观点是:『有!下一大步就是「注意力」。』其基本思想就是让RNN的每一步从更大范围的信息中选取。例如,假设你为图片打标签,它可能会为它输出的每一个词语选取图片的一部分作为输入。事实上,Xu, et al. (2015)就是这么做的——如果你想探索『注意力』的话,这是个有趣的引子!已经有大量使用『注意力』得到的良好成果,而且似乎更多的陈果也将要出现……
『注意力』并非是RNN研究中唯一一个激动人心的方向。例如,Kalchbrenner, et al. (2015)做出的Grid LSTMs 似乎很有前途。在生成模型中使用RNNs-例如Gregor, et al. (2015),Chung, et al. (2015)以及Bayer & Osendorfer (2015)-似乎也很有趣。过去几年是RNN激动人心的阶段,未来几年将会更加如此!