Understanding LSTM Networks

Recurrent Neural Network

人们从不会随意地开始自己的思考,当你在读这篇博文的时候,你根据之前所读的文字来理解现在每个词。并且,你也不会将前面的内容都丢掉,然后从新开始理解现在的内容,人的思路是具有延续性的。

传统的神经网络是没法做到上述事情的,这是一个很大的缺陷。举个栗子,假设你想要对电影里的某个时间点正在发生什么事情做判断。对传统神经网络来说,无法使用之前的发生的事情来推断后续发生的事情。

循环神经网络则可以解决这类问题,这种网络带有自循环结构,使得信息可以保存延续到下个时刻。

Recurrent Neural Networks have loops

在上图中,A + 循环构成一簇网络集合,A 的输入输出分别为 xtx_thth_t。其中 hth_t 又作为 A 的输入。该循环允许信息从本网络传递到下一网络。

这里面的循环,让循环神经网络看起来很难以理解。但是当你想得更深入一些时,你会发现它们与一般的神经网络是一致的。循环神经网络可以看做是相同网络的多次拷贝,每一个网络都将信息传递到下一个网络。我们可以将循环网络的循环展开如下所示:

An unrolled recurrent neural network

这种链式的属性表明循环神经网络与序列和列表是密切相关的,这种结构很自然地适合该类型数据。

在最近的几年里,RNN 在许多难题上都获得了难以置信的成功,比如语音识别、语言模型、机器翻译、图像捕捉等。Andrej Karpathy 的一篇博客 Unreasonable Effectiveness of Recurrent Neural Networks 里详细介绍了 RNN 的许多优异表现。

这些成功的关键是“LSTMIS”的使用,这是一种非常特殊的递归神经网络,在许多任务中,其工作性能远远优于标准版本。几乎所有基于递归神经网络的令人兴奋的结果都是通过它们实现的。本文将对 LSTM 进行探讨。

The Problem of Long-Term Dependencies

RNN 吸引注意的一个特性是,RNN 可以将之前的信息与当前的任务联系起来。比如,使用之前的视频画面可以帮助理解现在的视频画面。RNN 能做到如此境地么,答案是:可以,但是有依赖条件。

有时, 我们只需要处理最近的信息来解决当前的问题。比如,当语言模型尝试依赖之前的词来预测下一个词时,预测“the clouds are in the sky”的最后一个词时。我们不需要进一步的上下文,很明显下一个词时“sky”。在这个例子中,相关信息和所需预测位置的距离很近,RNNs 可以学习使用之前的信息。

但是,也存在其他需要更多上下文信息的例子。比如预测“I grew up in France… I speak fluent French”的最后一个词时,根据上下文下一个词应该是一种语言。如果我们想要缩减语言的范围,就需要更靠前的上下文“France”。这个例子中,相关信息和所需预测位置的距离变得很大。

不幸的是,当这个距离变大时,RNNs 无法学习信息间的关系。

理论上,RNNs 是完全可以胜任处理这种“long-term dependencies”的,使用者需要小心地选择参数来解决这类问题,但是实际中,RNNs 不能够学习这样的参数。这类问题已经被 Hochreiter(1991)Bengio(1994) 等人深入研究过,发现了为什么 RNNs 解决这类问题很困难的基本原因。

谢天谢地的是,LSTM 完全没有这种困扰。

LSTM Networks

Long Short Term Memory Networks - 通常称之为“LSTMs”,它是一种特殊结构的 RNN,能够学习 long-term dependencies。在 1997 年由 Hochreiter & Schmidhuber 引入,后续被众多研究者改进和发扬 1。LSTM 结构在大量的复杂问题中,获得了惊人的成功,并被广泛应用。

LSTMs 设计之初是用来避免 long-term dependency 问题的,记忆长久的信息是该结构的默认行为,并不是要刻意去学习的。

所有现行的循环神经网络具有神经网络的重复链式结构,标准的 RNNs 结构具有非常简单的结构,比如 tanh 层,如下:

The repeating module in a standard RNN contains a single layer

LSTMs 也有这种链式结构,但是重复单元更复杂。不同于单一的神经层,而是拥有 4 个以特殊形式交互的复杂层。

The repeating module in an LSTM contains four interacting layers

不要担心内部细节问题,稍后很快就要一步一步地讲解 LSTM。现在,先认识下即将使用的一些符号。

在上图中,每条线都代表一个实体向量,从一个节点的输出流向其他节点的输入。粉色的圆圈代表对应位置的计算,比如向量加法。黄色的方盒表示神经网络。线条合流表示串行,线条分支表示数据流复制并流向不同路径。

The Core Idea Behind LSTMs

LSTMs 的关键是 cell 状态,那条在结构图上侧的水平线。

cell 状态有点像是传送带,在整个链中从头流到尾,只有很少线性操作插入进来。对信息而言,可以很容易地通过它无损地流通。

LSTM 通过称之为门的结构来控制将信息从 cell 状态中加入或者移除。

门是一种可选择地控制信息流通的方式,它们由 sigmoid 神经层和 pointwise 乘积操作组成。

sigmoid 神经层输出介于 0 和 1 之间的值,描述了每个元素应该通过的比例。0 意味着拒绝任何信息通过,1 意味着让信息无损通过。一个 LSMT 有三个这种门,来保护和控制 cell 状态。

