递归神经网络

人类的思考不是每秒钟都从头开始的。当你读这篇博客的时候,你是通过之前你对文字的认识来理解这里的每一个字。你没有丢弃过去的认识而从零来思考。人的思维具有持续性。

传统的神经网络没法做到这点,这也是它们的主要缺陷。例如,你想要对电影中每时刻发生的事件进行分类。传统的神经网络就没法利用对过去事件的推理来知晓后续的事件。

递归神经网络解决了这个问题。它们是包含了循环的神经网络,使得信息可以保留下来。

理解LSTM网络

上图中,神经网络A,得到了输入xtx_t,并输出值hth_t。循环使得信息可以从网络的某一步传入下一步。

这些循环使递归神经网络看上去很神秘。但是,如果你再一细想,就会发现它们和普通的神经网络没什么不同。递归神经网络可以看作为同一个网络的多重复制,每个网络都将信息传至后续网络。我们将该循环铺开看一下:

理解LSTM网络

这个像链条一样的实质揭示了,递归神经网络与序列和列表关系密切。对于这类数据,递归网络是非常自然的网络结构。

在过去几年中,人们在许多任务上都非常成功地应用了RNNs:语音识别、语言建模、翻译、图像标题等等。在Andrej Karpathy 的博文《The Unreasonable Effectiveness of Recurrent Neural Networks》有详细讨论这些惊艳的成就。

这些成就的核心就是LSTMs的使用,它是递归神经网络中非常特殊的一类,在许多任务上效果要明显好于标准的RNN。几乎所有激动人心的、基于递归神经网络的结果都是通过LSTMs取得的。

The problem of long-term dependencies

RNNs具有吸引力的一个点就是,它们能将之前的信息和当前的任务联系起来,如通过之前的视频画面可以理解当前的画面。如果RNNs能实现这点,那就太有用了。但是它们能否做到,是有条件的。

有时,我们只需关注最近的信息来完成当前的任务。例如,我们有一个语言模型,要基于之前的单词来预测下一个单词。如果我们要尝试预测“the clouds are in the sky”,我们无需更多的上下文,就可以知道下一个单词应该是"sky"。在这个例子中,相关信息和所要使用的位置之间的gap不大,RNNs可以学习利用过去的信息。

理解LSTM网络

但是,我们也会遇到一些例子,需要更多的上下文。例如我们要预测“I grew up in France … I speak fluent French”这句话。最近的信息表明,下一个单词可能是一个语言的名称,但如果我们想缩小至是哪种语言,我们需要进一步退回去,找到"France"这个上下文。这里,相关信息和所要使用的位置之间的gap非常大,这是完全有可能的。

不幸的是,随着gap增大,RNNs 就没办法来学习联系这些信息了。

理解LSTM网络

理论上,RNNs是绝对可以处理这类"long-term dependencies"的。人们可以仔细地去挑选参数,解决这类简单问题。但在实际中,RNNs就没办法来学习了。Hochreiter和Bengio等人都有深入地探索这个问题,他们找到了一些基本原因。令人欣慰的是,LSTMs没有这种问题。

LSTM Networks

长短期记忆网络 - 通常被称作LSTMs,是RNN的一种,可以学习long-term dependencies。Hochreiter和Schmidhuber提出了该网络,在随后的著作中又被人们不断地优化,流行了起来。LSTMs在各类问题上都效果良好,被广泛地应用。

LSTMs 很明确地就是去避免long-term dependency问题。LSTMs 的一个默认行为就是去记住长时间内的信息,而不会挣扎地去学习!

所有的递归神经网络都像链条一样,有着重复的神经网络模块。在标准的RNN中,这个重复模块的结构非常简单,例如一个简单的tanh层。

理解LSTM网络

LSTM 也具有这类链条结构,但是重复模块的结构就不同了。它有4个神经网络层,而不是1个,它们之间以一种特殊的方式来交流。

理解LSTM网络

别担心这里面的细节。我们会一步步地介绍LSTM中的细节。下面是各种记号:

理解LSTM网络

在上面的图中,每一条线都表示一个向量,从一个节点的输出到另一个节点的输入。粉红色的圆圈表示pointwise 操作,如向量相加,黄色的边框是要学习的神经网络层。两条相汇合的线表示concatenation,而一条分叉的线表示它里面的内容将被复制到不同的位置。

The Core Idea Behind LSTMs

LSTM的核心是细胞状态,就是上图中的那条穿过整个图的水平线。细胞状态就象传送者的腰带,它笔直地穿过整个链条,只有几处细小的线性变换。信息可以很容易地穿过它,而保持不变。

理解LSTM网络

LSTM 可以往细胞状态中添加或删除信息,通过gates来调节。Gates可以选择性地让信息通过。它们由单个的sigmoid神经网络层和pointwise 乘法操作构成。

理解LSTM网络

Sigmoid 层输出的值位于0和1之间,表示每个部分可以通过多少。0值表示“不让任何东西通过”,1表示“所有的东西都可以通过”。

LSTM有3种gates,来保护和控制这些细胞状态。

Step-by-Step LSTM Walk Through

