跳到主要内容

解码策略 — 模型算出概率之后,谁来挑词

这一章讲三件事: 为什么「模型输出」不等于「概率最大的词」——中间隔着一层叫解码策略的设计; 两大路线(贪心/随机采样)各自的毛病和修理工具; 以及各家模型在真实产品里怎么配置这些旋钮。 主走查: 拿原书那个「I am sleepy. I start a pot of __」的例子, 看同一串概率(咖啡 0.681、水 0.119……)在六种挑法下各变成什么选择。

1. 每一步都是一道选择题

第 05 章说过,生成是自回归的:模型给词表算出一串概率,挑一个词接上去, 再把它并回输入算下一个。原书把「挑」这个动作单独立章: 模型只负责出题(概率分布),解码策略负责作答1

两大基本路线。贪心搜索:每步直接挑概率最高的那个—— 行话叫贪婪解码

它是确定性(没有随机成分)的——同一输入永远同一输出。 在输出被输入死死限定的任务上(翻译、摘要)表现好;

但在开放生成(聊天、写故事)上,它会一头扎进局部最优(眼前这一步最好、合起来却不好),说着说着开始复读2随机采样:按概率抽签——概率大的容易被抽中,但小概率词也有机会,输出有多样性3。 两条路线的全部改进,都是在给它们各自的毛病打补丁。

2. 主走查:「一壶__」的六种挑法

原书图 9.2 给了「I am sleepy. I start a pot of 」(我困了,烧一壶)的真实概率分布: coffee 0.681、water 0.119,后面还跟着 tea、milk 等一串小概率词3。 六种挑法逐个过:

① 贪心:直接取 coffee(0.681 最大)。接回输入,继续下一步。
② 随机采样:68.1% 的签给 coffee、11.9% 给 water、其余给长尾——
可能抽到 tea,也可能抽到完全跑题的词。
③ Beam(n=2):同时留两条命——coffee 与 water;
下一步各自由生:coffee then、coffee and 联合概率最高,留下;
最终选「整条句子」概率最大的那条,而不是每一步最优的那条。
④ 温度 0.7:分布变尖——coffee 的优势被放大,长尾更没戏;
温度 1.3:分布变平——长尾词的机会被抬高。
⑤ Top-3:只在 coffee/water/tea 三个里采,其余词直接删掉。
⑥ Top-p(p=0.8):按概率从高到低累加,coffee+water = 0.681+0.119 = 0.80,
恰好够线 → 只在这两个里采,第三名 tea(概率凑不够线)出局。
图说:同一串概率,六种性格。①④偏保守,②偏狂野,③看全局,⑤⑥给狂野装护栏。

注意 ⑤ 和 ⑥ 的差别:top-k 的名单长度固定(永远 3 个),不看分布形状—— 碰到「世界最高峰是__」这种答案唯一的场景,k 大了会放进错误答案; 碰到「我最喜欢的城市是__」这种开放场景,k 小了又限制多样性4。 top-p(也叫核采样)按「凑够 p 就停」划线, 分布尖时名单自动变短,分布平时自动变长——它是跟着分布形状走的5

3. 贪心系的修理:全局观与两个惩罚

贪心的病根是「鼠目寸光」:每步局部最优,合起来未必是全局最优(整句放在一起最好)。

beam search(集束搜索)的修法是同时保留 n 条整体概率最高的候选(n 叫集束宽度, 实战 3~6;n=1 就退化成贪心),最后输出整句概率最大的那条6

但 beam 有个隐蔽的偏置:偏向短句——整句概率是逐步概率的连乘, 每多一个词就多乘一个小于 1 的数,句子越长乘出来越小。

修法是长度惩罚:把句子的负对数(指数的逆运算;这里取对数把连乘变连加,好算)概率除以 L^α(α 常取 0.6~0.7), 把长度因素归一化掉7

复读病的修法是重复惩罚,三个档位: n-gram 惩罚最硬——已出现过的 n 元组(35 个词的片段)直接禁掉; presence penalty 温和些——一个词出现过一次,它的 logits (softmax 之前那串原始分数,分数越高概率越大)就减去一个固定值 α; frequency penalty 更讲理——减去的量与出现次数成正比(出现越多次罚得越狠), α 常取 0.118

4. 采样系的修理:形状、裁剪与借力

