AI教科书全错!底层公式惊天Bug曝光,Gemini率先自我修复

2026-10-30 科技 阅读

                  新智元报道   各大 AI 框架都错了!   PyTorch 错了,JAX 错了。连教科书里的标准公式,也错了。   谷歌 DeepMind 的主任研究科学家 Jon Barron 披露了这一重磅炸弹!   本周,Google DeepMind 展示了一个问题:在 PyTorch、JAX 以及各类教科书中,该算法的每一个标准版本都一直在悄悄把某个数字舍入为零...

  新智元报道

  各大 AI 框架都错了!

  PyTorch 错了,JAX 错了。连教科书里的标准公式,也错了。

  谷歌 DeepMind 的主任研究科学家 Jon Barron 披露了这一重磅炸弹!

  本周,Google DeepMind 展示了一个问题:在 PyTorch、JAX 以及各类教科书中,该算法的每一个标准版本都一直在悄悄把某个数字舍入为零。

  模型越自信,正确的训练信号反而越容易凭空消失。优化器因此失控,训练曲线剧烈震荡。

  但最让人毛骨悚然,也最让人兴奋的是:这个隐藏在全人类眼皮底下的底层逻辑漏洞,是AI(Gemini)自己抓出来的。

  这次,人类只负责了事后的复核与排版。

  消失的数字,崩塌的模型标

  这个 Bug 藏在 AI 最基础的运算里:Softmax和交叉熵。

  如果你接触过机器学习,对这两个词绝不陌生。

  Softmax 负责把模型输出的原始得分(logits)转化成概率。交叉熵负责计算误差,告诉模型错得有多离谱。

  所有的分类器,所有的大语言模型,每天都要大量调用这对函数,数以亿计。

  它们怎么会出错?

  问题出在「极限」和「四舍五入」上。

  为了防止计算溢出,现有的标准框架(无论是 PyTorch 还是 JAX)都会执行一个标准动作:

  先减去最大的得分。

  这一减,分母就会变成一个类似「1 + 极小数字」的结构。

  这个「极小数字」,取决于模型的自信程度。

  模型越自信,正确答案的得分比其他答案高得越多,这个数字就越小。

  但这里藏着一个关键细节:数学上的等价,不代表计算机浮点运算中的结果完全等价。

  在计算机的浮点数世界里,如果你把一个足够小的数字加到 1.0 上,计算机会觉得「这太小了,没必要算」,直接把结果四舍五入成精确的 1.0。

  在 bfloat16 格式下,这个悬崖出现在数值 5.5 左右。在 fp32 下,出现在 16.6 左右。

  一旦越过这个悬崖,会发生什么?

  正确的梯度,瞬间变成了绝对的零。

  模型明明还在学习,但关于正确答案的反馈信号,被计算机的舍入机制直接抹杀了。

  DeepMind 的论文将此称为Softmax 崩溃(Softmax Collapse)。

  而优化器会让事情变得更糟。

  主流优化器 Adam 的原理,是把每一步更新除以近期梯度的平均值。当梯度因为 Bug 长时间变成零,这个平均值也会无限趋近于零。

  等到真实的梯度终于再次出现时,Adam 会用这个梯度除以一个极小的数字。

  结果就是模型向前猛冲了一大步,损失函数(Loss)瞬间飙升。

  学术界以前观察到这种现象,还给它起了个好听的名字叫「弹弓效应(Slingshots)」,以为这是模型在「顿悟(Grokking)」过程中的某种高级特征。

  搞了半天,这不是特征,是 Bug。

  除了崩溃,还有Softmax 抵消(Softmax Cancellation)。

  在知识蒸馏时,如果学生模型完全复制了老师,理论上梯度应该是零。

  但因为标准代码是分别计算概率再相减,舍入误差会留下一个「幽灵梯度」。学生模型会莫名其妙地偏离正确答案。

  这一切,全是因为丢掉了一个极小的数字。

  DeepMind 的 Jonathan T. Barron 团队在 arXiv 上提交了一篇论文:《Softmax 和交叉熵的修复》。

  第二天,Barron 在X平台上抛出重磅消息:

  事实证明,所有现有的 Softmax 和交叉熵实现(包括 JAX、PyTorch、教科书等)都有一个微妙的 Bug——其实是两个。

  简单的重写就能修复它们,并消除顿悟时的「弹弓效应」。

  对于交叉熵(修复崩溃):把目标从总和里拿出来,直接用log-sum-exp计算边距,然后返回负边距的softplus。核心原则:永远不要把一个极小的数字加到 1 上。

  对于蒸馏(修复抵消):在对数空间里使用expm1和log1p进行计算。这样一来,当学生完美匹配老师时,梯度就是完美的绝对零,没有任何幽灵残留。

  论文给出了直观的数据测试:

  在模加法(a + b mod 31)任务中,使用标准代码,bfloat16 精度下的测试准确率只有 93.3%(而且极其不稳定)。

  换上修复后的代码,准确率直接飙升到 100.0%,稳如泰山。

  而在蒸馏测试中,修复后的代码让学生模型与老师模型的散度保持为零,准确率维持完美的 100%。

  但真正让整个科技圈炸锅的,是 Barron 在评论区补充的一句话:

  这个 Bug 最初是由 Gemini Flash 3.7 发现并修复的。论文里的大部分实验是由 Flash 3.8 完成的。Gemini 4 Argon 写了论文和图表的初稿。

  我只是极其苛刻地挑刺,直到内容扎实。

  10 月 24 日,独立工程师 Satyajit Ghana 在 PyTorch 中进行了全面复现。

  他在 CPU 上用打印出来的值复现了这两个 Bug,移植了修复程序,并证实了论文中 fp32 精度下的结果。

  他得出的结论掷地有声:「不管其他细节如何,机制毫无保留地被证实了。」

  历史的悲剧,机器总在丢数字

  数字被悄悄丢掉,这不是第一次。每次发生,代价都极其惨痛。

  1965 年,多伦多大学的 William Kahan 教授就在《ACM 通讯》上发出警告。

  他指出,当计算机把成千上万个数字累加时,每一次加法都会产生舍入误差。加一百万个数,你可能会丢掉 6 位有效数字。

  他的解决方案极其简单:多加一个变量,把上次丢失的误差存起来,下次再加回去。这就是著名的「Kahan 求和算法」。

  Kahan 教授在文章里留下一句充满预言意味的嘲讽:「双精度很快就会被普遍接受,用来代替解决数值问题时的聪明才智。」

  61 年后的今天,AI 为了追求更快的芯片速度,一路降级到了 16 位的 bfloat16 格式。精度变低了,而聪明才智必须重新端上桌。

  1991 年,它让人丢了命。

  海湾战争期间,一枚美国「爱国者」导弹未能拦截来袭的「飞毛腿」导弹。导弹击中兵营,28 名美国士兵丧生。

  美国会计总署(GAO)随后的调查报告揭示了惨剧的原因。系统内部时钟以十分之一秒为单位计时。但将这个时间转化为实数时,寄存器只有 24 位长。

  随着系统运行,转换误差不断累积。

  导弹连已经连续运行了 100 多个小时。运行 8 小时,误差 0.02 秒,距离偏差 55 米。运行 100 小时,误差 0.34 秒,距离偏差高达 687 米。目标早已飞出了雷达设定的跟踪范围。

  一次看不见的四舍五入,四天后变成了 687 米的致命偏差。

  1994 年,它让 Intel损失了一大笔钱。

  1994 年 10 月,林奇堡学院的数学教授 Thomas Nicely 发现,他的两台电脑算出的结果不一样。

  他在计算孪生素数的倒数和。同样的程序,奔腾芯片和老旧的 486 算出了分歧。几天后,他锁定了罪魁祸首:当计算 1 除以 824,633,702,441 时,奔腾处理器的浮点运算单元算错了。

  原因是,奔腾的除法器使用了一个查找表,而表里漏掉了 5 个条目。

  发现问题的,不仅是 Nicely 教授的两台电脑比对,更是严谨的交叉验证。

  最终,英特尔被迫同意无条件为所有用户更换芯片。1995 年 1 月,英特尔为此计提了 4.75 亿美元的巨额损失。

  1994 年,丢数字让英特尔损失惨重。

  1991 年,丢数字让人失去生命。

  2026 年,数字又在 AI 最常用的函数里丢了。

  教训一次比一次深刻,但也一次比一次有用。

  数字不会凭空消失,它们只是去了你没注意到的地方。

  这是 AI 底层数学最糟糕的时刻,但它刚刚变得好了一点。

  而最令人振奋的是:这一次,是机器找到了自身的缺陷,人类负责了最终的把关。

  参考资料:

  https://arxiv.org/pdf/2610.31642

  https://x.com/BrianRoemmele/status/2114362944339448314

  编辑:大卫

相关阅读

柘城网为柘城本地权威综合门户。立足本土,解读钻石、辣椒、肉牛特色产业,传承朱襄故里人文,汇聚旅游、非遗、美食与民生资讯,搭建柘城论坛,服务柘城百姓。
Copyright © 2026 柘城网 All Rights Reserved. 豫ICP备2025133402号豫公网安备41142402000636号
关灯 [!--
扫一扫添加微信客服
--]
返回顶部
返回顶部