Transformer 解码策略
约 1253 字大约 4 分钟
2026-06-29
第一节讲到,语言建模头经过 softmax 后输出的是 词表里每个词元的概率分布。但概率分布本身不是文本 —— 模型最终得从这 50000 个词里 挑一个 真正输出出来。根据概率分布选择词元的方法,就叫解码策略(decoding strategy)
贪婪策略 Greedy
每一步都选当前 概率最大 的词元作为输出,不考虑后续的潜在可能性。还是第一节那个例子,上下文 "我今天很" 经 softmax 得到:
{
开心: 0.61,
累: 0.12,
忙: 0.08,
美丽: 0.04,
...(共 50000 个词)
}贪婪策略下,下一个词 = 概率最大的词 = "开心",没有悬念
| 内容 | |
|---|---|
| 优点 | 简单易实现;速度快 |
| 缺点 | 缺乏多样性(同样输入每次都得到同样输出);容易陷入局部最优 |
笔记
局部最优指的是: 每一步都贪最大,但一路贪下来的整句不一定是全局最好的那句 —— 这也是后面 Beam Search 想解决的问题
采样策略 Sampling
采样策略在每一步生成时 不总是选概率最大的词,而是让可能性高的词更有可能被选中,但不是唯一结果,而是 按 softmax 概率分布进行随机抽样。这样同样的输入每次生成可能都不一样,增强语言多样性。
同样是上面那个分布,采样会按概率 随机抽一个:
- 大概率是 "开心"(61%)
- 也可能是 "累"(12%)
- 有小概率抽到 "美丽"(4%)
| 内容 | |
|---|---|
| 优点 | 多样性高(同样输入能生成多种合理输出);更自然 |
| 缺点 | 不可控;有时会胡说八道 |
温度系数 Temperature
贪婪太死、纯采样太野,因此中间需要一个旋钮来调节 "随机性" 与 "确定性" 的平衡 —— 这就是 温度系数(temperature),它控制 softmax 概率分布的 "陡峭程度"
原理
默认 softmax 直接对 logits 计算:
probs = softmax(logits)加入温度 T 后,先把 logits 除以 T 再算:
probs = softmax(logits / T)其中 T 是一个正数(一般取 0.5 ~ 2)。logits 除以 T 后,整个分布的形状就变了:
| 温度 T | 分布特征 | 解码表现 |
|---|---|---|
| T < 1 | 更尖锐 | 更偏向高概率词(更保守) |
| T = 1 | 原始分布 | 标准采样 |
| T > 1 | 更平坦 | 更倾向随机、多样化 |
直觉上就是:
- 除以一个小于 1 的 T,相当于把 logits 放大,大小差距被拉得更开,softmax 后高分词更 "一家独大";
- 除以一个大于 1 的 T,logits 被 压缩,差距变小,低分词也有了机会
示例
仍用第一节那组 logits:
{
开心: 4.2,
累: 2.7,
忙: 1.5,
昨天: -1.2,
小狗: -3.5
}不同温度下的行为:
T = 1:"开心"(约 61%)最可能,其他词有较低概率T = 0.5:"开心"更具压倒性优势(可能 >80%)T = 2.0:其他词概率显著提升,分布明显变 "平"
因此:温度越低,越倾向选高概率词;温度越高,越倾向选其他词
这段拿第一节的 softmax 代码改一行就能验证,看不同 T 下 "开心" 的概率怎么变:
import math
vocab = ["开心", "累", "忙", "昨天", "小狗"]
logits = [4.2, 2.7, 1.5, -1.2, -3.5]
def softmax_with_temp(logits, T):
scaled = [x / T for x in logits] # 关键:先除以温度 T
exps = [math.exp(x) for x in scaled]
total = sum(exps)
return [e / total for e in exps]
for T in [0.5, 1.0, 2.0]:
probs = softmax_with_temp(logits, T)
print(f"T={T}: 开心={probs[0]:.3f} 小狗={probs[-1]:.4f}")
# 输出:
# T=0.5: 开心=0.943 小狗=0.0000
# T=1.0: 开心=0.755 小狗=0.0003
# T=2.0: 开心=0.535 小狗=0.0099可以看到 T 从 0.5 升到 2.0,"开心"的统治力从 0.94 一路降到 0.54,"小狗"这种低分词的概率则涨了几十倍 —— 分布肉眼可见地变 "平" 了
最佳实践
- 想要 "稳定" "一致性强"的结果 → 用低温度(如
T = 0.7) - 想要 "有创意" "更多样"的结果 → 用高温度(如
T = 1.5)
其他解码策略
除了贪婪和纯采样,实际中更常用的是下面这几种 "带约束的采样",在多样性和合理性之间找平衡:
| 策略 | 每一步做什么 | 效果 |
|---|---|---|
| 贪婪解码 Greedy | 选概率最大的词 | 单一、重复、稳定 |
| 采样 Sampling | 按概率随机选一个词 | 多样、有趣但不稳定 |
| Top-k | 只在概率前 k 名里随机选 | 控制随机性 + 保留合理选项 |
| Top-p(nucleus) | 在累计概率 > p 的词里随机选 | 更智能的采样 |
| Beam Search | 保留多个候选句分支并评分 | 更接近全局最优但计算更贵 |
Top-k 和 Top-p 的区别:Top-k 固定取前 k 个候选(数量固定),Top-p 是按累计概率动态圈定一批候选(数量随分布变化)—— 分布尖锐时候选少,分布平坦时候选多,比固定 k 更自适应
