理解 LSTM 网络
来源:互联网 发布:by什么意思网络用语 编辑:程序博客网 时间:2024/06/06 16:58
Recurrent Neural Networks
本文在翻译自:Christopher Olah LSTM的基础上,做了一些增改。
人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。
传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。
RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。
在上面的示例图中,神经网络的模块,A,正在读取某个输入 x_i,并输出一个值 h_i。循环可以使得信息可以从当前步传递到下一步。
这些循环使得 RNN 看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:
链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。
并且 RNN 也已经被人们应用了!在过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。我建议大家参考 Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 来看看更丰富有趣的 RNN 的成功应用。
而这些成功应用的关键之处就是 LSTM 的使用,这是一种特别的 RNN,比标准的 RNN 在很多的任务上都表现得更好。几乎所有的令人振奋的关于 RNN 的结果都是通过 LSTM 达到的。这篇博文也会就 LSTM 进行展开。
长期依赖(Long-Term Dependencies)问题
RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。假设我们试着去预测“I come from China… I speak fluent Chinese”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 China 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。即决定Chinese的China距离Chinese距离远,难以产生关联。
不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。
在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。
然而,幸运的是,LSTM 并没有这个问题!
解决方案:设计Gate,保存重要的记忆。
LSTM 网络
Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和、积,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM 的核心思想
LSTM 的关键就是细胞状态(cell state),水平线在图上方贯穿运行。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM 有通过精心设计的称作为“门”(Gate)的结构来去除或者增加信息到细胞状态的能力。”门”是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。
一个Cell由三个Gate(input、forget、output)和一个cell单元组成。Gate使用一个sigmoid激活函数,而input和新时刻的cell state通常会使用tanh来转换。(下图黄色的就是Gate)
Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!
逐步理解 LSTM
一、丢弃信息
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层(forget gate)完成。该门会读取 h_{t-1} 和 x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态
让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
二、输入信息,产生新的细胞状态
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,
在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。
现在是更新旧细胞状态的时间了,
我们把旧的细胞状态
在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
三、输出信息
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们得到输出(output)。
在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出的代词是单数还是复数?这样,如果是 动词 的话,我们也知道动词需要进行的词形变化。
RNN的梯度弥散、爆炸现象
这里,我想回顾一下造成RNN无法保存一段时间之前的内容的问题:Vanishing Gradient.
①同传统的神经网络类似,RNN也需要通过反向运算来更新权重。
即:当前时刻的隐藏层的activation unit的计算,需要当前的
因为不同时刻有不同的损失函数形式,以
可知,
对t3时刻:
其中:
对t2时刻:
同样的,对t=n,根据链式法则:
②对
这里,和求权值的梯度不一样,对U的求导为求和
③说到这里,还是没有提到梯度弥散、爆炸啊?那这个问题究竟是怎么回事呢?
如上图所示,因为不同时间状态的转移矩阵
因为RNN这个缺陷,我们首先想到的是更改非线性激励单元(比如将sigmoid和tanh改成别的,比如relu等,但是经过试验, 效果一样不好。)。于是,1997年Hochreiter & Schmidhuber 提出了LSTM,是对RNN的结构性创新,目前其在NLP领域应用的很广泛。
LSTM 的几个常见变化
一、Gers & Schmidhuber (2000)提出的peephole connections。此方法即让Cell state参与门层(Gate layer)的输入。
上图中,对每个门层都考虑了Cell state的输入,但在实际中,很多paper的方法是部分考虑Cell state的输入。比如,output gate不考虑Cell state对output门层的输入。
二、使用coupled forget and input gates。可以这么理解:input Gate取消。利用1-
当然,这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
究竟哪种LSTM变体是最好的呢?这其中的差异性真的重要吗?Greff, et al. (2015) 给出了诸多流行变体的比较,结论是它们的效果基本上是差不多的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。下图是Jozefowicz等人的论文截图。
Conclusion
Earlier, I mentioned the remarkable results people are achieving with RNNs. Essentially all of these are achieved using LSTMs. They really work a lot better for most tasks!
Written down as a set of equations, LSTMs look pretty intimidating.
(通过上述一系列的方程式,LSTM看起来更容易理解了。) Hopefully, walking through them step by step in this essay has made them a bit more approachable.
LSTMs were a big step in what we can accomplish with RNNs. It’s natural to wonder: is there another big step? A common opinion among researchers is: “Yes! There is a next step and it’s attention!(LSTM的下一步可能取得重大突破领域是注意力方面。)” The idea is to let every step of an RNN pick information to look at from some larger collection of information. For example, if you are using an RNN to create a caption describing an image, it might pick a part of the image to look at for every word it outputs. In fact, Xu, et al. (2015) do exactly this – it might be a fun starting point if you want to explore attention! There’s been a number of really exciting results using attention, and it seems like a lot more are around the corner…
Attention isn’t the only exciting thread in RNN research. For example, Grid LSTMs by Kalchbrenner, et al. (2015) seem extremely promising. Work using RNNs in generative models – such as Gregor, et al. (2015), Chung, et al. (2015), or Bayer & Osendorfer (2015) – also seems very interesting. The last few years have been an exciting time for recurrent neural networks, and the coming ones promise to only be more so!
参考文章:
1、http://colah.github.io/posts/2015-08-Understanding-LSTMs/
2、http://www.jianshu.com/p/9dc9f41f0b29
3、http://blog.csdn.net/zdy0_2004/article/details/49977423
- 理解LSTM网络
- 理解LSTM网络
- 理解LSTM网络
- 理解LSTM网络
- 理解LSTM网络
- 理解 LSTM 网络
- 理解LSTM网络
- 理解LSTM网络
- 理解 LSTM 网络
- 理解LSTM网络
- 理解 LSTM 网络
- 理解 LSTM 网络
- 理解 LSTM 网络
- 理解 LSTM 网络
- 理解LSTM网络
- [译] 理解 LSTM 网络
- 理解 LSTM 网络
- 理解LSTM网络
- NYOJ-1092数字分割
- Android缓存处理
- Android用surface直接显示yuv数据(三)
- andorid查看某个进程占用的内存
- SSH框架电力项目八--运行监控的保存
- 理解 LSTM 网络
- Hadoop Hive sql语法详解3--DML 操作:元数据存储
- Android用surface直接显示yuv数据(一)
- css中高度塌陷介绍以及定位介绍
- Example: Getting WMI Data from a Remote Computer
- 【数据结构】一些书上的基本概念
- 用python处理Excel文档(2)——用xlsxwriter模块写xls/xlsx文档
- Android用surface直接显示yuv数据(二)
- ADB server did not ACK