TensorFlow2.0(十一)--理解LSTM网络

前言

本文内容摘自著名博客文章Understanding LSTM Networks, 思维导图链接:读书笔记–《Understanding LSTM Networks》

1. 循环神经网络

我们从来不会从头思考,比如当你看到这句话时,你理解每个字的含义,因为你记住了之前的字和句子,这是因为我们的大脑有记忆的能力。传统的神经网络并不能做到向我们这样理解文章和句子,这是它主要的缺点。举个例子,想像一下你想对电影的每个片段发生的事情进行分类,但是目前还不清楚一个传统的普通网络如何利用它对电影中先前事件的推理来预测后来的事件。循环神经网络解决了这个问题,其是一个自带循环的网络结构,该结构可以使信息保存下来。
TensorFlow2.0(十一)--理解LSTM网络

图1.1 自带反馈的循环神经网络
-

在图1.1中,AA是一个神经网络块,输入是XtX_t,输出为hth_t, AA自带的循环能够使信息从网络的一个步传递到下一个步。这些循环使得循环神经网络看起来有点神秘。然而,如果你再多想一想,就会发现它们和普通的神经网络并没有什么不同。一个循环神经网络可以被认为是同一个网络的多个副本,每个副本都将一条消息传递给一个继任者。如果我们展开循环的话:
TensorFlow2.0(十一)--理解LSTM网络

图1.2 一个展开的循环神经网络
-

这种链式结构揭示了循环神经网络与序列密切关系。在过去的几年里,RNN在许多问题上都取得了令人难以置信的成功:语音识别、语言建模、翻译、图像字幕等等。这些成功的关键是LSTM的使用,LSTM是一种非常特殊的循环神经网络,在许多任务中都比标准的RNN好得多,几乎所有基于循环神经网络的令人兴奋的结果都是用它们实现的。本文将探讨LSTM的原理与结构。

2. 长期依赖问题

RNN的一个优点是它可以将先前的信息连接到当前的任务,例如使用先前的视频帧可以加深对当前帧的理解。如果RNN可以做到这一点,它们将非常有用。但是事实是这样的吗?

有时,我们只需要查看最近的信息来执行当前任务。例如,假设一个语言模型试图根据前面的单词预测下一个单词。如果我们试图预测 “云在天空” 中的最后一个词,我们不需要任何进一步的上下文理解,很明显下一个词将是天空。在这种情况下,如果相关信息和所需位置之间的差距很小(如图2.1所示),RNN可以学习使用过去的信息。不幸的是,随着距离的增加,RNN将无法胜任这个工作。
TensorFlow2.0(十一)--理解LSTM网络

图2.1 相关信息和预测信息的位置较近时

TensorFlow2.0(十一)--理解LSTM网络

图2.2 相关信息和预测信息的位置较远时
-

从理论上讲,RNN绝对有能力处理这样的“长期依赖关系”,人类可以仔细地为它们选择参数来解决这种形式的问题。不幸的是,在实践中,RNN似乎无法学习它们。Hochreite和Bengio等人深入探讨了这个问题,发现这可能是困难的。不过还好,LSTM网络没有这个问题。

3. LSTM网络

长短期记忆网络通常被称为“LSTM”,是一种特殊的RNN,能够学习长期依赖性。它们在许多问题上都非常有效,现在得到了广泛的应用。LSTM是为了避免长期依赖性问题而设计的。所有的循环神经网络都具有神经网络的一系列重复模块的形式。在标准RNN中(图3.1),这个重复模块有一个非常简单的结构,比如一个tanh层:
TensorFlow2.0(十一)--理解LSTM网络

图3.1 包含单个层的标准RNN中的重复模块
-

LSTMs也有这种链式结构,但是重复模块有不同的结构。如图3.2所示,与单一的神经网络层不同,这里有四层,以一种非常特殊的方式相互作用:
TensorFlow2.0(十一)--理解LSTM网络

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

看不懂图3.2的结构没关系,稍后我们将逐步解析LSTM结构。现在,我们先熟悉一下我们将要使用的符号。
TensorFlow2.0(十一)--理解LSTM网络

图3.3 结构图中符号含义
-

在图3.3中,粉红色的圆圈表示逐点的运算操作,如向量加法,而黄色的盒子是可学习的神经网络层。行合并表示连接,而行分叉表示其内容被复制,并且复制到不同的位置。

4. LSTM背后的核心思想

LSTM的关键是单元状态,即穿过图4.1顶部的水平线。单元的状态有点像传送带。它沿着整个链一直走,只有一些微小的线性相互作用。信息很容易在不改变的情况下流动。
TensorFlow2.0(十一)--理解LSTM网络

图4.1 LSTM中单元的状态传递
-