随机采样的问题是「什么词都敢要」——长尾里混着噪声词。三件修理工具:

  • 温度:给 logits 全体除以一个系数 t 再过 softmax。 t<1 分布变尖(强者更强),t=1 不变,t→0 等价于贪心,t→∞ 变成均匀乱抽。 它不改变候选名单,改变的是名单内部的悬殊程度9;
  • top-k / top-p:直接改候选名单(§2 走查),把长尾关在门外;
  • 对比解码:借一个小模型当「反衬」。大模型通常比小模型更会给「重要的词」打高分, 所以大模型的对数概率减去小模型的对数概率,差值分布里重要词被放大。 原书的例子:给「Columbus was from Italy, and he was born in __」, GPT-2 XL 给 Spain 15%、1451 仅 10%;GPT-2 small 给 Spain 10%、1451 只有 0.1%—— 相减之后,正确答案「1451」的相对概率被显著抬升10

5. 各家的真实配置:挑法就是产品决策

解码策略不是学术摆设,每个模型出厂都带一份配置单11:

模型/API配置为什么
T5默认贪心;翻译/摘要用 beam 4 + 长度惩罚 0.6输出被输入限定,求稳
GPT-3beam 4 + 长度惩罚 0.6同上
Alpacatop-k 50 + top-p 0.9 + 温度 0.7主打开放对话,要多样性又要护栏
LLaMA问答用贪心;写代码:Pass@1 温度 0.1,Pass@100 温度 0.8求一次对就低温,要多次尝试就放开
OpenAI API温度 0 = 贪心;另有 top_p、presence/frequency penalty 参数把旋钮直接交给用户

原书还拿自家 YuLan 模型演示了同一个问题的三种输出(例 9.1): 问「人的正常体温是多少」,贪心版中规中矩答「约 37°C」; 加频率惩罚后更短更干;top-p 0.95 版则展开成 36.5~37.5°C 的范围回答—— 同一个模型,三种性格,全是解码层的事12

判断(我们的,不是书里的): 这张配置单说明解码策略不是「哪个算法更先进」的技术题, 挑法是产品决策——同一批旋钮,翻译摘要拧成贪心+beam 是求稳,对话拧成 top-p+温度 0.7 是求活,代码拧成低温是求对;OpenAI 干脆把旋钮交给用户,等于承认这是使用者的决策。 如果错,会错在: 如果将来出现一种「按输入自适应调好全部旋钮」的解码器, 挑法就会从产品决策降级成工程默认值——但决策并没有消失,只是从作者挪到了做自适应的人手里, 而「求稳/求活/求对」三种性格的区分,本身就是按产品场景划的。

6. 作者的判断与证据

  • 例子与数字均有出处: coffee/water 的概率分布(0.681/0.119)、top-p 凑线过程、 对比解码的 Columbus 例,都来自原书图 9.2~9.5 与正文3510;
  • 配置单来自官方材料: T5/GPT-3/Alpaca/LLaMA/OpenAI API 的设置是原书从 各自论文与 API 文档汇总11;
  • 经验区间: beam 36、α 0.60.7、惩罚系数 0.1~1 是原书给的常用范围, 属于工程经验而非定理678

7. 边界与局限

  • 本章全部策略都工作在「已经训好的模型」之上——模型本身的概率分布不好,挑法救不回来; 温度调得再低,也调不出模型没有的知识(第 09 章:低温只是幻觉少,不是没幻觉)。
  • beam search 系列在开放对话上反而容易产出平庸回答(「最安全的那句」), 所以现代对话模型几乎全走采样系;beam 的主场留在翻译、摘要。
  • 对比解码要同时跑两个模型,成本翻倍,实战中用得少——第 11 章的投机解码 借走了同一个「大小模型协作」的思路,但用途是加速而不是提质。
  • 例 9.1 的三种输出是单次演示,不是统计结论;温度与质量的精确关系因任务而异。

8. 可带走的

  1. 模型出概率,解码策略挑词——「输出」是两层共同的决定;
  2. 贪心 = 每步取最大,确定性、会复读;随机采样 = 按概率抽签,多样、会跑题;
  3. beam search 看整句概率(实战 36),但要配长度惩罚(连乘 <1 造成的短句偏置,α 0.60.7);
  4. 重复惩罚三档:n-gram 硬禁、presence 减固定值、frequency 按次数罚;
  5. 温度除 logits:t→0 变贪心,t→∞ 变均匀;它调悬殊,不换名单;
  6. top-p = 按概率从高到低凑够 p 为止——名单随分布形状自适应,top-k 不会;
  7. 对比解码:大模型减小模型,重要词被放大(Spain vs 1451 例);
  8. 配置随任务走:翻译摘要用 beam,对话用 top-p+温度 0.7 上下,代码求对用低温;
  9. 调参直觉:先定任务性格(求稳/求活),再动温度,最后才动惩罚项;
  10. 幻觉治理里「温度别太高」是解码层的贡献(第 09 章),但它治不了「模型不知道」。

9. 原文地图

