长短时记忆神经网络(LSTM)

下面为翻译文章,会稍有增删:

原文:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

其他人的翻译:https://www.xiemingzhao.com/posts/eff2088e.html

类似的文章:https://www.jianshu.com/p/8219ca28925e

循环神经网络

人类不会每秒都从头开始思考。 阅读本文时,您会根据对先前单词的理解来理解每个单词。 您不会丢掉一切,重新从头开始思考。 传统的神经网络无法做到这一点,这似乎是一个重大缺陷。 例如,假设您想对电影中每个点发生的事件进行分类。 尚不清楚传统的神经网络如何利用电影中先前事件的推理来告知后期事件。循环神经网络解决了这个问题。 它是具有循环的网络,可以使信息持久存在。

图1 循环神经网络

上面的循环神经网络,以 x t x_t xt 作为网络的输入,然后输出 h t h_t ht ,循环使得信息可以从当前步流动到下一步。

这些循环使这个神经网络显得有些神秘。 但是,如果您再想一想,就会发现它们与普通的神经网络并没有什么不同。 循环神经网络可以看作是同一网络的多个副本,每个副本都将消息传递给后继者。 考虑一下如果展开循环会发生什么:

在这里插入图片描述

图2 展开的循环神经网络

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

在过去的几年中,将RNN应用到各种问题上已经取得了令人难以置信的成功:语音识别,语言建模,翻译,图像字幕…清单还在继续。 我将在Andrej Karpathy的出色博客文章 “The Unreasonable Effectiveness of Recurrent Neural Networks” 中讨论使用RNN可以实现的惊人成就。 但是它们确实非常惊人。

这些成功的关键是使用“ LSTM”,这是一种非常特殊的循环神经网络,在许多任务上都能比标准版本好得多。 几乎所有令人兴奋的结果都是利用循环神经网络实现的。 本文将探讨的是这些LSTM

长时依赖问题

RNNs有吸引力的一个地方是它可以将先前的信息连接到当前的任务上,例如使用先前的视频帧可能会有助于对当前帧的理解。如果RNNs可以做到这一点,将变得十分有用,但是可以做到吗?

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

在这里插入图片描述

图3

但是这里也存在一些需要更多上下文信息的情况。想一下如果我们想要预测最后一个单词 “I grew up in France… I speak fluent French.” 从最近的信息来看,要预测的单词应该是一种语言的名字,但是要确定是那种语言,我们需要更前面单词 “France” 的上下文信息。这说明相关信息与当前任务的距离可能非常远。

在这里插入图片描述

图4

从理论上来说,RNNs完全有能力处理这样的长时依赖,人类可以仔细的选择参数以解决这类简单问题。不幸的是,在实践中,RNNs看起来并没有能力处理他们。Hochreiter(1991)[German]Bengio, et al. (1994)等人对此问题进行了深入探讨,发现了处理这类问题变困难的根本原因。

谢天谢地,LSTMs没有这个问题。

LSTM网络

长短时记忆神经网络(Long Short Term networks),通常叫做LSTMs,是一种能够捕捉长时依赖的特殊循环神经网络。它们由Hochreiter & Schmidhuber (1997) 提出,然后被许多人在后来的工作中进行精炼和推广。他们的工作在各种问题上表现都非常好,现在也被广泛使用。

LSTMs是专门设计用来避免长时依赖问题的。长时间的记住信息已经成为了它的默认行为,不需要专门去学习。

所有的LSTMs都有重复神经网络模块的链式形式。在标准的RNNs中,这个重复的模块可以是非常简单的结构,例如单个tanh层。

在这里插入图片描述

图5 包含单个tanh层的标准RNN重复模块

LSTMs同样也有类似的链式结构,但是重复的模块有不同的结构。不是只有一个神经网络层,而是四个,以一种非常特殊的方式进行交互。

在这里插入图片描述

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

不需要担心在模型中计算的细节。我们之后将一步步浏览整个LSTM网络。现在先来熟悉一下将要使用到的符号表示。

在这里插入图片描述

图7 网络中的符号含义
  1. 神经网络层(用于学习)
  2. 逐点操作(逐点相乘、逐点相加)
  3. 向量转移(向量沿箭头方向移动)
  4. 连接(将两个向量连接在一起)
  5. 复制(将向量复制为两份)
LSTMs背后的核心思想

LSTMs的关键是细胞状态(cell state),水平的线贯穿图的顶部。细胞状态就像一个传送带,它沿整个链条一直沿直线延伸,只有一些较小的线性相互作用。 信息不加改变地流动非常容易。

在这里插入图片描述

图8

LSTM有能力向细胞状态添加或者移除信息,这些操作由门(gate)结构来精细调控。门结构是一种让信息有选择通过的方式。他们由一个sigmoid神经网络层和一个点乘操作构成。

在这里插入图片描述

图9

sigmoid层输出的数据在0-1之间,表示每一个组件应该通过多少信息。如果为0则表示任何信息都无法通过,如果为1则表示所有信息都可以通过。

一个LSTM有三个这样的门来保护和控制细胞状态。

一步步看LSTM

LSTM的第一个步骤是决定需要从细胞状态中丢弃哪些信息。这个是由一个sigmoid层也叫做遗忘门(forget gate)来决定的。它输入 h t − 1 h_{t-1} ht1 x t x_t xt ,然后经过sigmoid层后,得到0-1之间的输出 f t f_t ft 。之后跟细胞状态 C t − 1 C_{t-1} Ct1 逐点相乘。如果 f t f_t ft 对应的值为0,则丢弃对应的信息,反之,则保留对应的信息。

