原文链接:深度学习中的梯度消失、梯度爆炸问题的原因以及解决方法
- 使用了深层网络,当层数越深的时候,梯度将以指数形式传播。在根据损失函数计算的误差通过梯度反向传播的方式对深度网络权值进行更新时,得到的梯度值接近0,也就是梯度消失。
- 计算权值更新信息的时候需要计算前层偏导信息,如果采用了不合适的损失函数,如sigmoid,则容易发生梯度消失情况。
解决方法:
- 预训练+微调。Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优。
- 选择relu等梯度大部分落在常数上的激活函数。relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失的问题。
- batch normalization。BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失的问题,或者可以理解为BN将输出从饱和区拉到了非饱和区。
- 使用梯度剪切预防梯度爆炸。为梯度设置一个阈值,在更新过程中,超过这个阈值的梯度被强制限定在这一范围,防止梯度爆炸。
- 使用正则化 (regularization) 预防梯度爆炸。在损失函数中加入参数的正则化项,在防止过拟合的同时,还可以防止梯度爆炸。
- 使用残差网络ResNet
- LSTM网络