编程与 AI15 分钟阅读更新于 2026-08-03

Transformer 如何选择下一个词:贪心、束搜索与随机采样

从解码器输出的词表概率分布出发,理解贪心解码、束搜索、温度、Top-k 和 Top-p 采样如何决定最终生成的词元。

相关工具

模型给出概率,系统还要做选择

Transformer 解码器在每个位置输出的是词表上的一组分数或概率,而不是直接输出一段已经写好的文字。概率分布告诉我们每个候选词有多大可能,但最终要把哪个词追加到序列中,还需要一个解码策略。

同一个概率分布,可以用不同方式选择结果。每一步都取最高概率词,速度快但可能只得到局部最优;保留多条候选路径,可以比较更长序列的累计得分;按概率随机采样,则允许不同但合理的表达出现。

因此,生成结果不只由模型参数决定,也受到解码策略影响。理解这一层,才能解释为什么同一个模型在不同参数下会写出不同风格的文本。

贪心解码是最直接的选择

贪心解码在每个位置选择当前概率最高的词元,然后把它加入前缀,继续预测下一步。它不保存其他候选,也不回头比较整句的累计概率,整个过程只有一条路径。

这种方法实现简单、速度快、内存开销小,适合需要稳定和低延迟的场景。但当前一步最高概率的词,未必能带来整体最好的后续。一个看似普通的词可能打开更合理的句子路径,而局部最高词反而让后面变得尴尬。

贪心解码还可能产生重复、过早结束或表达单一等现象。它不是模型唯一的生成方式,只是最容易实现的一种基线。

束搜索为什么要保留多条路径

束搜索在每一步保留若干条候选序列,束宽 beam size 表示最多保留多少条路径。下一步生成时,每条候选都扩展出多个词元,系统再根据累计得分筛选,保留分数较好的若干条。

它的目标不是只看当前一步最高概率,而是比较更长序列的整体得分。对翻译这类输出相对稳定、希望保持完整对应关系的任务,束搜索可能比单纯贪心更容易找到合适的序列。

束宽越大,候选路径越多,搜索更充分,但计算和内存成本也会增加。束搜索仍然不是穷举所有可能序列,而是在有限宽度内寻找更有希望的路径。

Transformer 贪心解码和束搜索候选路径及累计得分对比图
贪心解码与束搜索

贪心解码只沿当前最高概率路径前进,束搜索保留多条候选路径并比较累计得分。

为什么生成任务需要随机性

如果每次都选择唯一最高概率词,面对同一个提示,模型往往会得到相同或非常相似的结果。对于需要稳定复现的任务,这可能是优点;对于故事、对话和创意表达,过于确定的选择会让结果显得单调。

随机采样不是完全随意地选词,而是按照概率分布进行抽取。概率高的词更容易被选中,概率低但仍合理的词也保留一定机会。每一步的随机选择会让后续上下文发生变化,从而产生不同的完整序列。

采样之前通常会先调整概率分布,减少极低质量候选的影响,再从筛选后的候选集合中抽取。温度、Top-k 和 Top-p 就是常见的控制方式。

温度如何改变概率分布

温度 T 通常作用于 Softmax 前的 logits,形式可以写成 p_i=softmax(z_i/T)。当 T 小于 1 时,分布会变得更尖锐,高概率词更突出;当 T 大于 1 时,分布会变得更平滑,其他候选获得更多机会。

温度低并不等于一定选择最高概率词,但它会让采样结果更接近确定性选择。温度高也不等于完全随机,因为原始 logits 的差异仍然影响最终概率。

温度应该和任务目标一起调整。需要事实稳定、格式严格时,通常倾向于较低温度;需要多样表达时,可以适度提高温度,但仍要配合候选筛选,避免低质量词元进入序列。

Top-k 只保留固定数量的候选

Top-k 会先把词表中的候选按概率排序,只保留概率最高的 k 个词元,再把它们重新归一化后采样。其余词元概率直接设为 0,不参与这一步选择。

k 较小时,候选集合窄,结果更集中;k 较大时,候选更多,表达可能更丰富,但低概率词也更容易进入。Top-k 的特点是候选数量固定,无论当前分布尖锐还是平滑,都保留同样多的词元。

固定数量也带来一个限制:当模型非常确定时,可能保留了过多不必要的候选;当模型分布较平时,固定的 k 又可能排除一些合理选项。

Top-p 让候选集合随分布变化

Top-p,也叫 nucleus sampling,会从高到低累加词元概率,直到累计概率达到阈值 p,再把这些词元作为候选集合。候选数量不是固定的,而是根据当前概率分布动态变化。

当模型很确定时,前几个词就能达到 p,候选集合会比较小;当模型不确定时,需要更多词元才能覆盖相同累计概率,候选集合会变大。这样可以让筛选范围跟随模型当前的信心变化。

