colah的一篇讲解LSTM比较好的文章,翻译过来一起学习,原文地址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ,Posted on August 27, 2015。
Recurrent Neural Networks
人类思维具有连贯性。当你看这篇文章时,根据你对前面词语的理解,你可以明白当前词语的意义。即是由前面的内容可以帮助理解后续的内容,体现了思维的连续性。
传统的神经网络(RNN之前的网络)在解决任务时,不能做到像人类思维一样的具有连续性,这成为它的一个主要不足。比如你想对电影不同时刻发生的故事情节进行事件的分类,就无法利用传统的神经网络,根据电影中前面时刻发生的剧情去推理后续的情节。RNN可以解决此类与连续性有关的问题,它们具有循环结构的网络,可以使信息在其中持续保存。
RNN具有循环结构 |
上图中的神经网络结构A,接收输入Xt ,输出ht 。A具有的循环结构使得信息可以从上一个时间步(timestep,t)传到下一时间步(t+1)。带有箭头的循环网络A看起来很复杂,把循环结构展开之后就会比较清晰,从下图的展开结构可以看出循环网络与普通网络的差别也没有那么大。循环神经网络RNN可以看成是同一个网络的复制了几份而已,然后再把这复制的几个网络按照先后顺序排列起来,使得前一个网络的输出刚好作为下一个网络的输入。
RNN的展开示意图 |
这种类似链式的性质表明RNN与序列数据和列表数据有自然地联系,这种结构是神经网络利用序列数据的天然结构。事实也是如此。过去几年里,RNN成功应用于各种问题中:语音识别,语言模型,(机器)翻译,给图像加说明文字等等。Andrej Karpathy的blog讨论了RNN的各种神奇的效果:The Unreasonable Effectiveness of Recurrent Neural Networks。RNN的成功运用得益于一种特殊的循环神经网络结构:LSTM。在循环神经网络的运用领域,几乎所有的令人激动的成果都是基于LSTM做出来的,它远比标准的RNN结构要好得多。本文接下来就是要讨论这些LSTM结构。
长期依赖的问题(The Problem of Long-Term Dependencies)
RNN中的一个引人注意的想法就是它们也许能够将当前的问题与以前的信息联系起来,比如利用电影中前面一些帧的内容也许能够帮助理解后面的电影内容。RNN能否解决这个信息长期依赖的问题,取决于具体的情况。
有时我们只需要查询最近的信息来解决当前的问题,比如一个语言模型基于前面的几个词来预测下一个单词,我们要预测一句话的最后一个词 " the clouds are in the sky ",仅凭sky之前的词,不需要其他更多的信息即可预测到 sky,这种情况下预测位置与相关信息的距离很近,RNN能够学会利用这种之前的信息。
但是还有另外的一些情况RNN无法处理。比如要预测一大段话中最后一个词" I grew up in France.... I speak fluent French. "。最近的信息暗示最后一个词可能是一种语言,但是如果要确定是 French 就得需要远处的France这个上下文的信息。这种情况,France与French距离可能会比较的远,RNN就无法学会将这些信息关联起来。
理论上RNN是可以处理这种“长期依赖”问题的,人们可以手工的仔细选择RNN的参数来解决小问题,但是实际中RNN还是无法学到“长期依赖”的解决方法, Hochreiter (1991) [German] 和 Bengio, et al. (1994) 深入研究过RNN无法工作的一些主要原因。LSTM没有这样的问题。
LSTM
LSTM(Long Short Term Memory)网络是一种特殊的RNN网络,能够解决“长期依赖”(long-tern dependencies)的问题,由Hochreiter & Schmidhuber (1997)提出的,它在许多问题的表现效果都很好,至今也在广泛应用。
LSTM被明确的设计为可以解决“长期依赖”问题,所以能够记住长期的信息是它们的默认一种属性。
在标准RNN结构中,循环的网络模块中结构比较简单,比如仅有一层tanh层。
|
LSTM也有与RNN相似的循环结构,但是循环模块中不再是简单的网络,而是比较复杂的网络单元。LSTM的循环模块主要有4个单元,以比较复杂的方式进行连接。
|
先提前熟悉一下将要用到的标记,下面会一步一步的讲解LSTM。
LSTM的主要思想(The Core Idea Behind LSTMs)
每个LSTM的重复结构称之为一个细胞(cell),在LSTM中最关键的就是细胞的状态,下图中贯穿的那条横线所表示的就是细胞状态。
LSTM能够给细胞状态增加或者删除信息,是由一种叫做“门”的结构来控制的,门主要起到开关的作用,它可以选择性的让信息通过,门是由一个sigmoid层与一个点乘操作组成的。
门的组成结构 |
sigmoid层输出的是0-1之间的数字,表示着每个成分能够通过门的比例,对应位数字为0表示不通过,数字1表示全通过。比如一个信息表示为向量[1, 2, 3, 4],sigmoid层的输出为[0.3, 0.5, 0.2, 0.4],那么信息通过此门后执行点乘操作,结果为[1, 2, 3, 4] .* [0.3, 0.5, 0.2, 0.4] = [0.3, 1.0, 0.6, 1.6]。
LSTM共有3种门,通过这3种门控制与保护细胞状态。
逐步详解LSTM(Step-by-Step LSTM Walk Through)
第一步是LSTM决定哪些信息需要从细胞状态中丢弃,由“遗忘门”(sigmoid层)来决定丢弃哪些信息。遗忘门接收上一时刻的输出ht-1 与这一时刻的输入xt,然后输出遗忘矩阵f,决定上一时刻的细胞状态Ct-1 的信息通过情况。
遗忘门
第二步是决定从新的信息中存储哪些信息到细胞状态中去。首先输入门(也是sigmoid层)接收ht-1 与xt,产生决定我们要更新哪些数字。接下来一个tanh层产生候选状态值 ilde{C}_t 。再联合待更新的数值与候选状态值,对旧的状态Ct-1 进行更新。如下图,
接着是更新旧的状态,如下图,ft 是遗忘矩阵, Ct-1是上一时刻的状态(旧状态),it 是决定要更新哪些数字,~Ct 是候选状态。
最后一步是决定输出哪些信息。首先利用输出门(sigmoid层)产生一个输出矩阵Ot,决定输出当前状态Ct的哪些部分。接着状态Ct通过tanh层之后与Ot相乘,成为输出的内容ht 。如下图。
LSTM的变种
目前讨论的都是普通的LSTM,并非所有的LSTM网络结构都是这样的。
Gers & Schmidhuber (2000) 提出了一个比较流行的LSTM模型,加入了“peephole connections”,也就是增加了细胞状态与3个控制门的直接连接。如下图,
另一个LSTM变种模型是利用耦合的遗忘门与输入门。遗忘门决定哪些状态需要遗忘,输入门决定哪些输入信息加入新的状态,将这个两个分离的过程联合起来,共同做决定。只在要输入新状态的部分对旧的状态进行丢弃,或者只在被遗忘的状态部分输入新的状态。见下图,
另一个更加动态的LST是由 Cho, et al. (2014) 提出的GRU(Gated Recurrent Unit),GRU将遗忘门与输入门整合成一个单独的更新门,还整合了细胞状态与隐藏状态等,结果是GRU比标准的LSTM模型更加的简单。
还有其他的一些变种如Yao, et al. (2015) 提出的Depth Gated RNNs。还有采用其他方法解决长期依赖问题的方案如 Koutnik, et al. (2014) 提出的 Clockwork RNNs。
Greff, et al. (2015) 对比了这些变种发现它们都是一样的,其中的差别并没有太多的影响。 Jozefowicz, et al. (2015) 测试了测试了成千上万的RNN结果,发现有些RNN在某些特定任务上表现比LSTM要好。
结论
LSTM在绝大多数任务上的表现确实比RNN要好。LSTM是一个很大的进步,但是另外一个大的进步是什么呢?研究人员的一个共识就是注意力机制(Attention),注意力机制就是让RNN在每一步的训练都从大的信息集合中挑选需要的信息,类似于注意力集中在某一部分的信息上面。使用注意力机制有很多令人兴奋的成果出来,还有更多的成果即将出现。
注意力机制不是RNN领域唯一的,还有Kalchbrenner, et al. (2015) 的Grid LSTMs,还有 Gregor, et al. (2015), Chung, et al. (2015), or Bayer & Osendorfer (2015) 等人在生成式模型方面利用RNN。
致谢
省略...