LSTM

递归神经网络

关于RNN和LSTM 李宏毅老师的课讲的十分清晰

https://www.youtube.com/watch?v=xCGidAeyS4M

 

人类不会每时每刻都开始思考。当你阅读这篇文章时,你会根据你对之前单词的理解来理解每个单词。你不要扔掉所有东西,然后再从头开始思考。你的想法有持久性。

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

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

递归神经网络具有循环。

在上图中,一块神经网络,A一个,看一些输入xtxt并输出值htht循环允许信息从网络的一个步骤传递到下一个步骤。

这些循环使得循环神经网络看起来有点神秘。但是,如果你多想一点,事实证明它们与普通的神经网络并没有什么不同。可以将循环神经网络视为同一网络的多个副本,每个副本都将消息传递给后继者。考虑如果我们展开循环会发生什么:

展开的递归神经网络。
展开的递归神经网络。

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

他们肯定会被使用!在过去几年中,将RNN应用于各种问题取得了令人难以置信的成功:语音识别,语言建模,翻译,图像字幕......这个列表还在继续。我将讨论使用RNNs可以实现的惊人壮举,以及Andrej Karpathy的优秀博客文章,回归神经网络的不合理有效性但他们真的很棒。

这些成功的关键在于使用“LSTM”,这是一种非常特殊的递归神经网络,对于许多任务而言,它比标准版本好得多。几乎所有基于递归神经网络的令人兴奋的结果都是用它们实现的。这篇论文将探讨这些LSTM。

长期依赖问题

RNN的一个吸引力是他们可能能够将先前信息连接到当前任务,例如使用先前的视频帧可能通知对当前帧的理解。如果RNN可以做到这一点,它们将非常有用。但他们可以吗?这取决于。

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

但也有一些情况需要更多的背景。考虑尝试预测文本中的最后一个词“我在法国长大......我说流利的法语。”最近的信息表明,下一个词可能是一种语言的名称,但如果我们想缩小哪种语言,我们需要从更进一步的背景来看,法国的背景。相关信息与需要变得非常大的点之间的差距是完全可能的。

不幸的是,随着差距的扩大,RNN无法学习连接信息。

神经网络与长期依赖关系斗争。

理论上,RNN绝对能够处理这种“长期依赖性”。人类可以仔细挑选参数来解决这种形式的玩具问题。遗憾的是,在实践中,RNN似乎无法学习它们。Hochreiter(1991)[德国]Bengio等人对该问题进行了深入探讨(1994),他找到了一些非常根本的原因,为什么它可能很难。

值得庆幸的是,LSTM没有这个问题!

LSTM Networks

长短期内存网络 - 通常只称为“LSTM” - 是一种特殊的RNN,能够学习长期依赖性。它们由Hochreiter&Schmidhuber(1997)介绍,并在以下工作中被许多人提炼和推广。1它们在各种各样的问题上运作得非常好,现在被广泛使用。

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

所有递归神经网络都具有神经网络重复模块链的形式。在标准RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。

标准RNN中的重复模块包含单个层。

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

LSTM神经网络。
LSTM中的重复模块包含四个交互层。

不要担心发生了什么的细节。我们将逐步介绍LSTM图。现在,让我们试着对我们将要使用的符号感到满意。

在上图中,每一行都携带一个整个向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如矢量加法,而黄色框表示神经网络层。行合并表示连接,而行分叉表示其内容被复制,副本将转移到不同的位置。

LSTM背后的核心理念

LSTM的关键是单元状态,水平线贯穿图的顶部。

电池状态有点像传送带。它直接沿着整个链运行,只有一些次要的线性交互。信息很容易沿着它不变地流动。

LSTM确实能够移除或添加信息到细胞状态,由称为门的结构精心调节。

门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。

sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。

LSTM通过三个这样的本结构来实现信息的保护和控制。

这三个门分别输入门、遗忘门和输出门。

遗忘门

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取ht−1 和xt ,输出一个在 0到 1之间的数值给每个在细胞状态 Ct−1 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

 

其中ht−1表示的是上一个cell的输出,xt表示的是当前细胞的输入。σ表示sigmod函数。

输入门

下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,C^t 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。

 

现在是更新旧细胞状态的时间了,Ct−1更新为Ct。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与ftft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

 

输出门

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

LSTM变体

原文这部分介绍了 LSTM 的几个变种,还有这些变形的作用。在这里我就不再写了。有兴趣的可以直接阅读原文。

下面主要讲一下其中比较著名的变种 GRU(Gated Recurrent Unit ),这是由 Cho, et al. (2014) 提出。在 GRU 中,如下图所示,只有两个门:重置门(reset gate)和更新门(update gate)。同时在这个结构中,把细胞状态和隐藏状态进行了合并。最后模型比标准的 LSTM 结构要简单,而且这个结构后来也非常流行。



其中, rt表示重置门,zt表示更新门。重置门决定是否将之前的状态忘记。(作用相当于合并了 LSTM 中的遗忘门和传入门)当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏状态h^t会被重置为当前输入的信息。更新门决定是否要将隐藏状态更新为新的状态h^t(作用相当于 LSTM 中的输出门) 。

和 LSTM 比较一下:
- GRU 少一个门,同时少了细胞状态Ct。
- 在 LSTM 中,通过遗忘门和传入门控制信息的保留和传入;GRU 则通过重置门来控制是否要保留原来隐藏状态的信息,但是不再限制当前信息的传入。
- 在 LSTM 中,虽然得到了新的细胞状态 Ct,但是还不能直接输出,而是需要经过一个过滤的处理:ht=ot∗tanh(Ct);同样,在 GRU 中, 虽然我们也得到了新的隐藏状态h^t, 但是还不能直接输出,而是通过更新门来控制最后的输出:ht=(1−zt)∗ht−1+zt∗h^t

posted @ 2019-02-27 16:49  我要记下来!  阅读(4096)  评论(0编辑  收藏  举报