理解LSTM网络

Posted 拉风小宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解LSTM网络相关的知识,希望对你有一定的参考价值。

最近学习Deep Learning的RNN和LSTM,找到一篇来自2015年Colah撰写的非常好的博客,当然我也看到有人翻译过了,暂且不管,希望我的这个版本比他们的好吧哈哈

Understanding LSTM Networks – colah

循环神经网络 (Recurrent Neural Networks / RNN)

人们读句子的时候,会根据前面的词对整个句子进行整体理解,而不会一个字一个字读,忘记前面的词。也就是说,人们的想法有持续性。

而这种特点传统的神经网络不能实现,比如你想根据在每个点的电影瞬间进行电影分类,就会因为传统的神经网络不能利用之前的信息推理后面的信息而宣告失败。

循环神经网络(RNN)就是为了解决这个问题而诞生的,他利用了循环,从而保持信息的持续性

在上面的图示中,神经网络的模块 A A A, 会根据输入 x t x_t xt输出 h t h_t ht,而循环结构允许信息从当前这一步传递到下一步(因为下一步的输出会受当前以及之前输入的影响)。 RNN看起来有点迷,但是你只需要定睛一想,他和普通的神经网络(NN)并没有什么卵区别。一个RNN可以看做把一个相同的网络贴了好多次,每一次都会把信息传递给后继者(successor). 我们可以把上面的循环结构展开:

这种链式结构揭示了RNN仿佛天然与序列和列表密切相关。而事实上这种神经网络的结构也确实是非常适合用来处理这两种类型的数据。在过去的几年里,RNN在很多领域取得了非常大的成就:比如语音识别,语言建模,翻译,图片描述等,各位感兴趣可以参考

The Unreasonable Effectiveness of Recurrent Neural Networks --Andref Karpathy

之所以RNN取得这么辉煌的成功,LSTM的应用是必不可少的。LSTM是一种特殊的RNN,他在很多任务上的表现比标准的RNN的要优秀的多,几乎所有令人振奋的成功都是基于他的,下面我们就来详细瞅瞅LSTM的过人之处

长期依赖(Long-Term Dependencies)问题

RNN的优点之一就是其可以利用循环结构解决联系前后信息的问题,比如利用前面的视频推断当前帧。但是在实际实现过程中还有很多问题需要考虑,那么我们就要考虑这种推理性能与什么因此有关

有时我们只需要考虑当前信息就可以实现当前任务。举个?,如果一个语言模型需要根据前面的词推理当前词,如果让我们预测下面一句话的最后一个词“the clouds are in the sky”(云在天上),我们并不需要其他更多的信息——太明显了吧云就应该在天上。在这种情况下需要的预测的信息和相关信息“离得”不远,RNN就可以有效地学习到

但是有的时候吧我们又着实需要更多上下文信息。再举个?,预测下面一句话的最后一个词“I grew up in France… I speak fluent French.”(我在法国长大,……(表示说了一堆别的东西),我说一口流利的法语),此处大家都猜得出来应该填某种语言,但是你想猜出是法语,那就只能再往前面看,直到看到法国??,这个时候相关信息的距离就很大了。

而RNN的问题就在于随着距离变大,其联系相关信息的能力会降低。

理论上来说,RNN应该有能力处理这种“长时期依赖”的问题。只不过需要精心挑选参数。然而实际上,RNN做的并不好。Hochreither在1991年和Bengio在1994年都发表过文章阐述其失败的根本原因。

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

LSTM 网络

长期短期记忆网络——通常称为"LSTMs"是一种特殊形式的RNN,其有能力学习到长期依赖关系。他们是由Hochreiter和Schmidhuber在1997年提出的

LONG SHORT-TERM MEMORY --Hochreiter, Schmidhuber, etc.

并且被很多人在后续工作中发展推广的。LSTM在实际上解决了大量的问题,应用非常广泛。

LSTM就是专门为了解决长期依赖问题提出的,他可以非常轻松的实现。所有的RNN都是把同一个神经网络模块重复贴,贴成一个链。而每一个模块的结构都很简单,比如说一个简单的 tanh \\texttttanh tanh层。