LSTM 中的第一步就是决定细胞状态中我们要丢弃哪些。这一决定是通过一个sigmoid层来实现的,该层被称为"遗忘门层"。它的输入是ht1h_{t-1}xtx_t,对于细胞状态Ct1C_{t-1}中的每个数,它输出的值介于0和1之间。1表示完全保留,0表示完全丢弃。

我们回到语言模型的例子,基于所有之前的单词来预测下一个单词。在这个问题中,细胞状态可能包含当前主语的性别,这样正确的代词就可以使用了。但当我们遇到了另一个新的主语,我们就应该忘记原先主语的性别。

理解LSTM网络

下一步就是决定在新的细胞状态中存储什么新的信息。这有两个部分。首先,一个称作“输入门层”的sigmoid层决定哪些值要更新。然后,一个tanh层创建一个新的向量,包含新的候选值C~t\tilde C_t,加到细胞状态中去。接下来,我们将这两步结合起来,对状态进行更新。

在语言模型的例子中,我们想要往细胞状态中加入新主语的性别,来代替我们不再需要的原主语的性别。

理解LSTM网络

现在我们就可以更新原细胞状态Ct1C_{t-1}了,得到新的细胞状态CtC_t。原先的步骤已经决定了要做什么,我们只要去执行就可以了。

我们将原状态乘以ftf_t,忘记那些我们之前决定忘记的。然后我们加上itC~ti_t * \tilde C_t。这就是新的候选值,通过缩放比例来决定要多大程度上更新每个状态值。

在语言模型的例子中,这就是我们丢弃原主语性别信息、添加新的信息的地方,和我们在上一步中决定的一样。

理解LSTM网络

最后,我们要决定输出什么。这个输出是基于我们的细胞状态,但会经过筛选得到。首先,我们运行一个sigmoid层,它决定细胞状态的哪一部分将被输出。然后,我们将细胞状态通过tanh(将值置于-1和1之间),再乘以sigmoid gate的输出,这样我们就只输出了我们决定输出的。

在语言模型的例子中,因为它只看到了主语,它可能想要输出一个关于动词的信息,以防动词就是接下来要产生的单词。例如,它可能要输出主语是单数还是复数,这样我们就知道了该动词接下来的形态。

理解LSTM网络

Variants on Long Short Term Memory

目前为止我介绍的都只是非常普通的LSTM。但不是所有的LSTM都和上面的一样。事实上,几乎每一篇涵盖LSTM的论文都作了些许改动。这些改动都比较小,但非常值得去介绍其中的几个。

Gers和Schmidhuber 提出了一个流行的LSTM变体,加入了"peephole 连接"。我们允许gate层观看细胞状态。

理解LSTM网络

上面的图在所有的gates中都添加了peepholes,但很多论文只对部分gates添加了peepholes。

另一个版本将遗忘门和输入门耦合起来。它没有单独地去决定哪些要忘记、哪些新的信息要加入,而是将二者结合起来决定。仅当我们要输入新信息的时候,我们才去忘记。仅当我们去忘记一些旧的值时,我们才会往状态中输入新的值。

理解LSTM网络

对于LSTM,一个更加明显的改动版就是Gated Recurrent Unit — GRU,由Cho等人提出。它将遗忘和输入门整合为一个"update gate"。它同样将细胞状态和隐藏状态融合起来,做了其他的改变。这个模型要比标准的LSTM模型更加简单,逐渐受到人们的欢迎。

理解LSTM网络

这些只是LSTM变体中的几个例子,也有很多其他的变体,如Yao等人设计的 Depth Gated RNNs。也有一些完全不同的方法来处理long-term dependencies,如Koutnik等人设计的 Clockwork RNNs。

这些变体中哪个更好呢?这些差异重要吗?Greff等人对这些变体做了一个详尽的比较,发现它们几乎是一样的。Jozefowicz等人在一万多个RNN结构上做了实验,发现其中部分变体会在特定的任务上的表现要比LSTM好。

Conclusion

一开始,我提到了人们通过RNNs取得的显著成绩。基本上它们都使用了LSTMs。对于绝大多数的任务,它们效果的确要好许多。

LSTM一堆公式看上去很唬人。但是一步步地阅读完这篇博文,理解起来应该要容易一些了。

LSTM 对于RNN是一大步,我们可以用它来做许多任务。那么很自然地就会问:是否还能再有一大步?学者们的一个观点是:“Yes,下一个一大步就是注意力机制”。它的想法就是让RNN在每一步都可以从一组更大的信息集合中选取信息。例如,如果你要用RNN来创建一张图片的标题,它可能会选取图像的一部分去关注,然后输出每个单词。实际上,Xu等人就是这么做的 — 你可以去了解**意力机制。利用注意力机制,人们已经取得了不错的效果,但仍有很多需要去摸索。

注意力机制并不是RNN研究领域唯一的振奋人心的点。例如,Kalchbrenner等人提出的 Grid LSTMs看上去也不错。在生成模型中利用RNN模型也看上去很有意思。过去几年对于递归神经网络来说非常激动人心,未来也会如此。

本文转载自http://colah.github.io/posts/2015-08-Understanding-LSTMs/?source=post_page-----37e2f46f1714----------------------

相关文章:

  • 2021-06-30
  • 2021-08-03
  • 2021-07-16
  • 2021-08-28
猜你喜欢
  • 2022-01-22
相关资源
相似解决方案