深度学习之神经网络结构——RNN_理解LSTM

本篇博客移动到http://codetutor.net/中。

原文链接

Understanding LSTM Networks

RNN

我们不是在大脑一片空白的情况下开始思考。当你读这篇文章的时候,你是基于对前面单词的理解来理解当前的单词。你不会把所有的东西丢开,让大脑每次都一片空白地思考。我们的思想是持久的。

传统的神经网络做不到这一点,这看起来是它的主要缺点。举个例子,假设你正在看电影,你想对每个时间点的事件类型进行分类。传统的神经网络无法对电影中前面的事件进行推理,得到后续事件。

 

RNN可以解决这个问题。RNN中有循环结构,允许信息的持久化。

 

在上面的图中,神经网络的一个分块,A的循环可以让信息从网络中的一个step传递到下一个step。

 

这些循环让RNN看起来有些神秘。但是如果你仔细想想,会发现RNN和传统的神经网络的也有相通之处。一个RNN可以看成同一网络的多个拷贝,每个拷贝网络都向后面的网络传递信息。如果将循环展开,就可以得到:

 

这个链式结构表明RNN和序列、列表之间密切相关。用这种神经网络处理这些数据是很自然的一件事。

 

当然已经用过了!在过去几年,将RNN应用到不同问题都取得了不可思议的成功,语音识别、语言模型、翻译……如果想了解RNN在不同应用中的成绩,可以去看一篇非常好的博客,Andrej Karpathy的The Unreasonable Effectiveness of Recurrent Neural Networks. 

 

长时依赖问题

RNN最大的吸引力就在于他们可以将前面的信息和当前任务联系起来,比如用前面视频帧的信息可能有助于当前帧的理解。如果RNN可以做到这一点,那将会非常有用。但是可以吗?这视情况而定。

有时,我们只用邻近的信息就可以解决当前任务。比如语言模型预测给予前面的单词预测下一个单词,如果我们想要预测“the clouds are in the sky”的最后一个单词,不需要更多的上下文,就可以看出最后一个单词显然是sky。这种情况下,相关信息和当前预测单词距离不远,RNN可以学会使用过去的信息。

 

但是也存在需要更多上下文的情况。如果想要预测“I grew up in France… I speak fluent French.”邻近的信息表明最后一个单词很可能是一种语言,但如果想要确定是那一种语言,需要找到France。这种情况下,和相关信息之间的距离非常大。

但是,当距离增加时,RNN会丧失学习到连接如此远的信息的能力。


理论上,RNN绝对可以处理这种长时依赖,可以仔细的挑选参数解决这种形式的简单问题。但是,在实践中,RNN不能学到这些知识。在Hochreiter(1991)Bengio(1994)都深入探讨过这个问题,给出了一些使训练RNN变得困难的根本原因。

 

LSTM

Long Short Memory Network – 通常称作LSTM,是一种特殊的RNN,可以学习到长时依赖。LSTM由Hochreiter(1997) 提出,并且后面有很多工作对其进行修改。LSTM在很多问题上都取得了相当大的成功,并得到广泛使用。

LSTM通过刻意的设计来避免长时依赖问题。记住长期信息是LSTM的默认能力,不需要花费很多代价去学习。

 

所有的RNN都是重复神经网络模块的链式形式。在传统的RNN中,这些重复的模块结构很简单,比如一个单tanh层。


LSTM也有链式的结构,但是重复模块有不同的结构,包含四个单神经网络层,用一种特殊的方式进行交互。

 

不要担心细节。我们接下来会一步步的剖析LSTM。现在,我们尝试熟悉一下用到的符号。

 

在上图中,每条线传递一个向量,从一个节点的输出到另一个节点的输入。粉色圆圈表示pointwise操作,如向量之和。黄色的矩形表示学习到的神经网络层。汇聚的线表示连接,分开的线表示内容被拷贝成两份。

 

LSTM的核心思想

 

LSTM的关键点是cell状态,也就是贯穿上图的水平线。

 

Cell状态像传送带,在整个链上运行,信息在上面流动并保持不变是件容易的事情。

 

LSTM通过门的控制可以向cell状态中添加或者删除信息。

 

门是一种让信息选择式通过的方法,包含一个sigmoid神经网络层和一个pointwise乘法操作。


Sigmoid层输出0-1之间的值,表示每个组件有多少信息可以通过。值为0表示“不让任何信息通过”,值为1表示“让所有信息通过”。

一个LSTM有三个这样的门,保护以及控制cell状态。

 