LSTM也有着类似的链式结构,但是重复模块有所变化。不再是一个单独的神经网络层,而是有四个,以某种特殊的形式进行交互。

下面我们会一步一步介绍细节,大家不要着急。下面是我们会用到的符号。

在上图中,每条线都传递一整个(entire)向量,从一个节点的输出传送给另外一个节点作为输入。粉色的⭕️表示逐点操作(运算),例如向量加法。黄色的矩形框表示神经网络层。合并的线表示向量合并(concatenation),比如 h t − 1 h_t−1 ht1 x t x_t xt , 那么合并后的输出就是 [ h t − 1 , x t ] [h_t−1,x_t] [ht1,xt],分开的线表示将向量复制一份传递给两个地方。

LSTMs的核心思想

LSTMs的关键在于元组的状态(cell state),也就是图中最上面那条线。

cell state有点类似于传送带。他直接贯穿整个链条,仅有一些很少的线性交互。这种结构使得“信息通过而维持不变”变得非常容易。

LSTM具有给cell state添加或删除信息的能力,这种能力是由一种叫做“门”(gate)的结构赋予的。

门的作用就是可以选择让信息选择性透过。这种性能是通过一个 sigmoid \\textttsigmoid sigmoid神经网络层和一个按位相乘运算组成。

sigmoid \\textttsigmoid sigmoid层输出一个[0,1]之间的数,用来描述此门允许多少信息可以通过。比如0就是“不让任何信息通过”,1就是“允许所有信息通过”。

一个LSTM有三个门,用来保护和控制cell state。下面我们就来详细讲一下这三个门

逐步理解LSTM

遗忘门

LSTM的第一步是决定要在cell state里保留哪些信息,抛弃哪些信息。这个决定是由一个 sigmoid \\textttsigmoid sigmoid层做的(遗忘门层)。其输入是 h t − 1 h_t-1 ht1 x t x_t xt,输出是一个0到1之间的数,这个数与cell state C t − 1 C_t-1 Ct1对应,用来表示允许多少信息通过。1表示“完全保持这个信息”,而0表示“完全抛弃”信息。

让我们回到我们之前预测词的那个语言模型的例子。cell state应该包含着当前主语的性别信息,这样在后文中代词才不会用错(比如小伙子用he,him,妹子she,her)。当我们看到一个新的主语时,系统应该记住当前主语的性别而忘记之前的性别信息。

输入门

下一是我们决定什么信息加到cell state中。之中包含两部分,首先一个 sigmoid \\textttsigmoid sigmoid层(输入门层)用来决定哪些值将被更新。之后一个 tanh \\texttttanh tanh层用来创造一个新的候选值 C ~ t \\tildeC_t C~t,之后会被加到状态信息中。在下一步中,我们将会结合两个部分以实现状态的更新。

对于之前的例子,我们会在cell state中增加新主语的性别信息用来替代旧的主语性别信息(我们应该忘记的)

现在是更新cell state的时间了,由 C t − 1 C_t-1 Ct1 C t C_t Ct。前面已经把准备工作做好了。我们首先将之前的state与 f t f_t ft相乘,忘记之前我们决定忘记的信息。然后我们加上 i t ∗ C ~ t i_t * \\tildeC_t itC~t,这是关于新的候选值的一项,用来衡量我们更新每个状态值(state value)的大小。

在语言模型的中,这一步才是真正丢掉旧的主语性别信息增加新信息的时候

输出门

最后,我们需要决定输出哪些信息。输出依赖于我们的cell state,只不过是一个过滤后的版本。首先,运行一个 sigmoid \\textttsigmoid sigmoid层决定哪部分的cell state将会被输出。之后让cell state通过 tanh \\texttttanh tanh(其输出值是 [ − 1 , 1 ] [-1, 1] [1,1])并且将其与 sigmoid \\textttsigmoid sigmoid门的输出值相乘,因此系统只会输出我们决定输出的部分。

