反向传播
在看梯度消失和梯度爆炸之前,首先应了解反向传播的思想。因为梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。
反向传播算法(Backpropagation)的主要思想是:
- 将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这是神经网络的前向传播过程;
- 由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
- 在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
**通俗理解:**训练集作为输入时,层与层之间连接的权重w及偏差b都是初始化的,训练的目标就是通过反向传播调整w和b,使模型的预测效果尽可能接近理想输出,即最小化误差。为了找到损失函数的极小值,梯度下降无疑是种有效的方法。
模型推导可看参考文献1,2,很详细。
梯度下降
之前看过一篇梯度下降的形象化解释(参考文献3):
以一个人下山为例。比如刚开始的初始位置是在红色的山顶位置,那么现在的问题是该如何达到蓝色的山底呢?按照梯度下降算法的思想,它将按如下操作达到最低点:
- 明确自己现在所处的位置;
- 找到相对于该位置而言下降最快的方向;
- 沿着第二步找到的方向走一小步,到达一个新的位置,此时的位置肯定比原来低;
- 重复1-3;
- 终止于最低点。
按照以上5步,最终达到最低点,这就是梯度下降的完整流程。
梯度消失
在神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率(激活函数的导数值往往小于1,当层级很多时,从输出层向输入层反向传播的过程中导数逐渐趋近于0,这样越靠前的层级,其w,b参数的值难以更新,神经网络无法优化,训练无法收敛),即随着隐藏层数目的增加,分类准确率反而下降了。这就是梯度消失现象。
产生梯度消失的主要原因有:
- 隐藏层的层数过多;
- 采用了不合适的激活函数(更容易产生梯度消失,但是也有可能产生梯度爆炸)。
梯度爆炸
梯度爆炸则主要是指权重值在反向传播的过程中变得过大。以sigmoid激活函数为例,当权值|w|过大时,导致 |sigmoid’(z)w| > 1,当层级很多时,大于1的值不断相乘,梯度呈指数级增长,最后到输入时,梯度将会非常大,会得到一个非常大的权重更新,就会产生梯度爆炸。
在网络训练过程中,如果出现模型不能在训练集上收敛、损失函数值变为NaN、损失更新变化大不稳定等现象,就有可能是梯度爆炸。权重 变化大、权重值为NaN、梯度一直大于1也有一定可能是梯度爆炸。在训练时应注意这些情况。
产生梯度爆炸的主要原因有:
- 隐藏层的层数过多;
- 权重的初始化值过大。
解决梯度消失和梯度爆炸的常用方法
- 梯度剪切、正则
梯度剪切:主要针对梯度爆炸,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
权重正则化(weithts regularization):常用L1正则和L2正则,其主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。 - 选择relu等梯度大部分落在常数上的激活函数
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu函数公式:
图像:
- batch normalization
BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉到了非饱和区。 - 残差网络的捷径(shortcut)
Deep Residual Learning for Image Recognition - LSTM的“门(gate)”结构
LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),如下图所示。
LSTM 通过它内部的“门”可以在接下来更新的时候“记住”前几次训练的”残留记忆“。