资讯

梯度消失问题是什么?深层网络前面几层几乎学不动

2026-11-053 分钟阅读百科
TL;DR梯度消失问题(Vanishing Gradient Problem)指在训练深层神经网络或循环神经网络时,误差梯度在反向传播中逐层相乘不断变小,导致靠近输入的层几乎得不到更新、训练停滞,Hochreiter 在 1991 年分析了这一问题,ReLU、LSTM、残差连接和归一化等技术有效缓解了它。

梯度消失问题(Vanishing Gradient Problem)是训练深层神经网络时遇到的一个经典难题:在通过反向传播计算梯度时,梯度从输出层往输入层一层层地传回去,越传越小,到了靠近输入的那些层,梯度已经小到几乎为零。结果是这些层的参数几乎得不到更新,网络学不到有用的东西,训练变得极其缓慢甚至停滞。

为什么会出现梯度消失

神经网络是通过反向传播算法来训练的:先计算出网络输出的误差,再根据链式法则,从后往前逐层计算每个参数的梯度,也就是误差对这个参数的影响有多大,然后据此调整参数。按照链式法则,某一层的梯度等于它后面各层的导数一层层乘起来的结果。如果每一层的导数都小于 1,那么很多个小于 1 的数连乘起来,结果就会以指数的速度变小。比如每一层乘以 0.25,经过 10 层之后,梯度就只剩下原来的约百万分之一。

早期的神经网络常用 Sigmoid 函数作为激活函数,它把输入压缩到 0 和 1 之间。它的导数最大也只有 0.25,而且当输入很大或很小时,导数几乎为零,也就是函数进入了“饱和区”。这使得梯度消失的问题尤其严重。1991 年,Sepp Hochreiter 在他的毕业论文中系统地分析了这个问题,1994 年 Yoshua Bengio 等人也对循环神经网络中的这一问题进行了深入的研究。

在循环神经网络中

梯度消失在循环神经网络中同样严重。循环神经网络按时间步处理序列,在时间上展开后,就相当于一个非常深的网络。梯度沿着时间往回传递,经过很多个时间步之后就会消失。这导致循环神经网络很难学到序列中相隔很远的元素之间的关系,也就是长期依赖。比如在一个很长的句子中,句首的主语决定了句尾动词的形式,但网络可能已经“忘记”了句首的信息。

如何解决

研究者提出了多种方法来缓解梯度消失:更好的激活函数,ReLU 函数在输入为正时导数恒为 1,不会让梯度在传递中缩小,它的普及是深度学习能够训练更深网络的重要原因之一,后来还出现了 Leaky ReLU、GELU 等变体;长短期记忆网络(LSTM),由 Hochreiter 和 Jürgen Schmidhuber 在 1997 年提出,通过门控机制和一条“细胞状态”通道,让信息和梯度能够在很长的时间跨度上稳定地传递,专门用来解决循环神经网络中的梯度消失问题,门控循环单元(GRU)也基于类似的思想;残差连接,何恺明等人在 2015 年提出的残差网络(ResNet)在层与层之间增加了“捷径”,让输入可以直接跳过若干层加到输出上,梯度也可以通过这些捷径直接传回前面的层,从而能够训练上百层甚至上千层的网络,如今 Transformer 中也普遍使用残差连接;合适的权重初始化,比如 Xavier 初始化和 He 初始化,让每一层的信号在一开始就保持合适的大小;批归一化和层归一化,让每一层的输入保持稳定的分布。

它的“兄弟”:梯度爆炸

与梯度消失相对的是梯度爆炸:如果每一层的导数都大于 1,连乘之后梯度会变得极大,导致参数的更新幅度过大,训练变得不稳定甚至直接崩溃。梯度爆炸通常用梯度裁剪来解决,也就是当梯度超过某个阈值时,把它缩小到阈值以内。