跳转至

解码策略(Decoding Strategy)

面试高频考点

  • Greedy、Beam Search、采样的区别?
  • Temperature 的作用?
  • Top-p 和 Top-k 的区别?
  • 为什么 Beam Search 在对话中反而不如采样?
  • Repetition Penalty 原理?

一、基本框架

每一步,模型输出词表上的概率分布(logits → softmax → probabilities),解码策略决定如何从分布中选择下一个 Token。

核心公式:P(y_t | y_<t, x) = softmax(Linear(h_t)) ,其中 h_t 是最后一层 hidden state。

Nucleus Sampling 论文图:Beam Search 与人类文本概率分布差异

图源:The Curious Case of Neural Text Degeneration 论文 HTML 图。图里展示了 Beam Search 倾向于过度选择高概率 token,而人类文本的概率变化更自然。

面试里最重要的结论是:

最高概率路径不一定是最像人、最有信息量、最适合对话的路径。


二、Greedy Decoding(贪心解码)

细化理解: Greedy 每一步选择最高概率 token,因此稳定、便宜、可复现,但容易产生重复和局部最优。它适合分类、抽取、结构化生成等确定性任务,不适合需要多样性的创作。即便 temperature 为 0,模型也不是“保证正确”,只是采样路径更确定。

每步选择概率最高的 Token:y_t = argmax P(y | y_<t)

示例:
Step 1: P("我"=0.3, "今天"=0.2, "我们"=0.15, ...) → 选 "我"
Step 2: P("喜欢"=0.4, "爱"=0.25, "想"=0.1, ...) → 选 "喜欢"
Step 3: P("吃"=0.35, "机器学习"=0.2, "打篮球"=0.15, ...) → 选 "吃"
...
→ "我喜欢吃..."

优点:速度快,确定性(每次输出相同)。 缺点:容易陷入重复循环("我喜欢吃苹果,我喜欢吃苹果,我喜欢吃苹果..."),全局非最优(贪心不保证最大联合概率)。


维护 k 条候选序列(k = beam size),每步对所有候选扩展所有可能 Token,按累积对数概率排序,保留最高分的 k 条。

Beam Search (k=2) 示例:

Step 1: [("我", -0.5), ("今天", -0.7)]  ← 保留 top 2
Step 2: 对 "我" 扩展 → ("我喜欢", -1.2), ("我爱", -1.6)
        对 今天 扩展 → ("今天天气", -1.3), ("今天很", -1.8)
        合并排序 → [("我喜欢", -1.2), ("今天天气", -1.3)]  ← 保留 top 2
Step 3: 继续扩展...

长度惩罚:长序列累积概率天然偏低,Beam Search 常引入长度归一化:

score = (1/n^α) × Σ log P(y_t)
α 通常设为 0.6-1.0。

优点:比 Greedy 探索更多可能性,输出质量更好。 缺点:生成偏向保守、重复(高概率的安全输出被反复选中);计算量 = 贪心 × k;n-gram 阻断(block n-gram repeats)是常见缓解手段。

适用场景:机器翻译、文本摘要等输出需要精确性的任务。


四、Temperature(温度采样)

在 softmax 前对 logits 缩放,控制分布的"锐度":

P(y_i) = exp(z_i / T) / Σ_j exp(z_j / T)
T 值的影响:

T = 0.1:  分布极度尖锐
          ████████████░░░░░░░░░░░░░░░░  几乎等于 greedy

T = 0.7:  分布适中
          ████████░░░░░░░░░░░░░░░░░░░  常用设置

T = 1.0:  原始分布
          ██████░░░░░░░░░░░░░░░░░░░░░

T = 1.5:  分布更平坦
          ███░░░░░░░░░░░░░░░░░░░░░░░░  增加低概率 token 被选中的机会

T → ∞:   均匀分布
          ████████████████████████████  完全随机
任务 推荐 T
代码生成 0.0 - 0.3
翻译 / 摘要 0.3 - 0.5
通用对话 0.6 - 0.9
创意写作 0.8 - 1.2
头脑风暴 1.0 - 1.5

五、Top-k 采样

只从概率最高的 k 个 Token 中采样,裁剪掉低概率的"长尾噪音"。

全词表(50000 tokens)→ 只保留 top-50 → 重新归一化 → 采样

问题:k 固定,不适应分布形状变化
  - 平峰分布(均匀):top-50 可能只覆盖了 30% 的概率质量 → 丢失太多
  - 尖峰分布(集中):top-50 覆盖了 99.9% → k 太大了,浪费

六、Top-p(Nucleus Sampling)

细化理解: Top-p 根据累计概率动态确定候选集合,比固定 top-k 更适应不同分布形状。模型很确定时,候选集合可能很小;模型不确定时,候选集合会扩大。生产里常把 top-p 与 temperature 一起调,并用任务评估确认事实性、重复率和输出多样性的平衡。

选取累积概率超过 p 的最小 Token 集合,在其中采样:

给定分布 P = [0.5, 0.3, 0.08, 0.05, 0.03, 0.02, ...]

Top-p (p=0.9):
  0.5 + 0.3 + 0.08 + 0.05 = 0.93 > 0.9 → 停止
  候选集 = {前 4 个 token},重新归一化后采样

Top-p (p=0.95):
  0.5 + 0.3 + 0.08 + 0.05 + 0.03 = 0.96 > 0.95 → 停止
  候选集 = {前 5 个 token}

自适应特性:尖峰分布下候选集小(更确定),平峰分布下候选集大(更多样),自动适应不同上下文。

常用值:p = 0.9 或 0.95(对话推荐 0.95)。


七、Top-p 和 Top-k 的组合

实际应用中,常先 Top-k 裁剪再 Top-p 裁剪,取交集:

Step 1: Top-k(如 k=50)→ 候选集 K
Step 2: Top-p(如 p=0.9)→ 候选集 P
Step 3: 取 K ∩ P,再从交集中采样

这避免了 Top-p 偶尔选中极低概率 token 的问题。


八、其他解码策略

Repetition Penalty

对已生成的 Token,在下次计算概率时施加惩罚:

P'(y_i) = P(y_i) / penalty  (if y_i 已被生成过)
P'(y_i) = P(y_i)            (if y_i 未被生成过)

penalty 通常设为 1.1-1.2
值 > 1:降低重复概率
值 = 1:无效果

Frequency / Presence Penalty(OpenAI API)

参数 含义 效果
frequency_penalty 按已生成 token 的频率等比惩罚 鼓励使用不同的词
presence_penalty 只要出现过就惩罚(与频率无关) 鼓励引入新话题

Contrastive Decoding

同时运行一个小模型(如 LLaMA-2 7B)和大模型(如 LLaMA-2 70B),选择大模型概率远高于小模型概率的 token:

score(y) = log P_large(y|x) - log P_small(y|x)
选 score 最高的 token

这样选出的 token 更反映了大模型的"专长"(而非两个模型都能做好的通用部分)。

DoLa(Decoding by Contrasting Layers)

不需要额外小模型,而是用 Transformer 不同层的输出分布做对比:高层(最终层)输出 - 低层输出,放大模型的"深层知识"。

Min-p Sampling(2024 新方法)

只保留概率 ≥ min_p × max_prob 的 token:

max_prob = 0.5
min_p = 0.1
→ 保留所有 p ≥ 0.05 的 token(0.1 × 0.5)

特点:自动适应分布形状,比 Top-p 更简洁

九、各策略对比总结

策略 是否采样 多样性 质量 适用场景
Greedy 最低 一般 需确定性的场景
Beam Search 高(翻译) 翻译、摘要、OCR 后处理
Temperature 可控 中-高 几乎所有生成任务
Top-k 中-高 早期常用
Top-p 自适应 当前主流(推荐)
Contrastive Dec. 最高 追求最佳质量的开放生成

参数怎么一起调

场景 推荐设置 理由
代码 / 数学 temperature=0~0.3, top_p=0.8~0.95 降低随机性,优先正确性
信息抽取 temperature=0, 可不用采样 输出应稳定可复现
通用对话 temperature=0.6~0.9, top_p=0.9~0.95 兼顾自然度和稳定性
创意写作 temperature=0.9~1.2, top_p=0.95 放开多样性
头脑风暴 temperature=1.0+, 多次采样 需要覆盖更多候选

面试提醒

如果被问 temperaturetop_p 的关系,可以这样说:

  • temperature 改变整个分布的尖锐程度
  • top_p 决定从累计概率质量多少的候选集合里采样
  • 前者调“分布形状”,后者裁“候选范围”

十、面试延伸

Q:为什么 Beam Search 在对话任务上反而不好?

Beam Search 倾向于选择高概率路径,对话中的高质量回复往往不是唯一概率最高的(而是多样、有变化的)。Beam Search 的输出容易显得"安全""重复""无聊"。研究表明人类对话中,模型生成的最佳回复在模型自己分布中的概率排名往往不在前几位,所以 Beam Search 选"最高分路径"会偏离人类偏好。这也是为什么 RLHF 之后普遍采用采样策略。

Q:Temperature = 0 能保证确定性吗?

理论上 T=0 等价于 Greedy(argmax)。但实际上:① 浮点运算的非确定性(GPU 浮点非结合性);② 不同硬件/优化可能导致 logits 有微小差异。要获得可复现的输出,需要同时设置 seed、关闭 dropout、固定 batch size。

Q:为什么代码生成推荐用低 Temperature?

代码对正确性要求极高,一个 token 错就编译失败或逻辑错误。低 Temperature 减少了"随机尝试"的可能,倾向于选择模型最确信的输出。这是确定性任务用确定性解码的典型场景。

Q:什么是 Best-of-N 采样?

独立采样 N 次(通常 N=4 到 16),对每条输出用奖励模型打分,返回分最高的那条。比 Beam Search 更多样(每次独立采样),但成本高(需要 N 次生成 + N 次评分)。InstructGPT / ChatGPT 训练时使用了这种策略。


原始论文

论文 链接
The Curious Case of Neural Text Degeneration (Holtzman et al., ICLR 2020) — Top-p 采样 arxiv.org/abs/1904.09751
Contrastive Decoding (Li et al., NeurIPS 2023) arxiv.org/abs/2210.15097
DoLa: Decoding by Contrasting Layers (Chuang et al., ICLR 2024) arxiv.org/abs/2309.03883
Min-p Sampling (Nguyen et al., 2024) arxiv.org/abs/2407.01082

延伸阅读与视频

平台 标题 说明
📺 B站 Andrej Karpathy【中英】从零构建GPT(重制版) 4.6万播放,含Greedy/Sampling/Temperature等策略的完整实现
📺 B站 Token、多模态、LLM、Agent到底是什么意思? 6.9万播放,含解码策略基础概念讲解