Understanding LSTM Networks

Understanding LSTM Networks

Posted on August 27, 2015

写在前面的译者自白

这是我尝试个人独立搜集资料、完整翻译完成的第一篇文档。虽然初衷是为了赶最近的课程大作业进度而突然开始学习LSTM模型,而所看到的翻译又不太尽如人意,不过翻译外文著作可以说是我一个拖了许久都未曾真正实现的愿望,从某种意义上来说,或许也算是梦想吧。之前看过不少外文著作的中译版,个人感觉质量参差不齐,这样的现象在理工科学术论文中尤其突出(暗自思忖可能是国内的理工科学者们大都醉心于学术科研,而无心顾及文字通顺美观与否的缘故罢…)。

对于我而言,一个优秀的译本,能够成为鼓励我继续阅读下去的重要理由,译本质量的高低,也将会直接影响到原篇表意的传达。我曾经尝试过翻译外文小说,但最终还是由于种种原因半途而废,现在想起来还是会觉得有些惋惜。理工科的三年里,我对文学的接触越来越少,行文也不再像从前那般富于灵动,因此想趁着自己还没有被折磨到完全丧失对文字的兴趣的此时此刻,再多尝试一些新的东西。

对于《Understanding LSTM Networks》这篇外文博客的翻译,我不敢说一定能够做到尽善尽美、超越前人,只是根据自己对于原篇以及LSTM网络一些粗浅的理解,从中文的角度来尝试着揣度作者所想要表达的含义。文中有不少字句的翻译可能和目前各平台上流行的翻译版本有一定出入(如我将cell state翻译成了“单元状态”而非“细胞状态”),如果令尊敬的读者朋友在阅读过程中产生了一些歧义或是难以理解之处,还望多多包涵;另外文中的一些专业术语名词的措辞可能也还不够准确(谁叫我不是科班学生呢…),欢迎各位积极指正。

最后,附上英文原篇的链接:《Understanding LSTM Networks》by Christopher Olah

最后的最后,如果对这个的翻译版本还算满意的话,可以点赞支持一下哦!心より感謝申し上げます!


循环神经网络(Recurrent Neural Networks,RNN)

人类的思考并不是每时每刻都从新的起点开始,就像你在阅读这篇文章时,你对新的内容的理解往往会基于对前述已知的内容的理解,而不是舍弃联系的断章取义。这是因为你的思想具有连贯性。

但传统的神经网络做不到这一点,这似乎也是它的一个严重缺陷。譬如说你想要对一部电影中各个时间点所发生的事件进行分类,传统神经网络要如何实现借助对之前所发生过的事件的“理性认知”(reasoning)来推测之后的事件,目前尚不明晰。

循环神经网络(RNN)则正好解决了这一问题。在RNN内部存在循环,这使得它能够让信息产生连贯性。
在这里插入图片描述
在上图中,神经网络模块A接受输入 x t x_t xt并输出 h t h_t ht(这里的输出没有用 y y y进行表示,而是采用了隐层输出 h t h_t ht)。循环的使用,让信息能够从神经网络的一次迭代传递到下一次。这些循环可能会让RNN看起来有些奇怪(mysterious),但是如果深入思考,就会发现RNN与普通的神经网络并没有那么大的区别。一个RNN网络可以被看作是同一神经网络的大量副本的集合,其中的每一个副本各自向其后继副本传递信息。想象一下如果我们将网络的循环展开后会发生什么:
在这里插入图片描述

这种链式的特征表明RNN网络与序列、列表的联系十分紧密,可以说RNN对于处理序列形式数据具有天生的适应性,并且事实证明它也确实是被广泛地运用(于处理这类问题)。最近几年RNN被成功运用于解决包括语音识别、语言建模、翻译、图片描述等在内的一系列问题。我认为应用RNN的一大壮举是Andrej Karpathy所发表的blog The Unreasonable Effectiveness of Recurrent Neural Networks。除此之外RNN还有很多其他令人惊叹的应用。

这些成功的取得,都离不开“LSTMs”(Long Short Term Memory,长短期记忆)的运用。“LSTMs”是一类十分特殊的RNN网络,它在对许多问题的处理上会远优于标准的RNN网络,几乎所有基于RNN所取得的杰出成果都离不开“LSTMs”,而这也将是本文将要探索的主题。

长期依赖(Long-Term Dependencies)问题

