一、梯度消失(Vanishing gradients)
(1)定义
在训练深度神经网络时,随着误差梯度从输出层向输入层逐层回传,梯度可能因为连乘效应逐渐减小。当使用激活函数的导数的最大值小于1时,深度网络中越前面的层(靠近输入层的层)在梯度回传过程中梯度变小得越快。如果梯度过小,它会使得网络的权重几乎不更新,从而导致学习过程中先导层训练缓慢,这就是所谓的梯度消失问题。
梯度下降算法的权重更新公式:
其中是权重,是学习率,是权重的梯度。梯度消失问题表现为接近于0,导致权重的更新量变得非常小。
(2)举例理解
① 比喻举例
假设有一场“传话游戏”,有5个人在操场上站成一排,从队列中的最后一个孩子开始,让他们一个接一个地传递给最前面的孩子。在这个过程中,每个孩子只能复述他们听到的内容,且由于各种原因(比如声音太轻、风声干扰、听不清等),每传一次,信息就可能会变得模糊一些。当信息传到队伍前端时,原本清晰的信息可能已经变得难以辨认,甚至完全消失。这就是“信息消失”的现象。
② 具体案例
使用Sigmoid激活函数的深层神经网络容易出现梯度消失问题。Sigmoid函数在两端的导数值非常接近零,这意味着当网络层次加深时,反向传播的梯度经过多层Sigmoid函数后,会迅速衰减到几乎为零,使得前几层的权重几乎得不到有效更新。
假设上面这个图中的神经网络激活函数是线性激活函数,这样一来输出就可以写成:
如果使用激活函数(如Sigmoid)的导数的最大值小于1时(比如0.5),那么得到的输出是层数越深,激活函数输出以指数级递减。这样的情况也适用于与层数相关的导数或梯度函数,也是呈指数级递减。
二、梯度爆炸(Exploding gradients)
(1)定义
在训练深度神经网络时,权重的更新梯度成指数级增长。如此大的梯度值会导致权重的大幅波动,使得网络模型无法稳定下来,或者导致数值计算上溢,变得无法继续学习。梯度爆炸通常在RNNs中较为常见,尤其当时间序列数据非常长的时候。
梯度下降算法的权重更新公式:
其中是权重,是学习率,是权重的梯度。梯度爆炸则表现为极大,使得更新步长非常大,可能在数值上溢(梯度值超过了计算机浮点数的表示范围)或者导致权重变得非常大以至于模型不稳定。
(2)举例理解
③ 比喻举例
假设有5个话筒和5个扬声器喇叭,他们是一对一对的组成5对,现在把他们收尾相连即“(话筒1,喇叭1) > (话筒2,喇叭2)>...>(话筒5,喇叭5)”,当你在第一个话筒处发出声音,声音会被一层层放大,直至超过喇叭的最大输出响度,产生啸叫。
④ 具体案例
假设上面这个图中的神经网络激活函数是线性激活函数,这样一来输出就可以写成:
如果使用激活函数(如Sigmoid)的导数的最大值大于1时(比如1.5),那么得到的输出是层数越深,激活函数输出以指数级递增。这样的情况也适用于与层数相关的导数或梯度函数,也是呈指数级递增。
三、避免梯度消失和梯度爆炸的方法
(1)避免梯度消失
- 选择合适的激活函数:使用ReLU激活函数及其变种(如Leaky ReLU, ELU等),它们的导数不会随着输入值的增大而减小,有助于缓解梯度消失问题。
- 合适的初始化权重:采用He初始化或Xavier/Glorot初始化等策略,可以根据网络中每层的输入和输出尺寸来适当设定权重的初始化值,从而帮助梯度更平稳地流动。
(2)避免梯度爆炸
- 选择合适的优化算法:如使用具有动量项的SGD或Adam等,以确保梯度在反向传播过程中保持在一个可控范围内,从而使模型能够稳健地学习和优化。
- 使用梯度裁剪:在反向传播时,如果计算出的梯度超出了某个阈值,就将它限制在这个阈值范围内。这个技术对于防止梯度爆炸尤其有用。