引言:一个被低估的关键环节
当你向ChatGPT提问"法国的首都是哪里",它会毫不犹豫地回答"巴黎"。但如果你问"写一个创意故事",同样的模型可能每次都会给出不同的开头。这种差异的背后,隐藏着大语言模型最基础却又最关键的技术环节——解码策略。
解码策略决定了模型如何从成千上万个候选词中选择下一个输出。一个看似简单的选择,却直接影响着生成文本的质量、多样性和可靠性。然而,与模型架构、训练方法相比,解码策略长期处于聚光灯之外。直到2020年,Holtzman等人在ICLR发表的论文"The Curious Case of Neural Text Degeneration"才真正将这一问题推向学术前沿——他们发现,即使是最先进的语言模型,使用贪婪解码也会产生重复、无聊甚至荒谬的文本。
timeline
title 解码策略发展历程
section 早期阶段
2014 : 束搜索成为机器翻译标准
2017 : Transformer架构诞生
section 神经文本退化发现
2018 : Top-k采样提出
2020 : Top-p采样 : 神经文本退化论文发表
section 高级方法涌现
2020 : Mirostat采样
2022 : 典型采样
2023 : 对比解码
section 动态阈值方法
2025 : Min-p采样 : Top-n-sigma采样 : Min-p争议论文
此后,Top-p采样(核采样)、Min-p采样、Top-n-sigma等方法相继涌现,解码策略的研究进入了快速发展的新阶段。本文将系统梳理这一领域从贪婪搜索到动态阈值采样的二十年演进历程,帮助读者深入理解大模型文本生成背后的核心技术。
第一部分:解码的基础——从Logits到概率分布
在深入各种解码策略之前,我们需要先理解大语言模型输出的本质。
Logits:模型的原始输出
当语言模型处理输入文本后,它的最后一层会输出一个向量,称为logits。对于一个词汇表大小为N的模型,这个向量的长度就是N,每个元素对应词汇表中一个词元的"得分"。
Logits有几个重要特征:
- 它们可以是任意实数(正数、负数、甚至很大或很小)
- 它们不直接表示概率
- 它们的相对大小反映了模型对各个词元的偏好程度
Softmax:从得分到概率
要将logits转换为有效的概率分布,需要使用Softmax函数:
$$p_i = \text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{N} e^{x_j}}$$Softmax的核心作用是将任意实数转换为概率:
- 所有输出值都在(0, 1)之间
- 所有输出值的和为1
- 较大的logit对应较高的概率
flowchart LR
A[输入文本] --> B[模型计算]
B --> C[Logits向量<br/>长度=N]
C --> D[Softmax变换]
D --> E[概率分布<br/>所有概率和=1]
E --> F{解码策略}
F --> G[下一个词元]
style A fill:#e1f5fe
style G fill:#c8e6c9
自回归生成:序列的概率分解
语言模型生成文本的过程是自回归的,即每个新词元都基于之前生成的所有词元。对于序列 $w = (w_1, w_2, ..., w_t)$,其联合概率可以分解为:
$$P(w) = \prod_{i=1}^{t} P(w_i | w_1, ..., w_{i-1})$$这意味着在每一步,模型都在进行一次从概率分布中选择词元的决策。解码策略的核心问题就是:如何从这个概率分布中选择下一个词元?
第二部分:确定性解码方法
贪婪解码:简单但受限
贪婪解码(Greedy Decoding) 是最直观的解码策略:每一步都选择概率最高的词元。
$$w_t = \arg\max_{w} P(w | w_1, ..., w_{t-1})$$优点:
- 计算效率最高,只需一次前向传播
- 输出确定性,便于复现和调试
- 对于事实性问答等任务效果良好
致命缺陷: Holtzman等人(2020)的经典实验揭示了贪婪解码的根本问题:它倾向于产生重复循环。模型可能陷入"我喜欢吃苹果。苹果很好吃。好吃的东西我喜欢吃苹果…“这样的死循环。这是因为贪婪选择忽略了概率分布的整体结构,只关注局部最优。
graph LR
subgraph 贪婪解码的重复陷阱
A["我喜欢吃苹果"] --> B["苹果很好吃"]
B --> C["好吃的东西我喜欢"]
C --> D["欢吃苹果..."]
D -.->|循环|A
end
style A fill:#ffcdd2
style B fill:#ffcdd2
style C fill:#ffcdd2
style D fill:#ffcdd2
更深层的分析表明,人类语言本身具有概率分布较为平坦的特性——我们经常使用多种方式表达同一意思。贪婪解码强行选择最高概率词元,会导致输出过于单一和机械。
束搜索:向前看N步
束搜索(Beam Search) 是贪婪解码的自然扩展:在每一步保留概率最高的k个候选序列,最终选择总体概率最高的完整序列。
graph TD
subgraph 步骤1
A1[起始] --> B1[词元A<br/>P=0.4]
A1 --> B2[词元B<br/>P=0.3]
A1 --> B3[词元C<br/>P=0.2]
end
subgraph 步骤2
B1 --> C1[A-X<br/>累积P=0.32]
B1 --> C2[A-Y<br/>累积P=0.28]
B2 --> C3[B-Z<br/>累积P=0.24]
B2 --> C4[B-W<br/>累积P=0.21]
end
style C1 fill:#90EE90
style C3 fill:#90EE90
束搜索的数学表示: 给定束宽 $k$,在第 $t$ 步,我们维护候选集合 $B_t$:
$$B_t = \{(w_1, ..., w_t) : \text{top-}k \text{ by } \sum_{i=1}^{t} \log P(w_i | w_{优点:- 考虑了序列的整体概率,而非局部贪心
- 在机器翻译等任务中表现优异
- 输出质量通常优于贪婪解码
局限性:
- 计算成本增加k倍
- 对于开放式生成任务,仍可能产生重复和保守的输出
- 研究表明,束搜索倾向于生成短序列(因为短序列更容易获得较高的累积概率)
为什么确定性方法不够?
mindmap
root((确定性方法))
贪婪解码
优点
计算最快
结果确定
缺点
重复循环
缺乏多样性
束搜索
优点
考虑全局概率
翻译效果好
缺点
计算成本高
仍然保守
共同问题
无法产生
多样化输出
确定性解码方法的核心问题是缺乏多样性。它们总是选择"最安全"的路径,但人类语言的本质恰恰包含了适度的随机性和创造性。这催生了随机采样方法的研究。
第三部分:随机采样方法
随机采样方法引入随机性,允许模型以一定概率选择非最高概率的词元。这看似"不理智”,却能产生更自然、更有创意的文本。
温度采样:调节概率分布的陡峭程度
温度(Temperature) 是最基础的采样控制参数。通过调整温度,可以改变概率分布的"陡峭程度":
$$p_i = \frac{e^{x_i / T}}{\sum_{j=1}^{N} e^{x_j / T}}$$温度的影响机制:
| 温度值 | 效果 | 适用场景 |
|---|---|---|
| T → 0 | 概率分布趋于one-hot,接近贪婪解码 | 代码生成、数学推理 |
| T = 1 | 保持原始概率分布 | 通用场景 |
| T > 1 | 概率分布趋于平坦,增加随机性 | 创意写作、头脑风暴 |
graph LR
subgraph T=0.5 低温度
A1["词元A: 95%"]
A2["词元B: 4%"]
A3["词元C: 1%"]
end
subgraph T=1.0 标准温度
B1["词元A: 70%"]
B2["词元B: 20%"]
B3["词元C: 10%"]
end
subgraph T=2.0 高温度
C1["词元A: 45%"]
C2["词元B: 35%"]
C3["词元C: 20%"]
end
关键洞察:温度本身并不移除任何候选词元,它只是重新分配概率。这意味着即使温度很低,极低概率的词元仍有非零概率被选中。
Top-k采样:固定候选数量
Top-k采样 由Fan等人(2018)提出,核心思想是每一步只从概率最高的k个词元中采样:
算法流程:
- 将所有词元按概率降序排列
- 保留前k个词元,将其余词元的概率设为0
- 重新归一化概率分布
- 从保留的词元中按概率采样
Top-k的静态问题: 固定的k值无法适应不同情境下的概率分布差异:
-
高确定性场景:“法国的首都是___”
- “巴黎"概率可能高达90%以上
- 设置k=50会引入大量无意义选项
-
高不确定性场景:“我最喜欢的食物是___”
- 概率分布相对平坦
- 设置k=5可能遗漏合理选项
这种矛盾催生了Top-p采样。
Top-p采样(核采样):动态候选数量
Top-p采样(又称核采样,Nucleus Sampling)由Holtzman等人(2020)提出,是当前业界最主流的采样方法。
核心思想:保留累积概率达到p的最小词元集合。
$$\text{保留集合} = \min\{V' : \sum_{w \in V'} P(w | w_{graph TD
subgraph 高确定性场景
A1["巴黎: 85%"]
A2["里昂: 5%"]
A3["马赛: 3%"]
A4["其他: 7%"]
note1["Top-p=0.9时<br/>只需保留'巴黎'<br/>+ '里昂'即可"]
end
subgraph 低确定性场景
B1["苹果: 8%"]
B2["香蕉: 7%"]
B3["披萨: 6%"]
B4["寿司: 5%"]
B5["...更多选项"]
note2["Top-p=0.9时<br/>可能需要保留<br/>几十个词元"]
end
Top-p的优势:
- 动态适应不同场景的确定性程度
- 在高确定性场景中减少噪音选项
- 在低确定性场景中保留足够多样性
Top-p的局限: 当模型极度不确定时(概率分布非常平坦),Top-p会保留大量低质量词元,可能导致生成内容变得混乱。这一问题在高温设置下尤为明显。
第四部分:高级采样方法
随着研究的深入,研究者们提出了多种改进方案,试图更好地平衡生成质量与多样性。
Min-p采样:基于置信度的动态阈值
Min-p采样 由Nguyen等人于2025年在ICLR会议上发表(Oral Presentation,排名第18位的高分论文)。其核心思想是将采样阈值与模型的置信度挂钩。
算法原理:
$$p_{\text{scaled}} = p_{\text{base}} \times p_{\text{max}}$$其中 $p_{\text{max}}$ 是最高概率词元的概率值。只有概率不低于 $p_{\text{scaled}}$ 的词元才会被保留。
直观理解:
- 当模型高度自信时($p_{\text{max}}$ 高),阈值更高,保留更少选项
- 当模型不太确定时($p_{\text{max}}$ 低),阈值降低,允许更多选项
graph LR
subgraph 高置信度场景
A1["p_max = 0.90<br/>min_p = 0.1"]
A2["阈值 = 0.09"]
A3["只有'巴黎'被保留<br/>严格筛选"]
end
subgraph 低置信度场景
B1["p_max = 0.15<br/>min_p = 0.1"]
B2["阈值 = 0.015"]
B3["多个选项被保留<br/>宽松筛选"]
end
Min-p的争议: 值得注意的是,2025年6月发表的一篇批评论文"Turning Down the Heat: A Critical Analysis of Min-p Sampling in Language Models"对原始论文提出了多项质疑:
- 人类评估数据省略:原始论文在人类评估中省略了基础采样(basic sampling)的结果,只报告了Min-p与Top-p的比较
- 统计检验问题:批评者重新分析后发现,在大多数设置下,Min-p与其他方法无显著差异
- 社区采用数据撤回:原始论文声称"54,000个GitHub仓库使用Min-p”,该数据已被证实不可靠并被撤回
这场学术争议提醒我们:即使是顶级会议的Oral论文,也需要批判性地审视其方法论和结论。
Top-n-sigma采样:温度无关的截断
Top-n-sigma采样 由Tang等人(2025)在ACL会议上发表,解决了所有基于概率的截断方法的一个共同问题——温度耦合。
温度耦合问题: 当使用Top-p或Min-p时,改变温度会同时影响:
- 词元之间的相对概率
- 截断阈值下的候选集合
这使得参数调优变得复杂:无法独立控制"选择哪些候选"和"如何随机选择"。
Top-n-sigma的解决方案: 直接在logits空间进行操作,使用标准差作为阈值:
$$\text{阈值} = \max(\text{logits}) - n \times \text{std}(\text{logits})$$保留所有logits不低于此阈值的词元。
核心优势:当温度变化时,最大值和标准差会同步缩放,使得保留的候选集合保持不变。
# Top-n-sigma实现(仅两行代码)
threshold = logits.max() - n * logits.std()
logits[logits < threshold] = float('-inf')
典型采样:信息论视角
典型采样(Typical Sampling) 由Meister等人(2022)提出,基于信息论的分析框架。
核心洞察:人类使用语言时,倾向于选择信息量接近期望信息量的词元。
信息量定义:$I(w) = -\log P(w | w_{ 期望信息量:$H = -\sum_w P(w | w_{ 典型采样保留那些信息量接近条件熵的词元,而非单纯选择高概率词元。这一方法在减少重复退化的同时,保持了与人类写作相似的统计特性。 Mirostat 由Basu等人(2020)提出,采用控制理论的视角。 核心思想:通过反馈机制实时监控生成文本的困惑度(perplexity),并动态调整截断参数。 Mirostat定义了两种陷阱: 对比解码(Contrastive Decoding) 由Li等人(2023)提出,需要两个模型: 解码时选择专家模型认为概率高,但业余模型认为概率低的词元: 直觉:业余模型倾向于依赖表面模式(如常见搭配),而专家模型能理解更深层的语义。对比两者的差异可以抑制表面模式,促进真正的推理。 除了采样策略,大模型解码还涉及多种惩罚机制,用于控制生成文本的特性。 最早的重复惩罚由Keskar等人(2019)在CTRL论文中提出。对已出现的词元的logits进行惩罚: 其中 $\theta > 1$ 是惩罚系数。 注意:简单的除法实现存在bug——对负logits除以大于1的数会使其变大(更接近0),反而增加了概率。上述公式修正了这一问题。 频率惩罚与词元的出现次数成正比: 其中 $c$ 是惩罚系数,$\text{count}(w_i)$ 是词元 $w_i$ 已出现的次数。 效果:一个词出现次数越多,后续被选中的概率越低。 存在惩罚是一次性的: 其中 $p$ 是惩罚系数,$\mathbb{1}$ 是指示函数。 区别:存在惩罚与出现次数无关,只要词元出现过就施加相同的惩罚。 在实际应用中,多种采样策略通常组合使用。处理顺序会显著影响最终输出。 以llama.cpp为例,默认的采样管道顺序为: 关键观察: 惩罚优先执行:在截断之前应用惩罚,确保被惩罚的词元在截断阶段会被正确处理。 温度最后执行:温度调整在所有截断之后进行。这意味着高温设置不会引入已被截断方法过滤掉的噪音词元。 框架差异:不同框架的实现顺序可能不同。例如,HuggingFace Transformers默认在截断之前应用温度,这会导致相同参数产生不同输出。 重要提醒:如果在一个框架中调优参数,然后在另一个框架中部署,务必验证采样管道的实现顺序是否一致。 OpenAI的o1、o3等推理模型锁定了采样参数: 原因:推理模型在内部运行多条思维链,评估后选择最佳结果。如果温度设为0,所有思维链会塌缩为相同的路径,失去了多路径推理的意义。 Min-p采样的争议揭示了解码策略研究中的几个深层问题: 评估标准不一致:不同论文使用不同的基准数据集、评估指标和统计方法,使得结果难以比较。 超参数调优的不公平:某些方法可能因为获得了更多的超参数调优而表现出优势。 人类评估的主观性:文本质量的评判具有高度主观性,评估者背景会影响结果。 框架兼容性:同一参数在不同推理框架中的行为可能不同。 计算开销:某些高级方法(如对比解码需要两个模型)增加了推理成本。 任务特异性:没有放之四海而皆准的最佳参数,需要针对具体任务调优。 自适应采样:根据输入上下文和生成状态动态选择采样策略。 任务感知解码:结合任务类型自动选择最优解码配置。 理论分析:建立解码策略的理论框架,而非仅依赖经验调参。 解码策略是大语言模型文本生成的关键环节,二十年来经历了从简单到复杂、从静态到动态的演进历程: 选择解码策略时,需要综合考虑: 解码策略的研究仍在快速发展中。Min-p采样引发的学术争议提醒我们,即使是在顶级会议上发表的成果,也需要保持批判性思维。理解各种方法的原理和局限,才能在实践中做出明智的选择。Mirostat:直接控制困惑度
对比解码:专家与业余的较量
第五部分:惩罚机制
重复惩罚(Repetition Penalty)
频率惩罚(Frequency Penalty)
存在惩罚(Presence Penalty)
graph TD
subgraph 频率惩罚
F1["词元出现1次: -0.1"]
F2["词元出现5次: -0.5"]
F3["词元出现10次: -1.0"]
end
subgraph 存在惩罚
P1["词元出现1次: -0.5"]
P2["词元出现5次: -0.5"]
P3["词元出现10次: -0.5"]
end
style F3 fill:#ffcdd2
style P1 fill:#c8e6c9
style P2 fill:#c8e6c9
style P3 fill:#c8e6c9
惩罚类型
数学形式
适用场景
频率惩罚
线性增长
减少具体词汇的重复
存在惩罚
固定值
鼓励话题多样性
第六部分:采样处理管道
logits → 惩罚 → DRY → top_n_sigma → top_k → typical → top_p → min_p → xtc → temperature → 采样
flowchart LR
A[原始Logits] --> B[惩罚机制]
B --> C[DRY重复抑制]
C --> D[Top-n-sigma]
D --> E[Top-k]
E --> F[典型采样]
F --> G[Top-p]
G --> H[Min-p]
H --> I[XTC]
I --> J[温度调整]
J --> K[最终采样]
style A fill:#e3f2fd
style K fill:#c8e6c9
第七部分:实践指南
不同场景的参数推荐
使用场景
温度
截断方法
原因
代码生成
0.0 - 0.2
Min-p 0.1 或 Top-p 0.95
语法要求精确,错误词元导致崩溃
数学推理
0.0 - 0.3
Top-p 0.95
推理链需要连贯性
事实问答
0.3 - 0.7
Min-p 0.1
平衡准确性与自然度
通用对话
0.7 - 1.0
Min-p 0.05 或 Top-p 0.9
自然对话需要适度随机性
创意写作
1.0 - 1.5
Min-p 0.05
高多样性同时保持连贯性
头脑风暴
1.2 - 1.8
Min-p 0.02 - 0.05
追求最大创意,接受偶尔的奇异输出
主流服务商默认参数
服务商
温度
Top-p
Top-k
惩罚
OpenAI (GPT-4o)
1.0
1.0
未暴露
freq=0, presence=0
Anthropic (Claude)
1.0
未设置
未设置
未暴露
Google (Gemini)
1.0
0.95
40
freq=0, presence=0
Meta (Llama via vLLM)
1.0
1.0
禁用
rep_penalty=1.0
推理模型的特殊处理
第八部分:前沿发展与开放问题
学术界的争议焦点
mindmap
root((Min-p争议))
方法论问题
人类评估数据省略
统计检验不正确
LLM-as-Judge报告不一致
数据可靠性
社区采用数据撤回
54k仓库数据造假
启示
批判性审视顶会论文
验证可复现性
关注方法论细节
实际应用中的挑战
未来方向
总结
参考文献