Appearance
Q125 · 在 LLM 的推理阶段,有哪些常见的解码策略?请解释 Greedy Search, Beam Search, Top-K Sampling 和 Nucleus Sampling (Top-P) 的原理和优缺点。
给同一个模型输入“周末去”,它可能接“公园”“图书馆”或“商场”。模型算出每个候选的概率后,应用还得决定怎样从概率变成实际输出:总取当前最可能的一项,保留几条句子路径比较,还是从较可信的候选中随机抽取?这一步叫解码。本题中的“推理阶段”指模型已经训练好、正在为用户生成文本的 inference(推断或生成)阶段,并不专指模型内部的“思维链推理”。
四种常见选择是:**Greedy Search(贪心搜索)**每一步选当前概率最高的 token;Beam Search(束搜索)同时保留若干条高分前缀,逐步扩展后比较整段;Top-K Sampling 每一步只保留概率最高的固定 K 个 token 再抽样;Nucleus Sampling / Top-P 每一步保留累计概率达到阈值 P 的最小候选集合再抽样。前两种通常是不抽样的搜索,后两种明确有随机抽样;它们改变的是如何选输出,不会让模型突然知道原本不知道的事实。Hugging Face Transformers:生成策略 · Holtzman 等人:Nucleus Sampling 原论文
概率表里的词与符号
| 术语或符号 | 含义 | 本文例子 |
|---|---|---|
| LLM / 大语言模型 | 读入已有文本,给下一个 token 计算概率的模型 | 看到“周末去”后给五个候选打分 |
| token(词元) | 模型实际选择的文本单位,可能是一个字、词的一部分或特殊符号 | 为便于计算,假设“公园”整体恰好是一个 token;真实分词未必如此 |
| 词表 | 模型可选 token 的集合;实际词表远大于五项 | 本文为教学只保留五张候选卡 |
| 前缀 / 上下文 | 已经输入或生成的内容,决定下一步概率 | 第一步前缀是“周末去”;第二步前缀可能是“周末去图书馆” |
| 条件概率 | 给定前缀后某个候选成为下一 token 的概率 | “周末去”后“公园”概率为 0.40 |
| 序列概率 | 一条连续路径每一步条件概率的乘积 | “公园→散步”为 0.40 × 0.40 = 0.16 |
| 采样 / 抽样 | 按候选的相对概率随机挑一个,而不是总拿第一名 | “图书馆”可被抽中,“公园”也仍有机会 |
| 重新归一化 | 裁掉候选后,把留下的概率按其总和重新缩放到合计 1 | Top-K 留下前三项,原合计 0.85,再分别除以 0.85 |
K | Top-K 固定保留的候选个数,是整数 | K=3 保留前三张卡 |
P | Top-P 要覆盖的累计概率质量,通常是 0 到 1 的小数 | P=0.70 表示候选累计至少覆盖 70% |
B / beam width | 束搜索同时保留的路径条数,与 Top-K 的 token 个数不是一回事 | B=2 保留两条前缀 |
| 结束符 | 表示一句生成完成的特殊 token;还可以设长度上限 | 真实生成不能无限选词,本文两步算例暂不展开结束符 |
以下所有概率是人为设定的教学数字,不是从某个真实模型读出的结果。为比较清楚,假设温度为 1,没有额外的重复惩罚、禁用词或其他过滤器;每张卡恰好对应一个 token。第一步的完整玩具分布总和为 1:
| “周末去”后可能接的 token | 公园 | 图书馆 | 商场 | 影院 | 海边 |
|---|---|---|---|---|---|
| 模型给出的概率 | 0.40 | 0.30 | 0.15 | 0.10 | 0.05 |
验算:0.40 + 0.30 + 0.15 + 0.10 + 0.05 = 1.00。算法每生成一个 token,都会把它接到前缀后,再让模型重新计算下一步的分布。第一步的 0.40 不会自动沿用到第二步;这点对理解 Beam Search 尤其重要。
贪心搜索:每一步只拿眼前第一名
在“周末去”这个前缀下,Greedy Search 比较五项概率,选最大的 公园 = 0.40。随后前缀变成“周末去公园”,再独立计算下一 token。为了看清局部最优的局限,假设这一步的最高候选是“散步”,条件概率为 0.40;于是贪心得到两步前缀“周末去公园散步”,这两步的联合概率为 0.40 × 0.40 = 0.16。
贪心的好处是只维护一条路径,选择规则简单、结果相对稳定,适合短而明确、创意不是主要目标的输出;在自托管的基本实现中,额外搜索开销也较低。局限是第一步一旦选了“公园”,就不会回头考虑第一步概率稍低的“图书馆”;长篇开放式生成还可能显得单调或重复。重复也受模型本身、提示词和训练方式影响,不能断言全是贪心造成。Hugging Face 文档把贪心定义为每步取最高概率,并提醒它用于长输出时容易出现重复。Transformers 生成策略
“贪心一定给出最可能的整句话”是错的。它每一步只让当前 token最可能,并没有搜索所有可能的后续路径。下一节用同一第一步概率算出反例。
束搜索:保留多条前缀,再比较整段
设束宽 B=2,即每一步最多留下两条目前分数较高的前缀。第一步保留 公园 0.40 和 图书馆 0.30,暂时丢掉其余三条。第二步的概率取决于各自前缀,假设模型又给出:
| 第一阶段前缀 | 第二阶段最可能的延续 | 第二 token 的条件概率 | 两步联合概率 |
|---|---|---|---|
| “周末去公园” | “散步” | 0.40 | 0.40 × 0.40 = 0.16 |
| “周末去图书馆” | “看书” | 0.90 | 0.30 × 0.90 = 0.27 |
这一轮若按相同长度的两步前缀比较,“图书馆→看书”的 0.27 高于贪心路径“公园→散步”的 0.16。这正说明:第一步的第二名,后续可能更强。实际束搜索还会扩展每条保留前缀的多个候选、在所有新候选里再选前 B 条;工程实现常用对数概率相加来代替许多小概率相乘,避免数值下溢。log 是对数运算;因为对数函数保持大小顺序,同长度路径用“对数概率之和”排序,与用概率乘积排序一致。真实生成还要处理结束符、不同长度的比较、长度惩罚及提前停止,本文的 0.27 只用于说明两步同长度路径。Transformers 生成策略 · GenerationConfig 参数
Beam Search 的优势是能纠正部分早期局部选择,在翻译、语音识别、图像描述等答案更受输入约束的任务中常有用;它不等于穷举。第一步被剪掉的“商场”等路径不会再回来,因此 B=2 也不保证全局最优。束宽增大通常要保留更多状态、计算更多候选,推理时间和显存可能上升;实现可以批量计算,不能机械地说延迟总是恰好变成 B 倍。对自由写作,束搜索偏向高概率路径,未必最有趣,也可能产生重复。原始 Nucleus Sampling 论文讨论了开放式文本中高概率解码的退化问题;这些观察来自具体研究设置,不能无条件套到每个现代模型。Holtzman 等人论文
Top-K:每步保留固定数量,再从中抽样
在同一张第一步概率表上设 K=3:无论最高三项合计多少,先留下“公园、图书馆、商场”,丢掉“影院、海边”。留下的原概率合计 0.40 + 0.30 + 0.15 = 0.85,随后重新归一化:
| 被保留的 token | 原概率 | Top-K 后用于抽样的概率 |
|---|---|---|
| 公园 | 0.40 | 0.40 / 0.85 ≈ 0.4706 |
| 图书馆 | 0.30 | 0.30 / 0.85 ≈ 0.3529 |
| 商场 | 0.15 | 0.15 / 0.85 ≈ 0.1765 |
三项新概率约为 1,抽样器按这些权重随机选。比如仅用于演示,取一个 0 到 1 之间的随机数 u=0.90,依次把三段区间排为“公园 [0,0.4706)、图书馆 [0.4706,0.8235)、商场 [0.8235,1]”,它落在商场区间,所以这一次演示抽样得到“商场”;下一次随机数不同,结果也可能不同。u 是随机抽样数,不是模型对“商场”的概率。
Top-K 的好处是容易理解,并能挡住排名靠后的长尾 token,同时让前三名都有机会出现。它的问题是候选个数固定:某一步若第一名已有 0.95,K=3 仍会纳入两个很弱的候选;另一步若概率很平,前三项可能只覆盖很少的质量,把不少合理选项排除。K=1 且不额外引入随机性时,效果相当于每步贪心;但这里的“K=3”与 Beam 的“B=3”不能混同,前者只筛当前 token,后者留多条文本前缀。Transformers GenerationConfig
Top-P:每步累计到阈值,再从动态集合抽样
Nucleus Sampling 也称 Top-P。先把候选按概率从高到低排,取累计概率首次达到或超过 P 的最小前缀集合。对第一步设 P=0.70:只取“公园”得到 0.40,未达阈值;再加“图书馆”得到 0.40 + 0.30 = 0.70,已经达标,所以只保留这两项。“商场”虽然是第三名,也被排除。留下的概率重新归一化:公园 0.40 / 0.70 ≈ 0.5714;图书馆 0.30 / 0.70 ≈ 0.4286。若仍用上述演示随机数 u=0.90,它落在图书馆的区间 [0.5714,1],这一次演示抽样便是“图书馆”。这与 Top-K 的“商场”不同,差异来自候选集合,而非模型重新训练。Transformers GenerationConfig · Nucleus Sampling 原论文

