找回密码
立即注册
搜索
发回帖 发新帖

5107

积分

0

好友

655

主题
发表于 昨天 20:01 | 查看: 21| 回复: 0

开场

softmax 加交叉熵大概是深度学习里最“不值得怀疑”的组件了。所有主流框架——JAX、PyTorch、TensorFlow——的实现都遵循同一套教科书写法:先减去 logit 最大值防止溢出,再算指数归一化。这套写法早在 2002 年就写进了数值分析教材。

Softmax函数定义公式

A Fix for Softmax and Cross-Entropy 论文标题与作者信息

直到 Google DeepMind 发现:这套标准实现里藏着两个数值 bug,而 grokking 研究中困扰大家多年的 Slingshot 损失尖峰,正是 bug 的直接后果。

Figure 1: 标准 softmax 与交叉熵中的两个 bug:Softmax Collapse 与 Softmax Cancellation

两个 bug:精度悬崖与相消误差

第一个 bug 叫 Softmax Collapse。 当模型对正确答案越来越自信(用 logit margin m 衡量自信程度),目标 logit 的梯度本应指数级缩小、但始终非零。可标准实现里,一旦 m 越过一道“精度悬崖”——bf16 约 5.5、fp32 约 16.6、fp64 约 36.7——这个梯度就被直接舍入成 0。

Jon Barron 社交媒体帖子:指出所有现有实现都存在数 bug

第二个 bug 叫 Softmax Cancellation,专坑蒸馏。 学生 logits 逼近教师 logits 时,标准实现分别算出 q 和 p 再相减。两个近乎相等的概率相减,精度大打折扣;更糟的是前向用 softmax、反向用 log-softmax,公式路径不同,即使学生与教师完全相等,梯度也不为零,留下一层甩不掉的噪声地板。

修复:核心就一句话

两个 bug 的修复思路出奇朴素:

Figure 2: Slingshot 机制,有无修复对比

  • 永远别把 1 和 e^{-m} 直接相加。 把最大 logit 位精确置 0,用数值稳定的 softplus(−m) 替代 log(1+e^{-m}),autodiff 会自动推出“目标梯度 = 非目标梯度之和取负”,天然零和。
  • 在 log 空间直接算 q − p。 借助 expm1 和 log1p 避开一切“减 1”操作,学生等于教师时梯度精确为 0。

不修精度、不做内部 cast,几行代码的 drop-in 替换,几乎没有额外开销。

如果你对 softmax 加交叉熵的底层实现感兴趣,可以看看深度学习必修课:进击算法工程师,其中系统讲解了从数学基础到 Transformer 的完整推导路径。

Slingshot 的真相:一场由舍入误差引发的循环

grokking 训练中,网络先火速记忆训练集,泛化姗姗来迟,期间损失曲线上反复出现诡异尖峰——这就是 Thilak 等人 2022 年记录的 Slingshot 现象。本文给出了一条完整的因果链:

Figure 3: 归一化 Adam 步长随 logit margin 的变化

margin 涨过精度悬崖 → 目标梯度被清零 → 参数梯度近乎消失 → Adam 的二阶矩 √v̂ 指数衰减 → 权重衰减把个别样本拖回悬崖之下 → 目标梯度突然恢复,而 Adam 此时要除以一个极小的 √v̂+ϵ → 一步巨大的参数更新 → 损失尖峰 → 周而复始。

修复后的交叉熵让梯度平滑穿过悬崖,尖峰彻底消失。上图两组实验很说明问题:有权重衰减时,修复版 5 个种子全部 grok 成功(100±0%,标准版 94±5%);无权重衰减时,标准版在约 1250 步撞崖,测试准确率从 61% 崩到 23%,修复版则平稳走到 85%。

关于 Adam 的二阶矩 √v̂ 指数衰减这一优化器行为,AI人工智能工程师:从入门到精通全栈实战课程中也从训练调优角度做了相关剖析,适合想深入理解优化器数值特性的读者。

一个漂亮的副产品:m* ≈ log(1/ϵ)

修复后还有一个耐人寻味的现象:margin 不再无限增长,而是停在 18.4 附近。这不是精度限制,而是权重衰减与 Adam 归一化步长的平衡点。当梯度 |g| 缩到远小于 ϵ 后,Adam 的归一化步长随 e^{-m} 衰减,与权重衰减 λθ 抵消时训练自锁,解出来就是 *m ≈ log(1/ϵ)**。

Figure 4: 不同 ϵ 下 margin 平衡点的验证

这个公式顺手解释了为什么默认配置必然中招:ϵ=10^{-8} 时平衡点在 18.4,恰好比 fp32 悬崖 16.6 高一点点——标准实现总是在到达平衡之前先撞崖。

Figure 5: 三种浮点精度下的对比

作者用 LaProp 在 fp32 下验证了跨越多个数量级的 ϵ,实测平衡点与解析预测逐一吻合;ϵ=0 时 margin 则一路涨到梯度本身下溢(m≈81)才停。

实验:修复版全精度通关

在 a+b mod 31 的 grokking 基准上,标准实现一路撞墙:bf16 在 m≈5.5 就停滞,fp32 在 16.6 反复尖峰;把 ϵ 降到 10^{-16} 后,连 fp64 都在自己的悬崖 36.7 处翻车。修复版则在三种精度下全部平滑收敛到 100% 测试准确率。

Table 1: 各损失函数在模加法上的对比

与两种近期改进方法相比,差距同样明显:Zero-sum Proj. 只给目标 logit 补回 −1/K 的梯度,margin 卡在 18 附近,ϵ≤10^{-12} 时准确率跌破 50%;StableMax 改用线性增长的替代函数,margin 失控膨胀到 10³–10⁴,准确率全面落后。

Figure 6: 四个 grokking 任务上的结果

泛化性也站得住:文献中四个不同的 grokking 任务上,fp32 修复版的表现追平 fp64 标准版,而 fp32 标准版无一例外在悬崖处崩坏。

Figure 7: 学生以教师权重初始化的蒸馏实验

论文信息

论文标题:A Fix for Softmax and Cross-Entropy

论文地址:https://arxiv.org/abs/2610.31642




上一篇:多模态Agentic框架前沿综述:感知融合三代范式与四大应用
下一篇:Puter 开源项目 every:免费重写 Excel、Word、Photoshop,已有 51 个应用
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-27 05:40 , Processed in 0.070244 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表