理解LSTM网络

时间递归神经网络

人类不会每时每刻都从头开始重新思考,就像你阅读这篇文章时,你会根据对上文的理解来推断每个词语的意思,而不是抛弃一切从零开始思考。换而言之,你的思想具有持久性。

但传统的神经网络却做不到这一点,目前看来这似乎是其一个主要缺点。比如在一部电影中,你想要把所有时间点上的发生的事情进行分类;但目前还不清楚传统的神经网络如何利用对先前事件的推理来感知后续的情节。

时间递归神经网络(Recurrent neural networks,下简称RNN)解决了这个问题。其是一种包含着循环结构的网络,从而能让信息得以留存。

RNN存在循环结构

在上图中,神经网络中的块A根据输入x_t而输出对应的值h_t。一个循环结构让信息得以从网络中的一步传递到下一步。

这些循环结构让RNN看起来神秘不少,不过细想一下,就会发现其与普通的神经网络差别并不算大。一个RNN可以被看成是多个相同网络的重复,其中的每一个都会把信息依次传递给后者。让我们来看看把循环展开会是什么样:

一个展开的RNN

这种链式结构揭示出RNN与序列或列表是高度相关的,而它们都是神经网络中用于处理这类数据的天然结构。

并且它们已经被成功应用上了!在过去的几年中,人们将RNN应用于各种问题上并都取得了难以置信的成功:语音识别,语言建模,机器翻译,图像标注……并且还在持续增多。我会在Andrej Karpathy的RNN无与伦比的有效性一文中,留下些关于用RNN所取得的惊人成就的讨论。

这些成功的关键在与用好长短期记忆网络(LSTM),这是这是一种特殊的RNN,并且在很多任务中其表现都优于标准的RNN。事实上,几乎所有RNN产出的令人兴奋的结果,都是基于LSTM实现的。而这些LSTM正是本文将要探讨的内容。

长期依赖问题

RNN的吸引力之一来自于其将先前的信息联系到当前的任务上来的想法,比如可以用先前的视频帧来帮助理解当前帧的内容。如果RNN真能做到这一点,那将是非常有用的。但事实果真如此吗?其实还得视情况而论。

有时候我们只是需要借助近期的信息来完成当前的任务。比如有一个语言模型想要基于先前的词语来预测出下一个词语,如果我们想要预测“the clouds are in the sky”的最后一个单词,我们并不需要其他更多的上下文,这个单词显然就是sky。在这种情况下,预测词和所需信息的位置隔得较近,RNN就能够学习如何用上先前的信息。

但有些情况下我们需要更多的上下文。比如当我们尝试预测“我在法国长大……我能流利地说法语”的最后一个词组,近处的信息能提示到下一个出现的词组是一种语言的名字,但我们需要开头的关于法国的背景才能确定具体的语言。所以预测词和相关信息彼此间完全可能隔得非常远。

不幸的是,随着两者间距离的增加,RNN会越来越难以联系上这些信息。

理论上来讲,RNN绝对有能力来处理这种“长期依赖”问题。通过仔细地调整参数,人们应该能够用它来解决这一类中的玩具问题。然而实践证明,RNN似乎没有办法完成学习。Hochreiter(1991)(德文)Bengio(1994)等人对这个问题进行过深入的探究,并从中发现了其难以训练的相当根本的原因。

不过还好,LSTM并不存在这个问题。

LSTM网络

长期短期记忆网络(LSTM)是一种特殊的RNN,其能够学习长期的依赖信息。其由Hochreiter&Schmidhuber(1997)率先提出,并随后不断地被人们完善和推广1。它在各类问题中均表现良好,且目前已经被广泛使用。

LSTM被刻意设计为用于规避长期依赖问题,记忆长期信息是它们与生俱来的行为能力,而不是努力习得的。

所有的RNN都有一种重复神经网络模块的链式结构;在标准的RNN中,这些重复的模块通常结构简单,比如是单个tanh层

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

虽然LSTM也有类似的链式结构,但重复的模块却拥有复杂的结构:其有着四种用特殊方式交互在一起的神经网络层,而不是仅仅单层。

一个LSTM的标准重复模块包含着四个相互交互的层

无需对接下来的细节有所顾虑,我们稍后会跟着LSTM的流程图一步步地走一遍。首先,先让我们熟悉一下所用的记号:

在上图中,每条线都从一个节点的输出向另一节点的输入传递了一整个向量;粉色的圆点表示操作点,做诸如向量加法一类的操作;黄色的框是习得的神经网络层;合并起来的线条指代向量的联结;而分叉的线条表示其中的内容被复制并分别进入不同的地方。

