CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs

Vanishing Gradients

在一个普通的RNN网络中,求下列梯度:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
根据链式法则,可以得到:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
如果这些h(i+1)h(i)\frac{\partial h^{(i+1)}}{\partial h^{(i)}}导数太小就会发生梯度消失问题。
可以经过计算得到:CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
将其带入链式法则的公式,会得到Whij{W_h^{i-j}}
根据范数的计算规则,如果该矩阵的最大特征值小于1,就会越乘越小,发生梯度消失;如果最大特征值大于1,就会越乘越大,发生梯度爆炸。

Why is vanishing gradient a problem?

梯度消失使RNN在学习使更依赖于周围的步骤,远处的信号经过多个时间步的梯度传导会变得很小。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
在RNN中,梯度可以解释为过去时间步对现在时间步的影响。
如果梯度消失了,无法区分下面两个问题:

  1. There’s no dependency between step t and t+n in the data
  2. We have wrong parameters to capture the true dependency between t and t+n

Effect of vanishing gradient on RNN-LM

课程中举了一些例子来说明梯度消失对RNN的影响。
比如普通的RNN语言模型无法预测除这个词使ticket,因为它离我们要预测的空格太远了。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
或者普通的RNN倾向于预测下面这种:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
由于梯度消息,普通的RNN网络倾向于预测序列正确性而不是语法正确性。

Why is exploding gradient a problem?

如果梯度太大的话,以梯度下降为例,那每次更新的时候就会特别的大。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
就有可能直接更新过头了,就引起震荡或者发散。
或者梯度一直变大最后程序中显示NaN或者无限大。

Gradient clipping: solution for exploding gradient

解决梯度爆炸的方法就是,每次计算梯度后加一个限幅,限制梯度过大,思路如图;
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
加上clipping的效果如图所示:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
普通的RNN网络由于隐藏状态h(t)h^{(t)}每次都被更新,因此无法很久时间步之前的信息,为例解决这个问题,又提出了其余的RNN网络。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs

Long Short-Term Memory (LSTM)

lstm中不仅仅隐藏状态h(t)h^{(t)}还有c(t)c^{(t)},他们是等长的向量,c(t)c^{(t)}中储存又长时间的信息,h(t)h^{(t)}c(t)c^{(t)}读取信息。
lstm中erased/written/read是由门控制的,他们也都是等长的向量。
如图是lstm的三个门的计算公式,从上到下依次是遗忘门,输入门,输出门

CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
遗忘门:控制之前的cell状态是遗忘还是保持。
输入门:控制输出是否写入新的cell状态里面。
输出门:控制cell状态是否写入隐藏状态。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
可以用一张图来表示lstm:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
lstm可以将数据储存到cell状态里,这样就可以保留很久之前的时间步的信息,在一定程度上解决了梯度消失的问题。

Gated Recurrent Units (GRU)

GRU也是一种普通RNN的改进,它只有h(t)h^{(t)}。他又两个门,更新门和重置门。公式如下:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
更新门:控制哪一部分h(t)h^{(t)}是更新还是保留
重置门:控制生成新的h(t)h^{(t)}
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
LSTM vs GRU
lstm效果更好,但是GRU运算更快,效率更高。
通常一开是采用lstm,如果追求高效率的话切成GRU
梯度消息和爆炸不只是RNN中,各种深度网络中都存在这个问题。所以各种各样的解决方法(见ppt)。

Bidirectional RNNs

考虑的序列可能有顺序,但是普通的RNN是单向的,所以它有可能只读取前半段,从而对语言产生片面的理解。这个时候就采用双向RNN。
它的原理就建立两个RNN,一个Forward一个Backward,然后将产生的隐藏层合并如图所示:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
公式如图所示:
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
他的一个应用要求就是你必须已知完整的数据序列,因此无法用于语言模型,但他的功能是比较厉害的,因此默认采用双向RNN。

Multi-layer RNNs

普通的RNN是只有一个时间的维度的,在每个时间点上是只有一层的,如果将每个时间点有一层变成了多层,就是Multi-layer RNNs。
CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs