翻译自:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

1 Recurrent Neural Networks 循环神经网络

人类并不是每秒钟都从零开始思考。当你读这篇文章时,你根据对前面单词的理解来理解每个单词。你不会把一切都扔掉,重新开始思考。你的思想有恒心。

传统的神经网络无法做到这一点,这似乎是一个主要缺点。例如,假设您想对电影中每一点发生的事件进行分类。目前尚不清楚传统的神经网络如何利用其对电影中先前事件的推理来通知后续事件。

循环神经网络解决了这个问题。它们是具有循环的网络,允许信息持久存在。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

上图表示神经网络的一部分,Ax_{t}作为输入,然后输出值h_{t}。查看一些输入xt并输出值ht。循环允许信息从网络的上一步传递到下一个步。

这些循环使得循环神经网络看起来有点神秘。然而,如果你再多思考一下,就会发现它们与普通的神经网络并没有什么不同。一个循环神经网络可以被认为是同一网络的多个副本,每个副本向后续网络传递信息。如果我们展开上述循环:

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

这种链状性质表明,循环神经网络与序列和列表密切相关。它们是用于此类数据的神经网络的自然结构。

在过去几年中,RNN在各种问题上取得了难以置信的成功:语音识别、语言建模、翻译、图像字幕……等等。我将把关于使用RNN可以实现的惊人成就的讨论留给Andrej Karpathy的优秀博客文章,即循环神经网络的不合理有效性。但它们真的很神奇。

这些成功的关键是“LSTM”的使用,这是一种非常特殊的循环神经网络,对于许多任务来说,它的工作性能远远好于标准版本。几乎所有基于循环神经网络的令人兴奋的结果都是用它们实现的。本文将对LSTM做简单的介绍。

2 长时序依赖的问题

RNN的一个优点是,它们可能可以将以前的信息连接到当前任务,例如,使用以前的视频帧可能有助于理解当前帧。如果RNN能够做到这一点,它们将非常有用。但他们可以吗?视情况而定。

有时,我们只需要查看最近的信息即可执行当前任务。例如,考虑一个语言模型,该模型试图根据前面的单词预测下一个单词。如果我们试图预测“the clouds are in the sky”中的最后一个词,我们不需要任何进一步的上下文。很明显,下一个词将是天空。在这种情况下,如果相关信息与所需位置之间的差距很小,RNN可以学习使用过去的信息。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

但也有一些情况下,我们需要更多的上下文。如果预测课文中的最后一个词“I grew up in France… I speak fluent French.”。邻近的信息表明,下一个单词可能是一种语言的名称,但如果我们想缩小哪种语言的范围,我们需要从更远的地方了解关于“France”的上下文。相关信息与所需信息之间的差距完全有可能变得非常大。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

理论上,RNN完全能够处理这种“长期依赖性”一个人可以仔细地为他们挑选参数来解决这种形式的玩具问题。遗憾的是,在实践中,RNN似乎无法学习它们。Hochreiter(1991)GermanBengio等人(1994)对这个问题进行了深入探讨,他们发现了一些非常基本的原因,解释了为什么这个问题可能很难解决。

谢天谢地,LSTM没有这个问题!

3 LSTM

Long Short Term Memory networks(LSTM)是一种特殊形式的RNN,它能够学习长期依赖关系。它由Hochreiter & Schmidhuber (1997)提出,并在后续的工作中被许多人提炼和推广。它们在各种各样的问题上工作得非常好,现在已被广泛使用。

LSTM的明确设计是为了避免长期依赖性问题。长时间记住信息实际上是他们的默认行为,而不是他们努力学习的东西!

所有循环神经网络都具有神经网络重复模块链的形式。在标准RNN中,此重复模块将具有非常简单的结构,例如单个tanh层(如下图所示)。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

LSTM也有这种链状结构,但重复模块有不同的结构。没有单一的神经网络层,而是有四个,以一种非常特殊的方式相互作用。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

不要担心正在发生的事情的细节。稍后我们将逐步浏览LSTM图。现在,让我们试着熟悉一下我们将要使用的符号。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

在上图中,从一个节点的输出到其他节点的输入,每一行都承载一个完整的向量。粉红色的圆圈代表逐点操作,如向量加法,而黄色的方框是学习的神经网络层。线合并表示串联,而分叉分叉表示其内容被复制,并且副本被复制到不同的位置。

4 LSTM背后的核心思想

LSTMs的关键是单元状态,即穿过下图顶部的水平线。
细胞状态有点像传送带。它直接沿着整个链条运行,只有一些轻微的线性相互作用。信息很容易一成不变地沿着它流动。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

LSTM可以移除或者向细胞状态添加信息,然后由称为“门”的结构进行调节。

门是一种选择性地让信息通过的方式。它们由一个sigmoid神经网络层和一个逐点乘法运算组成。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

sigmoid层输出0到1之间的数字,描述每个组件应通过的数量。值为0表示不让任何东西通过,而值为1表示让所有东西通过。

LSTM有三个这样的门,用于保护和控制单元状态。

5 一步一步了解LSTM