RNN网络的一个很吸引人的地方在于它能将过往的经验与当前的任务联系起来,比如联系之前看到过的视频画面来形成对当前视频中播放内容的理解。如果RNN网络能做到这一点,那么它将会具有极高的应用价值。但是它真的能做到吗?

那得看情况。

有时,我们只需要关注最近的一些信息,就能处理好当前的任务。试想一个语言处理模型试图通过之前所识别到的词句来推测下一个可能出现的单词,例如要推测“the clouds are in the s k y sky sky”的最后一个单词“ s k y sky sky”,在这个例子中,我们并不需要关于这个语句的更多信息——仅通过“the clouds are in the”即可以推断出最后一个单词是sky。在这类相关信息和待推测信息之间语义上联系较紧密的情况下,RNN能够有效地从先前的信息中进行学习。
在这里插入图片描述

当相关信息和待推测信息距离较近时,RNN能够有效地实现推测

但是也存在不少需要更多信息才能够解决问题的情况。例如要推测“I grew up in France… I speak fluent F r e n c h French French.”这句话中最后的单词 F r e n c h French French,最近的信息表明,这里需要填的词很可能是一门语言的名称,但如果我们想要将范围细化到哪一种语言,我们则需要更前面的关于“France”的文本。这个例子表明,有时相关信息和待推测信息在物理上可能相隔很远。

不幸的是,随着这样的间隔的增大,RNN网络会逐渐丧失信息关联的能力
在这里插入图片描述

当相关信息和待推测信息距离较远时,RNN会丧失信息关联能力

理论而言,RNN网络是绝对能够胜任这样的“长期依赖”问题的,人类可以通过仔细地为网络模型设置参数来解决一些简单初级的“长期依赖”问题,但令人沮丧的是,实际上RNN网络似乎并不能真正做到“学习”二字。Hochreiter、Bengio等人对该问题进行了深入的研究,并发现了一些使训练RNN网络变得非常困难的根本原因。

不过值得庆幸的是,LTSMs并不存在这种问题

LSTM网络

长短期记忆网络(Long Short Term Memory networks,LSTMs)是一种特殊的RNN网络,它能够从长期依赖信息中进行学习。LSTM由Hochreiter & Schmidhuber提出,并在之后被许多研究者不断完善和推广。LSTM能够较好地处理许多种问题,目前也被广泛使用。

LSTM的设计初衷就是为了避免长期依赖的问题。维持长期记忆可以说是LSTM的默认行为,而不是像令普通RNN网络一般头痛的问题。

所有的RNN网络都存在一个由重复的神经网络单元构成的链式结构,在标准RNN网络中,这个重复的单元仅仅包含一个很简单的结构,例如单一的tanh激活函数层(这个概念建议先了解一下神经网络的基础知识,例如激活函数)
在这里插入图片描述

LSTMs同样也拥有这样的链式结构,但重复神经网络单元的结构有所不同。LSTMs的神经网络单元中有4层结构,它们以特殊的方式进行交互。
在这里插入图片描述

不用担心上图中看不懂的细节问题,之后我们会一步步对LSTM的结构进行解析,就目前而言,你只需要了解一些可能会用到的符号标记:
在这里插入图片描述

在LSTM的结构图中,每一条黑线代表向量从一个神经网络节点的输出到另一个节点的输入之间的传输流;粉色圆圈代表了逐点进行的一些操作(pointwise,这个数学术语暂时没有找到比较好的翻译词汇,可以参考英文的定义Pointwise Operations),比如向量的加法;黄色方块则代表了经过学习得到的神经网络层。相交汇的线表示向量的连接与整合(concatenation),分流的线则表示数据内容被复制,并传递给不同的输入。

LSTMs的核心思想

LSTMs的关键点是单元状态(cell state,个人的理解是每个单元的记忆内容),也就是图中横贯在顶部的水平线(数据流)

单元状态的概念有点类似于通过传送带运输物品,它会沿着整条链一直向后传播,在这个过程中仅存在与外界的少量线性交互。大部分信息都能够通过这样一条数据流,维持原状进行传递。
在这里插入图片描述

LSTM通过精心设计的“门”(Gates)结构,可以对单元状态信息流进行信息的添加和删除。“门”结构由一个sigmoid神经网络层和一个计算点积的运算单元组成,可以实现让信息选择性地通过。
在这里插入图片描述

“门”结构示意图