一步步深入剖析LSTM

LSTM的第一步是决定要将cell状态中的什么信息丢弃掉。这个决定是遗忘门完成的。以ht-1和xt为输入,为cell状态Ct-1的每个数字,输出一个0-1之间的值。1表示完整地保留,0表示完全丢弃。

以语言模型为例:基于前面所有的单词预测下一个单词。在这个问题中,cell状态可能包含当前主语的性别,所以可以预测到正确的代词。当看到一个新的主语时,想要忘记旧主语的性别。

 

下一步是决定将要在cell状态中添加什么新信息。这包含两部分:首先,称作输入门的sigmoid层决定要更新哪些值。然后,一个tanh层创建新的候选值向量,会被加入状态中。在下一步,通过组合这两项产生对状态的更新。

在语言模型的例子中,希望向cell状态中加入新主语的性别,以代替我们忘记的那个。

 

现在是将cell状态从Ct-1更新到Ct的时候了!前面的几步已经明确了要做什么,现在只需要真的去做。

 

将旧状态和ft相乘,忘掉希望忘记的信息。然后加入it*Ct。这是新的候选值,根据决定的每个状态值的更新程度,进行变化。

在语言模型的例子中,就是真正丢弃旧主语性别的信息并增加新信息的过程。

 

最后,我们需要决定将要输出什么。这个输出是基于cell状态的,但是需要经过过滤。首先,运行一个sigmoid层决定cell状态的哪些部分是要输出的。然后,对cell状态进行tanh计算(将值限制在-1到1之间)并和sigmoid门的输出相乘,这样就只输出了想要输出的部分。

对于语言模型的例子,因为看到一个主语,可能想输出一些和动词相关的信息,因为下一个单词极有可能是动词。举个例子,可能输出主语是单数还是复数的信息,这样如果下一个单词是动词的话我们就知道动词的形式。

 

LSTM的变体

目前为止介绍的都是正常的LSTM。但不是所有的LSTM和上面介绍的一样。实际上,似乎每篇用到LSTM的文章使用的LSTM都有一点变化。这种变化是细微的,但其中一些也值得提一提。

一个最流行的变体,是由Gers(2000)提出的,加入“peephole connections”。这意味着我们可以让门接受细胞状态的输入。

 

上面的图中对每个门都加了peephole,但很多文章只给部分门加peephole。

 

另一个变体是把遗忘门和输入门结合,相对于传统LSTM分开决定忘记什么、添加什么信息,现在将这两个决策同时完成。只有在输入一些东西的时候才会进行遗忘;只有忘记cell状态中旧的信息时才会向其中输入新值。

 

一个变化比较大的变体是Cho(2014)提出的门限循环单元GRU。将遗忘门和输入门组合成一个单个的更新门。也合并了细胞状态和隐藏状态,并做了其他改变。GRU比LSTM简单,也变得越来越流行。

 

这里只是部分的LSTM的变体,还有很多没有提到的,比如Yao(2015)提出的Depth Gated RNNs。也有完全不同的用于解决长时依赖的方法,比如Koutnik(2014)提出的Clockwork RNN。

 

哪一个变体是最好的?不同变体之间的差异有关系吗?Greff(2015)做了一个实验,用于比较流行的LStm变体,发现他们都是一样的。Jozefowicz(2015)测试了一万多种RNN结构,发现有些变体在特定任务上比LSTM要好。

 

总结

前面,我提到过用RNN得到的出色的结果。本质上,这些都是用LSTM得到的。对大多数任务效果都很好!

 

把LSTM写成一组公式,看起来确实让人费解,希望通过本文一步一步的深入LSTM结构,能更容易理解LSTM。

LSTM是RNN的一个大飞跃。很自然的会想到:下一个飞跃在哪?在研究人员中,一个普遍的观点是:下一步飞跃有了,就是attention。Attention是让RNN的每一步都从大量信息中抽取最重要的部分。比如,如果你在用RNN产生一个图片的描述,在输出每一个单词的时候可能只关注图片的一部分。Xu(2015)做的就是这个——如果你想深入探究attention的话,这可能是一个比较有意思的起点。还有一些用attention取得的振奋人心的成果,而且有很多问题亟待探索。

Attention不是RNN研究中仅有的方向。Kalchbrenner(2015)提出的Grid LSTM看起来很有前景。在生成模型中使用RNN,如Gregor(2015),Chung(2015),orBayer(2015),看起来也很有意思。



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值