LSTM的第一步是决定要从细胞状态中丢弃哪些信息。而这个决定是由一个称为“遗忘门”的sigmoid层做出的。h_{t-1}x_{t}为遗忘门的输入,然后为单元状态C_{t-1}中的每一个数字输出一个位于0和1之间数字,1表示完全保留,0表示完全丢弃。

让我们回到我们的例子,一个语言模型试图根据前面的所有单词预测下一个单词。在这样的问题中,细胞状态可能包括当前主语的性别,以便可以使用正确的代词。当我们看到一个新的主题时,我们想忘记旧主题的性别。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

下一步是决定我们将在单元状态中存储哪些新信息。这有两个部分。首先,一个称为“输入门”的sigmoid层决定我们将更新哪些值。接下来,tanh层创建一个可以添加到细胞状态的新向量\tilde{C} _{t}。在下一步中,我们将结合这两者来创建状态更新。

在我们的语言模型示例中,我们希望将新主体的性别添加到细胞状态,以替换我们忘记的旧主体。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

现在是时候将旧的细胞状态C_{t-1}更新为新的细胞状态C{t}了。前面的步骤已经决定了要做什么,我们只需要实际执行。我们将旧状态C_{t-1}乘以f_{t},忘记我们之前决定需要忘记的事情。然后我们加上i_{t} * \tilde{C} _{t},这是新的候选值,根据我们决定更新每个状态值的程度进行缩放。

在语言模型中,正如我们在前面的步骤中所决定的那样,我们实际上会在这里删除关于旧主题性别的信息,并添加新信息。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

最后,我们需要决定要输出什么。此输出将基于我们的单元格状态,但将是过滤版本。首先,我们运行一个sigmoid层,它决定我们要输出的细胞状态的哪些部分。然后,我们将单元格状态使用tanh(以使值介于−1和1)计算,并将其乘以sigmoid的输出,这样我们只输出我们决定输出的部分。

对于语言模型示例,因为它只看到了一个主题,所以可能需要输出与动词相关的信息,以防接下来会出现这样的情况。例如,它可能会输出主语是单数还是复数,这样我们就知道如果接下来是这样的话,动词应该变成什么形式。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

LSTM计算的全过程可参考以下动图:

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

6 LSTM的一些变体

到目前为止,我描述的是一个非常正常的LSTM。但并非所有LSTM都与上述相同。事实上,似乎几乎所有涉及LSTM的论文都使用了略有不同的版本。这些差别很小,但其中一些值得一提。

Gers & Schmidhuber (2000)介绍一种流行的LSTM变体,它添加了“peephole connections”,让门去检查细胞状态。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

上图为所有门都添加了窥视孔,但许多论文会给一部分门添加窥视孔,剩下的则不会。

另一种变体是使用耦合的遗忘和输入门。我们一起做出这些决定,而不是分别决定忘记什么和应该添加什么新信息。我们只会忘记何时要在其位置输入内容。只有当我们忘记了一些旧的东西时,我们才会向状态输入新的值。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

LSTM上一个稍显显著的变化是由Cho等人(2014)引入的门控复发单位(GRU)。它将遗忘门和输入门组合成一个“更新门”。它还合并了细胞状态和隐藏状态,并进行了一些其他更改。由此产生的模型比标准的LSTM模型更简单,并且越来越流行。

深度学习 – 理解LSTM网络[翻译]-StubbornHuang Blog

这些只是最著名的LSTM变体中的少数几个。还有很多其他的,比如Yao等人(2015)的深度门RNN。还有一些处理长期依赖关系的完全不同的方法,如Koutnik等人的Clockwork RNN(2014)

以下哪种变体最好?差异重要吗?Greff等人(2015年)对流行的变体进行了很好的比较,发现它们都差不多。Jozefowicz等人(2015年)测试了一万多个RNN架构,发现有些架构在某些任务上比LSTM工作得更好。

7 结论

早些时候,我提到了人们使用RNN所取得的显著成果。基本上,所有这些都是使用LSTM实现的。对于大多数任务来说,它们确实工作得更好!

把LSTM写成一组方程式,看起来相当吓人。希望在这篇文章中一步一步地浏览它们能让它们更容易接近。

LSTM是我们使用RNN实现目标的一大步。人们自然会想:是否还有一大步?研究人员的一个共同观点是:“是的!还有下一步,那就是注意力!”这样做的目的是让RNN的每一步都能从一些更大的信息集合中选择要查看的信息。例如,如果您使用RNN创建描述图像的标题,它可能会选择图像的一部分来查看它输出的每个单词。事实上,Xu等人(2015)正是这样做的——如果你想探索注意力,这可能是一个有趣的起点!利用注意力取得了许多令人兴奋的结果,而且似乎还有更多的结果即将出现…

注意力并不是RNN研究中唯一令人兴奋的线索。例如,Kalchbrenner等人(2015年)提出的网格LSTM似乎非常有前景。在生成模型中使用RNN的工作——如Gregor等人(2015年)Chung等人(2015年)Bayer&Osendorfer(2015年)似乎也很有趣。过去的几年对于RNN来说是一个激动人心的时刻,而接下来的几年将会更加激动人心!

参考链接