Press "Enter" to skip to content

如何通俗理解LSTM

如何通俗理解LSTM

 

前言

 

提到LSTM,之前学过的同学可能最先想到的是ChristopherOlah的博文《 理解LSTM网络》,这篇文章确实厉害,网上流传也相当之广,而且当你看过了网上很多关于LSTM的文章之后,你会发现这篇文章是最经典的。不过呢,如果你是第一次看LSTM,则原文可能会给你带来些许障碍:

 

一者,原文一上来没有对那三个门解释的足够细致,包括三个不同的sigmoid函数,用的同一个符号σ(有错幺?没错,看多了就会明白这是习惯用法)。

 

二者,不同的权值也用的同一个符号w,而当把符号、公式、关系一一对应清楚后,初学就不会一脸懵逼了。甚至如果我们把各个式子的计算过程用有方向的水流表示出来,则会好懂不少,这个时候就需要用到动图了。

 

众所周知,我们已经把SVM、CNN、xgboost等很多技术,写的/讲的国内最通俗易懂了,接下来,我们要把LSTM、BERT也写的/讲的国内最通俗易懂,不单单是从Word2Vec->Seq2Seq->Seq2SeqwithAttention->Transformer->BERT,我们希望给所有AI初学者铺路:一步一个台阶,而不是出现理解断层。

 

话不多说,本文在ChristopherOlah博文《理解LSTM网络》的基础上做了大量便于理解的说明/注解,一切为更好懂。

 

一、RecurrentNeuralNetworks

 

人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。

 

传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。

 

RNN解决了这个问题。RNN是包含循环的网络,允许信息的持久化。

RNN包含循环

在上面的示例图中,神经网络的模块
,正在读取某个输入
,并输出一个值

。循环可以使得信息可以从当前步传递到下一步。

 

这些循环使得RNN看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

展开的RNN

 

链式的特征揭示了RNN本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。

 

并且RNN也已经被人们应用了!在过去几年中,应用RNN在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。我建议大家参考AndrejKarpathy的博客文章——TheUnreasonableEffectivenessofRecurrentNeuralNetworks来看看更丰富有趣的RNN的成功应用。

 

而这些成功应用的关键之处就是LSTM的使用,这是一种特别的RNN,比标准的RNN在很多的任务上都表现得更好。几乎所有的令人振奋的关于RNN的结果都是通过LSTM达到的。这篇博文也会就LSTM进行展开。

 

二、长期依赖(Long-TermDependencies)问题

 

RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果RNN可以做到这个,他们就变得非常有用。但是真的可以幺?答案是,还有很多依赖因素。

 

有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测“thecloudsareinthesky”最后的词,我们并不需要任何其他的上下文——因此下一个词很显然就应该是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN可以学会使用先前的信息。

不太长的相关信息和位置间隔

 

但是同样会有一些更加复杂的场景。假设我们试着去预测“IgrewupinFrance…IspeakfluentFrench”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什幺语言,我们是需要先前提到的离当前位置很远的France的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

 

不幸的是,在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力。

相当长的相关信息和位置间隔

 

在理论上,RNN绝对可以处理这样的长期依赖问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN肯定不能够成功学习到这些知识。Bengio,etal.(1994)等人对该问题进行了深入的研究,他们发现一些使训练RNN变得非常困难的相当根本的原因。

 

换句话说, RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。

 

因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。​

 

 

因此,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

 

然而,幸运的是,LSTM并没有这个问题!

 

三、LSTM网络

LongShortTerm网络——一般就叫做LSTM——是一种RNN特殊的类型,可以学习长期依赖信息。如@寒小阳所说:LSTM和基线RNN并没有特别大的结构不同,但是它们用了不同的函数来计算隐状态。LSTM的“记忆”我们叫做细胞/cells,你可以直接把它们想做黑盒,这个黑盒的输入为前状态
和当前输入

。这些“细胞”会决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。实际的应用中发现,这种方式可以有效地保存很长时间之前的关联信息。

 

举个例子,当你想在网上购买生活用品时,一般都会查看一下此前已购买该商品用户的评价。


当你浏览评论时,你的大脑下意识地只会记住重要的关键词,比如“amazing”和“awsome”这样的词汇,而不太会关心“this”、“give”、“all”、“should”等字样。如果朋友第二天问你用户评价都说了什幺,那你可能不会一字不漏地记住它,而是会说出但大脑里记得的主要观点,比如“下次肯定还会来买”,那其他一些无关紧要的内容自然会从记忆中逐渐消失。

而这基本上就像是 LSTM 或 GRU 所做的那样,它们可以学习只保留相关信息来进行预测,并忘记不相关的数据。

 

LSTM由Hochreiter&Schmidhuber(1997)提出,并在近期被AlexGraves进行了改良和推广。在很多问题,LSTM都取得相当巨大的成功,并得到了广泛的使用。

 

LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是LSTM的默认行为,而非需要付出很大代价才能获得的能力!

 

所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。

标准RNN中的重复模块包含单一的层

 

激活函数 Tanh 作用在于帮助调节流经网络的值,使得数值始终限制在 -1 和 1 之间。

LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

LSTM中的重复模块包含四个交互的层

 

不必担心这里的细节。我们会一步一步地剖析LSTM解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。

LSTM中的图标

 

在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表pointwise的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

 

四、LSTM的核心思想

 

LSTM的关键就是细胞状态,水平线在图上方贯穿运行。

 

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个sigmoid神经网络层和一个pointwise乘法操作。

Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到 0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息,因为任何数乘以 0 都得 0,这部分信息就会剔除掉。同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。

如此,0代表“不许任何量通过”,1就指“允许任意量通过”!从而使得网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。

 

LSTM拥有三个门,来保护和控制细胞状态。

 

五、逐步理解LSTM

 

5.1忘记门

在我们LSTM中的第一步是决定我们会从细胞状态中丢弃什幺信息。这个决定通过一个称为“忘记门”的结构完成。该忘记门会读取

,输出一个在0到1之间的数值赋值给每个在细胞状态

中的数字,1表示完全保留,0表示完全舍弃。

 

让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

决定丢弃信息

 

5.2输入门

 

下一步是确定什幺样的新信息被存放在细胞状态中。这里包含两个部分:

 

第一,sigmoid层称“输入门层”决定什幺值我们将要更新;

第二,一个tanh层创建一个新的候选值向量

,会被加入到状态中。

 

下一步,我们会讲这两个信息来产生对状态的更新。

 

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。

确定更新的信息

 

5.3细胞状态

现在是更新旧细胞状态的时间了,
更新为

。前面的步骤已经决定了将会做什幺,我们现在就是实际去完成。

我们把旧状态与
相乘,丢弃掉我们确定需要丢弃的信息。接着加上

。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

 

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

更新细胞状态

 

5.4输出门

 

最终,我们需要确定输出什幺值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。

 

首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。

 

接着,我们把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

 

在语言模型的例子中,因为他就看到了一个代词,可能需要输出与一个动词相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

输出信息

 

六、LSTM的变体

 

我们到目前为止都还在介绍正常的LSTM。但是不是所有的LSTM都长成一个样子的。实际上,几乎所有包含LSTM的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。

 

其中一个流形的LSTM变体,就是由Gers&Schmidhuber(2000)提出的,增加了“peepholeconnection”。是说,我们让门层也会接受细胞状态的输入。

peephole连接

 

上面的图例中,我们增加了peephole到每个门上,但是许多论文会加入部分的peephole而非所有都加。

 

另一个变体是通过使用coupled忘记和输入门。不同于之前是分开确定什幺忘记和需要添加什幺新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态。

coupled忘记门和输入门

 

另一个改动较大的变体是GatedRecurrentUnit(GRU),这是由Cho,etal.(2014)提出。它将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的LSTM模型要简单,也是非常流行的变体。

GRU

 

这里只是部分流行的LSTM变体。当然还有很多其他的,如Yao,etal.(2015)提出的DepthGatedRNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik,etal.(2014)提出的ClockworkRNN。

 

要问哪个变体是最好的?其中的差异性真的重要吗?Greff,etal.(2015)给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz,etal.(2015)则在超过1万种RNN架构上进行了测试,发现一些架构在某些任务上也取得了比LSTM更好的结果。

 

七、参考文献

ChristopherOlah的博文《理解LSTM网络
通过一张张动图形象的理解LSTM

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注