LSTM网络的理解
本文是对Christopher Olah的一篇博客的翻译。
源博客链接:Understanding LSTM Networks
循环神经网络(RNN)
人类开始自己的思考不会是从一片空白开始的。正如你读这篇文章,你对每个字的理解都依赖于前面的字。你不会丢弃所有的事情,然后用空白的大脑开始思考。你的思想有持久性。
传统的神经网络不能做这些事情,这似乎是它们最主要的缺点。例如,想象你想要对一部电影中每一个时间点的事件进行分类。如何用传统的神经网络,从电影中前一部分的事件推理出后一部分事件?这似乎很难做到。
循环神经网络解决了这个问题。它们是带有循环的神经网络,允许持久化信息。
在上图中,循环神经网络的一个模块A,读取xt ,并输出了ht. 循环的存在允许信息传递到下一步。
这些循环使得循环神经网络看起来有些神秘。然而,如果你仔细一想,你将会发现它们和普通的神经网络并非完全不同。一个循环神经网络可以被认为是多个神经网络的副本组成,每一个网络都传送消息给下一个网络。想象一下如果我们将它展开会发生什么:
这个链状的网络生动的反映了循环神经网络和序列有亲密的联系。它们是处理这类数据最自然的神经网络结构。
它们的确被使用了!在过去的几年里,在各种问题中使用RNN,取得了很多难以置信的成功。例如:语音识别,语言模型,翻译,图像描述等等。在Andrej Karpathy的博客中,介绍了很多RNN的伟大功绩。The Unreasonable Effectiveness of Recurrent Neural Networks
其中最为关键的就是LSTM的成功使用,LSTM是一种特别的循环神经网络,它可以解决很多问题,并且效果比普通的RNN更好。几乎所有优秀的成果都依赖于LSTM。这篇文章将会揭示LSTM。
长期依赖问题
RNN其中的一个有吸引力的想法是:它们能连接前面的信息到当前的任务,例如使用过去的视频段来推测当前的视频段。如果RNN能做到这一点,那它将会很有用。但是它能做到吗?这是有条件的。
有时候,我们仅仅只需要去看最近的信息就可以解决当前的任务。例如,考虑一个语言模型试图依据前一个单词预测下一个单词。如果我们想要预测句子"the clouds are in the sky"中,最后一个单词sky,我们不需要更多的前文信息,因为很明显,根据“the clouds are in the ”我们就能推测出sky。在很多情况下,相关的信息和预测的词位置之间的间隔是非常小的。RNN可以学习间隔不大的信息。
但是也有很多情况下,我们需要更多的上下文信息。考虑预测句子“I grew up in France… I speak fluent ” 的下一个单词,如果仅根据“I speak fluent” 是无法预测出Frence。最近的信息仅仅只能告诉我们这个单词可能是一门语言,但如果我们想要确定是那一门语言,我们需要“I grew up in France…”。相关信息和预测词之间的间隔可能很大。
不幸的是,随着间隔的增加,RNN已经没有能力去学习相关的信息。
理论上,RNN绝对有能力处理长期依赖问题。人类可以认真的为他们的问题选取参数。但在实践中,RNN 肯定不能够成功学习到这些知识。Hochreiter 和 Bengio深刻的研究了这个问题,他们发现了很多RNN训练变得困难的原因。
注:我大致解释一下为什么会有长期依赖的问题。RNN中更新权重的方法依然是反向传播算法,利用了求偏导的方法(链式求导法则)。而我们选择的激活函数的梯度(斜率)的范围一般是(0,1)之间,由极限运算可知对无穷个小于1的数相乘取极限时,值为0.所以出现了梯度消失的现象。同理无穷个大于1的数相乘,结果为无穷,出现了梯度爆炸的问题。
幸运的是,LSTM没有这些问题。
LSTM网络
长短期记忆网络通常简称LSTM,它是一种特别的,有能力学习长期依赖信息的RNN。LSTM 由Hochreiter 和 Schmidhuber 提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。在实践中,记住很多长期的信息是它默认的行为,并不需要努力就可以得到。(简而言之,它就是为了记忆长期信息而生)。
所有循环神经网络都是链状重复的形式。在标准RNN中,这些重复的模块有一个特别简单的结构,例如一个简单的tanh层。
LSTM同样也有这样的链式结构,但重复的模块拥有一个不同的结构。不再是只有一个单一的神经网络层,这里有4层,用一种特殊的方式进行交互。
先不用担心一些具体的细节。我们一会将一步步分析。现在,先让我们熟悉一些我们将会使用的符号
在上面的图中,一条线代表着一个向量,从一个点的输出到另一个点的输入。粉色的圈代表着按位操作,例如向量加法。黄色盒子代表一个神经网络层。两线合并代表两个向量合并,分开的线表示内容被复制,然后分发到不同的位置。
LSTM的核心思想
LSTM的关键是细胞状态,水平线在图上方贯穿运行。
细胞状态类似于传送带。它运行在整个链上,只有少量的线性交互。它很容易让信息传递并且不改变信息。
LSTM有能力减少或者增加信息,通过一个叫做门的结构来实现。
门是一种可以选择让信息通过的方法。它由一个sigmoid神经网络层和一个位运算乘法操作构成。
这个sigmoid层输出的数值在0到1之间,它描述了可以通过部分所占比例。0则代表任何信息都不能通过,1则代表所有信息都可以通过。
一个LSTM有3个门,用来保护和控制细胞状态。
一步步理解LSTM
LSTM的第一步是决定那些信息应该从细胞状态中丢弃。这个决定是由一个叫做“遗忘门”的sigmoid层来做的。它的输入是ht-1和xt ,并且为每个细胞状态Ct-1输出一个范围在0到1之间的数。1代表完全保留Ct-1,0代表完全弃。
现在,让我们回顾一下依据前文预测下一个单词的语言模型。在这个问题中,细胞状态可以包括当前对象的性别,所以可以推测出正确的代词(男:he, 女:she)。当我们看见一个新的对象,我们就需要去忘记前面对象的性别。
下一步是决定那些新信息应该存储到细胞状态中。这一步又包括两部分。首先,一个叫做“输入门”的sigmoid层决定那些值我们应该更新。其次,一个tanh层创建了一个新的候选值向量 C t ~ \widetilde{Ct} Ct ,它可以加入细胞状态中。接下来我们将结合这两步去创建状态更新。
在我们语言模型的例子中,我们想要增加新对象的性别到细胞状态中,去替换旧的信息。
现在是时候将细胞状态Ct-1更新为Ct了。前一步已经决定了该做什么,现在我们仅仅只需去做就行。
我们用旧状态Ct-1和ft相乘,忘记一些我们决定去忘记的事情。然后与it* C t ~ \widetilde{Ct} Ct 相加。
正如我们前面所决定的一样,在这个语言模型的例子中,我们的确丢弃了旧的信息并且增加了新的信息。
最后,我们需要去决定我们想要输出什么。这个输出将依赖于我们的细胞状态,但这是一个过滤的版本。首先,我们运行一个sigmoid层去决定细胞状态的那一部分我们要输出。然后让Ct经过 tanh(经过tanh以后,值将会在-1到1之间,这是由tanh函数的性质所决定的),并与输出门的值相乘,因此我们仅仅输出了我们决定输出的那一部分。
在语言模型的例子中,因为它就看到了一个 对象,可能需要输出一个接下来可能发生的动词相关的信息。例如,可能输出是否对象是单数还是负数,如果是动词的话,我们也需要根据单复数来决定动词的变化形式。
LSTM的变体
我已经描述了一个相当常规的LSTM。但并非所有的LSTM都和上面描述的一样,似乎所有的论文涉及到的LSTM都略有不同,这些变化是次要的,但仍然值得去提出来。
下面作者简介了三种变体,由于仅仅只是介绍性的文字,对理解LSTM并无帮助,这里不再进行翻译。
结论
在早些时候,我已经提到了人们用RNN取得的显著的成果。这些成果中最为重要的就是使用了LSTM。LSTM为很多问题提供了更好的解决方案。
写下一系列的等式,LSTM看起来有点神秘。但随着文章中一步步的解释,它已经变得更容易理解。
LSTM是我们在RNN中前进的一大步。很自然的就去想:是否还有其他的突破呢?研究人员共同的回答是:“有的”。它就是注意力!这个想法是让RNN的每一步都从一个更大的信息集中挑选信息。例如,如果你使用RNN去创建一个图片的描述,它可能会挑选图片的一部分去描述。事实上,Xu, et al.(2015) 已经这么做了,如果你想要去探索注意力,那么这将是一个有趣的开始!目前使用注意力已经有了很多令人兴奋的结果,并且似乎还有很多值得去研究的地方…
致谢
感谢许多人帮助我更好地了解LSTM,评论了可视化效果并提供了有关此帖子的反馈。 非常感谢Google同事的有益反馈,尤其是Oriol Vinyals,Greg Corrado,Jon Shlens,Luke Vilnis和Ilya Sutskever。 我也感谢其他许多朋友和同事花时间帮助我,包括Dario Amodei和Jacob Steinhardt。 我特别感谢Cho Kyunghyun Cho关于我的图表的极其周到的通信。 在写这篇文章之前,我在两个关于神经网络的研讨会系列中练习解释LSTM。 感谢参与其中的每个人对我的耐心和反馈。
译者小结
本文是我的第一篇翻译,翻译的目的是为了让自己能更好的适应以后的论文阅读。很多地方的翻译难免有些生涩。
作者 Christopher Olah 的文章写的非常认真,这种态度值得去学习。
关于LSTM:个人觉得先学习RNN的基本原理,搞懂RNN的特点和缺点,然后根据本文的描述,理解LSTM的三个门即可。正如作者所说,LSTM的变体非常多样,但万变不离其宗,掌握基本的结构以后,其他的变体就不再羞涩难懂。
若发现翻译有误的地方,欢迎指正。