深入理解LSTM网络

递归神经网络(Recurrent Neural Networks)

人类并不会每一秒都重新开始他们的思维。当你阅读这篇文章,你能够基于你前面的理解,来理解当前的每一个单词。你并不会丢掉前面所有的东西和重新开始你的思维。因为你的思维具有持久性。

传统的神经网络并没有能力做到这一点,这看起来是一个非常大的缺点。例如,假设你想对电影中每个时刻所发生事件属于什么类型进行分类。目前还不清楚,传统的神经网络能否做到这点–合理的利用电影钟已经发生的事件去推断及将要发生的事件。

然而,递归神经网络解决了这个问题。它的网络是循环的,允许信息更加持久化。 

在上图中,有一个神经网络模块 A, 输入 xi和输出值 hi。循环允许将信息从当前这一步传递到下一步。

这个循环使得递归神经网络看起来更加的神秘。然而,如果你仔细的想一下,它并不是那么,它并没有难于理解也并没有比正常的神经网络更加的复杂。递归神经网络可以被看作相同神经网络的多重拷贝,每个神经网络模块都会把信息传递给下一个神经模块。考虑一下,如果我们将循环展开,将会发生什么? 

这种链式一样的结构很自然的揭示了递归神经网络本质上是与序列(sequences)和列表(lists)密切相关。对于这中类型的数据,递归神经网络是一种很自然的神经网络架构。

RNN 已经被人们所使用并且非常的有用! 在过去的几年里,RNN已经非常成功的运用到了各种各样的问题上:演讲识别,语言模型,翻译,图像字幕… 这样子的例子举不胜举。在这里我将不在讨论RNN, 我建议大家看Andrej Karpathy’s的博客The Unreasonable Effectiveness of Recurrent Neural Networks。他成功的运用了RNN并且更加丰富和有趣。

然而,这些成功运用的关键之处是对“LSTM”的使用,这是一种非常特别的递归神经网络。对于许多的任务,它比标准的RNN表现的更好。几乎所有令人兴奋的关于RNN的结果,都是由LSTM取得的。这篇论文也将主要讨论LSTM。

长期依赖问题(The Problem of Long-Term Dependencies)

RNNs一个需要引起注意点的是他们可以把前面的信息与当前任务连接起来,比如使用视频前面的片段来理解当前片段的信息。如果RNNs能够做到这些,那么他将是非常有用的,但是,他可以吗? 这存在很多依赖关系。

有时,我们仅仅需要知道最近的信息来执行当前的任务。例如,给定一个语言模型基于前面一个单词尝试去预测下一个单词。如果我们尝试去预测”the clouds are int the sky”这句话的最后一个单词,我们并不需要任何上下文的内容–很显然下一个单词是sky。在这种情况下,相关信息和预测单词的位置之间的间隔是非常小的。RNNs也可以学习先前的信息。 

但是也存在我们需要更多的上下文信息的情况。假设我们尝试去预测”I grew up in France… I speak fluent French”这句话的最后一个单词。当前的信息表明接下来的单词是很可能是语言的名字。但是我们需要是哪种语言,我们就需要前面内容提到的离当前位置很远的France的上下文信息。这就说明相关信息和当前预测词的位置之间的间隔变得非常的大。 
不幸的是,随着这间隔不断的变大,RNNs就会失去学习连接如此远的信息的能力。 

在理论上,RNNs是绝对能够有能力处理“长期依赖”问题。人们可以仔细的挑选哪些参数去解决这些问题的初级形式。实践中,RNNs似乎并不能学习到这些知识。Hochreiter (1991) [German] 和 Bengio, et al. (1994) 更加具有深度的讨论了这些问题,他们发现了为什么RNNs是很难去学习的一些最基本的原因。 
然而,幸运的是,LSTM并没有这些问题!

LSTM网络

长短期内存网络(Long Short Term Memory networks) – 通常叫 “LSTMs”, 是一种特殊的RNN类型, 可以学习长期依赖关系。它首先是由Hochreiter & Schmidhuber (1997)提出来的,后来许多的人对它进行了改进和推广。LSTMs对于许多的问题都取得了巨大的成功,并且也得到了广泛的使用。

LSTMs 刻意的设计去避免长期依赖问题。记住长期的信息在实践中RNN几乎默认的行为,但是却需要很大的代价去学习这种能力。

所有的递归神经网络都有重复神经网络模块的链式形式,在标准的RNNs中,重复模块只有一个非常简单的架构,比如只有一个tanh层 

LSTM同样也是这种链式结构,但是重复的模型拥有不同的结构,它与单个的神经网层不同,它有四个, 使用非常特别方式进行交互。 

这里不必担心详细的细节是什么,我们将会一步一步的讲解LSTM图。现在,我们需要熟悉图中使用的各种图标代表什么意思。 

在上图中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉红色的圆圈代表点乘操作(pointwise operations), 像向量的加法。而黄色的方框是学习到的神经网络层,合在一起的线条表示向量的连接操作,分叉的线条表示他的内容被复制到了不同的位置。

LSTMs 背后的核心思想

LSTMs的关键就是细胞状态(cell state), 水平线在这个图的顶部上贯穿运行。

细胞转态就像传送带一样。直接在整个链上运行,只有一些少量的线性交互。信息这上面流动很容易使它保持不变。 

LSTM精心的设计了一种结构去移除或者添加元素到细胞状态(cell state)上, 这种结构叫做门限(gates).

门限(gates)使得信息可以选择性的通过。它是由一个sigmoid神经网络层和一个点乘乘法操作组成 