在这里插入图片描述

图10

解释一下:

C t − 1 C_{t-1} Ct1 是上一时刻的细胞状态

h t − 1 h_{t-1} ht1 是上一时刻的模块输出

σ \sigma σ 代表sigmoid层,每一个数据都需要经过sigmoid函数

f t f_t ft 代表遗忘门的输出

W f W_f Wf 代表权重矩阵

b f b_f bf 代表偏置

[ h t − 1 , x t ] [h_{t-1},x_t] [ht1,xt] 代表将两个矩阵拼接在一起

LSTM的下一个步骤是要决定将哪些信息存储在细胞状态中,这包含两个部分:

1.首先有一个sigmoid层叫做“输入门层”,它决定我们将更新哪些信息。

2.下一步,一个tanh层创建候选值的向量, C ~ t \tilde{C}_t C~t ,决定哪些信息能够被加到细胞状态中

接下来,我们将结合着两个部分对细胞状态进行更新。

在这里插入图片描述

图11

现在我们来将细胞状态 C t − 1 C_{t-1} Ct1 更新为 C t C_t Ct

我们先用旧的状态 C t − 1 C_{t-1} Ct1 对应点乘 f t f_t ft ,即 C t − 1 ∗ f t C_{t-1} * f_t Ct1ft ,用来丢弃我们已经决定要遗忘的信息,然后再加上 i t ∗ C ~ t i_t * \tilde{C}_t itC~t ,最终构成细胞状态 C t C_t Ct 。这是新的候选值,根据我们决定更新每个状态值的大小来缩放。

在这里插入图片描述

图12

最后我们需要决定我们的输出,输出取决于我们的细胞状态,但是应当是一个过滤的版本。首先,首先我们要运行一个sigmoid层来决定要输出细胞状态的哪些信息。然后将细胞状态通过tanh层然后乘以sigmoid层的输出,最后我们就可以输出我们想要输出的部分。

在这里插入图片描述

图12
长短时记忆神经网络的变体

我们到目前为止讨论的都是普通的长短时记忆神经网络。但是并不是所有的LSTMs都跟上面的一样。事实上,几乎每一个涉及到LSTMs的文章都使用了一些不同的版本。这些版本的区别很小,但是值得一提。

其中一个受欢迎的LSTM变体,由Gers & Schmidhuber (2000)提出,添加了窥视孔连接,这意味着可以让门层看到细胞状态。

在这里插入图片描述

图13

上面的图对每一个门都添加了窥视孔,但是很多文章都仅仅给一部分门窥视孔。

另一个变体使用了双输入和输出门。与单独决定要遗忘或者添加一些信息不同,这个网络同时决定这两件事情。当我们要添加一些信息的时候,才会遗忘这个地方的信息;当我们要遗忘更旧信息的时候,才会在这个地方添加新值。这两句话看起来是在表述一个意思,但是仔细品品,又有些不一样的意味。

在这里插入图片描述

图14

一个有些戏剧性的LSTM变体是门控循环单元(Gate Recurrent Unit,GRU)Cho, et al. (2014)。它结合了遗忘和输入门成为一个单一的“更新门”,它还结合了细胞状态和隐藏状态,并且做了一些其他的改变。最终的模型比标准的LSTM模型更简单,而且越来越受欢迎。

在这里插入图片描述

图15

这里仅仅只有一些值得注意的LSTM变体。还有许多其他的例如:Depth Gated RNNs by Yao, et al. (2015) 。同样也有完全不同的方法去解决长时依赖,像Clockwork RNNs by Koutnik, et al. (2014)

这些LSTM变体中那个是最好的?差异重要吗?Greff, et al. (2015) 对受欢迎的变体做了一个比较,发现他们都是一样的。Jozefowicz, et al. (2015) 测试了超过一万个RNN结构,发现一些RNN在特定任务上表现要比LSTMs更好。

总结

之前,我提到了人们使用RNN所取得的非凡成就。基本上所有这些都是使用LSTM实现的。对于大多数任务,它们确实工作得更好!

写成一组方程式,LSTM看起来很吓人。希望本文逐步介绍它们,使他们变得更加平易近人。

LSTM是我们可以使用RNN完成的重要一步。很自然地想:还有另外一个大步吗?研究人员普遍认为:“是的!有下一步,Attention!”这个想法是让RNN的每一步都从更大的信息集合中选择信息。例如,如果您使用RNN创建描述图像的标题,则它可能会选择图像的一部分以查看其输出的每个单词。实际上,Xu, et al. (2015) 正是这样做的-如果您想探索Attention,这可能是一个有趣的起点!Attention取得了许多令人振奋的结果,而且似乎还有很多其他的任务……

Attention不仅仅是RNN研究中唯一令人兴奋的话题。例如,Grid LSTMs by Kalchbrenner, et al. (2015) 看起来更具有前途。将RNNs用于生成模型中也十分有趣,例如: Gregor, et al. (2015), Chung, et al. (2015), 以及 Bayer & Osendorfer (2015) 。最近几年对于递归神经网络来说是一个令人振奋的时刻,而即将到来的几年有望如此!

致谢