LSTM背后的核心理念

LSTM的关键在于单元状态,即流程图上方的水平线。

单元状态有点像一根传输带, 其贯穿于整个链状结构,但只包含极少量的线性交互,故信息很容易在上面流动但不造成任何改变。

LSTM事实上可以通过一种称为“门”的结构来添加或删除单元状态上的信息。门是一种让信息选择性通过的方式,其由一个sigmoid神经网络层和一个操作点所构成。

其中sigmoid层可以输出01之间的任意数字,用以表明各个组分可以通过多少。0表示不允许任何通过,而1表示允许一切通过。

一个LSTM拥有三个这样的门来保护和控制单元状态。

循序渐进理解LSTM

LSTM的第一步是去决定我们要从单元状态中扔掉些什么,这个决策是由一个被称之为“遗忘门层”的sigmoid层来做的。对每个单元C_{t-1},其都会接受h_{t-1}x_t并输出一个01之间的数字,其中0表示完全不予通过,而1表示完全予以保留。

让我们回到那个根据全部的前文来预测下一个单词的语言模型的例子,在这类问题中,单元状态可能包含了当前主语的性别,继而可以用上正确的代词;而当我们遇到下一个主语的时候,必然要忘记老主语的性别信息。

下一步是决定我们要在单元状态中存些什么。其分为两部分:首先,一个被称为“输入门层”的sigmoid层决定了我们需要更新哪些值;其次,一个tanh层会创建一个关于可能被添加到状态中的新候选值的向量\tilde{C}_t。接下来,我们会结合这两个部分去更新状态。

在我们语言模型的例子中,我们想要向单元状态添加关于新主语的性别信息来替代我们所忘记的旧性别。

现在是时候把旧的单元状态C_{t-1}更新为新的单元状态C_t了。之前几步已经决定好要做哪些了,我们只需要事实上做出来就行。

我们把旧状态乘以f_t来忘记要忘的事,然后加上i_t*\tilde{C}_t,即新候选值根据我们的更新意愿缩放后的结果。

在我们语言模型的例子中,此处正是我们根据之前的决策来事实上丢弃旧性别信息和添加新信息的阶段。

接下来就是要决定输出什么了。该输出基于我们的单元状态,但会额外被滤除一些部分。首先,我们会用一个sigmoid层来决定具体输出单元状态的哪一部分;接下来,我们先把单元状态进行tanh运算(将值映射到-11之间),再乘上sigmoid门的输出,便得到了我们想要的部分。

对语言模型的例子来说,因为其只关注主语,所以其可能只是想输出和接下来的动词变化有关的信息。比如想输出主语是单数还是复数,这样的话如果之后出现了一个动词,它就知道该用什么形式。

LSTM的变种

目前所提到的都还只是常规的LSTM,但并非所有的LSTM都和上文所述的一样。事实上,几乎每一篇涉及到LSTM的论文所用的模型都有细微的差别。虽然差别很小,不过其中的一些还是值得提一提的。

一种由Gers&Schmidhuber(2000)提出的常见LSTM变种加入了“猫眼连接(peephole connections)”,意思是允许门层能够看到单元状态。

上图给所有的门都加装了猫眼,不过有些论文中只是给其中的某些门加装。

另一种变体则是使用成对的遗忘门和输入门。我们不再分立地去决定该遗忘或新增什么信息,而是把它们放在一次共同决策。我们只在某个位置上要输入新值时才将其遗忘,以及我们只把新值输入到那些刚要被遗忘的位置。

LSTM的一个更为显著的变体是由Cho(2014)等人引入的门控循环单元(GRU)。其将遗忘门和输入门组合成单个“更新门”,还把单元状态和隐藏状态合在了一起,以及还有一些别的改动。这样得到的模型比标准的LSTM要来得简洁,其也因此广受欢迎。

当然这里只是一小部分比较有名的LSTM变体,另外还有很多别的变体,像是Yao(2015) 等人提出的Depth Gated RNNs,以及还会有一些用完全不同的方式来解决长期依赖问题的,比如Koutnik(2015)等人提出的Clockwork RNNs.

那么到底哪种变体最好?这些差别到底有没有用?Greff等人(2015)就曾对流行的各个变体做过比较,发现没什么大的区别。另一方面,Jozefowicz等人 (2015)对超过一万种RNN架构进行了对比测试,发现其中的一些在特定任务上表现得比LSTM好。

