理解LSTM网络(翻译)

Translated on December 19, 2015


Recurrent Neural Networks

人们思考问题时,不会在每一秒都从头开始想,而不考虑以往的记忆和经验。比如,读这篇文章的时候,你每读一个词都会结合前面读到的几个词来理解当前这个词的意思,而不会把前面看到的几个词忘掉然后单独考虑这个词的意思。也就是说,你的思考是有持续性的。

传统的神经网络不能做到这种持续性,这似乎是它最大的一个缺陷。举个栗子,假设你想对一部电影中的每一帧正在发生的事件做分类。用传统的神经网络的话,你很难搞清楚,它怎样才能把之前发生的事件的信息提供给这一帧正在发生的事件,以帮助其作出正确的分类。

循环神经网络(RNN)刚好解决了这个问题,这种类型的网络中存在环,能够使信息保存其中。


RNN-rolled

RNN存在环

上图是RNN的一部分, A 的输入是 xi , 输出为值 hi . 这个环能够允许信息从神经网络中的一步传递到另一步。

这些环让循环神经网络看起来似乎有些难以理解。但是你稍微想一下就能发现,它其实跟传统神经网络并没有太大的区别。一个循环神经网络可以被看作由同一个网络多次复制得到,每次都将信息传递给后续网络。我们将环展开就能看出来了。


RNN-rolled

展开的RNN

这种链式的本质,揭示出它和序列以及列表有着紧密的联系。它们是处理这类数据的网络结构的自然选择。

并且它们确实是被用上了!在过去的几年里,RNN被应用在各种各样的任务中,并且取得巨大的成功。比如在:语音识别、语言模型建模、机器翻译、图片加标题等等。而且这个列表还在继续扩大。我们不在这里继续讨论RNN的牛逼之处,你可以在Andrej Karpathy的博客:The Unreasonable Effectiveness of Recurrent Neural Networks 中找到。RNN的确是丧心病狂的好!

这些成功的核心就是它们都使用了LSTM,LSTM是RNN的一个变种。对许多任务来说,使用LSTM比标准的RNN效果要好很多。几乎所有激动人心的结果都是在基于这种类型的RNN上实现的。这种类型的RNN也是我们这篇文章所要讨论的内容。

长距离依赖的问题

RNN有一个吸引人的一点就是它能够将之前的信息整合到当前的任务当中,比如利用视频之前出现的帧的信息来理解当前这一帧。如果真的RNN能做到这一点,那的确是非常有用的,但是它能吗?不一定。

有时候,我们只需要利用到比较近的信息来处理当前的任务。比如,假设我们尝试利用一个语言模型来根据之前出现的几个单词预测接下来的一个单词。假设我们想要预测句子 “the clouds are in the sky“,我们不需要有更多的上下位了,因为已经非常明显了,跟在后面的单词是 sky。预测所需要的相关信息所在的位置和目标单词的距离比较小,像这样的话RNN是可以利用到这些过去信息。


RNN-rolled

但是,有时候我们需要更多的上下文。假设我们想要预测这段文本的最后一个单词 “I grew up in France… I speak fluent French “。如果只知道很近的几个单词,我们能猜测出目标单词代表着一种语言,但是想要确定具体代表哪种语言的话,就得知道更久之前的信息,到Frence附近才行。像这种所要利用的信息离目标单词的距离很远的情况是很有可能会发生的。

不幸的是,随着距离的增大。RNN越来越难将这种长距离的信息利用起来。


RNN-rolled

从理论上讲,RNN绝对能够处理像这种”长距离依赖“的问题。我们可以人为的仔细挑选出一些参数来解决长距离依赖问题中较简单的任务。但遗憾的是,在实践中,RNN似乎不能自主的去学习处理这类任务。这个问题 Hochreiter (1991) [German]Bengio, et al. (1994) 已经深度的探讨过,他们找了这类问题很难解决的本质原因。

幸运的是,LSTMs不存在这个问题!

LSTM网络

长短期记忆网络-通常也被简称为“LSTMs”- 是一种特殊类型的RNN,能够学习长期的依赖关系。这种网络是由 Hochreiter & Schmidhuber 在1997年发明,被后续很多人完善和普及。LSTMs在许多任务上都表现极好,被广泛使用。

LSTMs被明确设计出来解决长期依赖问题。记忆长效信息是它们默认的自发行为,不是努力去学习的!

所有的循环神经网络都有链式的重复模块。在标准的RNN中,这种重复模块包含一个简单的结构,比如一个单层 tanh层。


RNN-rolled

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

LSTMs同样有这种链式结构,但是它们的重复模块不同。一个四层的网络代替了原来的单层网络,这四层网络用一种特殊的方式进行交互。


RNN-rolled

LSTM网络的重复模块包含一个四层的交互网络

我们不用担心这些细节。我们将对上面的LSTM图进行一步一步的梳理。现在,让我们来熟悉一下一会儿将会用到的一些表示符号~

RNN-rolled

在上面的图表中,每一条线代表着一整个向量,从一个结点的输出到另一个结点的输入。粉红色的圆圈代表按位操作,比如向量加法。黄色的方块代表学习的神经网络。线的合并代表连接,分叉表示复制。

LSTMs背后的核心思想

LSTMs的关键是cell的状态,就是图表顶端水平向右的那条线。

cell的状态就像是一种传送带。它的状态沿着整条链传送,只有少数地方有一些线性交互。信息在传送过程中很容易就能保持不变。


RNN-rolled

通过一种叫做‘门’的结构的控制,LSTM能够在cell的状态中增加或者移除信息。

门是一种有选择的的让信息通过的方法。门是由一个sigmoid网络层和一个按位乘的操作组成的。