sigmoid神经网络层的输出是[0,1]之间的一个数值,这个数值描述了“门”结构能允许多大比例的信息通过。如果输出为0,代表“不让任何信息通过”;如果输出为1,则代表“让所有信息通过”。

LSTM网络中的一个神经网络节点拥有三个这样的“门”结构,用来对单元状态信息流进行维护与控制。

逐步理解LSTM

LSTM网络的第一步是要决定哪些信息应该从单元状态中被舍弃。做出这个决定的是一个被称为“遗忘门”(forget gate layer)的sigmoid神经网络层。“遗忘门”将 x t x_t xt h t − 1 h_{t-1} ht1作为输入,输出一个向量 f t f_t ft,其与表征单元状态的向量 C t − 1 C_{t-1} Ct1维度相同, f t f_t ft的每个元素取值都在[0,1]之间,取值为1代表“完全保留”,取值为0则代表“完全舍弃”。
在这里插入图片描述

关于上述运算个人的一些理解:
在这里插入图片描述

sigmoid函数

sigmoid函数是一种逻辑回归的方式,本质上回答的是“是”和“否”问题,也即是否应该保留单元状态中的某些信息。其会根据上一层的输出向量 h t − 1 h_{t-1} ht1和新的输入向量 x t x_t xt组合后的结果,输出代表对于 C t − 1 C_{t-1} Ct1中各信息分量是否应该保留的意见 f t f_t ft向量。由于sigmoid函数在大多数的输入条件下,得到的都是接近0或接近1的值,因此 f t ⋅ C t − 1 f_t \cdot C_{t-1} ftCt1的过程,其实也就是消除一部分信息的过程。

让我们回到之前那个预测语句的语言模型的例子,对于这个特定的问题,单元状态可能包括类似“当前主语的性别”这样的信息,这些信息让模型在推测之后的内容时能够正确地使用代词(he、she、it)。当识别到新的主语时,可能就会选择性地遗忘之前主语的性别等信息。

下一步是要决定哪些新的信息是需要存储进单元状态中的。这一步主要包括两个部分:首先,通过被称为“输入门”(input gate layer)的sigmoid神经网络层来决定哪些值是需要进行更新的,结果以向量 i t i_t it的形式输出;然后,通过tanh神经网络层来创建一个更新候选值向量 C t ~ \tilde{C_t} Ct~(里面是将要在原来单元状态 C t − 1 C_{t-1} Ct1的基础上更新的信息内容)。与第一步类似地,采用 i t ⋅ C t ~ i_t \cdot \tilde{C_t} itCt~的形式来计算得到用于更新单元状态的参数,sigmoid层的输出 i t i_t it决定了 C t ~ \tilde{C_t} Ct~中哪些信息应该被保留。
在这里插入图片描述

在语言模型的例子中,这个步骤体现为将新的主语的性别信息添加到单元状态中,替换需要被遗忘掉的旧主语的信息。

下面我们将旧的单元状态 C t − 1 C_{t-1} Ct1更新成新的状态 C t C_t Ct。前面的步骤中已经详细介绍了如何实现这一过程,现在我们要做的就是来真正实现它。(其实之前的一些解释说明也已经将这部分内容介绍了一些了)

首先,对于旧的单元状态进行“遗忘”——通过对 C t − 1 C_{t-1} Ct1 f t f_t ft做点积来实现;然后加入新的单元状态信息,即 i t ⋅ C t ~ i_t \cdot \tilde{C_t} itCt~,其中 C t ~ \tilde{C_t} Ct~是更新候选值的向量集合,而 i t i_t it则描述了对应于每一个更新候选值、将其纳入模型中的比例。
在这里插入图片描述

在语言模型的例子中,这一步正好对应于实现前两步中提到的将旧主语的性别信息舍弃、同时添加新主语的性别信息的操作。

最后,我们需要确定模型的输出(这个也可以被称作是“输出门”(output gate layer))。输出应当以单元状态的信息为基础,但是在输出之前,需要对单元状态的信息做一次过滤。首先,通过一个sigmoid神经网络层来筛选出单元状态中需要被输出的信息(原理同之前所述),该层的输入为 [ h t − 1 , x t ] [h_{t-1}, x_t] [ht1,xt],输出为 o t o_t ot;与此同时,将单元状态通过tanh层将数值标准化到 [ − 1 , 1 ] [-1,1] [1,1]区间内。最后将二者点乘,以实现仅输出经过筛选后的信息。
在这里插入图片描述

