问大模型十个问题,总有一两次它把同一句话念叨三四遍,这种复读现象在 Kimi、通义千问的早期版本里都出现过。重复惩罚是解码阶段对付它的头一道闸门,思路直白:已经出现过的词,下次挑字时先给它扣分,本文讲清这套机制的对象、力度与副作用。
扣分扣的是谁:对象与范围
重复惩罚的作用点在概率出炉之前。每生成一步,解码器会扫一遍已生成的词,凡是出现过的,其原始分先除以一个大于 1 的系数再参与排序。范围通常覆盖整个上下文,几千字之前的老词照样被压。它盯的是「出现过没有」,至于出现过几次,标准重复惩罚一视同仁——出现一次和出现十次扣的分一样多。想按次数递增加码,得用频率惩罚,那是另一套思路,两者常被拿来搭配使用。顺带一提,部分接口还会区分提示里的词要不要算进扣分范围,接线时留意文档说明。
| 对比项 | 重复惩罚 | 频率惩罚 |
|---|---|---|
| 判断依据 | 词出现过没有 | 出现的次数 |
| 扣分方式 | 扣固定分,一次与十次一样 | 按次数累进,念叨越多压得越狠 |
| 何时用 | 复读的头一道闸门 | 需要按次数递增加码时 |
| 搭配 | 两者常一起用 | 顽固复读时与前者搭配 |
力度拧多大:过紧过松都出事
力度是关键旋钮。拧得太松,复读照旧;拧得太紧,正常该重复的词也被误伤——列清单的序号、诗词的叠字、代码的变量名,全可能被逼着换写法,句子反而不通。实践中 1.1 到 1.3 是常见区间,超过 1.5 就要小心副作用。束搜索是怎么保留候选的那篇讲的解码路线可以与它叠加,聊天模板是怎么拼装对话的那篇讲的输入格式则与它互不相干——前者管输出侧挑字,后者管输入侧拼装,别混为一谈。
复读调参自查清单
- 先看复读出现在第几轮:短复读多为参数问题,长复读常是上下文太挤
- 惩罚从 1.1 起步,每次加 0.1 观察,一次只动一个旋钮
- 出现名词被迫替换、句子不通,说明拧过头,回调 0.05 再试
- 调参前先确认一件事:扣分对象里是否混进了不该压的正常词
复读从哪来:先看病根再拧旋钮
复读的根源在概率分布过尖:某个词一旦占了上风,后面每一步它的胜率都被自己抬高,路越走越窄。注意力掩码是什么那篇讲过模型每步只能看前文,这加剧了路径依赖。所以重复惩罚本质是打断自我强化的外力,治标很管用;若病根在提示写得太绕、信息不足,参数只能缓解不能根治。换句话说,它是刹车,方向盘还得靠提示来打。豆包的官方使用建议也是同一顺序:遇到复读先简化提示,再动解码参数。
关于重复惩罚的三个常问问题
- 惩罚值越大越不会复读吗?:它压的是所有出现过的词,包括正常的重复。力度过大会逼着模型换词,产出别扭句子;先小幅上调,一见用词别扭就回调。
- 它和频率惩罚有什么区别?:前者只看词出现过没有,扣固定分;后者按出现次数累进,念叨越多压得越狠。顽固复读适合两者搭配。
- 为什么调了参数还是复读?:病根可能在过尖的分布或过长的上下文,参数只是外力;试试简化提示、缩短历史,再配合温度微调。
归拢成一句:重复惩罚是外力打断,病根在分布过尖,内服外治一起上才见效。再补两个实战细节:一是扣分通常只对已经出现过的候选起作用,实现多在打分层按出现次数累加惩罚,出现越多次扣得越狠;二是温度与惩罚别同时拧到头,两个旋钮都往压尖分布的方向使劲,叠加之后容易把模型逼进另一种极端——用词越来越生僻,句子反而更怪。调参一次只动一个,改完先测几轮再动下一个。遇到复读先看采样参数是否过于保守,再考虑加惩罚,顺序反了容易误判。


