采用 s i g m o i d sigmoid sigmoid 为激活函数,当反向传播使用 链式法则 的时候会有连乘,就会出现梯度消失。

由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。(因为推反向传播的时候才会用到 链式法则,详细见后面推导)

解决办法

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

解决梯度消失、爆炸主要有以下几种方案:

1. 换用Relu、LeakyRelu、Elu等激活函数
  1. ReLu:让激活函数的导数为1

  2. LeakyReLu:包含了ReLu的几乎所有有点,同时解决了 ReLu 中 0 区间带来的影响

  3. ELU:和LeakyReLu一样,都是为了解决0区间问题,相对于来,elu计算更耗时一些(为什么)

具体可以看关于各种激活函数的解析与讨论

2. BatchNormalization (面试常考)

可参考 Batch Normalization(算法面试几乎必考)

3. ResNet残差结构、DenseNet

主要是 shortcut 这种操作,解决了梯度消失问题

4. LSTM结构

LSTM不太容易发生梯度消失,主要原因在于LSTM内部复杂的“门(gates)”,具体看LSTM基本原理解析

LSTM 超详细公式手推

5. 预训练加finetunning

此方法来自Hinton在06年发表的论文上,其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。

训练完成后,再对整个网络进行“微调(fine-tunning)”。

此方法相当于是找局部最优,然后整合起来寻找全局最优,但是现在基本都是直接拿imagenet的预训练模型直接进行finetunning。

6. 梯度剪切( Clip 操作)、正则

这个方案主要是针对梯度爆炸提出的,其思想是设值一个剪切阈值,如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。

另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式:

可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

7. 权重初始化时候的一些技巧

梯度消失推导: