注意:本文为学习笔记,大量直接复制于参考文章中的原文字及图片,本篇文章大部分为翻译于Understanding LSTM Networks,英文还可以的建议直接看原文,写的很通俗易懂。
有种比较常见的RNN的隐藏层信息计算方法LSTM(Long-Short-Term-Memories),这种隐藏层的计算方法通过引入门(Gate) 的机制来解决RNN的梯度消失问题,从而学习到长距离依赖。
这里说的隐藏层计算方法指的是如何计算下个时刻的隐藏层信息,标准RNN中计算方法是:
而LSTM可以理解为计算htht的另一种方法。
一、长依赖问题
RNNs最吸引人的地方在于它可能够处理那些需要上文信息的任务,比如说使用之前的视频帧来理解当前帧,就像看电影,你前面的没有看,从中间开始看的话肯定就很多没法理解了对吧。假如RNNs能过做这些,那当然是极好的,但是真的可以吗?这还得看情况。
有时候,我们只需要一些比较近的信息来解决当前的任务。比如说,有这么一个语言模型,想要基于前文信息来预测下一个单词是什么。假如我们想要预测“the clouds are in the sky”中的sky,我们不需要任何下文信息,很显然就应该是sky。在这样的例子里,所需要的上文信息比较少,RNNs可以做到。
但是有时候我们需要更多的上下文信息。比如说我们想要预测这么一个文本“I grew up in France… I speak fluent French.”中的French,这就需要很靠前的一些信息。很不幸的是,对于这种情况,RNNs没办法很好的解决。
理论上,RNNs可以解决长依赖问题。人们可以通过调整参数来解决这类问题。但是实际上,RNNs对于这种距离非常长的,似乎并没有办法解决,这个问题在之前已经被深度探索过了。
庆幸的是,LSTM可以解决这种问题。
二、LSTM Networks
Long Short Term Memory networks,通常被称作LSTMs,是一种特殊的RNN,致力于解决长距离的依赖问题。它可以很好的解决各种问题,现在被广泛使用。LSTMs是明确设计用来解决长依赖问题的。
所有的RNNs都有一些重复的模块。在标准的RNNs中,重复模块只是一个很简单的结构,比如说一个tanh层(一种激活函数,关于tanh层,可以看之前介绍的文章)。
LSTMs也有这种链状结构,但是其中的重复模块更加复杂。相比于标准RNNs中的tanh层,LSTMs模块中可以分为四个部分。
不要担心太复杂没法理解,我们一步一步来看。首先来了解一些我们将会用到的基本概念。
在上面的图示中,每条线都表示着一个向量,从一个节点的output传递到另一个节点的input。粉色圆圈表示点运算,比如说向量之间的加法。黄色的矩形表示已经训练好的神经网络层。合并的线表示合并操作,分开的线表示复制,比如说一个向量被送往两个节点的输入。
三、LSTMs最核心的思想
LSTMs中最重要的是cell state,在下面的图解中最上面的那条水平线传递着。
cell state有点像传送带,它在这个链中传递,只有一些小的线性操作。信息可以很容易的保持不变。
LSTM呢,可以根据gates的结构及设定往cell state里移除或者添加信息。Gates是过滤信息的一种方式。他们由一个sigmoid网络层和一个点乘操作组成。
Sigmoid层输出介于0和1之间的数字,表示让多少信息通过。0表示一点都不让过,1表示全部通过。
一个LSTM有三个那种gate,用来控制cell state。
四、Step-by-Step LSTM Walk Through
第一步是决定我们要从cell state里扔掉哪些信息。这是由一个sigmoid层被称作“forget gate layer”来实现的。它根据h(t-1)和x(t),给C(t-1)中的每个数字输出一个基于0和1之间的数字。1表示保持原样,0表示完全清除掉。
回到我们之前说的预测下一个单词的问题。在这类问题中,cell state里面可能包含一个对象的性别信息,以此来使用正确的代词,是用he还是she。然后当我们遇到了一个新对象,我们就必须忘掉之前的老对象。(有点喜新厌旧的感觉==)
第二步是决定我们要把哪些新信息存储在cell state中。这个过程包括两个部分。首先,一个sigmoid层“input gate layer”决定我们要更新哪些值。其次,一个tanh层产生一个新的候选集的向量C̃(t) ,用来被添加到cell state中。最后,把这两者结合起来对state进行更新。
在语言模型的例子中,我们想要把新对象的性别添加到state中,用来替换老对象的性别。
现在是时候把C(t-1)更新为C(t)了。上文已经说好要怎么做了,我们照做就是。
我们将老状态点乘上f(t)来忘掉一些东西。然后我们加上i(t)*C̃(t),来更新一些状态值。
最后,我们决定要输出什么。这基于我们的cell state,但是也得经过一些过滤。首先,我们用一个sigmoid层来决定我们打算输出cell state的哪些部分。然后,我们将cell state经过一个tanh层(将输出值限定在-1到1之间),最后将其与sigmoid gate的输出相乘。
在刚才所说的语言模型例子,如果它只是看到一个新对象而不知道性别,然后它可能会输出一些和这个和动词相关的信息,以防之后要用到。比如说,可能会输出这个对象是单身还是成对的。所以我们可以依据这个来判断后面出现的一些信息。
五、一些变种
上文所说的是最标准的LSTM。但是并不是所有的LSTM都像上文所有那样。实际上,几乎所有的paper里面的LSTMs都做了一些细微的改动。改动很小,但是这也是值得关注的。
一个流行的变种,添加了“peephole connections”。这意味着gate层可以观测cell state的信息。
另一个流行的变种是使用耦合的“forget gate”和“input gate”。该变种将移除和添加这两种操作联合起来。我们只有在想要输入一些信息的时候才去移除一些信息。我们只有想要移除一些信息的时候才去输入一些信息。
还有一种变化比较大的变种是the Gated Recurrent Unit(GRU)。将“forget gate”和“input gate”合并成一个“update gate”。同时也合并了hidden state和cell state以及其他的一些变动。这个模型比标准LSTM更简单,并且越来越流行。
哪个变种最好呢?这个没有确切的答案,主要看你想要解决哪种问题。
总结
RNNs完成了很多了不起的任务。并且很多是使用LSTMs的。所以说LSTM是很重要的很值得学习的,但是有那么多公式,看起来很吓人。所以作者才想要做这么一个教程,一步一步的来解释教授知识。
LSTMs是RNNs发展的重要一步,那么下一大的进步是什么呢?一个大家普遍认同的看法是attention机制。这个idea是说让每一个step的RNN都观测更大集合的信息。具体的就不详细说了,之后再学习总结一下attention机制。
参考文章:
CS224d笔记4续——RNN隐藏层计算之GRU和LSTM
Understanding LSTM Networks