在深度学习中,梯度消失和梯度爆炸是训练深层神经网络时常见的两大问题,它们会严重影响网络的训练过程和性能。
一、什么是梯度?
梯度是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值。换句话说,函数在该点处沿着梯度的方向变化最快,变化率最大(梯度的模即为该最大方向导数的值)。在多元函数中,梯度是由各参数的偏导数组成的向量,它指明了函数值增长最快的方向。


参考学习资料:函数梯度与隐函数
参考学习视频:10分钟了解方向导数与梯度_哔哩哔哩_bilibili
在机器学习中,梯度主要用于优化算法中,特别是用于寻找损失函数的最小值。损失函数是衡量模型预测值与真实值之间差异的函数,优化损失函数的过程就是训练模型的过程。
二、梯度消失(Vanishing gradients)
1、定义
在训练深度神经网络时,随着误差梯度从输出层向输入层逐层回传,梯度可能因为连乘效应逐渐减小。当使用激活函数的导数的最大值小于1时,深度网络中越前面的层(靠近输入层的层)在梯度回传过程中梯度变小得越快。如果梯度过小,它会使得网络的权重几乎不更新,从而导致学习过程中先导层训练缓慢,这就是所谓的梯度消失问题。
梯度下降算法的权重更新公式:

其中W是权重,η是学习率,∂J/∂W是权重的梯度。梯度消失问题表现为∂J/∂W接近于0,导致权重的更新量变得非常小。(比如:0.00000000....1小数点后好多位,导致梯度值超过了计算机浮点数的表示范围)
2、梯度消失的原因
梯度消失的主要原因包括激活函数的选择、链式法则的应用、权重初始化不当以及网络层数过多等。
(1)激活函数的选择
在使用某些激活函数(如Sigmoid和Tanh)时,当输入值非常大或非常小的时候,这些函数的导数(或梯度)会趋近于零。例如,Sigmoid函数的导数范围在[0, 0.25]之间,这意味着在反向传播过程中,梯度会逐层衰减,最终导致靠近输入层的参数几乎无法更新。
(2)链式法则的应用
在深度神经网络中,梯度是通过链式法则从输出层逐层反向传播到输入层的。每一层的梯度都是前一层梯度与该层激活函数导数的乘积。如果每一层的梯度都稍微减小一点,那么经过多层传播后,梯度值就会变得非常小,几乎为零。

(3)权重初始化不当
如果网络权重的初始值设置得太小,那么在前向传播过程中,输入信号可能会迅速衰减,导致激活函数的输入值非常小,进而使得梯度在反向传播过程中也迅速减小。
(4)网络层数过多
随着网络层数的增加,梯度需要通过更多的层进行反向传播。每一层都可能对梯度进行一定的衰减,因此层数越多,梯度消失的风险就越大。
3、缓解梯度消失的方法
为了缓解梯度消失问题,可以采取多种策略,如使用ReLU或其变体作为激活函数、采用合适的权重初始化策略、引入批量归一化(Batch Normalization)以及使用残差连接(Residual Connections)等。例如:
选择合适的激活函数:使用ReLU激活函数及其变种(如Leaky ReLU, ELU等),它们的导数不会随着输入值的增大而减小,有助于缓解梯度消失问题。
合适的初始化权重:采用He初始化或Xavier/Glorot初始化等策略,可以根据网络中每层的输入和输出尺寸来适当设定权重的初始化值,从而帮助梯度更平稳地流动。
批标准化(Batch Normalization):批标准化通过标准化每层的输入,减少激活函数的饱和现象,从而帮助缓解梯度消失问题。因为它使得每一层的输入分布更加稳定,避免了输入数据分布的剧烈变化,从而提高了训练的稳定性。(在每一层之前对激活函数的输入进行归一化,保持激活值在一个合理的范围内,有助于保持较好的梯度流。)
三、梯度爆炸(Exploding gradients)
1、定义
在训练深度神经网络时,权重的更新梯度成指数级增长。如此大的梯度值会导致权重的大幅波动,使得网络模型无法稳定下来,或者导致数值计算上溢,变得无法继续学习。梯度爆炸通常在RNNs中较为常见,尤其当时间序列数据非常长的时候。
梯度下降算法的权重更新公式:

其中W是权重,η是学习率,∂J/∂W是权重的梯度。梯度爆炸问题表现为∂J/∂W极大,使得更新步长非常大,可能在数值上溢或者导致权重变得非常大以至于模型不稳定。(比如:123123123123....1非常非常大,导致梯度值超过了计算机浮点数的表示范围)
2、梯度爆炸的原因
(1)权重初始化过大
在神经网络中,如果权重的初始值设置得过大,那么在反向传播过程中,梯度值可能会因为权重的累积效应而迅速增大,导致梯度爆炸。
(2)网络层数过多
在深层神经网络中,由于链式法则的应用,梯度需要通过多层进行反向传播。如果每一层的梯度都稍微增大一点,那么经过多层传播后,梯度值就会变得非常大,导致梯度爆炸。
(3)学习率设置过高
学习率决定了模型参数更新的步长。如果学习率设置得过高,那么模型参数在更新时可能会因为步长过大而跳出最优解的范围,同时过高的学习率会使模型在更新参数时过于激进,从而加剧梯度的波动。
3、缓解梯度爆炸的方法
为了缓解梯度爆炸问题,可以采取多种策略,如使用梯度裁剪、合理初始化权重、调整学习率并选择稳定的优化算法来降低梯度爆炸的风险。例如:
选择合适的优化算法:如使用具有动量项的SGD或Adam等,以确保梯度在反向传播过程中保持在一个可控范围内,从而使模型能够稳健地学习和优化。
使用梯度裁剪:在反向传播时,如果计算出的梯度超出了某个阈值,就将它限制在这个阈值范围内。这个技术对于防止梯度爆炸尤其有用。
参考资料1:一文彻底搞懂深度学习:梯度消失和梯度爆炸-CSDN博客
参考资料2:【机器学习300问】77、什么是梯度消失和梯度爆炸?-CSDN博客
参考资料3:梯度消失&梯度爆炸 - 知乎