CS22N 学习笔记(七)Vanishing Gradients and Fancy RNNs
Vanishing Gradients
在一个普通的RNN网络中,求下列梯度:
根据链式法则,可以得到:
如果这些导数太小就会发生梯度消失问题。
可以经过计算得到:
将其带入链式法则的公式,会得到
根据范数的计算规则,如果该矩阵的最大特征值小于1,就会越乘越小,发生梯度消失;如果最大特征值大于1,就会越乘越大,发生梯度爆炸。
Why is vanishing gradient a problem?
梯度消失使RNN在学习使更依赖于周围的步骤,远处的信号经过多个时间步的梯度传导会变得很小。
在RNN中,梯度可以解释为过去时间步对现在时间步的影响。
如果梯度消失了,无法区分下面两个问题:
- There’s no dependency between step t and t+n in the data
- We have wrong parameters to capture the true dependency between t and t+n
Effect of vanishing gradient on RNN-LM
课程中举了一些例子来说明梯度消失对RNN的影响。
比如普通的RNN语言模型无法预测除这个词使ticket,因为它离我们要预测的空格太远了。
或者普通的RNN倾向于预测下面这种:
由于梯度消息,普通的RNN网络倾向于预测序列正确性而不是语法正确性。
Why is exploding gradient a problem?
如果梯度太大的话,以梯度下降为例,那每次更新的时候就会特别的大。
就有可能直接更新过头了,就引起震荡或者发散。
或者梯度一直变大最后程序中显示NaN或者无限大。
Gradient clipping: solution for exploding gradient
解决梯度爆炸的方法就是,每次计算梯度后加一个限幅,限制梯度过大,思路如图;
加上clipping的效果如图所示:
普通的RNN网络由于隐藏状态每次都被更新,因此无法很久时间步之前的信息,为例解决这个问题,又提出了其余的RNN网络。
Long Short-Term Memory (LSTM)
lstm中不仅仅隐藏状态还有,他们是等长的向量,中储存又长时间的信息,从读取信息。
lstm中erased/written/read是由门控制的,他们也都是等长的向量。
如图是lstm的三个门的计算公式,从上到下依次是遗忘门,输入门,输出门
遗忘门:控制之前的cell状态是遗忘还是保持。
输入门:控制输出是否写入新的cell状态里面。
输出门:控制cell状态是否写入隐藏状态。
可以用一张图来表示lstm:
lstm可以将数据储存到cell状态里,这样就可以保留很久之前的时间步的信息,在一定程度上解决了梯度消失的问题。
Gated Recurrent Units (GRU)
GRU也是一种普通RNN的改进,它只有。他又两个门,更新门和重置门。公式如下:
更新门:控制哪一部分是更新还是保留
重置门:控制生成新的
LSTM vs GRU
lstm效果更好,但是GRU运算更快,效率更高。
通常一开是采用lstm,如果追求高效率的话切成GRU
梯度消息和爆炸不只是RNN中,各种深度网络中都存在这个问题。所以各种各样的解决方法(见ppt)。
Bidirectional RNNs
考虑的序列可能有顺序,但是普通的RNN是单向的,所以它有可能只读取前半段,从而对语言产生片面的理解。这个时候就采用双向RNN。
它的原理就建立两个RNN,一个Forward一个Backward,然后将产生的隐藏层合并如图所示:
公式如图所示:
他的一个应用要求就是你必须已知完整的数据序列,因此无法用于语言模型,但他的功能是比较厉害的,因此默认采用双向RNN。
Multi-layer RNNs
普通的RNN是只有一个时间的维度的,在每个时间点上是只有一层的,如果将每个时间点有一层变成了多层,就是Multi-layer RNNs。