理解LSTM网络

本文译自 Understanding LSTM Networks

原作者:Christopher Olah

循环神经网络

人类不会每秒钟都从头开始思考。 在阅读本文时,你可以根据以前单词的理解来理解每个单词。 你不要把所有东西都扔掉,再从头开始思考。 你的想法有持久性。 在这方面,传统神经网络不能做到这一点,这是一个很大的缺点。 例如,想象一下,当你想要分析电影中剧情的发展。 传统神经网络是不能够利用电影中以前的事件来推理以后的事情的。 而循环神经网络解决了这个问题。 它们是具有循环的网络,允许信息影响持续存在。


在上图中,一组神经网络A输入Xt并输出一个值ht。 循环允许信息从网络的一个步骤传递到下一个。

这些循环使得循环神经网络显得很神秘。 然而,如果你仔细想想,它们并不与一般的神经网络完全不同。 一个循环神经网络可以被认为是同一个网络的多个副本,每一个都传递一个信息给后继者。 考虑如果我们展开循环会发生什么:


这种链状特征揭示了循环神经网络与序列和列表密切相关,它们是用于此类数据的神经网络的自然结构。

而且他们确实得到应用! 在过去几年里,将RNN应用于语音识别,语言建模,翻译,图像字幕等各种问题已经取得了令人难以置信的成功。 我将讨论可以通过RNN实现的令人惊叹的专长,使Andrej Karpathy的优秀博客“反复神经网络的不合理有效性”成为可能。 但他们真的很神奇。 这些成功的关键在于使用“LSTM”,这是一种非常特殊的循环神经网络,对于许多任务来说,它们比标准版本好得多。 几乎所有令人兴奋的结果基于循环神经网络是通过他们实现的。 这篇文章将探讨这些LSTM。


长期依赖的问题

RNNs吸引人的一点在于它能够将过去的信息连接到当前任务,例如使用先前的视频帧可以为当前帧的理解提供信息。 如果RNNs可以做到这一点,他们将非常有用。 但他们可以吗?这取决于不同的情况。

有时候,我们只需要最近的信息来处理当前的任务。举个例子,输入法能够通过你输入的上一个词来预测你想要输入的下一个词。比如,我们想要预测“云彩在天上",我们不需要更多的信息就能够预测最后两个字。在这种情况下,如果相关信息与所需预测的信息间隔很小,则RNN可以学习使用过去的信息。



但有些情况下我们就需要更多的文本。比如预测“我来自法国...我法语很流利...”,最近的信息预测这是一个语言名词,但是当我们想确定具体是哪一种语言的时候,我们需要找到包含法国的文本,但这个文本很可能间隔非常远。很不幸,当间隔增加,RNNs就会更难以连接相关的信息。


理论上,RNNs完全有能力有能力处理这样的“长期依赖”。一个人可以仔细挑选参数来解决这种形式的问题。但实践却表明RNNs似乎不能学习。Hochreiter (1991) [German]深层次的揭露了这个问题,而Bengio, et al. (1994)解释了一些基本的原因。

但是,LSTMs没有这个问题!

LSTM 网络

长短记忆网络(Long Short Term Memory networks)通常称为“LSTMs"-是一种特殊的RNN,有能力学习长期的依赖。LSTMs最初由Hochreiter & Schmidhuber (1997)提出,并在之后的工作中由许多人优化推广。LSTM在各种各样的问题上工作得很好,现在被广泛使用。

LSTM专为解决长期依赖问题而设计。记忆长周期的信息是默认的行为而不是一下他们难以学习的东西。

现有的循环神经网络都会有一个链来重复神经网络的模块。在标准的RNN中一般是一个非常简单的结构,如一个tanh层。


LSTMs也有一个类似链结构,但是重复模块有一个复杂的结构。相对于单神经网络层,LSTM有4层,以一个非常特殊的方式交互。



不用担心其中的细节。我们将会一步步图解LSTM。现在让我们熟悉一下将用到的符号。



在上图中,每个线代表一个完整的向量,从一个节点输出到其他节点的输入,粉色的圈代表节点操作,比如向量加,而黄色框是学习到的神经网络层。线合并代表连接,线分叉代表复制。

LSTMs背后的核心概念

LSTM的关键是Cell的状态,水平线穿过计算图的顶部。

Cell状态有点像输送带。直接在整个链上运行,只有一些小的线性相互作用。 信息流畅地保持不变。


LSTMs没有能力去添加或者删除cell状态的信息,而是由称作门(gates)的结构小心的调节。

门是一个可以让信息选择性的通过的结构。由一个sigmoid神经网络层和一个节点乘算法组成。


一步步了解LSTM

LSTM中,第一步是决定我们将丢弃什么信息,并把剩下的送入cell状态。这个决定由叫做忘门层(forget gate layer)的sigmoid层做出。它通过观察ht-1和xt,为cell状态Ct-1中的每个数输出一个0到1之间的数,1表示完全保留这个,0表示完全抛弃这个。

让我们回到语言模型的例子。在这个预测下一个单词的问题中,cell状态也许会包含前面对象的属性,所以可以使用正确的代名词。当我们看到一个新的对象,我们想要忘记旧对象的属性。


