在训练较为复杂的RNN类型网络时,有时会采取正交方法初始化(orthogonal initialization)网络参数。本文用简单的例子介绍其中的原因。
本文较大程度参考了这篇博客。
简单例子
RNN具有如下形式:
我们考虑一个极端简化的版本:没有输入,激活函数为直通,直接输出隐变量。
计算第t步的输出时,需要计算参数矩阵的t次幂:
为了计算简便,可以把方阵
其中
优化网络参数时,使用简单的二范数代价:
为了更新参数,需要计算代价对于参数的导数(是个标量):
梯度消失/爆炸
当RNN步数t增加时,
∂yt/∂Wi 会怎样变化呢?
为书写直观假设
可以直接写出
分别写出对四个参数的导数(长度为2的矢量):
重点:每一项里都有
代价对于参数的导数
∝ 参数矩阵特征值λi 的t次方。
如果
如果
正交初始化
理想的情况是,特征值绝对值为1。则无论步数增加多少,梯度都在数值计算的精度内。
这样的参数矩阵
把转移矩阵初始化为单位正交阵,可以避免在训练一开始就发生梯度爆炸/消失现象,称为orthogonal initialization。
其他解决方法
除了正交初始化,在RNN类型网络训练中,还可以使用如下方法解决梯度消失/爆炸问题:
- 使用ReLU激活函数->解决梯度消失
- 对梯度进行剪切(gradient clipping)->解决梯度爆炸
- 引入更复杂的结构,例如LSTM、GRU->解决梯度消失