主题原书章原文位置
自回归解码与「挑词」框架9.1.1text/48-ch09-01-9-1-decoding-strategies.txt:9(搜「how to choose the next token」)
贪心与复读病9.1.1text/48-ch09-01-9-1-decoding-strategies.txt:15(搜「repetitive sentences」)
随机采样与 coffee 分布9.1.1text/48-ch09-01-9-1-decoding-strategies.txt:23(搜「water」)
beam search 与 n=2 演示9.1.2text/48-ch09-01-9-1-decoding-strategies.txt:31(搜「beam size」)
长度惩罚9.1.2text/48-ch09-01-9-1-decoding-strategies.txt:35(搜「length penalty」)
重复惩罚三档9.1.2text/48-ch09-01-9-1-decoding-strategies.txt:37(搜「presence penalty」)
温度公式与四种情形9.1.3text/48-ch09-01-9-1-decoding-strategies.txt:47(搜「temperature coefficient」)
top-k 的场景病9.1.3text/48-ch09-01-9-1-decoding-strategies.txt:55(搜「The highest mountain in the world is」)
top-p 凑线 0.681+0.1199.1.3text/48-ch09-01-9-1-decoding-strategies.txt:55(搜「0.681」)
对比解码 Columbus 例9.1.3text/48-ch09-01-9-1-decoding-strategies.txt:57(搜「Columbus」)
各家配置9.1.4text/48-ch09-01-9-1-decoding-strategies.txt:63(搜「T5」) · text/48-ch09-01-9-1-decoding-strategies.txt:67(搜「Alpaca」) · text/48-ch09-01-9-1-decoding-strategies.txt:69(搜「Pass@1」) · text/48-ch09-01-9-1-decoding-strategies.txt:71(搜「OpenAI API」)
例 9.1 三种输出例 9.1text/48-ch09-01-9-1-decoding-strategies.txt:79(搜「37∘C」)

Footnotes

  1. 出处:「9.1.1 Background」第 9 段(text/48-ch09-01-9-1-decoding-strategies.txt:9,搜「how to choose the next token」)。

  2. 出处:「9.1.1 Background」第 11-15 段(text/48-ch09-01-9-1-decoding-strategies.txt:15,搜「repetitive sentences」)。贪心在翻译/摘要上表现好、在开放生成上复读,均出此段。

  3. 出处:「9.1.1 Background」第 19-25 段(text/48-ch09-01-9-1-decoding-strategies.txt:23,搜「water」);0.681/0.119 的具体数值见「9.1.3」第 55 段(text/48-ch09-01-9-1-decoding-strategies.txt:55,搜「0.681」)。 2 3

  4. 出处:「9.1.3 Improved Strategies for Random Sampling」第 55 段(text/48-ch09-01-9-1-decoding-strategies.txt:55,搜「The highest mountain in the world is」)。

  5. 出处:「9.1.3 Improved Strategies for Random Sampling」第 55 段(text/48-ch09-01-9-1-decoding-strategies.txt:55,搜「nucleus sampling」)。 2

  6. 出处:「9.1.2 Improvements to Greedy Search」第 31 段(text/48-ch09-01-9-1-decoding-strategies.txt:31,搜「beam size」)。「beam 过大反而变差」同段。 2

  7. 出处:「9.1.2 Improvements to Greedy Search」第 35 段(text/48-ch09-01-9-1-decoding-strategies.txt:35,搜「length penalty」)。 2

  8. 出处:「9.1.2 Improvements to Greedy Search」第 37 段(text/48-ch09-01-9-1-decoding-strategies.txt:37,搜「presence penalty」)。 2

  9. 出处:「9.1.3 Improved Strategies for Random Sampling」第 43-47 段(text/48-ch09-01-9-1-decoding-strategies.txt:47,搜「temperature coefficient」)。式 9.3:P(u_j|u_<i) = exp(l_j/t) / Σ exp(l_j′/t)。

  10. 出处:「9.1.3 Improved Strategies for Random Sampling」第 57 段(text/48-ch09-01-9-1-decoding-strategies.txt:57,搜「Columbus」)。 2

  11. 出处:「9.1.4 Practical Settings」第 63-71 段(text/48-ch09-01-9-1-decoding-strategies.txt:63,搜「T5」;text/48-ch09-01-9-1-decoding-strategies.txt:67,搜「Alpaca」;text/48-ch09-01-9-1-decoding-strategies.txt:69,搜「Pass@1」;text/48-ch09-01-9-1-decoding-strategies.txt:71,搜「OpenAI API」)。 2

  12. 出处:例 9.1 第 79-87 段(text/48-ch09-01-9-1-decoding-strategies.txt:79,搜「37∘C」)。