概述
理解LSTM网络
原文:Understanding LSTM Networks
循环神经网络
人类每一秒的思考都不是从头开始的。我们在阅读文章时,会根据对前面单词的理解来理解每个当前单词。而不是丢掉之前的内容,重新开始思考。我们的思考具有连续性。
传统的神经网络无法实现这种连续性。 例如,假如我们试图理解电影中每一帧发生了什么事情。 目前没有传统的神经网络能够利用对电影中先前发生的事件来帮助理解后续的事件。
循环神经网络(Recurrent Neural Networks, RNNs)解决了这个问题。RNN 中循环的操作,使得它们可以保留之前学习到的内容。
在上图中,有一个 RNN A A A 。它接收输入 x t x_t xt ,输出 h t h_t ht 。网络中的循环结构使得某个时刻的状态能够传到下一个时刻。(译者注:因为当前时刻的状态会作为下一时刻输入的一部分)。
这些循环的结构让 RNNs 看起来有些难以理解。但是,你稍微想一下就会发现,这似乎和普通的神经网络有不少相似之处呀。我们可以把 RNNs 看成是一个普通的网络做了多次复制后叠加在一起组成的。每一网络会把它的输出传递到下一个网络中。我们可以把 RNNs 在时间步上进行展开,就得到下图这样:
从链状的结构很容易理解到它是和序列信息相关的。这种结构似乎生来就是为了解决序列相关问题的。
而且,它们的的确确非常管用!在最近的几年中,人们利用 RNNs 不可思议地解决了各种各样的问题:语音识别,语言模型,翻译,图像(添加)字幕,等等。关于RNNs在这些方面取得的惊人成功,我们可以看 Andrej Karpathy 的博客: The Unreasonable Effectiveness of Recurrent Neural Networks.
RNNs 能够取得这样的成功,主要还是 LSTMs 的使用。这是一种比较特殊的 RNNs,而且对于很多任务,它比普通的 RNNs 效果要好很多很多!基本上现在所使用的循环神经网络用的都是 LSTMs,这也正是本文后面所要解释的网络。
长距离依赖存在的问题
RNNs 的出现,主要是因为它们能够把以前的信息联系到现在,从而解决现在的问题。比如,利用前面的画面,能够帮助我们理解当前画面的内容。如果 RNNs 真的可以做到这个,那么它肯定是对我们的任务有帮助的。但是它真的可以做到吗,恐怕还得看实际情况呀!
有时候,我们在处理当前任务的时候,只需要看一下比较近的一些信息。比如在一个语言模型中,我们要通过上文来预测一下个词可能会是什么,那么当我们看到“ the clouds are in the ?”时,不需要更多的信息,我们就能够自然而然的想到下一个词应该是“sky”。在这样的情况下,我们所要预测的内容和相关信息之间的间隔很小,这种情况下 RNNs 就能够利用过去的信息, 很容易的实现。
但是,有些情况是需要更多的上下文信息。比如我们要预测“I grew up in France … I speak ?”这个预测的词应该是 French,但是我们是要通过很长很长之前提到的信息,才能做出这个正确的预测的呀,普通的 RNNs 很难做到这个。
随着预测信息和相关信息间的间隔增大, RNNs 很难去把它们关联起来了。
从理论上来讲,通过选择合适的参数,RNNs 确实是可以把这种长时期的依赖关系(“long-term dependencies”) 联系起来,并解决这类问题的。但遗憾的是在实际中, RNNs 无法解决这个问题。 Hochreiter (1991) German 和 Bengio, et al. (1994) 曾经对这个问题进行过深入的研究,发现 RNNs 的确很难解决这个问题。
但是非常幸运,LSTMs 能够帮我们解决这个问题。
LSTM网络
长短期记忆网络(Long Short Term Memory networks) - 通常叫做 “LSTMs” —— 是 RNN 中一个特殊的类型。由 Hochreiter & Schmidhuber (1997) 提出,广受欢迎,之后也得到了很多人们的改进调整。LSTMs 被广泛地用于解决各类问题,并都取得了非常棒的效果。
设计 LSTMs 主要是为了解决前面提到的 长距离依赖 (long-term dependency )的问题。它们的结构本身就很适合记住很长距离的信息,而非很艰难的 “理论上能够“。
所有循环神经网络结构都是由完全相同结构的(神经网络)模块进行复制而成的。在普通的RNNs 中,这个模块结构非常简单,比如仅是一个单一的 tanh 层。
LSTMs 与标准 RNN 的整体结构类似,区别在于各个重复单元。LSTMs 中的各个重复单元不再只是用一个单一的 tanh 层,而是用了四个交互层。
别被这个结构给吓着了,下面我们会把它解剖开,一步一步地来理解它(耐心看下去,你一定可以理解的)。现在,我们先来定义一下用到的符号:
本文的网络结构图中,每条线都传递着一个向量,从一个节点中输出,然后输入到另一个节点中。粉红色的圆圈表示逐点操作,比如逐点相加、相乘;黄色的矩形框表示的是一个神经网络层(就是很多个神经节点);合并的线表示把两条线上所携带的向量进行合并(比如一个带 h t − 1 h_{t-1} ht−1,另一个带 x t x_t xt , 那么合并后的输出就是$[h_{t-1}, x_t] $); 分开的线表示将线上传递的向量复制一份,传给两个地方。
LSTM背后的核心思想
LSTMs 最关键的地方在于细胞状态(cell state), C t C_t Ct,即结构图上面的那条横穿的水平线。结构图中的绿色部分即一个细胞(cell)。
细胞状态的传输就像一条传送带,向量 C t C_t Ct 从整条链路中穿过,沿途只是做了少量的线性操作。这种结构能够很轻松地实现信息从整条链路中传输而不被改变,这样可以方便地实现长距离信息的保留。
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层和一个逐点相乘的操作来实现的。
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”,0-1之间的其他数则表示 “让多大部分的信息通过”。
每个 LSTM 有三个这样的门结构,来实现保护和控制信息。这三个门是 LSTM 结构设计的核心,它们分别是遗忘门,输入门和输出门。以下将仔细介绍。
逐步推演LSTM
遗忘门
首先是 LSTM 要决定让哪些信息继续通过这个 cell ,这是通过一个叫做遗忘门(forget gate layer)的sigmoid 神经层来实现的。它的输入是 h t − 1 h_{t-1} ht−1 和 x t x_t xt,输出是一个数值都在 0,1 之间的向量,该向量的长度和 cell 的状态 $ C_{t-1} $ 一样),表示让 $C_{t-1} $ 的各部分信息通过的比重。 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”,0-1之间的其他数则表示 “让多大部分的信息通过”。
回到我们上面提到的语言模型中,我们要根据所有的上文信息来预测下一个词。这种情况下,每个 cell 的状态中都应该包含了当前主语的性别信息(保留信息),这样接下来我们才能够正确地使用代词。但是当我们又开始描述一个新的主语时,就应该把上文中的主语性别给忘了才对,此时就需要遗忘门来忘记信息。
输入门
下一步是决定让哪些新的信息加入到 cell 状态中来。实现这个需要包括两个步骤:一个叫做输入门(input gate layer)的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容 C ~ t tilde{C}_t C~t 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。
在我们的语言模型的例子中,我们想把新的主语性别信息添加到 cell 状态中,来替换掉老的状态信息。
有了上述的结构,我们就能够更新 cell 状态了, 即把 $ C_{t-1}$ 更新为 $C_{t} $。 从结构图中应该能一目了然,首先我们把旧的状态 C t − 1 C_{t-1} Ct−1 和 f t f_t ft 相乘,把一些不想保留的信息忘掉。然后加上 $i_t * tilde{C_{t}} $。这部分信息就是我们要添加的新内容。
输出门
最后,我们需要来决定输出什么值了。这个输出主要是依赖于 cell 的状态 C t C_t Ct,但是又不仅仅依赖于 C t C_t Ct,而是需要经过一个过滤的处理。首先,我们还是使用一个 sigmoid 层来决定 C t C_t Ct 中哪部分信息会被输出。这就是输出门(output gate layer)。接着,我们把 C t C_t Ct 通过一个 tanh 层,将数值归一化到-1到1之间,然后把 tanh 层的输出与 sigmoid 层计算出的权重相乘,得到最终的输出结果。
在语言模型例子中,假设我们的模型刚刚接触了一个代词,接下来可能要输出一个动词,这个输出可能就和代词的信息相关了。比如说,这个动词应该采用单数形式还是复数的形式,那么我们就得把刚学到的和代词相关的信息都加入到 cell 状态中来,才能够进行正确的预测。
LSTM变体
我们目前讨论的是最常规的 LSTM。但不是所有 LSTMs 都与上述结构相同。事实上,几乎每篇论文中的 LSTM 结构都是实用了一个略微不同的版本。差别虽然不大,但还是值得一提。
添加peephole
Gers & Schmidhuber (2000) 提出了一个非常流行的 LSTM 变体,添加了 “peephole connections”。这使得门结构可以看到细胞状态 C t C_t Ct 。下图展示的结构中,每个门结构都添加了 peephole,在许多论文中,只在其中某些门结构添加了 peephole。
耦合的遗忘门与输入门
另一种变体是使用耦合的遗忘门和输入门。不同于原始 LSTM 中分别决定要遗忘或添加哪些信息,本变体同时完成这两项决定。只有在需要添加某些新信息时,会遗忘对应位置的信息;只有遗忘了某些位置的信息,才在该位置添加新信息。
GRU
一个更加著名且变化较大的 LSTM 变体是 Cho, et al. (2014) 提出的 GRU。GRU 中只有两个门:重置门(reset gate)和更新门(update gate),它同样将细胞状态 C t C_t Ct 和隐藏状态 h t h_t ht 组合了起来,并做了一些其他的改动。GRU 比原始的 LSTM 结构更加简洁,并很快流行开来。
以上只是几个最值得一提的 LSTM 变体。实际上还有更多,比如Yao, et al. (2015)提出的 Depth Gated RNNs。另外, 还有一些完全不同于 LSTM 的机构也可以用来处理长距离依赖问题,比如 Koutnik, et al. (2014) 提出的Clockwork RNNs。
以下部分来自理解 LSTM 网络 (Understanding LSTM Networks by colah) 对 GRU 结构的扩展说明,并非来自原文。
GRU 结构中, r t r_t rt 表示重置门, z t z_t zt 表示更新门。**重置门决定是否将之前的状态忘记。**当 r t r_t rt 趋于 0 的时候,前一个时刻的状态信息 h t − 1 h_{t-1} ht−1 会被忘掉,隐藏状态 h ~ t tilde{h}_t h~t 会被重置为当前输入的信息。更新门决定是否要将隐藏状态更新为新的状态 h t ~ tilde{h_t} ht~。更新门的作用相当于合并了 LSTM 中的遗忘门和传入门。
和 LSTM 比较一下:
- GRU 少一个门,同时少了细胞状态 C t C_t Ct。
- 在 LSTM 中,通过遗忘门和传入门控制信息的保留和传入;GRU 则通过重置门来控制是否要保留原来隐藏状态的信息,但是不再限制当前信息的传入。
- 在 LSTM 中,虽然得到了新的细胞状态 $C_t $,但是还不能直接输出,而是需要经过一个过滤的处理 h t = o t × t a n h ( C t ) h_t=o_ttimes tanh(C_t) ht=ot×tanh(Ct); 同样,在 GRU 中,虽然 (2) 中我们也得到了新的隐藏状态 h t ~ tilde{h_t} ht~, 但是还不能直接输出,而是通过更新门来控制最后的输出: h t = ( 1 − z t ) ∗ h t − 1 + z t ∗ h ~ t h_t=(1-z_t)*h_{t-1}+z_t*tilde{h}_t ht=(1−zt)∗ht−1+zt∗h~t 。
哪个变体是最好的呢?它们之间的区别有那么大吗?Greff, et al. (2015) 对常见的变体进行了比较,发现它们几乎是一样的。Jozefowicz, et al. (2015) 测试了超过一万中 RNN 结构,发现有些结构在特定任务上比 LSTM 表现更佳。
结论
(编者注:本文原文成文于 2015.08.27,Transformer,即 Attention is all you need 还未发表,以下是作者对当时 RNN 发展的预测)
前文提到,了人们使用 RNN 取得的显著成果。 基本上所有这些都是使用 LSTM 实现的。 对于大多数任务,它们确实工作得更好!
写成公式,LSTM 看起来相当吓人。 希望在本文中逐步介绍它们可以使它们更容易理解。
LSTM 是我们使用 RNN 可以完成的一大步。 人们很自然地会想:是否可以再迈出了一大步? 研究人员的共同意见是:“是的! 还有下一步,那就是注意力! 这个想法是让 RNN 的每一步都从一些更大的信息集合中挑选信息来查看。 例如,如果使用 RNN 创建描述图像的标题,它可能会选择图像的一部分来查看它输出的每个单词。 事实上, Xu, et al. (2015) 正是这样做的——如果你想探索注意力,这可能是一个有趣的起点! 使用注意力已经取得了许多非常令人兴奋的结果,而且似乎还有更多的结果……
除了注意力机制之外,RNN 研究中还有许多其他的方向。 例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 似乎非常有前途。 在生成模型中使用 RNN——例如 Gregor, et al. (2015), Chung, et al. (2015), or Bayer & Osendorfer (2015) – 似乎也很有趣。 过去几年对于递归神经网络来说是一个激动人心的时期,而即将到来的只会更加精彩!
致谢
略
翻译参考
- 理解 LSTM 网络 (Understanding LSTM Networks by colah)
最后
以上就是大方彩虹为你收集整理的理解LSTM网络理解LSTM网络的全部内容,希望文章能够帮你解决理解LSTM网络理解LSTM网络所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复