LSTM 的论文原址:http://www.bioinf.jku.at/publications/older/2604.pdf
英文原文:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
本文在 https://blog.csdn.net/Leo_Xu06/article/details/78141321 的翻译基础上做了一些修改
递归神经网络(Recurrent Neural Network, RNN)
人类每时每刻的思考都不是孤立的从头开始,就像你在阅读这篇文章时,你对每个词的理解都是基于对先前词的理解而产生的,因为你的想法是具有时序关联性的。
传统神经网络的一个主要缺点是——做不到信息的时序关联。举个例子,想象一下你想区分一个电影某个时间点所发生的事件,传统的神经网络就做不到根据之前的事件来推理得到下一个事件。
递归神经网络(RNN)可以解决这一问题,它的网络结构中存在回环,使得之前的信息得以保留。
上面的示意图中,模块 A 接受输入x_t,并输出 h_t,环形结构允许信息从一个网络状态转移到下一个网络状态。
这些循环让循环神经网络看起来有点神秘。但是,你再仔细想下,就会发现它们与常见的神经网络没有什么不一样的地方。循环神经网络可以被认为是同一网络的多个副本,每个副本向后继者传递一个消息。把它展开之后是这个样子的:
该链式结构揭示了RNN与序列(sequences)和列表(lists)紧密关联,用这种神经网络结构处理特定数据(文本,语言等)也是直观自然的。在过去的几年中,已经有一些难以置信的RNN成功应用案例来解决各种问题:语音识别、语言建模、翻译、图片字幕……这个名单还在不断扩展,相关讨论见Andrej Karpathy的博文:The Unreasonable Effectiveness of Recurrent Neural Networks。
这些成功背后的本质是“长短期记忆模型(LSTMs)”的使用,这是一种特殊的递归神经网络,它对很多任务都适用,而且相较于标准的RNN模型,它的性能要高出许多,几乎所有基于RNN令人激动的成果都是由它取得。本文也将探索这些 LSTM 模型
长期依赖(Long-Term Dependencies)的问题
RNN优势之一在于它们能够将先前的信息关联到当前的任务中,比如用之前的视频帧可以辅助理解当前的视频帧。如果RNN真能做到这些,那将是非常有用的,但真是这样吗?视情况而定!
有时我们只需要看当前的信息就能完成当前的任务,比如:考虑一个语言预测模型想要根据之前的单词预测下一个单词。如果我们想要预测这句话“the clouds are in the sky,”的最后一个词,那么很显然即使根据前面的5个单词我们也能够预测到下一个单词是“sky”。这些情况下,相关的信息距离所求信息的距离不远,所以RNN能够学习使用先前信息。
但在有些情况下,我们需要更多的背景信息。如果想要预测“I grew up in France… I speak fluent French.”这句话的最后一个单词,离得近的句子“I speak fluent”暗示后面的单词很可能是一种语言,但如果我们想要确定是哪种语言,我们就需要先前出现的背景信息“France”,但它距离当前预测单词位置太远了。不幸的是,当这个距离变大时,RNN网络将不能够关联这些背景信息了。
理论上来说,通过人工挑选合适参数,RNN网络应该是完全可以解决这样的“长期依赖”问题的,但实际上RNN网络好像并不能做到。这个问题被Hochreiter (1991)和Bengio, et al. (1994)等人深入探索过,他们发现了一些根本原因。
幸运的是,LSTM不存在这样的问题!
LSTM 网络
Long Short Term Memory networks通常称为“LSTMs”,是一种特殊的RNN,它被设计用来避免长期依赖的问题。
有兴趣可以看下原作者论文:Hochreiter & Schmidhuber (1997),由于LSTM在众多场合被证明效果显著,现在已经成为最主流的神经网络之一
LSTM 的设计目标就是为了解决信息的长期依赖问题。长期记忆实际上是他们的默认行为,而不是他们努力学习的东西!
所有的递归神经网络都是重复的神经网络链,在标准的RNN中,这种重复的子模块有一种很简单的结构,比如一个tanh层。
LSTMs也有这种链式结构,但是重复的子模块结构不一样,它不仅仅只有单一神经网络层,而是有四个层以一种特殊的方式进行交互。
不要担心细节,下面我们将一步步展开讲解LSTM的结构。现在,我们先了解示意图中用到的表示符号:
上面的线条符号都包含一个向量,从一个节点到另一个节点,粉色的圆圈代表点对点的操作,比如向量相加,黄色的框代表学习到的神经网络。相交的线条代表信息合并,分开的线条代表信息复制分裂。
LSTMs背后的核心思想
LSTMs的关键是元胞状态(cell state),也就是在顶端的水平直线。
元胞状态有点像传送带,它沿着整条链一直向下,只与少数的线条有交互,信息可以容易地从它里面流过,不作过多改变。
LSTM也能够往元胞状态增加或者减少信息,这由门(gates)结构控制。
门能够选择性地让信息通过。它们由sigmoid神经网络层组成,并经过一个点乘操作。
sigmoid层输出0到1之间的数字,描述允许每一部分通过百分之多少的信息。0代表舍弃所有信息,1代表让所有信息通过。
一个LSTM有三个这样的门来保护和控制元胞状态。
LSTM工作步骤的详细介绍
LSTM中的第一步是决定什么信息将从元胞状态中被丢弃,该决定由一个叫“遗忘门”的sigmoid层产生,它的输入是h_{t-1}和x_t,输出是一个0到1之间的系数,元胞状态C_{t-1}中的每个数字,都要与该系数相乘
让我们回到上面那个根据之前的所有词预测下一个词的语言模型,在这种情况下,元胞状态可能包含当前主语的性别(男or女),根据它使用正确的代词(he/she),当有一个新的主语时,我们希望遗忘先前主语的性别。
下一步是决定哪些新的信息将被存储到元胞状态中,这包含两个部分。首先,一个叫“输入门层”的sigmoid层决定我们将要更新哪些值;然后,一个tanh层创建一个新的可被加入元胞状态的候选值向量\widetilde{C}_t;最后,我们将结合上面的一个值和一个向量,更新状态。
用上面的语言模型举例,就是我们想要加入新主语的性别信息到状态中,从而代替我们想遗忘的旧的性别信息。
下面要将旧的状态C_{t-1}更新到新的状态C_t,上面的步骤已经决定了做什么,我们只需要执行就好。
我们将旧状态乘上f_t,先忘记我们决定忘记的信息。然后加上i_t * \widetilde{C}_t,即用每个状态值更新率i_t乘上候选值向量。
在语言模型中,这相当于我们正真丢弃掉关于旧主语性别的信息,同时加上新主语性别的信息。
下面我们需要决定输出是什么,这个输出将基于元胞状态,但需要被过滤一下。首先,我们用一个sigmoid门决定元胞状态的哪一部分将被输出;然后,将元胞状态经过一个tanh层(使得值被规范化到-1到1之间);最后,将得到的值乘上sigmoid门输出的结果,从而得到我们决定输出的部分。
类比语言模型例子,因为它只看到了一个主语,下面它可能想要输出与一个动词相关的信息,比如可能输出这个主语是单数还是复数形式的,这样我们就能知道主语后面应该跟哪一个动词形式了。