品味LSTM的细枝末节

品味LSTM的细枝末节

目录:

  1. 闲聊
  2. RNN介绍
  3. RNN两大问题
  4. LSTM介绍
  5. 细说LSTM
  6. 总结

一、闲聊

🤔 人们能够理解语言,从来不是从开始,而是根据以往经验来做出判断。故“以往经验”对于判断与认知是十分重要的,设想一下,人类如果没有“经验”(记忆)或只有三秒记忆,那跟咸鱼有什么区别,人类就不会有什么文明。

就好比如人们想要去读一篇散文,从来都不是每次都要从学认字开始,而是根据自己长期积累的文字和语感知识来理解其中含义。

传统机器学习在处理序列数据上,就在记忆力上有缺点。比如前馈神经网络中每一层 N_t 对前一层 N_{t-1} 的输出作处理后,就将处理后的数据交给下一层 N_{t+1} ,并没有将 N_{t-1} 的数据传递给 N_{t+1} ,这样就导致了数据丢失,即使有残差网络,但是能记住的也只是指定某一层的数据,并不能根据数据来动态调整那一层需要记忆那些信息,最终的效果也是非常差。而RNN就具有记住能力,比如LSTM中就可以对部分数据进行遗忘和记忆。

在自然语言处理中,很多领域都需要结合句子上下文才能够处理的更恰当,比如自动问答,机器翻译,人机对话等任务中都需要通过历史信息中提取出对应信息,然后做出对应的回答。这也是站在人的角度来思考问题的一种方式,也是我们让电脑去思考的最好方式。

二、RNN

概念

RNN能够在一定程度上记住之前的知识,通过训练序列数据,能够记住某词前面出现的词语,这样就能产生些许“经验”。不要以为这个功能很简单,其实大有作用,就好比如,你说上一句,它就知道下一句是啥? 而且实践证明RNN在序列数据提取方面已经开始崭露头角🙉,不过仍需进一步研究,比如后续的Attention机制。 要知道其工作原理,需要了解去模型图。如下图所示


LSTM

公式图

X_t 是输入序列中某一个单元, h_t 为输出序列的某一个单元。上图是RNN缩略图,也是一个自循环图,看起来一点都不形象,将其展开后如下图所示:

是不是感觉清晰多了,熟悉多了。

举个栗子

举一个非常简单的例子,让RNN看10000次"我爱你,我也爱你 💖💖💖" 后,此时她的眼里只有你,当我们问RNN:"我爱你"时,RNN会毫不犹豫的回答"我也爱你💖💖💖"。此案例中,RNN眼里只有[我,爱,你,也]四个词,甚至都没有一个字,并且在她的认知里面,“我爱你”后面只会有“我也爱你”的情况,没有第三+者,这只是一个很简单的例子,可现实中的情况会复杂的多,RNN会看各种各样的事情,出现的频率也不同,则根据前后序列的关联性创建不同的权重。

三、RNN两大问题

RNN虽好,可是有两大致命问题:

  • 梯度消失
  • Long-Term Dependency

3.1 梯度消失

要解释好这个问题,没有严格的公式推导是不行的,所以请转到我另外一篇文章,其中解释了为什么RNN会出现梯度消失问题以及LSTM是如何解决梯度消失的问题。大家在看这篇文章的时候一定要手拿笔和纸进行演算,这样才能够理解的更透彻。

3.2 Long Term Dependency 问题

RNN最吸引我们的一个地方就是能够提取序列中的历史信息应用到当前任务当中,在逻辑上更贴近人类的思维过程,很多stat-of-art的模型都是基于RNN,实践效果也是很好。

然而,然而,然而,还是有很严重的问题:虽然能够记住历史信息,可,这是就近记住所有信息。这里的重点是就近所有。

  • 就近:虽然大多数情况下我们只需要记住最近的信息,可是这样的记忆力是否也太短暂了,用我们人类的理解就是这样的模型也只能够做一些简单的事情(用在人的身上也是如此)。
  • 所有:记住所有的信息,实际上是没有重点的,这样的信息对于自己而言是没有意义的。所有的信息都是重点,其实是没有重点,而且还是越近越是重点。

在机器翻译领域,有一个直观的例子:Tom likes eating humberger,who studies at Beijing University。或者 I grew up in France ,…, I speak fluent Franch.

当在翻译who的时候,很明显是指向Tom,可是当在翻译who的时候,CellState的humberger权重比Tom更大,记的更清楚。当我们要预测Franch这个单词的时候,就需要从历史信息中提取出France这个单词,然后预测出Franch,可是RNN由于梯度消失和记忆力问题,无法获取远距离信息,故导致这些信息获取的效果非常差。

就好比如 h_{t+1} 的时候,需要使用到 x_0x_1 信息,RNN对此是没有能力解决。这个问题被称之为Long-Term Dependency Problems。

这个问题,LSTM都没有,都没有,都没有。再说,又不看看LSTM(Long Short-term Memory)的名字。

