如何理解LSTM

如何理解LSTM。

如何理解LSTM网络

于 2015.8.27 发表

递归神经网络

人类每一秒都不会从头开始思考。 正如你阅读这篇文章那样,你都是通过之前的单词来理解文中的单词。你不会抛开之前所有看过的内容来从头开始思考。你的想法有持久性。

传统的神经网络没法拥有这样的记忆,这看起来似乎是一个缺陷。比如,加入你想对电影的每个镜头进行分类。这就不确定传统的神经网络是否能根据之前的事件对后面的即将发生的事件做出合理的分类。

递归神经网络解决了这个问题。他们是一种存在递归的网络,这样就允许信息能持久的传递下来。

递归神经网络

如上图所示,A可以看做是输入为$x_t$,输出值为$h_t$. 其中的循环使得信息能够从某一步传到其下一步。

这些步数让RNN看起来有点神秘。 然而,如果你仔细想想,其实他们还是有点像普通的神经网络的。一个RNN可以看做是对同一个网络的多次拷贝,每个网络都传递一个信息到下一个接受者。如下图所示:

RNN图解

这周链状的特性揭示了RNN与序列和列表密切相关。RNN天生就是为了处理这类数据的神经网络结构。在过去的几年里,RNN在处理很多问题中取得了巨大的成功: 语音识别,语言模型,翻译,图像字母等等。其应用领域还在持续扩展。

这个成功很大程度可以归功于LSTM, 它是一个特别的RNN,可以用来解决很多问题,并且比标准的RNN要好很多。几乎所有基于RNN的让人惊讶的结果都是通过LSTM实现的。正是这些LSTM,这篇文章将对其进行探讨。

长期依赖的问题

RNN一个让人着迷的地方就是他可以将之前的信息连接到当前的任务,比如电影中用前一帧可能用来理解当前这一帧。如果RNN能做到,这将非常有用。但是RNN能搞定吗?可能不一定。

有时候,我们需要回顾最近的信息来执行当前的任务。比如在语言模型中尝试用之前的单词来预测下一个单词。如果我想去预测 句子”the clouds are in the sky,”中的最后一个单词,我们不需要其他任何单词了-这个很明显下一个单词就是sky。这种情况下,相关信息和需要的空间之间的差距很小,RNN可以学习去使用之前的信息。

但是很多时候,我们需要更多的上下文。如果我想要去预测文字”I grew up in France… I speak fluent French.”中的最后一个单词。 最近的信息暗示下一个单词可能是一种语言的名字,但是如果我们去确定语言的名字,我们就需要更早期的信息–”France”的信息。 很有可能相关的信息和需要的空间之间的距离会变得很大。不幸的是,随着距离不断增长,RNN不能去学习连接这些信息。

理论上,RNN绝对有能力解决长期依赖问题。人类可以小心翼翼地调参数来解决这种问题。可悲的是,实际上,RNN无法去学习。这个问题在 Hochreiter(1991)和Bengio等(1994)就已经深入讨论过,他们发现了为什么RNN很难解决长期依赖的根本的原因。 值得庆幸的是,LSTM没有这样的问题。

LSTM网络

长短期记忆网络–通常讲LSTM–是一种特殊的RNN,可以用来解决长期依赖的问题。LSTM是由Hochreiter和Schmidhuber(1997)提出,然后在之后的工作中被很多人细化和推广。

LSTM被明确地设计去避免长期依赖的问题。实际上记住长时间信息是他们默认的行为,并不是他们努力去学习的东西。

所有RNN都有链式神经网络模块重复的形式。在标准的RNN中,重复的模块拥有很简单的结构,比如一个tanh层。

标准RNN的重复模块包含一个单层

LSTM也有类似的链式结构,但是重复的模块不一样。和单个神经网络层不一样的是,它有四个,以非常特别的方式交互。

LSTM重复模块包含四个交互层

不用担心其中的细节。我之后讲一步一步地学习LSTM流程。现在,先轻松地了解一下LSTM流程图中的一些标记。

上面这个图中,每一行都代表一个完整的从一个节点输出到其他节点输入的向量。粉红的圈圈表示点向运算,比如向量加法。 黄色框是学习神经网络层。线的汇聚代表连接,线的分叉表示其内容被复制并且被拷贝到不同的位置。