sigmoid层输出0到1之间的数值,表示每个组件有多少量可以通过。0代表“所有的不能量通过”,而1代表“所有的量都可以通过”。

一个LSTM 有三个这样的门限(gates),来保护和控制细胞状态(cell state).

一步一步的讲解LSTM怎么工作的

LSTM的第一步是决定我们要从细胞状态(cell state)中丢弃哪些信息。这个决定是由一个sigmoid层叫“忘记门限层”所决定的。它的输入为 ht1 xt, 输出0到1间的数到细胞转态(cell state) Ct1。其中1表示“完全的保留”而0表示“完全的放弃”。

让我们回到前面语言模型基于前面所有的信息预测下一个单词。对于这个问题,细胞状态包含了当前主语的类别,因此这正确的代词可以被选择。当我们看到一个新的代词时,可以忘记老的代词。 

下一步就是决定哪些新的信息需要存储在细胞状态中。这包含两部分:第一部分,一个sigmoid层叫“输入门限层”决定哪些值我们需要去更新。第二部分,一个tanh层,创建一个新的候选向量 C^t,会被加入到这状态上。下一步,我们将组合这两个部分产生一个新的更新状态。

在我们的语言模型中,我们想添加这新代词的主语类别到这细胞状态,去取代我们要忘记的老的代词。 

现在是时候去更新老的细胞状态 Ct1, 到一个新的细胞状态 Ct。前面的步骤已经决定了将要做什么,我们仅仅需要去实现它。

我们将旧状态与 ft相乘,需要丢弃的我们需要更早的丢弃。然后加上 itC^t。 这就是这新的候选值,规格化了我们需要去决定有多少状态值需要去更新。 

最后,我们需要决定需要输出什么,输出是基于我们的细胞状态,但是也有一个过滤后的版本。首先,我们运行sigmoid层,这层决定细胞转态哪些部分需要输出。然后,我们把细胞状态通过tanh(输出-1到1之间的值)进行处理,然后再乘上sigmoid输出。最后我们仅仅会输出我们确定输出的那部分。

在语言模型例子中,因为它仅仅看到了一个代词,也许我们想去输出与动词相关的信息,在这种情况下会发生什么呢?例如,也许输出是否这代词时单数还是复数。如果是动词的话,我也知道动词是否需要进行词形的变化。 

LSTM的变体

到目前为止,我们已经描述了相对正常的LSTM。但是并不是所有的LSTM都和上面讲述的相同。事实上,每篇论文上涉及的LSTM都有一些稍微的不同。这个差异是很小的,但是有些确实值得提及。

一种很流行的LSTM变体是由Gers & Schmidhuber (2000)所介绍,它增加了“peephole connections”, 也就是说,让门限层也接收细胞状态的输入。 

在上图中,对所有的门限都填加了peephoes。许多的论文,有些会添加peepholes ,但是也有些不会。

另外一种变体是使用couple forget 和 输入门限(input gates)。不是明确地把需要丢弃什么和需要添加新的信息分离开来, 而是把这些决策放在一起。我们仅仅丢弃当我们将要在当前位置输入时。我们仅仅输入新的值到我们已经忘记一些旧值上。 

一种稍微变化大一点的LSTM变体是Gated Recurrent Unit, 或者GRU, 由 Cho, et al. (2014).提出来的,它组合了忘记和输入门到一个“update gate”。它也合并了细胞状态和隐含层状态。和做了一些其他的改变。他的这个模型比标准的LSTM模型更加的简单,也慢慢的流行起来了。 

这仅仅列举了部分流行的LSTM变体。还有很多其他的变体,比如,由Yao, et al. (2015)提出来的Depth Gated RNNs。也有一些与LSTM完全不同的方法去解决长期依赖问题的方法,比如由Koutnik, et al. (2014)提出的Clockwork RNNs。

那么,哪种变体是最好的呢?这真的很重要吗?Greff, et al. (2015)对所流行的变体做了一个比较,发现他们的结论都是相同的。Jozefowicz, et al. (2015)测试了超过1万种RNN架构,发现在一些任务,RNN架构要比LSTM更好。

结论

刚开始时,我提及到通过RNNs取得了重大的结果,本质上所有的这些都可以使用LSTM实现。对于大部分的任务,它确实工作的更好。

写了很多的等式,LSTM看起来让人很费解。真心的希望,通过这篇文章一步一步的讲解能够使你更加清楚的理解LSTM。

LSTM是我们在完成RNNs的基础上取得的成功,很自然的,我们也许会问:接下来,哪里会有更大的突破呢?在研究员中最普遍的观点是:“是的!下一步已经有了,它就是注意力!”(Yes! There is a next step and it’s attention!),这种想法让RNN的每一步都从更大的信息集中挑选出信息。例如,你想使用RNN去描述一副图片,它也许会选择图片中的一部分去寻找它输出的每一个单词。事实上,Xu, et al. (2015) 确实这样子做了—如果你想更加深入的探索注意力,这也许就是一个很有趣的开始点。使用注意力,还有许多使用注意力令人兴奋的结果,和它看起来无处不在。

在RNN的研究中,注意力并不是唯一令人兴奋的研究方向。例如,Kalchbrenner, et al. (2015)所介绍的Grid LSTM似乎更有前景。使用RNNs生成模型–比如 Gregor, et al. (2015), Chung, et al. (2015), 或者 Bayer & Osendorfer (2015) –也非常的有趣。最近几年,对于RNN一直是一个令人激动的时刻,接下来也将更加的如此。

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

http://blog.csdn.net/shinanhualiu/article/details/49864219

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院