Transformer 如何选择下一个词:贪心、束搜索与随机采样
从解码器输出的词表概率分布出发,理解贪心解码、束搜索、温度、Top-k 和 Top-p 采样如何决定最终生成的词元。
相关工具
模型给出概率,系统还要做选择
Transformer 解码器在每个位置输出的是词表上的一组分数或概率,而不是直接输出一段已经写好的文字。概率分布告诉我们每个候选词有多大可能,但最终要把哪个词追加到序列中,还需要一个解码策略。
同一个概率分布,可以用不同方式选择结果。每一步都取最高概率词,速度快但可能只得到局部最优;保留多条候选路径,可以比较更长序列的累计得分;按概率随机采样,则允许不同但合理的表达出现。
因此,生成结果不只由模型参数决定,也受到解码策略影响。理解这一层,才能解释为什么同一个模型在不同参数下会写出不同风格的文本。
贪心解码是最直接的选择
贪心解码在每个位置选择当前概率最高的词元,然后把它加入前缀,继续预测下一步。它不保存其他候选,也不回头比较整句的累计概率,整个过程只有一条路径。
这种方法实现简单、速度快、内存开销小,适合需要稳定和低延迟的场景。但当前一步最高概率的词,未必能带来整体最好的后续。一个看似普通的词可能打开更合理的句子路径,而局部最高词反而让后面变得尴尬。
贪心解码还可能产生重复、过早结束或表达单一等现象。它不是模型唯一的生成方式,只是最容易实现的一种基线。
束搜索为什么要保留多条路径
束搜索在每一步保留若干条候选序列,束宽 beam size 表示最多保留多少条路径。下一步生成时,每条候选都扩展出多个词元,系统再根据累计得分筛选,保留分数较好的若干条。
它的目标不是只看当前一步最高概率,而是比较更长序列的整体得分。对翻译这类输出相对稳定、希望保持完整对应关系的任务,束搜索可能比单纯贪心更容易找到合适的序列。
束宽越大,候选路径越多,搜索更充分,但计算和内存成本也会增加。束搜索仍然不是穷举所有可能序列,而是在有限宽度内寻找更有希望的路径。

贪心解码只沿当前最高概率路径前进,束搜索保留多条候选路径并比较累计得分。
为什么生成任务需要随机性
如果每次都选择唯一最高概率词,面对同一个提示,模型往往会得到相同或非常相似的结果。对于需要稳定复现的任务,这可能是优点;对于故事、对话和创意表达,过于确定的选择会让结果显得单调。
随机采样不是完全随意地选词,而是按照概率分布进行抽取。概率高的词更容易被选中,概率低但仍合理的词也保留一定机会。每一步的随机选择会让后续上下文发生变化,从而产生不同的完整序列。
采样之前通常会先调整概率分布,减少极低质量候选的影响,再从筛选后的候选集合中抽取。温度、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 较低时更偏向高概率词。它与温度可以组合使用,但参数过多也会让行为更难预测,调整时应逐个观察结果。

温度改变分布的尖锐程度,Top-k 保留固定数量候选,Top-p 根据累计概率动态确定候选集合。
一次解码步骤到底做了什么
每一轮解码可以拆成几个动作:先拿到当前位置的隐藏表示,再通过输出投影得到词表 logits;对 logits 做 Softmax 得到概率;根据指定策略筛选或选择一个词元;把词元追加到当前前缀;最后检查是否生成 EOS 或达到长度上限。
如果没有结束,就把更新后的前缀送进下一轮解码器。实际实现可能使用 KV 缓存避免重复计算,但“输出概率—选择词元—追加前缀”的逻辑不会改变。
选择策略只作用在模型输出之后,不会改变前面注意力和前馈网络如何计算隐藏表示。它决定的是如何把连续概率分布转换成离散词元序列。

隐藏表示经过词表投影和 Softmax 后,按照解码策略选词并追加到前缀,循环直到 EOS。
如何减少重复和过早结束
重复可能来自模型概率分布本身,也可能被解码策略放大。过于确定的贪心或低温度选择,容易反复走向相同高概率词;过高的温度或过宽的候选集合,又可能引入不连贯内容。
实际系统可能使用重复惩罚、禁止重复 n-gram、长度惩罚或最小长度约束。它们会改变某些候选词的分数或结束条件,但都属于输出阶段的控制,不等于重新训练模型。
处理重复时,先观察重复发生在哪一层:是同一个词元连续出现,还是短语周期性复现;是所有提示都发生,还是特定任务发生。不同原因需要不同的约束,不能只把温度调高。
不同任务如何选择策略
翻译、格式化输出和部分摘要任务通常更看重稳定、完整和可控,可以从贪心或小束宽搜索开始,再根据验证结果调整长度和候选限制。束搜索在需要比较整句得分时更有价值,但它的计算成本更高。
故事、头脑风暴和开放式对话更需要多样性,可以使用温度配合 Top-p 或 Top-k 采样。参数不必追求越高越有趣,过大的随机性会破坏连贯性和事实一致性。
如果任务要求严格 JSON、固定字段或唯一答案,输出约束往往比单纯调温度更重要。解码策略应该服务于任务的正确性标准,而不是只追求文本看起来更丰富。
如何评估解码策略
不要只用一条提示比较结果。固定一组包含不同长度、不同难度和不同输出要求的样本,记录完整生成结果、结束位置、重复情况、格式正确率和任务指标,再比较策略差异。
随机采样需要设置随机种子或重复多次,不能只看一次结果就判断某个参数更好。束搜索要同时观察束宽变化带来的质量和延迟,温度、Top-k、Top-p 则可以逐个调整,避免互相掩盖影响。
最终评价应回到任务目标:翻译看对应和流畅,摘要看覆盖和准确,结构化输出看格式和字段,开放式文本看连贯、多样和安全。没有脱离任务的“最佳解码策略”。
确认模型输出的词表分布是否合理。
根据任务选择贪心、束搜索或采样。
使用温度、Top-k、Top-p 调整候选范围。
用质量、格式、重复、延迟等指标综合判断。
把解码策略放回 Transformer 主线
Transformer 解码器负责根据上下文产生词表分布,解码策略负责把这组连续概率转换成离散词元。前面的注意力、前馈网络、位置编码和 KV 缓存决定模型如何计算,后面的选择方式决定哪条生成路径被真正走出来。
贪心追求当前一步最确定的选择,束搜索保留多个候选路径,采样则保留概率分布中的多样性。温度、Top-k 和 Top-p 不是新的模型层,而是对输出分布进行控制的工具。
理解这层关系后,调生成参数就不再是盲目试数字,而是先明确想要稳定、完整还是多样,再选择与目标相符的策略和约束。
常见问题
贪心解码每次选最高概率词,为什么不一定得到最好结果?
因为当前一步概率最高的词可能让后续路径变差,贪心只比较局部选择,不比较完整序列的累计结果。
Top-k 和 Top-p 哪个更好?
没有固定答案。Top-k 保留固定数量候选,Top-p 根据累计概率动态调整,应该结合任务和实际生成结果选择。
温度越高,生成一定越有趣吗?
温度越高通常会让分布更平滑、结果更随机,但过高可能降低连贯性和准确性,仍需要配合任务目标调整。