四、LSTM术语


🔥 上图就是LSTM内部的模型图。在介绍LSTM之前,cue一下基本符号与概念:

  • 基本符号


  • Cell State 存储当前Cell的状态信息,包含数据的序列信息。比如当输入为“I love you”时,第三个cell中能够保存“I”和“Love”的信息,那么第三个Cell就可以大概率预测出“you”。
  • Gate Gate主要是控制在Cell State添加或删除信息,由上图中的Sigmoid函数和点乘操作组成。每个输入和历史CellState都是需要进行选择性记忆和遗忘,这个记忆和遗忘就是在不同阶段给不同对象不同的权重。比如LSTM在读过“I Love”之后,“you”的记忆可能比较明确和清晰(权重比较大),而“him”的记忆可能比较模糊(权重比较小),究其原因还是因为“you”在“I Love”附近转悠的次数比较多而已。 此外,Sigmoid函数输出在(0,1)之间,当输出为0的时候,不让当前信息流入到Cell State中;当输出为1的时候,就当前信息全部流入到Cell State中。
  • _{x_t} 是输入序列中第t个元素
  • _{h_t} 是输出序列中第t个元素


上图展示了 {C_t-1} 如何变成{C_t}。LSTM中的关键是每个单元格的状态(cell state),而这个单元格状态就类似于传送带,能够将一些信息沿着序列数据一直传递到序列最低端,且每经过一个cell,都能够携带上该单元格的信息,这样后面的单元格是知道之前序列的数据,故具有记忆的功能。

五、细说LSTM

接下来将一步一步的讲解LSTM中不同模块,逐层解剖出核心含义。

(1)选择性遗忘

决定之前的经验({C_t-1} ),有多少能够流向下一个Cell State( {C_t} ),具体公式如下图所示:


如何遗忘,是由一个“Forget Gate Layer”控制的,上图所示便是。由 {h_t-1} {x_t} 经过 sigmoid 函数之后输出一个(0,1)的数字,而这个数字就决定了上一个Cell State 有多少信息能够流向下一个Cell State

(2)选择性记忆

接下来就是要根据当前序列元素的输入和上一个输出来选择性记忆,决定哪些信息需要存储到Cell State中。而这个过程就包含两个过程,如下图所示:


第一个过程是由“Input Gate Layer”组成,此层决定了我们要把输入信息中的哪些信息输入嵌入到当前的Cell State中。第二个过程就是通过Tanh创建一个 \tilde{C_t} 通过与 _{i_t} 的组合来决定哪些信息是需要保存下来的。

在实际案例中就类似于上文中的“我喜欢打乒乓球”选择性的加入到到新的Cell State中。 _{i_t}\tilde{C_t} 共同决定“乒乓球”加入到我的爱好列表中。

(3)New Cell State

Old Cell State是如何变成New Cell State呢?如下图所示:



首先对Old Cell State进行选择性遗忘,然后对Input进行选择性记忆,然后加起来就是New Cell State。这个过程就比较容易理解了。

(4)输出

输出是根据当前Cell State,上一个输出,和当前输入决定的。具体的逻辑图如下所示:


与“Forget Gate Layer”相反, 通过上一个输出和当前输入,决定当前输入信息有多少信息可以影响输出。最终生成一个(0,1)的比例数据。另外上一个 Cell State 通过tanh后再和 {o_t} 点乘, 就可生成当前Cell 的输出 {h_t}

LSTM是具有在cell上添加删除信息的功能,而这个功能结构化的表现为Gate,中文理解为门阀。门阀是让数据能够一直在序列数据上流下去的关键。上图就是一个门阀,由一个sigmoid函数和矩阵点乘组成。

在实际应用当中,有这样的一个场景,我们要判断一个动词是单数还是复数,就需要知道主语是单数还是复数。

六、summary

🔥 LSTM能够保存训练过程中的序列信息,并通过Gate能够决定哪些信息需要记住,删除,和读取,就类似于计算机的内存存储。每个Cell能够根据对应输入和上一个输出决定接下来我要存储哪些信息,遗忘哪些信息,然后组装成记忆存储起来,同时产生对应的输出。

实践证明,虽然LSTM能够看到序列信息,可那是一股脑记住前面一段文本内的所有内容,这会导致在一些任务(比如机器翻译)中,让预测找不到重点,因为LSTM认为我所记住的都是重点。不过现在的学者已经研究出Attention机制,能够很好的解决重点这个问题。


LSTM的应用可不只是这些,BiLSTM就是其扩展,能够获取双向信息,在encoder-decoder模型中基本上占据主导地位,此在还有attention的加持,在各类任务中的效果也是杠杠的,此篇文章只是冰山一角,有兴趣的知友们可以自行探索,我所有的文章都会根据自己的学习历程不断更新,欢迎点赞关注加收藏~~~~

参考链接:

- Understanding LSTM

- wiki-lstm

编辑于 2019-12-07

文章被以下专栏收录