更多深度文章,请关注:https://yq.aliyun.com/cloud
循环神经网络(RNN)
人脑因为某种机制的存在,从来不会从头开始思考。当你阅读这篇文章时,你会根据你对以前的词意的理解来理解每个单词。你从来不会把所有东西都扔掉,再从头开始思考。由于这种机制的存在,我们的大脑变得无比高效。算法其实就是模拟我们人类思维的一种真实映射。不管是RNN,还是LSTM它们都是基于人类思维的一种数学表现形式。
但传统神经网络不能做到这一点,这似乎是一个很大的缺陷。例如,想象一下你想要分析一个电影中每个点发生什么样的事件。传统的神经网络是不能够利用电影中以前的事件的来推理出以后的事件。但循环神经网络解决了这个问题。它是具有循环的网络,允许信息持续存在。
在上图中,一个神经网络,A,输入Xt并输出Ht。循环允许信息从网络的一个步骤传递到下一个。
这些循环使得循环神经网络看起来很神秘。然而,如果你在深入的思考一下,那就证明它们并不是一般的神经网络。一个循环的神经网络可以被认为是同一个网络的多个副本,它们每一个都会传递给后继者的消息。考虑如果我们展开循环神经网络会发生什么呢?请看下图:
这种链状特征揭示了循环神经网络与序列和列表的关系非常密切。RNN是用于分析此类数据的神经网络的自然结构。
在过去的几年里,RNN应用于语音识别,语言建模,翻译,图像字幕等各种问题上,并且取得了巨大的成功。这些成功的基础是使用“LSTM”,这是一种非常特殊的循环神经网络,对于许多任务来说,它比标准版本要好的多。几乎所有基于循环神经网络的令人兴奋的结果都是通过它实现的。本文就着重探讨LSTM。
长期依赖的问题
RNN的功能之一就是他们可以能够将先前的信息连接到当前任务,例如使用先前的视频帧可以增加对当前帧的理解。如果RNN可以做到这一点,他们将非常有用。
但有时,我们只需要查看最近的信息来执行当前的任务。例如,考虑一种语言模型,尝试基于以前的单词来预测下一个单词。例如我们试图预测“云在天空 ”中的最后一个字,我们就不需要任何其他的语境。在这种情况下,如果相关信息与所需神经元之间的差距很小,则RNN可以使用过去的信息。
但也有需要更多上下文的情况。考虑尝试预测文本中的最后一个单词“我在法国长大…….我说流利的法语”。最近的信息表明,下一个单词可能是一种语言的名称,但是如果我们想缩小范围确定是哪种语言,我们需要法国的背景,从而进一步的来确定。这时,相关信息之间的差距就变得非常大。不幸的是,随着距离的扩大,RNN无法学会使用过去信息。
理论上,RNN绝对有能力处理类似的“长期依赖”。人们可以仔细挑选参数来解决这种形式的玩具问题。不幸的是,在实践中,RNN似乎没有办法做到这些。Hochreiter(1991)[German]和Bengio等人深入探讨了这个问题。他们发现解决这个问题是非常困难的。幸运的是,LSTM成功的解决了这个问题!
LSTM网络
Long Short Term Memory(通常称为“LSTM”)是一种特殊的RNN,能够保存长期的依赖关系。在这个模型中,常规的神经元,即一个将S型激活应用于其输入线性组合的单位,被存储单元所代替。每个存储单元是与一个输入门,一个输出门和一个跨越时间步骤无干扰送入自身的内部状态相关联。它是由Hochreiter&Schmidhuber(1997)介绍,并且许多人对它进行了精炼和普及。
所有的循环神经网络都具有神经网络重复模块链。在标准的RNN中,该重复模块具有非常简单的结构,例如单个tanh层。
LSTM也具有这样的链结构,但是重复模块具有不同的结构。没有一个单一的神经网络层,而是有四个,并且以非常特殊的方式进行交互。
不要担心改变了什么细节。接下来我们将逐步介绍LSTM。现在,先熟悉我们将要使用的符号。
在上图中,每一行都含有从一个节点的输出到其他节点的输入的整个向量。粉色圆圈表示点向运算,如向量加法,而黄色框是神经网络层。行合并表示连接,而行交叉表示其内容正在复制,副本将转送到不同的位置。
LSTM的核心思想
LSTM的关键是细胞状态,即水平线穿过图的顶部。
细胞状态类似于输送带。它直接在整个链上运行,只有一些小的线性相互作用。信息很容易的可以通过它并且保持不变。
LSTM确实具有删除或添加信息到细胞状态的能力,这种能力由被称为门的结构调节使用。门是一种可选择地让信息通过的方式。它们由S形的神经网络层和点向乘法运算组成。
SIGMOID函数输出值是0或者1,它描述每个组件应该通过多少数据。值为0表示“如何都不能通过”,而值为1意味着“让一切通过!”
LSTM有三个门,用于保护和控制细胞状态。
一步一步“走过”LSTM
LSTM的第一步就是决定我们要从单元格中丢弃什么信息。这一决定是由一个sigmoid layer控制的。它主要控制ht−1和xt之间的计算,输出0或者1。1代表“完全保持”,而0 代表“彻底丢弃”。
我们回到一个语言模型的例子,试图根据所有以前的语料来预测下一个单词。在这样的问题中,细胞状态可能包括当前主题(subject)的词性的分析,从这些分析中,我们可以使用正确的代词或者动词。
下一步是决定我们要在单元格状态下存储的新信息。这有两部分,首先,称为“输入门层”的S形层(sigmoid layer)决定了我们将更新哪些值。接下来,tanh层会创建新的候选值的向量。在下一步中,我们将结合这两个来创建对状态的更新。
在我们的语言模型的例子中,我们希望将新主题的词性可以添加到单元格状态,以替换我们忘记的旧词性。
现在是更新旧细胞状态的时候了,我们把旧状态乘以ft,忘记我们之前决定忘记的事情。然后我们加it∗Ct,这是新的候选状态,按照我们决定更新每个状态值的程度来衡量。
在语言模型的情况下,我们实际上已经删除关于旧主题词性的信息,并添加了新信息,正如我们在之前的步骤中所做的。
最后,我们需要决定我们要输出什么。此输出将基于我们的单元格状态,但这将是一个过滤版本。首先,我们运行一个sigmoid层,它决定了我们要输出的单元格状态的哪些部分。然后,我们把细胞状态通过tanh,并将其乘以sigmoid门的输出,以便我们只输出我们需要的部分。
对于语言模型,由于它只是看到一个主题,它可能需要输出与动词相关的信息,以防下一步需要。例如,它可能会输出主题是单数还是复数,以便我们知道动词应该如何组合在一起。
LSTM变异
到目前为止我所描述的是一个很正常的LSTM。但并不是所有的LSTM都与上述相同。事实上,几乎每一篇涉及LSTM的论文都使用了一个略有不同的版本。差异很小,但值得一提的是它们。
Gers&Schmidhuber(2000)介绍的一种受欢迎的LSTM变体添加了“窥视孔连接(peephole connections)”。这意味着我们让门层看着单元格状态。
上面的图就是增加了所有的门的窥视。
另一种变异是使用耦合的忘记(coupled forget)和输入门。而不是单独决定要忘记什么,我们应该添加新信息,然后一起做出这些决定。
LSTM的更显著的变化是由Cho等人(2014)介绍的门控循环单元或GRU 。它将忘记和输入门组合成一个单一的“更新门”,还合并了单元格状态和隐藏状态,并进行了一些其他更改。所得到的模型比标准LSTM模型更简单,并且越来越受欢迎。
这些是最显著的LSTM变体。还有很多其他的,如Yao等人(2015)的 Depth Gated RNNs 。还有一些完全不同的处理长期依赖的方法,例如Koutnik(2014)等人的 Clockwork RNNs。
哪些变体最好?分歧是否重要?Greff等人 (2015)做了一个很好的比较流行的变种,发现这些变异都是一样的。Jozefowicz,et al(2015)测试了一万多个RNN架构,发现在某些任务上它们的表现比LSTM更好。
结论
此前,我说人们通过RNN取得了显著的成果,这些成果基本上都是使用LSTM实现的。这足以表明LSTM的强大。可能写成一组方程式,会让LSTM看起来很吓人。但我希望在这篇文章中你会对它有一个认识,使他们变得更加平易近人。
LSTM是RNN发展的一大步。很自然的想法:还有另一大步吗?研究人员的共同观点是:“是的!还有下一步,值得关注!“这个想法是让RNN的每个步骤从一些较大的信息集合中挑选信息。例如,如果您使用RNN创建描述图像的标题,则可能会选择图像的一部分来查看其输出的每个字。事实上,徐(2015)做到了这一点 ,如果你想要引起注意,这可能是一个有趣的起点!
致谢
我很感谢一些人帮助我更好地了解LSTM, 我非常感谢Google的同事们有用的反馈,特别是Oriol Vinyals,Greg Corrado,Jon Shlens,Luke Vilnis和Ilya Sutskever。我也感谢许多其他朋友和同事花时间帮助我,包括达里奥·阿莫德迪和雅各布·斯坦哈特。
本文由@阿里云云栖社区组织翻译。
文章原标题《Understanding LSTM Networks》
作者:colah 博客:http://colah.github.io
译者:袁虎 审阅:
文章为简译,更为详细的内容,请查看原文