← 最新论文
🤖 machine learning

Gauge dependence and structured-output corruption in sign-branched repetition penalties: measurements across models, inference stacks, and alternative repetition controls

本文表明,大语言模型推理引擎中广泛使用的符号分支重复惩罚(sign-branching repetition penalty)存在根本性缺陷,因为它依赖于任意的逻辑值(logit)零点,从而导致不同模型之间出现大规模的标记选择不稳定性以及结构化 JSON 输出的灾难性失败,而这一问题可以通过将惩罚应用于归一化后的对数概率而非原始逻辑值来解决。

原作者: Peter Hollows

发布于 2026-07-14
📖 1 分钟阅读☕ 轻松阅读

原作者: Peter Hollows

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象一下,你有一个超级聪明的机器人作家,它非常喜欢讲故事。有时,它会陷入循环,像坏掉的唱片一样重复同一个词。为了修复这个问题,工程师们给了这个机器人一个“重复惩罚”(repetition penalty)旋钮。这个想法很简单:如果机器人试图说出一个刚刚用过的词,就调高旋钮,让这个词出现的概率降低,从而迫使机器人继续往下说。

多年来,世界上几乎所有的机器人作家(从 Hugging Face 到 vLLM 再到 llama.cpp)都在使用完全相同类型的旋钮。但这篇文章揭示了一个令人震惊的秘密:这个特定的旋钮是坏掉的,因为它看错了数字。

失灵的指南针

要理解这个故障,请想象机器人的大脑是一个巨大的地图,地图上的每个可能的词都有一个分数。正分意味着“我真的很想说这个”,负分意味着“我真的不想说这个”。这张地图是灵活的;机器人可以左右移动整张地图(给每个分数加上一个常数),而不会改变它下一个会选择哪个词。这就像在地图上移动一整座城市;即使城市现在处于另一个国家,街道之间的相对顺序仍然保持不变。

这个坏掉的旋钮试图通过检查一个分数的正负号来决定对重复词进行多少惩罚。

  • 如果分数是正数,它会将这个数字除以一个惩罚因子(使其变小)。
  • 如果分数是负数,它会将这个数字乘以一个惩罚因子(使其变得更负)。

问题在于:“正”与“负”之间的界限是人为规定的。 因为机器人可以左右滑动整张地图而不改变其行为,所以一个在某个机器人身上是“正”的词,在另一个机器人身上可能是“负”的,甚至在同一个机器人身上,只要稍微移动一下地图,情况也会改变。

论文证明了这种“符号分支”(检查数字是正还是负)所观察的坐标,是机器人训练过程中从未真正固定的。这就像试图通过观察仪表盘目前是在“红色区”还是“蓝色区”来驾驶汽车,而整个仪表盘其实是可以自行前后滑动的。

“同样的旋钮,不同的结果”引发的混乱

由于这种可滑动的地图,同一个旋钮设置(例如 1.3)会对不同的机器人产生完全不同的影响。

  • 在一个机器人(如 gpt2)上,1.3 的设置可能会惩罚 84% 的重复词。
  • 在另一个机器人(如 Qwen2.5-Coder-7B)上,同样的 1.3 设置可能几乎不会惩罚任何重复词,或者以完全不同的方式进行惩罚。

作者通过移动单个机器人的地图来进行测试。他们发现,使用标准的 1.3 设置,仅仅因为地图发生了微小的滑动,机器人就会改变其 58% 到 96% 的选择!

  • 如果你使用“减法式”惩罚(仅仅是减去一个数),机器人的行为保持不变。
  • 如果你使用标准的“乘法式”符号分支,机器人就会变得疯狂,几乎在每一个词的选择上都会改变主意。

这意味着,如果你调整你的机器人以使其在 1.3 的设置下表现良好,你实际上是在针对该特定机器人的一个偶然的“零点”进行调优。如果你将这个机器人移动到不同的计算机或更新其软件,同样的设置可能会彻底破坏它的表现。

JSON 灾难

这个漏洞最危险的部分在于它破坏了“结构化输出”(structured output)。这是指当你要求机器人编写代码或 JSON(一种特定的数据格式)时,它必须遵循严格的规则,比如闭合每一个大括号 { 或添加逗号 ,

这些规则要求机器人重复某些符号。但由于惩罚机制是基于原始数值的,它经常会将一个“必要的规则”误认为是“错误的重复”。

  • 论文在 200 个真实的 JSON Schema 上测试了这一点。
  • 使用标准的 1.3 设置,有效、可运行的 JSON 输出率从 97% 骤降至仅 23%
  • 机器人开始破坏语法,忘记闭合括号或遗漏逗号,因为惩罚机制对错误的数字过于激进。

这并非模拟实验的猜测;作者在包括代码专用模型在内的五种不同模型上直接测量了这一点,并看到在所有主流软件栈(Hugging Face、vLLM 和 llama.cpp)中都发生了同样的崩溃。

修复方案:先进行归一化

论文提供了一个简单且经过验证的修复方法。与其观察那些会滑动的原始数字,不如观察归一化概率(即一个词被选中的实际百分比机会)。

  • 概率始终在 0 到 1 之间,因此它们不会发生滑动。
  • 当作者将惩罚应用于这些归一化后的数字而非原始分数时,混乱消失了。
  • “翻转率”(即仅仅因为滑动就导致机器人改变主意的频率)降至 0.00
  • 1.3 设置下的 JSON 成功率回升到了 97%

Hugging Face 已经有一个名为 LogitNormalization 的工具可以实现这一点,但它默认是关闭的,并且是在惩罚之后运行的。论文建议,如果你在惩罚之前开启并运行它,你就能得到一个稳定、可靠的结果,且在任何模型上表现一致。

核心结论

目前几乎所有 AI 引擎中内置的“乘法重复惩罚”存在根本性缺陷,因为它依赖于一条可以滑动的数轴。它不是一个通用的旋钮;它是一个坏掉的拨盘,会在不同的机器上给出不同的结果。

  • 它做了什么: 它会导致 AI 编写的内容发生大规模、不可预测的变化(改变 58–96% 的选择),并破坏 JSON 等结构化格式(使有效性从 97% 降至 23%)。
  • 它不是什么: 这不是一个功能;这是一个在行业内被复制了多年的 Bug。
  • 解决方案: 先对数字进行归一化。这消除了滑动地图的问题,使惩罚无论在你使用哪种机器人时都能表现得一致。

作者在多个模型和软件栈中测量了这一点,结果非常明确:现行的标准是错误的,而修复方案已经就绪。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →