之前博客中有涉及前两部分的介绍:
第一部分LSTM-理解 Part-1(RNN:循环神经网络)
第二部分LSTM-理解 Part-2(RNN的局限性)
这是其中的第三部分,讲解 LSTM Networks。
LSTM Networks
长短期记忆网络(Long Short Term Memory networks)
长短期记忆网络(Long Short Term Memory networks),通常简称为“LSTM”,是一种特殊的循环神经网络,能够学习长期依赖关系。它们由Hochreiter和Schmidhuber于1997年提出,并在后续工作中得到了许多人的改进和普及。它们在各种问题上表现出色,现在被广泛使用。
LSTM明确设计为避免长期依赖问题。记住信息长时间是它们的默认行为,而不是它们难以学习的东西!
所有循环神经网络都具有神经网络重复模块链的形式。在标准的RNN中,这个重复模块的结构非常简单,比如只有一个tanh层。
标准循环神经网络中的重复模块包含一个单层。
在标准的RNN中,每个时间步的输入都会传入一个神经网络单元,该单元会使用当前输入以及前一时间步的隐藏状态作为输入,经过一个非线性的激活函数进行转换,生成新的隐藏状态,作为下一时间步的输入。这个单元的结构通常比较简单,只包含一个单层神经网络,也就是说,它的内部只包含一个线性变换和一个激活函数。这样设计的原因是为了减少计算量和参数数量,以便在处理大规模数据时能够更有效地训练和使用RNN模型。然而,这种简单的结构也导致了RNN在处理长序列时很容易出现梯度消失或梯度爆炸的问题。
LSTMs也具有链状结构,但重复模块的结构不同。它不是只包含一个神经网络层,而是包含四个神经网络层,这四个层以非常特殊的方式相互交互。
LSTM 中的重复模块包含四个相互作用的层。
当我们构建一个LSTM网络时,每个时间步都包含四个主要的交互层:输入门、遗忘门、输出门和记忆单元。这些层都被设计成互相交互以使网络可以更好地捕捉长期依赖关系。
输入门决定什么信息将被添加到记忆单元中。它首先通过一个Sigmoid层将输入数据进行筛选,确定哪些信息要被保留。然后,一个tanh层将输入数据进行处理,生成一个可以被添加到记忆单元中的新信息。
遗忘门决定哪些信息需要从记忆单元中删除。它也由一个Sigmoid层和一个tanh层组成。Sigmoid层首先决定哪些信息需要被遗忘,然后tanh层根据这个信息删除相应的内容。
输出门决定从记忆单元中提取哪些信息。输出门包含一个Sigmoid层和一个tanh层。Sigmoid层确定需要输出的信息,tanh层将它们处理成可以传递给下一层的格式。
最后,记忆单元就是一个内部状态,记录了在时间序列上之前的所有信息,并将它们传递给当前时间步。这种内部状态可以让LSTM网络更好地记住先前的信息,从而更好地处理长期依赖关系。
不要担心正在发生的细节。稍后我们将逐步介绍LSTM图表。现在,让我们只是试图熟悉我们将使用的符号。
在上面的图中,每条线(第3个)都携带一个整个向量,从一个节点的输出到其他节点的输入。粉色圆圈(第2个)表示逐点操作,例如向量加法,而黄色框(第1个)表示学习的神经网络层。线的合并(第4个)表示串联,而线的分叉(第5个)表示其内容被复制,并将副本发送到不同的位置。这里的符号表示可能比较陌生,但在后面的解释中,我们会逐步介绍每个符号的含义。
The Core Idea Behind LSTMs
LSTMs的核心思想
LSTM的关键在于细胞状态(cell state),它是图示中从上到下的水平线(见下)。
细胞状态有点像传送带。它沿着整个链条直线向下运行,只有一些微小的线性交互。信息很容易沿着它不变地流动。
LSTM具有删除或添加信息到cell state的能力,这是由门结构精细调控实现的。
门是一种可选地通过信息的方式。它们由sigmoid神经网络层和逐点乘法操作组成。
Sigmoid层输出0到1之间的数字,描述了每个组件应该通过多少。值为0表示“不让任何东西通过”,而值为1表示“让所有东西通过”!
LSTM有三个这样的门,用于保护和控制单元状态。
Step-by-Step LSTM Walk Through
逐步解析 LSTM
在 LSTM 中的第一步是决定我们要从单元状态中删除哪些信息。这个决策是由一个称为“遗忘门层”的 Sigmoid 层做出的。它查看 h t − 1 h_{t−1} ht−1 和 x t x_t xt,并为单元状态 C t − 1 C_{t−1} Ct−1 中的每个数字输出介于 0 和 1 之间的一个数。1 表示“完全保留”,而 0 表示“完全舍弃”。
让我们回到一个语言模型的例子,该模型试图基于之前的所有单词来预测下一个单词。在这样的问题中,单元状态可能包括当前主体的性别,以便可以使用正确的代词。当我们看到一个新主体时,我们希望忘记旧主体的性别。
下一步是决定我们要将什么新信息存储在细胞状态中。这包含两个部分。首先,一个称为“输入门层”的sigmoid层决定我们将更新哪些值。接下来,一个tanh层创建一个新的候选值向量 C ~ t \tilde{C}_{t} C~t,可以添加到状态中。在下一步中,我们将合并这两个部分以创建状态更新。
在我们的语言模型的例子中,我们想要将新主题的性别添加到细胞状态中,以替换我们正在忘记的旧主题的性别。
现在是时候将旧的单元状态 C t − 1 C_{t−1} Ct−1更新为新的单元状态 C t C_t Ct了。之前的步骤已经决定了该怎么做,我们现在只需要实际执行即可。
我们将旧状态乘以 f t f_t ft,从而遗忘我们之前决定要遗忘的内容。然后加上 i t ∗ C ~ t i_t * \tilde{C}_{t} it∗C~t,即新的候选值,它们的比例决定了每个状态值的更新程度。
在语言模型的例子中,这是我们实际删除关于旧主体性别的信息并添加新信息的步骤,就像我们在之前的步骤中决定的那样。
最后,我们需要决定我们要输出什么。这个输出将基于我们的单元状态,但会是一个过滤后的版本。首先,我们运行一个sigmoid层,它决定了我们要输出单元状态的哪些部分。然后,我们将单元状态通过tanh(将值推到-1到1之间)并乘以sigmoid门的输出,以便我们只输出我们决定的部分。
对于语言模型的例子,因为它刚刚看到了一个主语,它可能想要输出与动词相关的信息,以防接下来的词是动词。例如,它可以输出主语是单数还是复数,以便我们知道下一个词是动词时应该把动词变成什么形式。
Variants on Long Short Term Memory
LSTM的变体
上面,所描述的是一个相当普通的 LSTM。但并非所有的 LSTM 都与上述相同。实际上,似乎几乎每一篇涉及 LSTM 的论文都使用了略微不同的版本。这些差异很小,但值得一提。
由 Gers & Schmidhuber(2000)介绍的一种流行的 LSTM 变体是添加“窥视孔连接”。这意味着我们让门控层可以查看细胞状态。
另一种变体是使用耦合的遗忘门和输入门。我们不是单独地决定要遗忘什么,以及我们应该添加什么新信息,而是将这些决定结合在一起。只有在我们要输入新信息时才遗忘,只有在我们要遗忘一些旧信息时才输入新值到状态中。
一种比 LSTM 更为简单的变体是门循环单元(Gated Recurrent Unit,GRU),由Cho等人(2014)提出。它将遗忘门和输入门合并为一个单独的“更新门”,并合并了单元状态和隐藏状态,并进行了其他一些更改。由此产生的模型比标准LSTM模型更简单,越来越受欢迎。
这些只是一些最值得注意的LSTM变体。还有许多其他变体,例如由Yao等人(2015)提出的Depth Gated RNNs。还有一些完全不同的方法来解决长期依赖问题,例如Koutnik等人(2014)的Clockwork RNNs。
这些变体中哪个最好?这些差异重要吗?Greff等人(2015)进行了流行变体的良好比较,发现它们都差不多。Jozefowicz等人(2015)测试了一万多个RNN架构,发现有些在某些任务上比LSTM表现更好。
总结
早些时候,我提到人们使用RNN取得了显著的结果。事实上,几乎所有这些结果都是使用LSTM实现的。对于大多数任务来说,它们确实比其他方法都要好!
将LSTM写成一组方程看起来相当令人生畏。希望通过本文对它们进行逐步解释,使得读者更容易理解。
LSTM是我们可以通过RNN实现的重大进步。自然而然的问题是:是否还有另一个大的进步?研究人员普遍认为:“是的!下一个进步是注意力机制!”这种想法是让RNN的每个步骤从一些更大的信息集合中选择要查看的信息。例如,如果您正在使用RNN为图像创建标题,它可能会选择每个输出单词要查看的图像部分。实际上,Xu等人(2015)就是这样做的——如果您想探索注意力机制,这可能是一个有趣的起点!使用注意力机制已经取得了许多令人兴奋的结果,并且似乎还有更多的结果即将到来……
注意力机制并不是RNN研究中唯一令人兴奋的领域。例如,Kalchbrenner等人(2015)的网格LSTM似乎非常有前途。在生成模型中使用RNN的工作,例如Gregor等人(2015)、Chung等人(2015)或Bayer和Osendorfer(2015),也非常有趣。过去几年一直是递归神经网络方面的激动人心的时期,未来几年也将会更加如此!
Reference
LSTM-理解 Part-1(RNN:循环神经网络)
LSTM-理解 Part-2(RNN的局限性)
Understanding LSTM Networks
[干货] 深入浅出LSTM及其Python代码实现
YouTube视频:Illustrated Guide to LSTM’s and GRU’s: A step by step explanation