LSTM确实有能力将信息移除或添加到单元状态,并由称为的结构进行调节。门是一种选择性地让信息通过的方式。它们由一个sigmoid神经网络层和一个逐点乘法运算组成,如图4.2所示:
TensorFlow2.0(十一)--理解LSTM网络

图4.2 LSTM中的门结构
-

sigmoid层输出0到1之间的数字,描述每个成分应通过的量。值为0表示不让任何信息通过,值为1表示让所有信息通过。一个LSTM有三个这样的门,分别为遗忘门,输入门与输出门,用来控制单元的状态。

5. 单步解析LSTM网络结构

5.1 遗忘门结构

LSTM的第一步是决定我们将从单元(cell)状态中丢弃哪些信息。这个步骤是由一个称为“遗忘门”的sigmoid层做出的,如图5.1所示。它合并 ht1h_{t-1}xtx_t,经过一个sigmoid层并为输出一个0到1之间的数字。1表示“完全保留此项”,0表示“完全删除此项”。

让我们回到一个语言模型的例子,它试图根据前面的所有单词预测下一个单词。在这样一个问题中,cell的状态可能包含了当前主语的性别,因此可以使用正确的代词。当我们看到一个新的主题,我们就可以根据遗忘门忘记旧主题的性别。
TensorFlow2.0(十一)--理解LSTM网络

图5.1 遗忘门结构
5.2 输入门结构

第二步是决定我们将在cell状态下更新哪些新信息。首先,一个称为“输入门”的sigmoid层决定我们要更新哪些值(图5.2)。其次,tanh层创建一个新的候选值向量Ct~\tilde{C_t},添加到状态中。在下一步中,我们将结合这两个步骤来创建状态更新。回到我们的语言模型的例子中,我们希望将新主题的性别添加到细胞状态中,以取代我们忘记的旧主题。这就是输入门要起的作用。
TensorFlow2.0(十一)--理解LSTM网络

图5.2 输入门结构
-

现在是时候将旧的cell状态Ct1{C_{t-1}}更新为新的单元状态Ct{C_t}了。我们把旧状态Ct1{C_{t-1}}乘以ftf_t,遗忘之前决定忘记的事情。然后我们把它加上itCt~i_t*\tilde{C_t}Ct~\tilde{C_t}是新的候选值,乘以iti_t是根据我们决定更新每个状态值的程度进行缩放。

在语言模型的例子中,这是我们实际删除旧主题的性别信息并添加新信息的地方,正如我们在前面的步骤中所决定的那样。
TensorFlow2.0(十一)--理解LSTM网络

图5.3 更新cell状态
5.3 输出门结构

最后,我们需要决定我们要输出什么。此输出将基于单元(cell)状态,但将是过滤之后的版本。如图5.4所示,我们运行一个sigmoid层,它决定了我们要输出的cell状态的哪些部分。然后,我们通过tanh(将值推到-1和1之间)将cell状态乘以sigmoid层的输出,这样我们只输出我们决定的部分。

对于语言模型的例子,因为它只是看到了一个主题,所以它可能希望输出与动词相关的信息,以防下一步是这样。例如,它可能会输出主语是单数还是复数,这样我们就知道如果下一个主语是单数或复数,那么动词应该是什么形式。
TensorFlow2.0(十一)--理解LSTM网络

图5.4 输出门结构

6. LSTM结构的变体

6.1 增加窥视孔连接的LSTM

本文描述的是一个标准的LSTM。但并非所有的LSTM都与上述相同。事实上,几乎所有涉及LSTM的论文都使用了略有不同的版本。差别不大,但值得一提。由Gers&Schmidhuber(2000)引入的一种流行的LSTM变体是添加“窥视孔连接”,这意味着我们让门层查看单元状态。图6.1在所有的门上都增加了窥视孔,但是许多论文只增加一些窥视孔而不是全部。
TensorFlow2.0(十一)--理解LSTM网络

图6.1 增加窥视孔连接的LSTM结构
6.2 耦合遗忘门和输入门的LSTM

图6.2所示的另一种变体是使用耦合的遗忘门和输入门。我们不是单独决定要忘记什么和应该添加什么新信息,而是一起做出这些决定。我们只会忘记什么时候我们要在它的位置输入一些东西。我们只在忘记旧的东西时才向状态输入新值。

TensorFlow2.0(十一)--理解LSTM网络

图6.2 耦合遗忘门和输入门的LSTM结构
6.3 GRU

LSTM的一个影响比较大的变化是Cho等人引入的门循环单位(GRU:Gate Recurrent Unit)。如图6.3所示,它将遗忘门和输入门合并为一个“更新门”,还合并了单元(cell)状态和隐藏状态,并进行了一些其他更改。由此产生的模型比标准的LSTM模型简单,并且越来越受欢迎。
TensorFlow2.0(十一)--理解LSTM网络

图6.3 门循环网络结构