本文译自 Christopher Olah 的博文git
人类并非每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于本身已经拥有的对先前所见词的理解来推断当前词的真实含义。咱们不会将全部的东西都所有丢弃,而后用空白的大脑进行思考。咱们的思想拥有持久性。
传统的神经网络并不能作到这点,看起来也像是一种巨大的弊端。例如,假设你但愿对电影中的每一个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。
RNN 解决了这个问题。RNN 是包含循环的网络,容许信息的持久化。github
RNN 包含循环网络
在上面的示例图中,神经网络的模块,A,正在读取某个输入 x_i,并输出一个值 h_i。循环可使得信息能够从当前步传递到下一步。
这些循环使得 RNN 看起来很是神秘。然而,若是你仔细想一想,这样也不比一个正常的神经网络难于理解。RNN 能够被看作是同一神经网络的屡次复制,每一个神经网络模块会把消息传递给下一个。因此,若是咱们将这个循环展开:架构
展开的 RNNpost
链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最天然的神经网络架构。
而且 RNN 也已经被人们应用了!在过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得必定成功,而且这个列表还在增加。我建议你们参考 Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 来看看更丰富有趣的 RNN 的成功应用。
而这些成功应用的关键之处就是 LSTM 的使用,这是一种特别的 RNN,比标准的 RNN 在不少的任务上都表现得更好。几乎全部的使人振奋的关于 RNN 的结果都是经过 LSTM 达到的。这篇博文也会就 LSTM 进行展开。性能
RNN 的关键点之一就是他们能够用来链接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。若是 RNN 能够作到这个,他们就变得很是有用。可是真的能够么?答案是,还有不少依赖因素。
有时候,咱们仅仅须要知道先前的信息来执行当前的任务。例如,咱们有一个语言模型用来基于先前的词来预测下一个词。若是咱们试着预测 “the clouds are in the sky” 最后的词,咱们并不须要任何其余的上下文 —— 所以下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是很是小的,RNN 能够学会使用先前的信息。学习
不太长的相关信息和位置间隔测试
可是一样会有一些更加复杂的场景。假设咱们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词多是一种语言的名字,可是若是咱们须要弄清楚是什么语言,咱们是须要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就确定变得至关的大。
不幸的是,在这个间隔不断增大时,RNN 会丧失学习到链接如此远的信息的能力。this
至关长的相关信息和位置间隔google
在理论上,RNN 绝对能够处理这样的 长期依赖 问题。人们能够仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 确定不可以成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深刻的研究,他们发现一些使训练 RNN 变得很是困难的至关根本的缘由。
然而,幸运的是,LSTM 并无这个问题!
Long Short Term 网络—— 通常就叫作 LSTM ——是一种 RNN 特殊的类型,能够学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在不少问题,LSTM 都取得至关巨大的成功,并获得了普遍的使用。
LSTM 经过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非须要付出很大代价才能得到的能力!
全部 RNN 都具备一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个很是简单的结构,例如一个 tanh 层。
标准 RNN 中的重复模块包含单一的层
LSTM 一样是这样的结构,可是重复的模块拥有一个不一样的结构。不一样于 单一神经网络层,这里是有四个,以一种很是特殊的方式进行交互。
LSTM 中的重复模块包含四个交互的层
没必要担忧这里的细节。咱们会一步一步地剖析 LSTM 解析图。如今,咱们先来熟悉一下图中使用的各类元素的图标。
LSTM 中的图标
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其余节点的输入。粉色的圈表明 pointwise 的操做,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一块儿的线表示向量的链接,分开的线表示内容被复制,而后分发到不一样的位置。
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
细胞状态相似于传送带。直接在整个链上运行,只有一些少许的线性交互。信息在上面流传保持不变会很容易。
Paste_Image.png
LSTM 有经过精心设计的称做为“门”的结构来去除或者增长信息到细胞状态的能力。门是一种让信息选择式经过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操做。
Paste_Image.png
Sigmoid 层输出 0 到 1 之间的数值,描述每一个部分有多少许能够经过。0 表明“不准任何量经过”,1 就指“容许任意量经过”!
LSTM 拥有三个门,来保护和控制细胞状态。
在咱们 LSTM 中的第一步是决定咱们会从细胞状态中丢弃什么信息。这个决定经过一个称为忘记门层完成。该门会读取h_{t-1}
和x_t
,输出一个在 0 到 1 之间的数值给每一个在细胞状态C_{t-1}
中的数字。1 表示“彻底保留”,0 表示“彻底舍弃”。
让咱们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,所以正确的代词能够被选择出来。当咱们看到新的主语,咱们但愿忘记旧的主语。
决定丢弃信息
下一步是肯定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值咱们将要更新。而后,一个 tanh 层建立一个新的候选值向量,\tilde{C}_t
,会被加入到状态中。下一步,咱们会讲这两个信息来产生对状态的更新。
在咱们语言模型的例子中,咱们但愿增长新的主语的性别到细胞状态中,来替代旧的须要忘记的主语。
肯定更新的信息
如今是更新旧细胞状态的时间了,C_{t-1}
更新为C_t
。前面的步骤已经决定了将会作什么,咱们如今就是实际去完成。
咱们把旧状态与f_t
相乘,丢弃掉咱们肯定须要丢弃的信息。接着加上i_t * \tilde{C}_t
。这就是新的候选值,根据咱们决定更新每一个状态的程度进行变化。
在语言模型的例子中,这就是咱们实际根据前面肯定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
更新细胞状态
最终,咱们须要肯定输出什么值。这个输出将会基于咱们的细胞状态,可是也是一个过滤后的版本。首先,咱们运行一个 sigmoid 层来肯定细胞状态的哪一个部分将输出出去。接着,咱们把细胞状态经过 tanh 进行处理(获得一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终咱们仅仅会输出咱们肯定输出的那部分。
在语言模型的例子中,由于他就看到了一个 代词,可能须要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数仍是负数,这样若是是动词的话,咱们也知道动词须要进行的词形变化。
输出信息
咱们到目前为止都还在介绍正常的 LSTM。可是不是全部的 LSTM 都长成一个样子的。实际上,几乎全部包含 LSTM 的论文都采用了微小的变体。差别很是小,可是也值得拿出来说一下。
其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增长了 “peephole connection”。是说,咱们让 门层 也会接受细胞状态的输入。
peephole 链接
上面的图例中,咱们增长了 peephole 到每一个门上,可是许多论文会加入部分的 peephole 而非全部都加。
另外一个变体是经过使用 coupled 忘记和输入门。不一样于以前是分开肯定什么忘记和须要添加什么新的信息,这里是一同作出决定。咱们仅仅会当咱们将要输入在当前位置时忘记。咱们仅仅输入新的值到那些咱们已经忘记旧的信息的那些状态 。
coupled 忘记门和输入门
另外一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。一样还混合了细胞状态和隐藏状态,和其余一些改动。最终的模型比标准的 LSTM 模型要简单,也是很是流行的变体。
GRU
这里只是部分流行的 LSTM 变体。固然还有不少其余的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些彻底不一样的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
要问哪一个变体是最好的?其中的差别性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是同样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。
Jozefowicz等人论文截图
刚开始,我提到经过 RNN 获得重要的结果。本质上全部这些均可以使用 LSTM 完成。对于大多数任务确实展现了更好的性能!
因为 LSTM 通常是经过一系列的方程表示的,使得 LSTM 有一点使人费解。然而本文中一步一步地解释让这种困惑消除了很多。
LSTM 是咱们在 RNN 中得到的重要成功。很天然地,咱们也会考虑:哪里会有更加剧大的突破呢?在研究人员间广泛的观点是:“Yes! 下一步已经有了——那就是注意力!” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,若是你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上,Xu, et al.(2015)已经这么作了——若是你但愿深刻探索注意力可能这就是一个有趣的起点!还有一些使用注意力的至关振奋人心的研究成果,看起来有更多的东西亟待探索……
注意力也不是 RNN 研究领域中惟一的发展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是颇有前途。使用生成模型的 RNN,诸如Gregor, et al. (2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型一样颇有趣。在过去几年中,RNN 的研究已经至关的燃,而研究成果固然也会更加丰富!
I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.
I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals,Greg Corrado, Jon Shlens, Luke Vilnis, and Ilya Sutskever. I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt. I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.
Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.