LSTM背后的核心思想

LSTM的关键是cell状态–顶部贯穿整个流程图的水平线。细胞的状态有点像一个输送带。 它直接沿着整个链运行,只有一些轻微线性作用。信息很容易沿着它保持不变。

LSTM通过结构(也叫做门)仔细调节细胞,有删除或者添加信息到细胞状态的能力。门是一种通道可以选择性的让信息通过。它们由一个sigmoid神经网络层和一个逐点惩罚操作组成。

Sigmoid层输出值范围再0到1之间,描述了多少组成部分可以通过门。输出0代表不允许任何信息通过, 输出1代表运行所有信息通过。一个LSTM有三个这样的门, 来保护和控制细胞的状态。

逐步理解LSTM

LSTM的第一步是决定什么信息从细胞状态中丢弃。这个决定取决于一个sigmoid层(叫遗忘门)。该门会读取$h_{t-1}$和$xt$,输出一个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之间),将tanh层输出与sigmoid们相乘, 这样就输出我们想要的部分。

对于语言模型,因为它只看到一个主题,它可能与动词相关的信息,以备接下来的事情。举个栗子,它可能输出是单数还是复数,如果后面也是一样的话,我们就知道形成的动词应该结合再一起。

LSTM的变种

我们讲到现在只是一个非常普通的LSTM。但是并不是所有的LSTM都和上面讲的一样。事实上,几乎每一篇文章中涉及的LSTM有一点不同。这些区别很小,但是他们中的一些值得拿出来讲讲。

一个比较常见的LSTM变种是由Gers和Schmidhuber在2000年提出的, 它加入了窥视孔连接。 这意味这我们让门层也接受细胞状态的输入。

如上图所示,图中对所以的门加入窥视孔,但是很多文章中只加了部分窥视孔,其他的并不添加。

另一个变种是使用耦合的遗忘和输入门。 和分割地决定遗忘什么和添加什么新信息不一样的是,将这两个放在一起决定。当将要添加新的信息到节点时就去遗忘。当要遗忘屌一些之前的信息是就输入新的值。

一个更加戏剧性的变种是Gated Recurrent Unit (GRU), 它由Cho等再2014年提出。它讲遗忘和输入门复合成一个单独的更新门。它也合并了细胞状态和隐藏状态,也做了一些其他的改变。最终的模型会比标准的LSTM还要简单,因此越来越受到欢迎。

这些仅仅是一部分值得关注的LSTM变种。还有很多其他的变种,比如Depth Gated RNNs (Yao et al 2015)。也有一些完全不同的方法去解决长期以来的问题,比如Koutnik 等在2014年提出的Clockwork RNNs。

这些变种中哪个最好?它们之间的差别重要吗?Greff等在2015年对流行的变种做了一个不错的比较, 发现他们基本上一样。 Jozefowicz等在2015年测试了超过10, 000中RNN结构,发现其中一些再某种任务上比LSTM好点。

结论

早期,我提到了人们通过RNN得到了显著的结果。基本上所有的结果都是采用LSTM实现的。LSTM确实对大多数任务都做的不错!

写下一组方程,LSTM看起来确实挺吓人的。希望的是,这篇文章一步步理解LSTM可以是LSTM更加平易近人。

LSTM是RNN应用的一大步。很自然的,人们会想知道:是否还有更进一步的提升?研究人员普遍认为是的,还可以更进一步,那就是注意力。 这个想法是让RNN每一步都从更大的信息集中选择信息。举个例子,如果你是用RNN来产生标题去描述图片,它可能会选择图像的一部分去输出单词。事实上,Xu等人在2015年做到了,这可能是一个有趣的起始点,如果你想去探索注意力。使用注意力,已经由一些令人鸡冻的结果而且似乎有更多大学有待探索。

注意力也不是RNN研究的唯一主线。比如, Kalchbrenner等在2015年提出的Grid LSTM也很有希望。在生成模型中使用RNN, 比如 Gregor等(2015), Chung等(2015)和Bayer&Osendorfer(2015),也很有趣。对于RNN来说,最近几年是让人鸡冻的一段时光,并且RNN的前途不可限量!

参考

Christopher Olah’ blog

人艰不拆,生活不易