传统RNN在训练时,如果时间间隔很大的话,会遇到梯度消失(Gradient Vanishing)问题,即后面时间的节点对于前面时间节点的感知力下降,也就是忘事儿。
这是RNN在很长一段时间内无法广泛应用的原因,时间间隔一长就会导致网络无法训练。
这里通过一个例子更直观地说明这一问题的严重性。比如我们有以下的句子:
I grew up in France... I speak fluent ____
任务是预测是最后一个词是什么。根据当前位置前面的词语,我们知道这个词应该是一种语言的名字。为了知道是什么语言,我们需要继续往前看。于是找到了与当前位置距离很远的France位置。
不幸的是,RNN已经无法学习到距离间隔如此远的信息,也就是无法知道France的信息,从而也就无法准确预测最后一个词是什么。
为了解决这个问题,这期间有很多种方法发表。大致可以分为两类:一类是以新的方法改善或者代替传统的SGD方法,如Bengio提出的clip gradient;另一种则是设计更加精密的recurrent unit,如LSTM和GRU。
1.LSTM网络
LSTM(Long Short Term Memory)是一种特殊类型的RNN网络,它能够学习时间间隔较远的信息,通常称之为长期依赖信息。LSTM实现这一能力的设计并不复杂,其核心是通过设计特殊的网络结构来选择性记住长期的重要依赖信息,同时丢弃长期无用信息。
作为对比,简单回顾下RNN的结构。所有的RNN都是一种神经单元在时间维度上重复的链式结构。在传统的RNN中,这种神经单元通常具有简单的结构,如下图每个神经单元都只包含一个 tanh层。
其t时刻状态的计算公式:
同样,LSTM也是这样的链式结构。但与RNN不同的是,这些重复的神经单元具有不同的网络结构。每一个神经单元里包含四个特殊的交互结构。
其t时刻状态的计算公式:
其中,分别是遗忘门、输入门、输出门。
2.门结构
上面状态推导公式里提到了门。那么门是一种什么样的结构? 可以这么理解,门是一种信息筛选过滤的方法,会选择式地让信息通过。这种结构包含一个sigmoid层和pointwise乘法操作。
我们知道,sigmoid层针对每个分量的输出值在0到1之间,所以在这里实际上它描述了每个部分有多少信息量可以通过。极端取值下,0表示“不允许任何信息通过”,而1表示“允许所有信息通过”。
LSTM拥有三个门,来进行信息的传递。
- 遗忘门:将历史信息选择性地丢弃,即遗忘。
- 输入门:将当前时刻新的信息选择性记录下来。
- 输出门:根据当前收集的信息选择性输出信息。
3.LSTM的核心思想
那么,LSTM中的三个门是如何协调来完成长期依赖信息的保存呢?
答案是通过细胞状态,这是LSTM的关键结构。从图中可以看到,细胞状态类似于传送带,贯穿在整个链式结构上,在每个神经单元中只有一些少量的线性交互。这样更利于信息在上面流传保持不变。
4.深入理解 LSTM
4.1遗忘门
遗忘门决定从细胞状态中丢弃什么信息,它会读取 和
,输出一个在0到1之间的数值,这些数值在更新细胞状态
时会用到。
以刚才的预测下个一词任务来说明遗忘门的作用。
例如,
他今天有事,所以我。。。
当处理到”我“的时候选择性的忘记前面的”他“,或者说减小这个词对后面词的作用。
4.2输入门
既然要丢弃无用的信息,那么肯定也要吸收新的信息到细胞状态中。输入门决定哪些新信息被更新。
仍然以上面的句子为例。当处理到"我"这个词的时候,就会把主语”我“这一新信息添加到细胞状态中去。
4.3细胞状态更新
这一步会根据上述两个门产生的信息来对细胞状态进行更新,也就是更新为
。这里包含两个部分。
第一,创建tanh层产生一个新的候选更新状态。
第二,把旧状态与
相乘,丢弃掉不需要的信息。接着把候选状态
与
相乘得到新的候选输入信息。最后把上述两部分信息相加得到当前时刻的细胞状态
4.4输出门及状态输出
完成细胞状态更新后,我们要确定输出什么值。这里也包含两部分。
第一,通过输出门确定哪些信息被输出。
第二,将细胞状态通过tanh处理,得到在[-1,1]之间的值。接着,将它和输出门
相乘,得到最终想要的信息。
5.LSTM如何来避免梯度消失(Gradient Vanishing)
首先看下RNN是如何产生梯度消失的。
我们知道RNN的状态计算公式:。在BPTT求偏导时,根据链式法则,随着时间的累积,梯度会被表示成连乘积的形式,而这些连乘项它们的值通常小于1,很多小于1的数相乘会导致结果趋向于0,从而产生梯度消失。
而在LSTM中使用累加的方式计算状态,稍加推导可以发现导数也是累加形式,这样就不会产生梯度消失的现象了。
具体推导过程可参阅文献[2],[3]。
6.LSTM的变体
基于上面介绍的LSTM结构,衍生了很多LSTM的变体。这些衍生LSTM都做了微小的改动,差异并不大。这里介绍几个常见的变体。
第一个变体是由Gers & Schmidhuber于2000年提出的,增加了“peephole connection”。也就是每个门结构也会受到细胞状态的影响。
第二个变体是通过使用coupled忘记和输入门。与之前不同的地方在于,这里是同时决定遗忘和添加信息,而不是分开确定遗忘和添加信息。这里的相乘系数其实是互斥的。其意义是仅仅添加新信息到那些已经丢弃旧信息的状态中去。
第三个变体改动较大,也是目前被广泛使用的变体GRU(Gated Recurrent Unit),它是由Cho, et al. 于2014年提出。它将遗忘门和输入门合并成更新门,增加了重置门,输出也做了简化。GRU相对LSTM模型更简单,计算开销更小。
- 增加更新门
和重置门
。这两个门计算过程与LSTM的门计算一致。
- 候选输出状态
与LSTM中的
计算方法类似。不同之处在于,这里用
来控制历史状态需要保留多少。如果
为0,则只与当前输入有关。
的计算与上面介绍的coupled LSTM中的
计算方法类似。
对于上图展示的GRU公式,如果
= 1,
= 1,那么就变成了一个传统的RNN结构.
7.总结
LSTM和GRU是目前较为广泛使用的RNN结构。GRU参数少,结构相对简单,更容易训练,只需更少的数据能训练出较好的模型。另外,虽然LSTM参数多,但是如果数据量足够多,那么LSTM将会产生更好的结果。
参考
- [1] http://colah.github.io/posts/2015-08-Understanding-LSTMs/
- [2] An Empirical Exploration of Recurrent Network Architectures
- [3] Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling.