解码策略(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。

图源:
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, ...) → 选 "吃"
...
→ "我喜欢吃..."
优点:速度快,确定性(每次输出相同)。 缺点:容易陷入重复循环("我喜欢吃苹果,我喜欢吃苹果,我喜欢吃苹果..."),全局非最优(贪心不保证最大联合概率)。
三、Beam Search(束搜索)¶
维护 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)
优点:比 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+, 多次采样 |
需要覆盖更多候选 |
面试提醒¶
如果被问 temperature 和 top_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万播放,含解码策略基础概念讲解 |