Step-by-Step LSTM Walk Through

LSTM 的第一步是决定什么信息将要从 cell 状态中丢掉。这一决定由 sigmoid 组成的“遗忘门(forget gate)”来搞定,它输入 ht1h_{t−1}xtx_t,输出与 cell 状态 Ct1C_{t−1} 同维度的 0/1 向量。0 意味着拒绝任何信息通过,1 意味着让信息无损通过。

再回头想下前面的语言模型预测的例子,cell 状态可能包含当前主题的性别,所以当前代称可以正确地判断出来。当看到一个新的主题时,我们想遗忘掉旧主题的性别信息。

下一步是决定哪些新信息要被存储到 cell 状态中。分两部分,第一,由 sigmoid 组成“输入门(input gate)”决定哪些维度将要被更新;第二,由 tanh 生成新的可以被加入到 cell 状态中的候选值向量 Ct~\tilde{C_t}。然后,将这两个向量合并生成对 cell 状态更新的向量。

在语言模型预测的那个例子中,我们将增加新主题的性别信息到 cell 状态中,以替换掉旧的性别信息(被忘掉的那个)。

现在,将旧的 cell 状态 Ct1C_{t−1} 更新为 CtC_t,上面几步已经给出了要做的事情。

首先,将旧 cell 状态乘以 ftf_t,忘掉我们决定要遗忘掉的内容;然后,叠加 itCt~i_t * \tilde{C_t},那是我们决定要追加的更新内容。

在语言预测模型的例子中,上述动作对应实际要丢弃的关于旧主题的性别信息,并增加新的信息。

最后,我们需要决定输出什么,这个输出基于 cell 状态的,但是个过滤后的版本。先用 sigmoid(“输出门(output gate)”)决定 cell 状态的哪些部分是将要输出的,以及对应的输出比例;再用 tanh 将 cell 状态投射到[-1,1]之间;再将两者乘积得到我们想要输出的结果。

对语言预测例子而言,当 LSTM 刚看到一个主题,它想输出动词相关的信息时,比如,它可能输出单数/复数形式的主题,所以需要知道什么类型的动词的格式应该被对应地加入后续要发生的动作中。

Variants on Long Short Term Memory

到目前为止介绍的都是普通的 LSTM,实际上,并不是所有的 LSTMs 都是上述结构,基本每篇论文涉及到的 LSTMs 都会有轻微地改动。通常改动都很小,但是也有必要提起。

一个非常流行的 LSTM 版本,是 Gers & Schmidhuber(2000)提出的,加入了“peephole connections”。这意味着我们每个门都能将 cell 状态作为输入。

上图结构中,所有的门都加上了“窥视孔(peepholes)”,但在许多论文中有些门加有些门不加的。

另外一个变种是,使用组合的“forget gate”和“input gate”。不同于单独决定遗忘什么和添加什么,将这两个决策放到一起搞。只有当某维度上有输入时,才忘掉该维度的旧信息;只有某维度忘掉旧信息时,才更新信息到 cell 状态的该维度内。

LSTM 的一个非常赞的版本是 Gated Recurrent Unit or GRU,由 Cho(2014) 提出。它将“forget gate”和“input gate”混合成一个“update gate”,并且将 cell 状态和隐状态合并起来,还做了些其他改变。GRU 比 LSTM 在结构上更为简单,并且广受欢迎。

上述这些只是一小部分 LSTM 的变种,其他的还有像 Depth Gated RNNs(Yao 2015)。还有完全不同的处理“long-term dependencies”的方法,比如 Clockwork RNNs by Koutnik(2014)

哪种更好呢?这些不同之处有影响么? Greff, et al(2015) 对流行的变种做了非常好地对比,发现他们都是一致的。 Jozefowicz, et al(2015) 测试了多大 1 万多种 RNN 结构之后,发现了某些版本在某些任务中,表现比 LSTM 要好点(这篇论文非常值得一看)。

Conclusion

更早些的时候,我提到 RNN 所能达到的一些让人惊艳的结果,本质上都可以用 LSTM 达到同样的效果,实际上对大多数任务来说 LSTM 工作地更好。

LSTM 的公式看起来很吓人,但是本文一步一步地解析使得它们更方便理解。

LSTM 是 RNNs 的一个巨大进步,很自然地想知道,是否还存在另外一大步?在研究者总的普遍共识是:Yes,确实有下一步,那就是“attention”模型!其思想是让 RNN 的每一步从更大的采集信息集中筛选信息。比如,使用 RNN 来给图片生成标题,它可能选择部分图片内容来查找输出的每个词。实际上,Xu, et al.(2015) 做了这块内容,如果你想展开探索 attention 的话这是个很好地开端。另外也有不少使用 attention 的很好的工作,但是看起来更像是围绕着比较偏僻的问题。

Attention 并不是 RNN 研究的唯一分支。比如,Grid LSTM (Kalchbrenner 2015) 看着也很 promising。在生成模型中使用 RNN,比如 Gregor (2015), Chung (2015), Bayer & Osendorfer(2015) 看着也非常有意思。最近几年将是 RNN 的惊喜之年,会有更多的 promise 出现。