RNN-rolled

sigmoid层的输出是一个0到1之间的数值,表示每个部分有多少信息能够通过。0代表不让信息通过,而1表示让信息全部通过。

LSTM有三个这种门,保护和控制着cell的状态。

一步一步解读LSTM

LSTM的第一步就是决定我们应该从cell的状态中扔掉哪些信息。这个决定是由sigmoid层中的“遗忘门”来完成的。它的输入是 ht1 xt ,输出为一个0到1之间的数。其中1代表着完全保留,而0意味着全部扔掉。

我们回到刚才提到的语言模型的例子,即:用之前出现的单词来预测接下来的一个单词。在这样一个问题中,cell状态可能会考虑到当前主语的性别,这样才能找到正确的代词。当我们看到一个新的主语时,我们就希望忘记旧主语的性别。


RNN-rolled

下一步就是要决定什么样新的信息应该被存储在cell的状态里。这分为两步。首先,一个被称为”输入门”的sigmoid层决定我们需要更新哪些值。然后,tanh层生成一了一个候选向量 Ci~ ,它能够被加到状态中。最后一个步骤,我们将这两个值结合起来更新cell状态。

在我们的语言模型的例子中,我们希望能将新主语的性别信息加入到cell的状态中,替换需要忘记的旧信息。


RNN-rolled

现在是时候去更新旧的cell状态了,把 Ct1 加入到cell 状态 Ct 中。前面几步已经确定了该怎么做,现在只需要去执行就行了。

我们将旧状态乘以 ft ,把我们之前觉得该忘的东西忘掉,然后加上 itCi~ 。 这就是新的候选值,按我们决定的比例进行缩放。

在语言模型的例子中,这就是真正丢掉关于旧主语性别的例子然后加入新信息的过程,就像我们前几步中决定的那样。


RNN-rolled

最后,我们需要决定我们最终输出什么。这个输出结果将会基于我们的cell状态,但是会是一个过滤的版本。首先,我们会运行一个sigmoid层来决定cell状态的那一部分来输出。接着,我们将cell 状态通过tanh函数(使输出值保持在-1到1之间),然后乘以sigmoid门的输出,这样我们就输出了我们希望输出的那部分。

对于语言模型的例子,因为它只看到了一个主语,所以可能会输出跟动词相关的信息。比如,它可能会输出主语是单数还是复数,这样的话如果接下来的单词真的是动词,我们就能找到动词正确的形式了。


RNN-rolled

LSTM的各种变种

到目前为止,我们介绍的RNN都是一些比较正规的LSTM。但是,并不是所有的LSTMs都跟上面介绍的一样。事实上,基本上每一篇涉及到LSTM的论文都出现一个有小改动的版本的LSTMs。这些变化很小,但是值得提出来。

一种比较流行的LSTM的变种是由Gers & Schmidhuber (2000)
提出的。就是加上”窥探孔连接”。这就意味着门连接层能够接收到cell的状态信息。


RNN-rolled

上图就是在每个门上都加上窥探孔连接后的结果,但是并不是所有论文都会把连接全,有的会少连一些。

另一个变种就是用一对遗忘门和输入门。原来是先决定遗忘什么,然后再决定应该加入什么新信息,现在是两个决定一起完成。
我们只有在将要加入新信息时才会开始遗忘。也只有在遗忘旧信息同时才会加入新的信息到状态中。


RNN-rolled

LSTM一个稍微比较引人注目的变种是 Gated Recurrent Unit,或者简写为GRU。是由Cho, et al. (2014) 引入的。他把遗忘门和输入门结合起来构成更新门。将cell 状态和隐藏层状态合并,然后还有一些其他的小的改动。得到的模型比标准的LSTM模型简单一些,所以变得越来越流行了。


RNN-rolled

这只是比较出名的LSTM变种中少数几个,还有很多其他的。比如 Yao, et al. (2015) 的 Depth Gated RNNs。 还有一些比其他用完全不同的方法来处理长期依赖问题的,比如 Koutnik, et al. (2014) 的 Clockwork RNNs。

哪种变种是最好的呢?到底这些变化重要么?Greff, et al. (2015) 对比较流行的几种变种做了一个很好的对比,发现它们基本上都差不多。Jozefowicz, et al. (2015) 测试了超过一万种RNN结构,发现有一些能够在特定任务上超过LSTMs。

总结

之前,我提到了很多人用RNN取得了很好的效果。基本上,所有的这些RNN都是基于LSTM的。它们的确是在许多任务上都表现不俗!

写了一大推公式,让LSTMs看起来挺吓人的。但是希望,我们这样一步一步走下来能让你对LSTMs更了解一些,让它看起来更亲切。

LSTMs对于RNN来说是一个大的飞跃,有了LSTMs后越来越多的任务都用RNN来解决。很自然地,我们想是否还有下一个飞跃?研究者们普遍认同的一个观点是:”yes!的确有下一个飞跃,就是Attention!“这个观点就是在RNN的每一步都从大的信息集合中挑选出部分来关注。比如,如果你用RNN来产生描述图片的标题,对于每一个要输出的标题,它可能只关注图片的一部分。事实上,就是这样做的。如果你想探索attention,这可能是一个比较有意思的出发点。使用attention的RNN已经取得了许多激动人心的结果,而且似乎越来越多的好结果即将出现…….

RNN领域中不止是有attention这一个有趣的研究方向。比如,Grid LSTM 看起来也很有前景。在生成模型中使用RNN同样很有趣。过去几年RNN发展的很红火,那接下来几年更会是如此!

致谢

对于那些帮助我更好得理解LSTMs的人表示感谢,他们有的是面对面提出建议和评论,有的是在博客上进行反馈~

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值