梯度消失问题是深度神经网络训练中的一个挑战,在反向传播过程中,用于更新模型权重的梯度随着层数的增加而变得极小。这使得网络中靠前的层学习速度大大减慢,甚至完全停止学习,而靠后的层则能有效学习。这个问题出现的原因是反向传播时梯度是通过链式法则计算的,而激活函数或权重初始化产生的较小导数值的重复相乘会导致梯度呈指数级缩小。例如,在一个使用 sigmoid 激活函数的 10 层网络中,第一层的梯度可能会被乘以 0.25(sigmoid 的最大导数值)十次,从而减小到接近于零。这使得靠前的层无法获得有意义的更新,即使靠后的层能够有效训练。
这个问题在具有许多层或使用某些激活函数的网络中最为突出。例如,传统的激活函数如 sigmoid 或双曲正切(tanh)的导数峰值分别为 0.25 和 1.0,但在远离其输入范围中心时,这些值会迅速下降。如果这些函数的输入没有经过仔细缩放,大多数神经元可能在导数接近于零的区域运行,从而加剧梯度缩小。例如,在使用循环神经网络(RNN)的文本生成模型中,早期时间步的梯度常常消失,使得模型难以学习序列中的长期依赖关系。类似地,具有许多层的卷积网络如果早期卷积层没有接收到有效的梯度更新,可能无法检测图像中的基本边缘或纹理。
为了缓解梯度消失问题,通常采用几种策略。首先,偏好使用 ReLU(修正线性单元)或其变体(如 Leaky ReLU、Parametric ReLU)等激活函数,因为对于正输入,它们的导数是 1,避免了乘法缩小。其次,残差连接(例如在 ResNet 中)等架构选择允许梯度通过快捷路径绕过层,从而保留其大小。例如,一个残差块将层的输入直接添加到其输出中,确保即使层的转换降低了信号质量,原始梯度仍然可以流过。第三,仔细的权重初始化(例如 He 初始化)和批归一化(batch normalization)等归一化技术有助于将神经元激活保持在导数非零的范围内。这些方法共同使得更深层的网络能够有效训练,这在现代架构如 Transformers 或 Vision Transformers 中可见一斑,它们可以拥有数百层而不会出现梯度消失的问题。