解码策略 — 模型算出概率之后,谁来挑词
这一章讲三件事: 为什么「模型输出」不等于「概率最大的词」——中间隔着一层叫解码策略的设计; 两大路线(贪心/随机采样)各自的毛病和修理工具; 以及各家模型在真实产品里怎么配置这些旋钮。 主走查: 拿原书那个「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。