本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

Sampling & Decoding — 从概率到文本

Sampling & Decoding — 从概率到文本

更新于 2026-04-23

语言模型的输出是一个概率分布 — 对词表中每个 token 的预测概率。但最终我们需要的是一段确定的文本。从概率分布到实际 token 的选择过程,就是 Sampling & Decoding

不同的采样策略会产生截然不同的文本:确定性的 Greedy 适合代码生成,高温 Top-p 适合创意写作。而 Perplexity(困惑度) 则是衡量模型预测质量的核心指标 — 它告诉我们模型在每个位置”有多困惑”。

Perplexity — 语言模型的”困惑度”

信息论基础

在理解 Perplexity 之前,需要两个信息论概念:

熵(Entropy): 衡量随机变量的不确定性

H(p)=xp(x)log2p(x)H(p) = -\sum_{x} p(x) \log_2 p(x)

交叉熵(Cross-Entropy): 衡量模型 qq 对真实分布 pp 的近似程度

H(p,q)=xp(x)log2q(x)H(p, q) = -\sum_{x} p(x) \log_2 q(x)

模型越好,交叉熵越低。

Perplexity 定义

PPL=2H(p,q)\text{PPL} = 2^{H(p,q)}

直觉:模型在每个位置平均要从多少个 token 中做选择。 PPL = 1 表示完全确定(模型每次都知道下一个 token),PPL = |V|(词表大小)表示完全随机猜测。

对一段文本 w1,w2,,wNw_1, w_2, \ldots, w_N,实际计算公式为:

PPL=exp(1Ni=1Nlnp(wiw<i))\text{PPL} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \ln p(w_i | w_{<i})\right)
45%25%15%8%4%
The
45%
52%22%12%8%4%
cat
52%
60%18%10%7%3%
sat
60%
70%12%8%6%3%
on
70%
65%18%8%5%3%
the
65%
55%20%12%8%4%
mat
55%
PPL = 1.75
好模型:高置信度预测 → 低困惑度(每步平均只需从 ~2 个 token 中选择)

PPL 的局限

  • PPL 低 ≠ 生成质量高: 模型可能通过保守的高频词获得低 PPL,但生成的文本缺乏多样性和创造力
  • 不同 tokenizer 不可比较: PPL 值依赖于词表切分方式,BPE 和 SentencePiece 的 PPL 不能直接对比
  • 长度归一化重要: 不做归一化的话,长句子的 PPL 会系统性偏高

那么,模型输出了概率分布之后,我们该如何选择下一个 token?

Greedy Decoding

Greedy Decoding 逐步选择Greedy Decoding: 每步选 argmaxStep 1"I"the0.40a0.30my0.15...0.15Step 2"I the"cat0.35dog0.25bird0.20...0.20Step 3"I the cat"sat0.30ran0.28ate0.22...0.20策略:始终选择 argmax(p)⚠ 可能错过全局最优序列

最简单的策略 — 每步选概率最高的 token:

wt=argmaxwp(ww<t)w_t = \arg\max_{w} p(w | w_{<t})

优点: 确定性、速度快、实现简单

问题:

  • 局部最优陷阱: 贪心选择不一定得到全局最优序列
  • 退化重复: 容易产生 “the the the…” 之类的重复循环
  • 缺乏多样性: 同样的输入永远产生同样的输出

适用场景: 分类、信息提取等不需要创造性的任务。

Temperature Scaling

在 softmax 之前对 logits 除以温度参数 TT

pi=exp(zi/T)jexp(zj/T)p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
  • T < 1: 分布更尖锐 → 更确定,接近 Greedy
  • T > 1: 分布更平坦 → 更随机,增加多样性
  • T → 0: 退化为 Greedy;T → ∞: 退化为均匀分布
T→0: GreedyT=1: 标准T→∞: 均匀
65.5%Paris← Greedy16.2%London8.0%Berlin4.4%Tokyo2.7%Rome1.6%Madrid0.8%Oslo0.5%Lima0.2%Baku0.1%Fiji
Entropy (H)
1.67 bits
Perplexity (2ᴴ)
3.19
Greedy 选择
Paris

T < 1 → 分布更尖锐(确定性高);T > 1 → 分布更平坦(多样性高)

Temperature 与 Perplexity 的关系:T 升高 → 选择更分散 → 生成文本的 PPL 上升。

Top-k Sampling

Top-k 与 Top-p 采样对比Top-k (k=3)Top-p (p=0.9)集中分布: "the capital of France is ___"集中分布 → 仅保留 2 个Paris0.72Lyon0.12the0.06a0.04Rome0.03its0.02...0.01Paris0.72Lyon0.12the0.06a0.04Rome0.03its0.02...0.01固定 k=3自适应: 2 个平坦分布: "I like to eat ___"平坦分布 → 保留 8 个pizza0.14pasta0.13sushi0.12rice0.11bread0.10fish0.09cake0.08soup0.07...0.16pizza0.14pasta0.13sushi0.12rice0.11bread0.10fish0.09cake0.08soup0.07...0.16固定 k=3 (遗漏多)自适应: 8 个

