梯度消失、梯度爆炸

梯度消失、梯度爆炸

深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。

当神经网络的层数较多时,模型的数值稳定性容易变差。

假设一个层数为 L L 的多层感知机的第 l l H ( l ) \boldsymbol{H}^{(l)} 的权重参数为 W ( l ) \boldsymbol{W}^{(l)} ,输出层 H ( L ) \boldsymbol{H}^{(L)} 的权重参数为 W ( L ) \boldsymbol{W}^{(L)} 。为了便于讨论,不考虑偏差参数,且设所有隐藏层的激活函数为恒等映射(identity mapping) ϕ ( x ) = x \phi(x) = x 。给定输入 X \boldsymbol{X} ,多层感知机的第 l l 层的输出 H ( l ) = X W ( 1 ) W ( 2 ) W ( l ) \boldsymbol{H}^{(l)} = \boldsymbol{X} \boldsymbol{W}^{(1)} \boldsymbol{W}^{(2)} \ldots \boldsymbol{W}^{(l)} 。此时,如果层数 l l 较大, H ( l ) \boldsymbol{H}^{(l)} 的计算可能会出现衰减或爆炸。举个例子,假设输入和所有层的权重参数都是标量,如权重参数为0.2和5,多层感知机的第30层输出为输入 X \boldsymbol{X} 分别与 0. 2 30 1 × 1 0 21 0.2^{30} \approx 1 \times 10^{-21} (消失)和 5 30 9 × 1 0 20 5^{30} \approx 9 \times 10^{20} (爆炸)的乘积。当层数较多时,梯度的计算也容易出现消失或爆炸。

梯度消失、爆炸会带来哪些影响

举个例子,对于一个含有三层隐藏层的简单神经网络来说,当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。

解决办法

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

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

换用Relu、LeakyRelu、Elu等激活函数

ReLu:让激活函数的导数为1

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

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

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

BatchNormalization

BN本质上是解决传播过程中的梯度问题

ResNet残差结构

Resnet

LSTM结构

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

预训练加finetunning

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

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

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

梯度剪切、正则

这个方案主要是针对梯度爆炸提出的,其思想是设值一个剪切阈值,如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。
另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式:可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

发布了123 篇原创文章 · 获赞 71 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/boke14122621/article/details/104331199