Posts /

深入理解 LSTM

Twitter Facebook
30 Sep 2016

Recurrent Neural Networks

人们并不是每一秒都在从头开始重新思考某件事,正如你正在阅读这篇文章时,你会基于对前文的理解来理解当前的内容,而不是将之前的一切抛在脑后,从头开始重新思考。也就是说,你的思路、想法有持久性。

传统的神经网络是做不到这一点的,这似乎是一个NN的主要问题之一。例如,假设你想对一个电影中正在发生的每个时间点的事件进行分类,传统的神经网络是无法知道如何利用之前的事件来推到后续事件的。

幸好,Recurrent Neural Network 解决了这个问题。RNN是内部包含循环的网络,这使得它可以保持必要的信息。

如上图所示,A是一个神经网络块结构。我们注意到,输入_xt_和输出_ht_。中间的循环使得信息可以从网络的某一步传递到下一步。

这个循环可能会使RNN看起来很神秘。然而,如果你再仔细一点考虑的话,这跟一个普通的神经网络没什么两样嘛。一个RNN可以被看作是同一个网络的多个副本连接在一起,每个都是将信息传递给她的后继。下图展示了我们将这个loop展开的样子:

RNN的链式结构的本质揭示了它跟序列和列表紧密联系的事实。因为它们是神经网络用来使用这种信息的最自然的结构选择。

当然,这些结构已经被广泛应用了。在过去的几年中,RNN已经被成功地应用于多个问题领域:语音识别,语言建模,翻译,图像捕捉…… RNN正在被应用到越来越多的领域,如果你想了解更多的这方面的应用,你可以看Andrej Karpathy的这篇博客。这些真的是令人惊喜的进步。

这些应用的成功离不开LSTM的使用,这是一种很特殊但是有效的RNN。对很多任务来说,LSTM要比标准的RNN更加有效。几乎所有基于RNN的令人振奋的研究成果都是基于LSTM的。下面,我们主要探索一下LSTM。

The Problem of Long-Term Dependencies

RNN的其中一个吸引人的地方在于它能够将之前的信息应用于当前的任务中,例如使用先前的视频帧可能会启发当前帧。如果RNNs可以做到这一点,它们将会非常有用。RNN可以做到这个吗?这得看情况。

有时,我们仅仅需要使用最近的信息来完成当前任务。例如,考虑一个尝试基于前一个单词预测当前词语的语言模型,如果我们正在预测“the cloud in the sky” 中的最后一个词,我们不需要任何上下文信息,因为很明显,最后一个词就是sky。在这种情况下,相关信息和当前需要的位置的距离是很接近的,RNNs就可以用来使用过去的信息进行预测。

当然也有需要更多上下文的时候:例如我们要预测“I grew up in France… I speak fluent French.”通过上文提到的recent information,我们可以推测下一个单词是一种语言,但是如果我们想继续缩小范围,我们就需要继续往前找到France。这说明,相关信息和我们需要预测的位置之间的距离很大也是完全有可能的。

不幸的是,随着距离的增大,RNNs逐渐不能学习如何连接相关信息。

理论上,RNNs是完全可以处理这种长距离依赖“long-term dependencies”的。人类可以小心地为RNN选择合适的参数来解决这个问题;但是在实际中,RNNs似乎并不能从中学习出来。关于这个问题,Hochreiter (1991)[German] and Bengio, et al. (1994)应经做过深入的探讨,他们发现为什么这个问题如此困难的一些基础原因。

幸运的是,LSTMs不存在这个问题。

LSTM Networks

LSTM(Long Short Term Memory networks),是一种特殊的RNN网络,他能学习长距离依赖。LSTM是 Hochreiter & Schmidhuber (1997) 引入,并且由后续的很多人精华和使其流行开来的。LSTM在很多问题上都十分有效,现在也已经被广泛使用。

LSTM被显式的设计为如何避免长距离依赖的问题。长时间的记忆信息是它们默认的行为,而不是要费很大精力去学习的。

所有的RNNs都有一个重复的模块链式连接的网络结构。在标准的RNNs中,这个重复的模块有一个非常简单的结构,例如一个tanh函数层。

LSTMs也有类似的链式结构,但是重复模块内部的构造是不同的。LSTM的重复模块内部有四个,以特殊的方式互相通信的网络层(layer),而不是标准RNNs的一个神经网络层。

不用担心接下来的细节。我们会接下来一步一步了解LSTM的基本模式。在那之前,我们先熟悉一下接下来要是用的符号:

在上图中,每条线都是一个完整的vector,从一个节点的输出端到另一的输入端。粉红色的圆圈代表逐点操作,例如响亮的加法,黄色的boxes是被学习的网络层。线融合代表级联concatenation,一条线分成两个表示它其中的内容被复制然后传往不同的地点。

The Core Idea Behind LSTMs

LSTM的关键之处是Cell state,就是从一个图的上方横穿的这个带箭头的线。

Cell State 有点像一个传送带。它沿着整个链条一直运行下去,只包含一些细微的线性操作。信息在它上面保持不变的流动是很容易的。

LSTMs有向Cell State添加或者删除信息的能力,这些行为通过一种叫做“门”gates的结构严格管理。

门Gates是一种选择让信息通过/不通过的路径。它由一个Sigmoid神经网络层和一个逐点的乘积操作组成。

其中,Sigmoid层输出一些0~1之间的数字,表示向量的每一个元素应该多大程度上通过这个门。0代表不让任何信息通过,1表示让所有信息通过。

