理解循环神经网络(Recurrent Neural Networks)
循环神经网络
人类在每一秒都不会从头开始思考。正如当你开始阅读这篇文章时,你理解的每一个词语都基于对前面词语的理解。你不会丢弃之前所理解的内容而重新开始思考,因为思维具有持续性。
传统的神经网络并不能做到这一点,这点似乎是传统神经网络的主要弊端。举个例子,想象一下你想要通过一个神经网络模型来分类一部电影中每个时刻所发生的事件类型,如果用传统的神经网络将很难考虑如何通过之前的电影情节来推理下一刻的电影情节。
循环神经网络解决了这个问题。它们是具有循环的网络,允许信息持续存在。
带训练的神经网络
在上图中,块A连接着输入Xt和输出ht,其中有一个循环允许这一时刻的信息传递到网络的下一个时刻。
这些循环似乎让循环神经网络看起来更加神秘了。但是,如果你再深入思考一些,你回发现他们和普通的神经网络并没有太大的不同。一个循环神经网络可以看成是一个同一网络的多个副本,每一个副本都传递信息给下一个副本。我们把之前的网络展开看看:
展开后的循环神经网络
这种链状结构的特征揭示了循环神经网络与序列和列表密切相关。 它们是用于此类数据的神经网络的自然结构。
并且它们正在被使用着!在过去几年间,RNN已经被大量的成功应用于解决很多问题:语音识别,语言建模,翻译,图像字幕。。。被解决的问题数量还在不断的增加。我将把有关于RNN的惊人成就的讨论留给Andrej Karpathy的优秀博客文章, The Unreasonable Effectiveness of Recurrent Neural Networks。但是它们真的很神奇。
这些成功的关键在于使用“LSTM”,这是一种非常特殊的循环神经网络,对于许多任务来说,它们比标准版本好得多。 几乎所有令人兴奋的基于循环神经网络的结果是通过LSTM来实现的。 这篇文章将探讨这些LSTM。
长期依赖(Long-Term Dependencies)问题
一个RNN出现的重要原因是它能够连接之前的信息和当前的任务,例如利用之前的视频帧来形成对当前视频帧的理解。如果RNN能够做到这一点,它们将是非常有用的!但是它们可以做到这一点吗? 这依赖于很多的因素。
有时候我们只需要研究最近的一些信息就可以执行当前的任务。例如,在一个语言模型中,基于之前的一些词语来预测下一个词语。如果我们想预测”the clouds are in the sky,”中的最后一个单词,我们不需要更多的上下文-很明显的最后一个单词应该是sky。在这种情况,相关信息与当前位置的间隔是非常小的,RNN可以学习到利用过去的信息。
短期依赖
但是也会出现一种情况,我们需要更多的上下文信息。考虑到我们要预测这样一段文本的最后一个单词:I grew up in France… Ispeak fluent French. 最近的信息表明下一个单词很有可能是一种语言,但如果想知道究竟是何种语言,我们需要用到先前提到的,距离这一位置很远的关于France的上下文。相关信息与当前要预测位置的间隔非常大,这种情况是完全有可能出现的。
不幸的是,随着这种间隔的增加,RNN开始不能连接这些更久远的信息。
长期依赖
理论上来说,RNN完全可以解决这种”长依赖的问题“。人们可以通过仔细的为网络模型选择参数来解决这种形式的问题。可惜的是,在实际应用中,RNN似乎并不能解决这一类问题。
Hochreiter (1991) [German]和 Bengio, et al. (1994)等人曾经对这一问题进行过深度的研究,他们发现了这一问题不能解决的根本原因。
谢天谢地的是,LSTM根本不存在这些问题。
长短时记忆网络(Long Short Term Memory networks)
长短时记忆网络-经常被称之为LSTM,是一种特殊的RNN,能够解决学习问题中的长期依赖问题,这种网络是由Hochreiter & Schmidhuber (1997)提出的,并在随后的工作中被更多的人改良和推广。在很多问题中他们都运行的非常好,如今也是被广泛使用。
LSTM是被刻意设计用来解决长期依赖问题的。在实践中,记住长期信息是这种网络的默认行为,而不是一种需要付出很多努力才能解决的问题!
所有的循环神经网络都具有一种重复神经网络模块的链式结构。在标准的RNN中,这种重复的模块有一种非常简单的结构,例如单个的tanh层。
单个tanh层的rnn
和简单RNN一样,LSTM也拥有这样的链式结构,但是它的重复模块机构有一些不同。 不同于单个的网络层,LSTM有四个网络层,以一种特殊的方式来进行交互。
拥有四个网络层的LSTM
不用担心LSTM网络的细节展开。我们将会在之后的内容里一步一步的解释LSTM的图。现在,让我们来愉快的认识一些我们将会用到的图标。
一些图例
在上面的图例中,每一条黑线用于传输整个向量,从一个节点的输出到其他节点的输入。这个粉红色的圆圈代表节点操作,例如向量的加法,黄色的长方形是学习得到的神经网络层。合并的黑线代表向量的级联,而分开的黑心代表节点的内容被复制并传输至不同的地方。
LSTM的核心思想
LSTM的关键就是细胞核的状态,也就是图片上部穿过的这条水平直线。
细胞核的状态类似于一种传送带。它直接在整个链上穿过,附带一些少量的线性交互。很容易让信息在上面流传而保持不变。
一些图例
通过一种叫作门(gates)的结构,LSTM确实有能力来为细胞核状态增加或者移除信息。
门是一种让信息有选择性的通过的方式。它们是由一个sigmoid神经网络层和一个pointwise的乘法操作组成。
gate
sigmoid层的输出介于0~1之间,描绘的是每个部分有多少内容能通过。”0”值代表不允许通过,”1”值代表随意通过。
一个LSTM包含三种门,用于保护和控制这些细胞核状态。
逐步理解LSTM
LSTM的第一步是决定哪些信息要从我们的细胞核状态中剔除。这个决定是由“遗忘门”,也就是我们的sigmoid层决定的。它会读取ht-1和xt的值,然后为细胞核Ct-1的每个数字输出一个0~1的值。”1”代表完全保留这个值,”0”代表完全舍弃这个值。
让我们回到之前那个例子,运用语言模型基于之前的信息来预测下一个单词。在这一个问题中,细胞核状态可能会记住当前主语的性别,所以正确的代词将会被运用。但当我们看到一个新的主语时,我们希望能忘记之前主语的性别。
下一步是决定要将哪些新的信息保存在细胞核状态中。这里有两个步骤:第一步,一个叫作”输入门“的sigmoid层将决定我们会更新哪些信息,然后,一个 tanh 层创建一个新的候选值向量\tilde{C}_t,会被加入到状态中。下一步,我们会结合这两者来更新状态。
在我们的语言模型的栗子中,我们想要为细胞核状态增加新的主语的性别信息,并且遗忘旧主语的性别信息。
现在让我们来把旧的状态信息Ct-1来更新成新的状态Ct。之前的步骤已经说明该如何来做,现在让我们来真正的实现它。
我们将旧的状态乘以ft,提前舍弃我们决定舍弃的信息。然后我们加上it*\tilde{C}_t。这是一个新的候选值,根据我们决定更新每个状态的程度而变化。
在语言模型的例子中,这就是我们真正丢弃旧的主语心别信息,增加新的信息的地方,正如我们在前几步所决定的。
最后,我们要决定输入什么。这个输出基于我们的细胞核状态,但会是一个过滤后的版本。首先,我们运行了一个sigmoid层来决定细胞核状态的哪些部分要输出。然后,我们将细胞核状态进行tanh计算(来把值压缩到-1到1之间),并且将得到的值与sigmoid门的输出值相乘,这样我们就能输出我们决定输出的部分。
对于语言模型这个例子,由于它只看见一个主语,它可能想要输出一个与动词相关的信息。例如,它想输出主语是单数或者复数的信息,这样的话我们就能知道动词应该进行什么样的变化。
长短时记忆网络的变体
目前为止我所描述的都是非常标准的LSTM。但并不是所有的LSTM都和上面是一样的。事实上,几乎每一篇paper所涉及到的LSTM都有一点小的变化。这种变化是微小的,但是有些还是值得注意的。
一种比较流行的LSTM的变体,是由Gers & Schmidhuber (2000)提出的。增加了 “peephole connection”。这意味着我们让门这一层也接收了细胞核的状态。
上图中,我们为每个门都增加了peepholes,但是许多paper中都只给部分而非全部的门增加peepholes。
另一种变体是运用耦合的遗忘门和输入门。不同于之前的分开决定哪些信息需要忘记,哪些信息需要增加,这个变体是同时决定的。我们只需要在新增信息的时候代替不要的旧信息,或者在遗忘旧信息的时候增加新的信息。
一个稍微更显著的变体是Gated Recurrent Unit, 也称为GRU,由Cho, et al. (2014)提出。它把遗忘门和输入们结合为一个单独的”更新门”(update gate)。同时它还把细胞核状态和隐藏状态合并了,并做了一些其他的改变。这个模型比标准的LSTM模型更加简单,并且变得迅速流行起来。
以上只是显著的LSTM变体中的一小部分。还有许多其他的变体,例如 Yao, et al. (2015)所提出的Depth Gated RNNs。还有一些完全不同于LSTM的方法来解决长依赖的问题,例如 Koutnik, et al. (2014)所提出的Clockwork RNNs。
要问哪一个变体更优秀?这些差别到底有多重要? Greff, et al. (2015)对这些流行的变体做了一个比较,最终发现它们都是一样的。 Jozefowicz, et al. (2015)在超过 1 万种 RNN 架构上进行了实验,发现在一些特定任务上,RNN可以表现的比LSTM更为优秀。
结论
刚开始,我提到了人们在RNN上取得的惊人成果。但基本上所有的这些都是通过LSTM得到的。对于大部分任务而言它们真的表现的好太多了。
单单写下一组方程组,LSTM看起来是非常的吓人。希望通过这篇文章的一步一步的解读,能使它们看起来更容易接受一点。
LSTM是我们在RNN中所取得的重要进步。很容易产生这样的疑惑:是否会有另外一个重要进步?目前研究者的普遍观点是:是的!现在有另一个重要的进步,那就是注意力!这个观点是要让RNN中的每一步都能从更加大的信息集合中挑选信息。例如,如果你想使用一个RNN来生成一个图像的标题,它可能会选出这个图像的一部分并根据这一部分产生输入信息的单词。事实上,Xu, et al. (2015)就是研究这一课题的-如果你想研究注意力,这将会是一个很有趣的起点!现在已经有很多研究注意力而得到的很多令人兴奋的结果,但依然有更多的东西亟待探索。。。
注意力并不是RNN研究中唯一令人兴奋的方向。例如,Kalchbrenner, et al. (2015)的Grid LSTMs也是很有前景的。使用生成模型的RNN-例如Gregor, et al. (2015), Chung, et al. (2015)和 Bayer & Osendorfer (2015)等人提出的-也非常有趣。在过去几年间,关于RNN的研究已经是相当的火热,在接下来的时间里,RNN将会变得更加有前景。
致谢
I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.
I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis, and Ilya Sutskever. I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt. I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.
Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.
感想
第一次写翻译文,许多语句不是很通顺,以后会改进
文章中公式的问题由于还未学习如何用markdown语句来写公式,后面会继续修改
文章有不足之处欢迎批评指正!谢谢!