结论

早些时候,我提到过一些人们用RNN实现的显著成果,本质上来说这些其实都是用LSTM实现的,其在大多数任务上都表现的好得多。

写出来的一堆方程式让LSTM显得挺吓人,那么希望通过本文一步步地分析解离它们,会让其更容易被接受些。

LSTM是我们用RNN完成的一大跨越。那么自然而然地要问道:是不是还有别的一大跨越存在呢?研究人员的普遍观点是:没错!还有进一步的跨越,那就是注意力!这个想法是让RNN中的每一步都去从某个更大的信息集中挑选一些信息。比如你用RNN去给图片创建一个符合其表述的标题,那么对输出的每个字词都需要挑一部分图像内容来观察。事实上,Xu等人 (2015)做的正是这个——如果你想要探索注意力领域,这可能是个有意思的起点。已经有一些用注意力做出来的非常令人兴奋的结果了,并且看起来有很多领域值得探索……

注意力并非RNN研究中唯一令人兴奋的方向:比如Kalchbrenner(2015)等人的Grid LSTM看起来就很有前途;还有像Gregor等 (2015)Chung等(2015)或是Bayer和Osendorfer(2015年)这样把RNN用在生成模型里的,看起来也非常有意思。过去的几年就RNN而言显得令人激动,并且其在接下来几年里只会变得越发如此!

致谢

我很感谢一些人帮助我更好地理解LSTM、对本文的可视化方面提出见解、以及积极提供反馈。

我也很感谢我Google的同事给予颇具帮助的反馈,尤其是Oriol VinyalsGreg CorradoJon ShlensLuke VilnisIlya Sutskever。我也感谢其他的很多朋友和同事能够花时间来帮助我,包括Dario AmodeiJacob Steinhardt。特别要感谢Kyunghyun Cho对示意图中的对应关系做出的极其深入的思考。

在本文写作之前,我曾两次在所教的神经网络研讨会上练习着解释LSTM。这里要感谢每一个耐心参与其中的人和他们的宝贵建议。

1: 除了原作者,还有很多人也为现代的LSTM做出了贡献。一个不完整的名单如下:Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo, 和Alex Graves

本文的版权归 Dappur 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据派THU

教你用PyTorch实现“看图说话”(附代码、学习资源)

6976
来自专栏机器学习、深度学习

人群计数--Mixture of Counting CNNs

Mixture of Counting CNNs: Adaptive Integration of CNNs Specialized to Specific A...

2397
来自专栏CreateAMind

【前沿跟进】Google, OpenAI提出层次强化学习新思路

1291
来自专栏量子位

轻叩次元壁——谈谈真人头像的漫画化

在这篇自带萌点的文章中,作者提出了一种新型模型TwinGAN,可以将真人头像转化成漫画风的卡通头像。打通二次元和三次元的世界的方法,都在这里面了~

1722
来自专栏AI研习社

从零开始用 TensorFlow 分析情绪,硅谷网红带你飞

Siraj Raval 作为深度学习领域的自媒体人在欧美可以说是无人不知、无人不晓。 凭借在 Youtube 上的指导视频,Siraj Raval 在全世界吸...

3996
来自专栏专知

【专知中秋呈献-PyTorch手把手深度学习教程03】LSTM快速理解与PyTorch实现: 图文+代码

首先祝各位专知好友,中秋佳节快乐! 【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工...

1K6
来自专栏达观数据

达观数据搜索引擎排序实践(下篇)

机器学习排序 机器学习排序(Machine Learning to rank, 简称MLR) 机器学习排序系统框架 机器学习排序系统一般分为离线学习系统和在线预...

53010
来自专栏新智元

图解神经网络机器翻译原理:LSTM、seq2seq到Zero-Shot

【新智元导读】这篇刊登在 blog.statsbot.co 上的博文,通过对 LSTM、BRNN、seq2seq、Zero-Shot Translation 和...

40910
来自专栏深度学习与数据挖掘实战

【AI头条&优质资源】中国AI生态报告,崛起的5大因素是?

《如何评价 DeepMind 新提出的关系网络(Relation Network)?》

1132
来自专栏媒矿工厂

HDR关键技术:HEVC/H.265编码优化

与传统标准动态范围(SDR)视频相比,高动态范围(HDR)视频由于比特深度的增加提供了更加丰富的亮区细节和暗区细节。最新的显示技术通过清晰地再现HDR视频内容使...

5690

扫码关注云+社区

领取腾讯云代金券