在语言模型的例子中,模型刚刚捕捉到了一个主语,那么它也许会想要输出关于动词的信息,因为模型认为之后大概率会出现一个动词。例如,模型可能会描述主语是单数还是复数,以便让我们了解之后也许会出现的动词应该变化成什么人称形式。

LSTM的变体

到目前为止,我所描述的都是一个十分正常的LSTM网络,但并不是所有的LSTM网络都和上述提到的结构一样。事实上,似乎所有与LSTM网络相关的论文中,用到的网络模型都或多或少会有所不同。也许它们之间的区别并不显著,但其中一部分还是值得一提。

由Gers & Schmidhuber提出的一个比较流行的LSTM变体,是向模型中添加“窥视孔连接”(peephole connection,个人的理解是类似一种监督的机制)——将单元状态作为“门”结构的输入:
在这里插入图片描述

在上图中,每个“门”结构(遗忘门、输入门、输出门)都添加了“窥视孔”(peephole)——来自单元状态的数据输入。但许多的论文中有时会仅为一部分“门”结构添加“窥视孔”。

另外一种变体是使用相互耦合(coupled)的“遗忘门”和“输出门”。但在标准的LSTM中,决定什么应该被网络遗忘和什么应该被添加到网络中的过程是相互独立的,但在这种变体中,二者是协同进行的。只有当需要向网络中输入新信息时,才会将原有的信息遗忘;同时,只有当单元状态将旧有的信息遗忘时,才会向单元状态中添加新的值。[说实话这一段有一点玄学QAQ]
在这里插入图片描述

LSTM一个差异稍大的变体是GRU(Gated Recurrent Unit,门控循环单元),它由Cho提出。GRU将“遗忘门”与“输入门”整合成了统一的“更新门”(update gate),同时合并了单元状态数据流与隐藏状态(hidden state)数据流(也就是之前图中位于下方的 h t h_t ht),并做了一些其他改动。最后的结果是,GRU模型比标准的LSTM模型要更简化,目前也正在变得越来越流行。
在这里插入图片描述

这里仅列举了几例较为有代表性的LSTM模型变体,还有很多其他类型的变体,例如Yao等人提出的深度门限RNNs(Depth Gated RNNs)。同样也有很多其他完全不同的方式来解决长期依赖的问题,如Koutnik等人提出的Clockwork RNNs。

这些变体中哪一种是最好的?它们之间的差异性会(对解决问题)有很大影响吗?Greff等人做了关于常用变体的详细比较,发现它们基本上是一样的。Jozefowicz等人测试了超过一万种RNN架构,发现其中有一部分在处理某些任务上的性能优于LSTM网络。

总结

在文章的开头,我提到了人们通过RNNs实现的重要成果。本质上所有这些成果都离不开LSTMs的运用,因为LSTMs确实在解决大多数任务上都有着更好的表现!

从之前图中的一系列艰涩的表达式来看,LSTMs看起来似乎非常吓人,但好在经过本文一步步的梳理之后,这个模型或许变得平易近人了一些。[笑]

LSTMs是运用RNNs过程中取得的一个极大进展。这会让我们很自然地想:这一领域是否还将取得其他更大的进展呢?研究者们普遍的观点是:“是的!肯定会更进一步,而这一步的关键在于信息的聚焦(attention)!”这一观点背后的思想,是让RNN网络中的每一步都从较大的信息库中选择一部分信息进行聚焦。例如当你用RNN网络来生成描述某张图片的说明文字时,它可能会选择图片中的某一部分来作为生成输出文本的依据。事实上,这正是Xu等人正在做的研究——如果你想要了解更多关于这一方向的内容,这将会是一个有意思的引入。目前有大量利用attention得到的令人振奋的研究成果,并且未来新的研究成果还将不断涌现……

Attention并不是RNN研究唯一的热点——Kalchbrenner等人提出的梯度LSTMs(Grid LSTMs)的发展前景十分可观,将RNN网络运用于生成模型(generative models)的研究同样也很有趣。过去的几年是RNN蓬勃发展的时期,而未来将更是如此!

参考文章:
《Understanding LSTM Networks》译者:朱小虎 Xiaohu (Neil) Zhu(CSAGI / University AI)

如何从RNN起步,一步一步通俗理解LSTM

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值