下一步是来决定我们将保存什么新信息到cee状态中。这有两个部分。首先,一个sigmoid层(forget gate layer)决定哪个值将被更新。然后,一个tanh层创建一个新候选值的向量,Ct,可以被加入到cell状态中。在下一步,我们将要合并这两步来创建一个状态的更新。

在语言模型的例子里,我们想要添加新对象的属性到cell状态中来替换哦我们正在遗忘的旧对象。

现在是时候来更新旧的cell状态Ct-1为新状态Ct。前面的步骤已经决定了应该做什么,我们只需要实施。

我们将旧状态乘ft,忘记我们之前决定忘记的东西。然后我们加上it*ct。这是新的候选值,由我们决定更新每一个状态值的多少来缩放。

在语言模型的例子里,这是我们丢弃旧对象信息并添加新信息的地方。就如同我们在前一步决定的那样。

最终,我们需要决定我们输出什么。这输出将基于我们的cell状态,但会是一个过滤后的版本。首先,我们运行一个sigmoid层来决定哪些cell状态的部分将被输出。然后,我们将cell状态通过tanh(将值转化为-1到1之间)并与sigmoid门的输出相乘,就可以只输出我们想要的部分。

对于语言模型例子,因为只看到一个对象,在预测下一个词的时候,它也许想要输出一个关于动词的信息。比图,它也许输出这个对象是单数还是复数,因此我们知道接下来的是一个动词形式的。

LSTM的变种

上文讲述了一个普通的LSTM。但不是所有的LSTMs都和上面一样。事实上,看起来几乎所有论文都用了一个有一点不一样的LSTM。区别很小,但是值得注意。

一个著名的LSTM变种,由Gers & Schmidhuber (2000)提出,添加了窥视孔连接(peephole connections)。这意味着可以上门层查看cell状态。

上面的图添加了链接到所有门的窥孔,但很多论文只会添加其中的一些。

另一个变种是使用耦合的遗忘和输出门。相对于普通的LSTM分别决定添加和遗忘什么信息,这个变种同时作出决定,只在输入相同位置信息的时候遗忘当前的信息。只有在忘记一些值的时候才输入新值到状态中。

一个有点戏剧化的LSTM变种是GRU(Gated Recurrent Unit),由 Cho, et al. (2014)介绍。它把遗忘和输入门结合成一个“更新门”,同时还合并了cell状态和隐藏状态,并有其他一些改变。这使得模型比标准LSTM要简洁,并越来越流行。

这只是众多值得注意的LSTM变种中的几个。还有很多,如Depth Gated RNNs,Yao, et al. (2015).同时还有一些完全不同的追踪长依赖的方式,比如Clockwork RNNs, Koutnik, et al. (2014).

哪个变种是最好的?差别有必要吗?Greff, et al. (2015)对流行的变种做了一个总结,发现他们几乎一样。Jozefowicz, et al. (2015)测试了超过一万种RNN结构,发现有一些在特定问题上比LSTM更好。

结论

早前,我提到了人们在RNN获得的显著成就。基本都是由LSTM实现的,他们对于大多数任务都工作的很好!

LSTM的方程看起来很吓人,但是通过本文一步一步讲解,希望它们看起来更易懂。

LSTM是我们可以用RNN完成的一大进步。很自然的,我们会想,还有另一大步吗?研究人员的共同观点是:是的!还有下一步这就是注意力(attention)!这个想法是让RNN的每一步从一些较大的信息合集中挑选信息。比如,您使用RNN创建描述图像的标题,则可能会选择图像的一部分来查看其输出的每个字。事实上 ref="arxiv.org/pdf/1502.0304">Xu, et al. (2015) 做了这个,如果你想要探索更多关于注意力,这可能是一个有趣的起点! 有一些真正令人兴奋的结果使用了注意力,但似乎更多的是在角落...

注意力并不是RNN研究中唯一的兴奋点。例如Grid LSTMs,Kalchbrenner, et al. (2015) 看起来非常有希望。在生成模型中使用RNN进行工作,如 "http://arxiv.org/pdf/1502.04623.pdf">Gregor, et al. (2015), ="arxiv.org/pdf/1506.0221">Chung, et al. (2015), Bayer & Osendorfer (2015)看起来非常有趣。

最近几年对于RNN来说已经是一个激动人心的时刻了,而接踵而来的将只有会更多!

致谢

我很感谢一些人帮助我更好地了解LSTM,评论可视化,并提供关于这篇文章的反馈。

我非常感谢Google的同事们的有用的反馈,特别是 Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis, 和 Ilya Sutskever. 我也感谢许多其他朋友和同事花时间帮助我,包括 Dario Amodei, 和 Jacob Steinhardt. 。 我非常感谢 Kyunghyun Cho 对我的图表进行了深思熟虑的匹配。


在这篇文章之前,我在我在神经网络上教授的两个研讨会系列中练习了解释LSTM。 感谢所有参加这些活动的人对我的耐心,以及他们的反馈意见。

  1. 除了原作者,很多人对现代LSTM做出了贡献。 非全面的列表是:Felix Gers,Fred Cummins,Santiago Fernandez,Justin Bayer,Daan Wierstra,Julian Togelius,Faustino Gomez,Matteo Gagliolo和 Alex Graves.↩
编辑于 2017-09-16

文章被以下专栏收录