Top-p 仍然需要重新归一化候选概率,再进行采样。p 较高时保留更多可能性,p 较低时更偏向高概率词。它与温度可以组合使用,但参数过多也会让行为更难预测,调整时应逐个观察结果。

Transformer 温度 Top-k 和 Top-p 采样对词表概率分布影响的示意图
温度、Top-k 与 Top-p

温度改变分布的尖锐程度,Top-k 保留固定数量候选,Top-p 根据累计概率动态确定候选集合。

一次解码步骤到底做了什么

每一轮解码可以拆成几个动作:先拿到当前位置的隐藏表示,再通过输出投影得到词表 logits;对 logits 做 Softmax 得到概率;根据指定策略筛选或选择一个词元;把词元追加到当前前缀;最后检查是否生成 EOS 或达到长度上限。

如果没有结束,就把更新后的前缀送进下一轮解码器。实际实现可能使用 KV 缓存避免重复计算,但“输出概率—选择词元—追加前缀”的逻辑不会改变。

选择策略只作用在模型输出之后,不会改变前面注意力和前馈网络如何计算隐藏表示。它决定的是如何把连续概率分布转换成离散词元序列。

Transformer 从隐藏表示到词表概率再到词元追加和结束判断的解码流程图
一次解码步骤的完整流程

隐藏表示经过词表投影和 Softmax 后,按照解码策略选词并追加到前缀,循环直到 EOS。

如何减少重复和过早结束

重复可能来自模型概率分布本身,也可能被解码策略放大。过于确定的贪心或低温度选择,容易反复走向相同高概率词;过高的温度或过宽的候选集合,又可能引入不连贯内容。

实际系统可能使用重复惩罚、禁止重复 n-gram、长度惩罚或最小长度约束。它们会改变某些候选词的分数或结束条件,但都属于输出阶段的控制,不等于重新训练模型。

处理重复时,先观察重复发生在哪一层:是同一个词元连续出现,还是短语周期性复现;是所有提示都发生,还是特定任务发生。不同原因需要不同的约束,不能只把温度调高。

不同任务如何选择策略

翻译、格式化输出和部分摘要任务通常更看重稳定、完整和可控,可以从贪心或小束宽搜索开始,再根据验证结果调整长度和候选限制。束搜索在需要比较整句得分时更有价值,但它的计算成本更高。

故事、头脑风暴和开放式对话更需要多样性,可以使用温度配合 Top-p 或 Top-k 采样。参数不必追求越高越有趣,过大的随机性会破坏连贯性和事实一致性。

如果任务要求严格 JSON、固定字段或唯一答案,输出约束往往比单纯调温度更重要。解码策略应该服务于任务的正确性标准,而不是只追求文本看起来更丰富。

如何评估解码策略

不要只用一条提示比较结果。固定一组包含不同长度、不同难度和不同输出要求的样本,记录完整生成结果、结束位置、重复情况、格式正确率和任务指标,再比较策略差异。

随机采样需要设置随机种子或重复多次,不能只看一次结果就判断某个参数更好。束搜索要同时观察束宽变化带来的质量和延迟,温度、Top-k、Top-p 则可以逐个调整,避免互相掩盖影响。

最终评价应回到任务目标:翻译看对应和流畅,摘要看覆盖和准确,结构化输出看格式和字段,开放式文本看连贯、多样和安全。没有脱离任务的“最佳解码策略”。

解码策略的四个检查点
步骤 1
先看概率

确认模型输出的词表分布是否合理。

步骤 2
再选策略

根据任务选择贪心、束搜索或采样。

步骤 3
控制候选

使用温度、Top-k、Top-p 调整候选范围。

步骤 4
回到任务

用质量、格式、重复、延迟等指标综合判断。

把解码策略放回 Transformer 主线

Transformer 解码器负责根据上下文产生词表分布,解码策略负责把这组连续概率转换成离散词元。前面的注意力、前馈网络、位置编码和 KV 缓存决定模型如何计算,后面的选择方式决定哪条生成路径被真正走出来。

贪心追求当前一步最确定的选择,束搜索保留多个候选路径,采样则保留概率分布中的多样性。温度、Top-k 和 Top-p 不是新的模型层,而是对输出分布进行控制的工具。

理解这层关系后,调生成参数就不再是盲目试数字,而是先明确想要稳定、完整还是多样,再选择与目标相符的策略和约束。

常见问题

贪心解码每次选最高概率词,为什么不一定得到最好结果?

因为当前一步概率最高的词可能让后续路径变差,贪心只比较局部选择,不比较完整序列的累计结果。

Top-k 和 Top-p 哪个更好?

没有固定答案。Top-k 保留固定数量候选,Top-p 根据累计概率动态调整,应该结合任务和实际生成结果选择。

温度越高,生成一定越有趣吗?

温度越高通常会让分布更平滑、结果更随机,但过高可能降低连贯性和准确性,仍需要配合任务目标调整。