Fan et al. (2018) 提出只保留概率最高的 kk 个 token,其余概率设为 0,重新归一化后采样。

k 的选择困境:

  • k 太小 → 遗漏合理选项(“I ate a ___” — 可能的食物种类很多)
  • k 太大 → 包含概率极低的噪声 token

核心问题:kk固定的,无法适应不同上下文的确定性程度。高确定性上下文(“the capital of France is”)只需保留 1-2 个 token,而低确定性上下文需要保留更多。

Top-p / Nucleus Sampling

Holtzman et al. (2020) 提出的解决方案 — 动态截断:

选择最小的 token 集合 VpV_p,使得累积概率 wVpp(w)p\sum_{w \in V_p} p(w) \geq p

  • 确定性上下文(“the capital of France is”)→ 集合很小(1-2 个 token 就够)
  • 不确定上下文(“I like to eat”)→ 集合较大(需要更多 token 才达到阈值)
Greedy
Paris
100.0%
London
Berlin
Tokyo
Rome
Madrid
Seoul
Oslo
Lima
Cairo
Baku
Kiev
Doha
Fiji
Laos
保留 1 个 token
只选最高概率
Top-k (k=5)
Paris
34.4%
London
23.4%
Berlin
17.2%
Tokyo
14.1%
Rome
10.9%
Madrid
Seoul
Oslo
Lima
Cairo
Baku
Kiev
Doha
Fiji
Laos
保留 5 个 token
固定保留前 5 个
Top-p (p=0.90)
Paris
23.9%
London
16.3%
Berlin
12.0%
Tokyo
9.8%
Rome
7.6%
Madrid
6.5%
Seoul
5.4%
Oslo
4.3%
Lima
4.3%
Cairo
3.3%
Baku
3.3%
Kiev
3.3%
Doha
Fiji
Laos
保留 12 个 token
动态保留 12 个 (Σ≥0.9)

Top-p 会根据分布的确定性动态调整保留数量 — 尖锐分布保留少、平坦分布保留多

Top-p 比 Top-k 更自适应,实际效果也更好。通常设 p=0.90.95p = 0.9 \sim 0.95

与上面的采样策略不同,Beam Search 是一种搜索算法。它维护 BB 条候选序列(beam),每步扩展所有可能的下一 token,保留总分数最高的 BB 条:

score(w1:t)=i=1tlogp(wiw<i)\text{score}(w_{1:t}) = \sum_{i=1}^{t} \log p(w_i | w_{<i})

通常还会加 length penalty 避免偏好短序列。

初始: [START]
[START]

从起始 token 开始,准备展开 top-2 个候选

优点: 全局搜索比 Greedy 更优

缺点: 计算量是 Greedy 的 BB 倍、生成文本偏”安全”(缺乏惊喜和创造性)、不适合开放式生成

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

Repetition Penalty 与其他技巧

Repetition Penalty 机制Repetition PenaltyBefore Penalty"the" 已出现 2 次,logit 仍然高the3.2已出现cat2.8a2.5is2.1已出现my1.6big1.2惩罚After Penalty"the" logit 被降低,其他 token 相对上升cat2.8a2.5the2.5is1.6my1.6big1.2logit(token) /= α if token ∈ generated_tokensPresence penalty: 二元(出现过即惩罚)Frequency penalty: 按次数递增

实际部署中,采样策略通常不是单独使用的:

  • Frequency Penalty: 已生成 token 的 logit 按出现次数递减
  • Presence Penalty: 已出现过的 token 统一减去固定值
  • Min-P Sampling: 设定最小概率阈值,低于 pmin×pmaxp_{min} \times p_{max} 的 token 被过滤

组合使用示例:Temperature + Top-p + Repetition Penalty 联合,是当前 LLM API(如 OpenAI、Anthropic)的标准配置。

策略选择指南

采样策略选择指南应用场景代码/数学GreedyT=0精确确定创意写作Top-pT=0.8, p=0.95多样发散对话Top-kT=0.7, k=40平衡自然摘要/翻译Beam SearchB=4高质准确实际应用中通常组合 Temperature + Top-p + Repetition Penalty
场景推荐策略参数参考
代码生成Greedy 或低温 Top-pT=0.2, p=0.9
创意写作高温 Top-pT=0.9, p=0.95
翻译/摘要Beam SearchB=4, length_penalty=0.6
对话中温 Top-p + RepetitionT=0.7, p=0.9, rep=1.1

总结

  • Perplexity 衡量模型的预测质量,是评估语言模型的核心指标
  • Greedy 简单但退化,适合确定性任务
  • Temperature 控制分布的锐度,是其他策略的基础
  • Top-k 固定截断,简单但不够自适应
  • Top-p 动态截断,是当前最常用的采样策略
  • Beam Search 全局搜索,适合翻译等精确任务
  • 实际应用中通常组合多种策略