你是否遇到过这样的场景:训练刚开始看似正常,损失缓缓下降,突然某一刻后,损失值开始剧烈震荡,甚至直接飙出 NaN,整个模型瞬间崩溃。这不是你代码写错了,而是你的网络深处正在发生一场无声的爆炸——梯度爆炸。 在反向传播中,梯度通过链式法则逐层回传。如果每一层的局部梯度都稳定小于 1,连乘结果会指数级衰减,这就是臭名昭著的梯度消失。而梯度爆炸恰恰是它的镜像灾难:当每一层的传播项(通常由权重值驱动)持续大于 1,比如 2.5,那么梯度经过多层后会变成 2.5 × 2.5 × 2.5 … 指数级膨胀。原本一个很小的修正量,传到浅层时已经放大到天文数字。 更新规则 w_new = w_old - lr * gradient 决定了这种膨胀的致命后果。梯度一旦巨大,即使学习率再保守,权重更新步长也跟着疯狂飙升。你只会看到损失函数像过山车一样上下翻飞,参数值疯涨,直到超出浮点数范围变成 NaN,训练彻底崩溃。整个过程往往毫无预兆,前一秒还风平浪静,后一秒直接翻车。 幸运的是,阻击梯度爆炸有三大立竿见影的技术: 1. 梯度裁剪:不论计算出的原始梯度有多大,都硬性把它的范数压缩到设定阈值内,再拿去更新参数。粗暴但极其有效。 2. 慎重的权重初始化:像 Xavier 或 He 初始化这类方法,会根据网络层的维度精心设定初始权重尺度,从根源上抑制梯度在层间传播时无限膨胀或消失的倾向。 3. 批归一化:在每个层之间对激活值进行归一化,强行把数据分布拉回到稳定区间,间接压住了梯度的发散趋势。 这三招组合使用,几乎可以挡住绝大多数由梯度爆炸引发的训练灾难。下次当你的模型突然嗑药般失控,别再只盯着学习率,检查一下你的梯度是不是已经在深层埋下了引爆的引信。
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.