梯度爆炸问题是什么?梯度越传越大,训练一下子崩掉
梯度爆炸问题(Exploding Gradient Problem)是训练深层神经网络时可能遇到的一个问题:在通过反向传播计算梯度时,梯度从输出层往输入层逐层传回去,越传越大,变得极其巨大。过大的梯度会导致参数的更新幅度过大,模型的训练变得极不稳定,损失值剧烈地上下跳动,甚至变成无穷大或出现无法计算的数值,训练彻底失败。它与梯度消失问题是一对“兄弟”,两者合称为梯度不稳定问题。
为什么会出现梯度爆炸
神经网络通过反向传播算法来计算每个参数的梯度。根据链式法则,某一层的梯度等于它后面各层的导数逐层相乘的结果。如果每一层的导数,或者说每一层的权重,都大于 1,那么许多个大于 1 的数连乘起来,结果就会以指数的速度增大。比如每一层乘以 2,经过 10 层之后,梯度就会放大到原来的约一千倍;经过 30 层之后,就是十亿倍。网络越深,问题越严重。
梯度爆炸在循环神经网络中尤其常见。循环神经网络按照时间步处理序列,在每一个时间步都使用同一组权重。在时间上展开之后,相当于同一个权重矩阵被反复地相乘了很多次。如果这个矩阵会放大信号,经过很多个时间步之后,梯度就会急剧地增大。1994 年,Yoshua Bengio 等人系统地分析了循环神经网络中的梯度爆炸和梯度消失问题。
此外,权重初始化得过大、学习率设得过高,也容易引发梯度爆炸。
怎么发现梯度爆炸
训练时可以观察到一些迹象:损失值突然变得非常大,或者剧烈地波动、无法下降;模型的参数变得非常大;损失值或参数中出现了表示“不是一个数字”的 NaN 或者无穷大,这说明数值已经溢出了。可以在训练过程中监控梯度的大小,及时发现问题。
如何解决
梯度裁剪:这是最直接、最常用的方法。在每次更新参数之前,检查梯度的大小,如果超过了设定的阈值,就把它按比例缩小到阈值以内,同时保持梯度的方向不变。就像给汽车装一个限速器,无论踩多大的油门,速度都不会超过某个上限。2013 年,Razvan Pascanu 等人的研究推广了这种方法,它被广泛用于循环神经网络和 Transformer 的训练中,几乎所有的大语言模型训练都会使用梯度裁剪。
合适的权重初始化:比如 Xavier 初始化和 He 初始化,根据每一层的输入和输出的数量来设置初始权重的大小,让信号在前向和反向传播时都保持在合适的范围内。归一化:批归一化和层归一化可以让每一层输入的分布保持稳定,有效地缓解梯度不稳定的问题。残差连接:让梯度可以通过捷径直接传递,减少多层连乘带来的影响。更好的网络结构:长短期记忆网络和门控循环单元通过门控机制更好地控制信息和梯度的流动。降低学习率,以及使用带有学习率预热的训练策略:在训练刚开始时使用较小的学习率,再逐渐增大,避免一开始就出现过大的更新。此外,权重衰减等正则化方法也可以限制权重变得过大。
在大模型的训练中,即使采取了这些措施,有时仍然会出现损失突然飙升的情况,研究人员通常会采取回退到之前的检查点、跳过有问题的数据批次、调低学习率等方法来恢复训练。