图只比较当前一步的候选筛选:Top-K 看数量,Top-P 看累计质量。两栏里的词是留下来供抽样的范围,不是算法已经选出的最终词,也没有画 Beam Search 的跨步路径。图上“公园 40% + 图书馆 30% = 70%”与上文同一份概率表完全一致。
Top-P 的候选数量会随分布变:如果另一步第一名就有 0.72,设 P=0.70 时只会留下这一项,随机性在这一步消失;如果每项都很低,要累计到 0.70 就得保留更多项。它比固定 K 更能随模型的置信分布调整范围,但 P 太低容易收窄到单调候选,太高则可能带入不可靠的长尾。它仍可能重复、犯事实错误;原论文提出它是为了截掉概率分布中不可靠的尾部并改善当时开放式生成的质量,不是“Top-P 保证无幻觉”。Holtzman 等人论文
放在同一维度上比较
| 策略 | 每步保留什么 | 是否随机 | 本例第一步/两步结果 | 主要收益 | 主要代价或风险 |
|---|---|---|---|---|---|
| Greedy | 当前最高概率的一项 | 通常否 | 首步“公园”;两步“公园→散步”概率 0.16 | 简单、额外搜索开销小、相对稳定 | 早选错无法回头;长输出可能单调或重复 |
Beam,B=2 | 两条累计分数较高的前缀 | 通常否 | 比较后“两步图书馆→看书”概率 0.27 | 能考虑后续的整段分数 | 计算和状态更多;剪枝仍可能漏掉好路径,开放式生成可能重复 |
Top-K,K=3 | 当前最高概率的三项 | 是 | 候选为“公园、图书馆、商场”;演示抽样 u=0.90 取“商场” | 截断长尾,保留可控数量的变化 | 固定个数不适应尖锐或平坦分布 |
Top-P,P=0.70 | 当前累计至少 70% 的最小候选集 | 是 | 候选为“公园、图书馆”;同一 u=0.90 取“图书馆” | 候选个数随分布改变 | 阈值过窄会单调,过宽会纳入弱候选 |
表中“是否随机”针对这些策略的基本形式。Beam Search 可以与采样组合,Top-K 和 Top-P 也可同时作为过滤条件;设置温度会在筛选或抽样前调整概率分布,具体执行顺序取决于实现。这里把四种基础方法分开讲,是为了让读者看清各自控制的是“路径、个数还是概率质量”,并非说真实系统只能四选一。Transformers 生成策略 · GenerationConfig 参数
怎么选,以及为什么改参数未必奏效
如果任务是短的分类标签、格式化字段或需稳定比较的测试输出,先考虑确定性或低随机性的设置,再用任务指标检查正确率;这不表示贪心能保证 JSON 有效或事实正确,结构约束和验证仍要单独做。翻译、转写和其他有明确输入约束的生成,可以测试 Beam Search 是否提高任务指标,并同时测延迟与重复。写故事、营销措辞等开放式任务,可测试 Top-K 或 Top-P 是否提高可接受的多样性,并用人工或自动评测检查连贯性、事实性和重复率。不要只凭一段看起来更有趣的样例决定参数。Transformers 生成策略 · Hugging Face 解码方法解说
要分清三个常被混在一起的旋钮。温度改变概率分布的尖锐程度,在选候选之前就可能改变上文的 0.40/0.30/...;Top-K/Top-P按数量或质量裁剪候选并抽样;最大输出长度/结束符决定何时停。Beam 的长度惩罚处理不同长度序列的打分;重复惩罚又是另一项可选的生成控制。若看到重复,不能只把 P 调大或 B 调小就宣布修好:先看提示与模型分布,再用同一组样本比较重复率、任务正确率、延迟和成本。文献也指出,采样并不能彻底消除重复,而退化的成因可能涉及训练目标和模型本身。Hugging Face 解码方法解说 · Neural Text Generation with Unlikelihood Training
最后要看你实际能控制哪一层。在本地 Transformers generate() 中,官方文档明确列出 num_beams、do_sample、top_k、top_p 等配置;例如纯束搜索是 num_beams > 1 且 do_sample=False,采样可设置 do_sample=True,具体默认值还受模型的 generation config 影响。调用托管模型 API 时,未必能拿到每步完整词表或设置束宽与 Top-K;可调参数也可能随模型和推理模式变化。OpenAI 的现行部署检查清单就要求在某些推理模式中移除 temperature、top_p 等参数。**因此算法知识可以用于解释现象,但不能把本地库的参数表当成每家 API 的承诺。**应查所用模型和接口的当期文档,并用同一任务样本验证实际效果。Transformers GenerationConfig · OpenAI API 部署检查清单
面试时怎样说
解码是模型每步给出 token 概率后,决定实际输出哪一个 token 的过程。Greedy 每步取最高概率,简单但可能错过全句更高分的路径;Beam 保留多条前缀、用累计分数筛选,适合测试输入约束较强的任务,但计算更重,也不保证全局最优。Top-K 每步保留固定
K个高概率 token 再抽样;Top-P 保留累计概率达到P的最小集合再抽样,候选数会随分布变化。比如概率是 40%、30%、15%、10%、5%,K=3留前三项,P=0.70只留前两项。抽样能增加多样性,但不保证正确或不重复;实际选法要按任务正确率、重复、多样性、延迟和模型 API 支持来验证。
若追问“Beam Search 与 Top-K 都保留三个,区别在哪”,回答:Beam 的 B=3 是跨生成步保留三条整段前缀并继续比较累计分数;Top-K 的 K=3 是在当前一步保留三个 token,然后随机抽一个并只沿抽中的路径走。若问“Top-P 是否总比 Top-K 多样”,回答:不一定,P=0.70 在本例只留两项,若第一名本身超过 70% 就只留一项;真正效果依赖当步分布和参数。
资料依据
- Hugging Face Transformers:Generation strategies 与 GenerationConfig:四类策略、组合参数、长度与重复控制的官方说明。
- Holtzman 等人《The Curious Case of Neural Text Degeneration》:Nucleus Sampling 的原始研究及其开放式生成实验范围。
- Hugging Face《How to generate text》:官方团队对 Greedy、Beam、Top-K、Top-P 的图文解释与局限。
- OpenAI API 部署检查清单:现代托管模型的解码参数须按模型与推理模式核实。