对于我们的?,当系统看到一个主语(代词),系统输出的信息下一个动词信息也许会和主语有关。比如说,动词应该使用单数还是复数形式就取决于主语是单数还是复数。

LSTM的变体

peephole connections

之前讲的都是普通的LSTM模型,但是也并非所有的LSTMs都完全一样。有很多LSTMs都有一些轻微的区别和变种,变化不大但是其中的一些也值得一提。其中一个流行的变种是由Ger和Schmihuber在2000年提出的,增加了“门眼镜头(窥视孔)链接(peephole connections)”,用来让“门”也可以接收到cell state的信息。

上面的图显示的是给所有的门都装了“窥视孔”,当然也有很多文章只给一些门装了窥视孔。

coupled forget and input gates

另外一种变体是将遗忘门和输入门耦合起来。之前的LSTM都是分别决定哪些信息应该忘记,哪些信息应该加入,在这里我们将这两种操作合并起来一起考虑。我们在输入的时候忘记一些信息(占了新输入信息位置的需要被忘记),仅仅添加那些因为忘记旧的信息空出来的新信息(忘记信息空缺处的位置需要被添加)。

GRU

一个比较明显的变种是Gated Recurrent Unit(门循环单元),或者简称为GRU,是由Cho等人在2014年提出的。他将遗忘门和输入门合并成一个单个的“更新门”。他也融合了cell state 和hidden state(隐藏状态),并且有一些其他变化。GRU最终的模型比标准的LSTM模型简单,并且也在迅速流行起来。

这些仅仅是几种流行的LSTM变种,还有很多别的变种,比如Yao等人在2015年提出的Depth Gated RNNs。同时也有一些用完全不同的方法处理长期依赖关系的方法,比如Koutnik等人在2014年提出的Clockwork RNNs方法。

那么那些变种是最好的呢?这些变化重要吗?Greff等人在2015年做了一个关于几种最流行的变种的比较,结论是他们大体上是一样的。此外Jozefowicz等人在2015年测试了超过一万种RNN结构,发现其中的某些结构在某些任务上表现比LSTMs优秀。

结论

在文章的一开始,我提到了RNNs的一些显著的优点,而LSTMs几乎也都具有这些优点,并且在大部分任务中也取得了更好的效果。

上面的一系列等式先开始看起来令人聒噪,希望大家可以通过后面一步一步的分解让大家觉得更容易理解。

LSTMs对于RNNs来说取得了很大的一步进步,那么下一个问题是,还可以有另外一个大跨步吗?研究者们认为答案是:有的,下一步应该是注意力(attention)。基本想法是让RNN从一个更大的集合中查看和挑选信息。举个?,如果利用RNN创建一个标题描述图片,系统也许会挑选图片的一部分用以生成标题需要的词。事实上,Xu等人在2015年已经做了一部分工作——这也许是一个探索注意力的一个有趣的开始。关于注意力已经有了一些令人振奋的成果,但是也有很长的路要走。

注意力不是RNN研究中唯一的分支。比如Kalchbrenner等人在2015年提出的Grid LSTM看起来也很有前途,Gregor等人,Chung等人以及Bayer和Osendorfer等人在2015年提出的RNN在更广泛的应用似乎也很有趣。过去几年RNN已经取得了很大成绩,希望更大的成果在后面。

感谢

感谢大家在博文中帮我加注释并且提供建议给我。

感谢我在Google的同事,尤其是Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis, 和 Ilya Sutskever。同时感谢其他朋友和同事,包括Dario Amodei和Jacob Steinhardt。尤其感谢Kyunghyun Cho对于我的图示反馈的有深度的想法。

以上是关于理解LSTM网络的主要内容,如果未能解决你的问题,请参考以下文章

GRU与LSTM总结

Pytorch Note36 循环神经网络的变式:LSTM和GRU

3.2 LSTM和GRU循环神经网络

循环神经网络及其变体深度解读

循环神经网络及其变体深度解读

深度学习之GRU网络