一个LSTM有3个这种门,用来保护和控制Cell State。

Step-by-Step LSTM Walk Through

LSTM的第一步就是决定我们将什么信息从Cell State中扔掉。这个决策通过一个叫做“遗忘门层forget gate layer”的Sigmoid层组成。通过观测xt和ht-1,它为每一个CellState Ct-1中的数输出一个0~1之间的值。1代表全部保留,0代表全部舍弃。

还是以上文提到的语言模型为例。在这个问题中,CellState可能会包含当前目标的性别信息,因此我们就可以使用正确的代词。而当我们看到一个新的目标时,我们当然想忘记旧目标的性别信息。

接下来的一步是决定什么新信息需要存储到当前的CellState中。这一步包含两个部分:首先,一个叫做“输入门层input gate layer“的Sigmoid层用来决定我们需要更新哪个值。接下来,一个tanh层创建一个新的成员变量_Ct_,用来加到当前的CellState中。

在我们的语言模型中,我们想要向新的目标添加性别信息,来代替我们上一步舍弃掉的旧的性别信息。

接下来,我们要更新上一步的旧的CellState _Ct-1_了。上面的步骤已经计划好了如何做,这一步则是进行实际的操作。

我们将旧的状态乘上 ft ,遗忘掉我们之前计划遗忘掉的信息。然后将 it ***** Ct 。这就是我们的新的局部变量,用来表示我们决定多大程度上更新state的每个值。

在语言模型中,这就是我们实际上丢弃旧的信息,然后添加新的性别新的的地方,按照我们之前的决策。

最终,我们需要处理我们当前diagram的输出是什么了。这个输出取决于我们当前的CellState(注意,这时候CellState已经在上一步被更新过了),只不过我们需要过滤掉其中的部分信息。首先,我们通过一个Sigmoid层来决定CellState的哪些部分是需要输出的。然后,我们将新的CellState通过一个tanh函数(将CellState的各部分指规则化到-1~1之间),然后乘上我们前一步的Sigmoid层的输出,于是我们就得到了我们想要的输出结果。

还是以语言模型为例,既然们刚处理完新对象的性别信息,我们可能希望输出一个相关的动词作为下一个预测的单词。(主谓宾结构啦)例如,这个Cell可能会输出这个目标是单数还是复数形式,从而我们可以知道应该在下一个待预测的动词后加不加s。

Variants on Long Short Term Memory

上文中介绍的只是LSTM的标准形式,当然,并不是所有的LSTM都是这样的。事实上,似乎所有的有关LSTM的论文都是使用的有些许改变的LSTMs版本。差别虽然很细微,但是其中一些是值得一提的。

其中一个LSTMs的变体是由 Gers & Schmidhuber (2000)提出的。他向LSTM中添加了peephole connections(窥视孔连接)。这意味着我们让gate layer开始观测CellState。

上图向所有的门都添加了peepholes,但也有一些论文只给其中的一部分gates添加了peepholes。

另一个变体时将遗忘门和输入门组合在一起。也就是说,选择那些信息被舍弃和那些信息被更新同步进行。我们只在我们打算更新某个信息的时候才将一些信息遗忘掉。即只在add new value的时候forget older ones。

更技巧性的一个变体是一个叫做Gated Recurrent Unit(GRU)的模型。他是Cho, et, al.(2014) 提出的。它将forget和input 门改为一个“update gate”。它还讲cellState和hiddenState融合在一起,还有一些其他的改动。这使得这个模型比标准的LSTM实现起来更加简单,这个版本也越来越受欢迎。

这些只是所有notable的LSTMs的其中一些变体,还有其他比如Depth Gate RNNs(Yao, et, al(2015)).当然,对于长距离依赖的问题也有其他完全不同的解决方式,比如Clockwork RNNs (Koutnik, et, al(2014)).

这些变体中哪一个最好呢?这些变体之间的区别重要吗?Greff, et, al(2015) 层做过一个很好地对比工作,他发现这些变体其实是差不多一样的。 Jozefowicz, et, al(2015)测试过超过一万个RNNs的架构,他发现其中的一些要比LSTMs在某些任务上性能更好一点。

Conclusion

通过本文,我希望大家可以在面对LSTM的时候不被它吓退,而是有一个清晰地认识。

LSTM是RNN的一个巨大进步。我们不自然的会想,在这方面还有类似的大的进步吗?研究人员的共同态度是:当然!这方面的基本想法是是让一个RNN网络的每一步都从一个更大的集合来提取信息。例如,如果你在使用RNN创建一个描述图像的说明,我们可以通过选择图像的一部分来 查看(look at for)它对应输出的每个词。事实上,Xu, et, al (2015) 已经做过这件事了。如果你同样想使用attention的话,这篇文章将会是不错的起点。现在已经有很多关于使用attention的令人激动的成果了,比如前几天的Google’s Neural Machine Translation,这方面的成果肯定会越来越多……

Attention并不是RNN的研究中唯一令人激动的方向。例如,Grid LSTM(Kalchbrenner, et al. (2015) 

)看上去也是有极大的希望。使用RNNs在生成式模型中—例如 Gregor, et al. (2015)Chung, et al. (2015), or Bayer & Osendorfer (2015)  同样非常有趣。最近几年,有关RNN的令人激动的时刻层出不穷,以后也一定会越来越多。

<全文完>
Twitter Facebook