大模型数学速成(14):采样——Temperature、top-k 与 top-p
第 12 篇 给出词表上的 logits;第 13 篇 保证每一步只基于合法前缀。推理的最后一跳是:从概率分布里选出下一个 token——永远 $\arg\max$ 会又稳又无聊,完全乱抽又会胡言乱语。
本篇讲清三条最常用旋钮:Temperature、top-k、top-p(nucleus),并用 4 词小例子手算对照。
这是「大模型数学速成」续篇第 14 篇。建议先读第 12、13 篇。下一篇讲 量化(FP16 → INT4)。
一、贪心 vs 采样
设 Softmax 后概率为 $\mathbf{p}$(第 05、第 12 篇)。
| 策略 | 做法 | 典型观感 |
|---|---|---|
| 贪心(greedy) | $i^\star = \arg\max_i p_i$ | 稳、重复、模板腔 |
| 纯采样 | 按 $\mathbf{p}$ 多项式抽样 | 多样,但易抽到长尾怪词 |
| 截断 + 温度后再采 | 本篇重点 | 生产里最常见 |
解码循环(接第 13 篇 Decode)每步都是:
\[\text{logits } \mathbf{z} \;\xrightarrow{\text{改分布}}\; \mathbf{p}' \;\xrightarrow{\text{抽样}}\; \text{token id}\]
然后把新 token 写回序列,更新 KV Cache,再走下一步。
二、Temperature:拧「尖锐度」
在 Softmax 前把 logits 除以温度 $T > 0$:
\[p_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}\]
| $T$ | 分布形态 | 直觉 |
|---|---|---|
| $T \to 0^+$ | 越来越接近 one-hot,近乎贪心 | 「只敢选最高分」 |
| $T = 1$ | 模型原始 Softmax | 默认刻度 |
| $T > 1$ | 更平坦,尾部抬高 | 「更愿意试冷门」 |
注意:$T$ 不改变 $z_i$ 的排序,只改变相对差距被放大/缩小的程度。$T$ 不能为 0(除零);实现里极小 $T$ 等价贪心。
和生活类比
考试填空:
- $T$ 很小 = 只写最有把握的那一个词;
- $T$ 很大 = 一堆还行的词都觉得「差不多」,更容易写冷门搭配。
三、top-k:只留分数最高的 k 个
- 取 logits(或概率)最高的 $k$ 个词
- 其余位置概率置 0(或 logits 置 $-\infty$)
- 在这 $k$ 个上重新归一化,再采样
\[\mathcal{V}_k = \operatorname{top\text{-}k}(\mathbf{z}), \quad p'_i \propto \begin{cases} e^{z_i/T} & i \in \mathcal{V}_k \\ 0 & \text{otherwise} \end{cases}\]
| $k$ | 效果 |
|---|---|
| $k=1$ | 等价贪心(与 $T$ 无关,只剩一个) |
| $k$ 中等 | 去掉明显离谱的长尾 |
| $k=V$(词表大小) | 不做 top-k,退回全词表 |
局限:$k$ 固定。有时分布很尖,真正有质量的候选不到 $k$ 个;有时很平,固定 $k$ 又砍得太狠或太松——这就是 top-p 要解决的。
四、top-p(nucleus):按概率质量截断
- 将词按概率从大到小排序:$p_{(1)} \ge p_{(2)} \ge \cdots$
- 找最小集合,使其概率和 $\ge p$(常见 $p=0.9$ 等):
\[\mathcal{V}_p = \Big\{ (1),\ldots,(m) \;\Big|\; m = \min\big\{ m' : \sum_{t=1}^{m'} p_{(t)} \ge p \big\} \Big\}\]
- 集合外置 0,集合内重新归一化,再采样
称为 nucleus(核)采样:候选集大小随分布形状变——尖时自动变少,平时自动变多。
| top-k | top-p | |
|---|---|---|
| 截断依据 | 固定个数 | 累积概率质量 |
| 集合大小 | 恒为 $k$ | 动态 |
| 常见组合 | 可与 $T$ 联用 | 常与 $T$ 联用(先 $T$ 再 top-p,或按实现顺序) |
实现细节(先温度还是先截断、对 logits 还是对 $p$ 排序)因框架略有差异,读文档时看一眼即可;数学意图都是「丢掉不可靠长尾,再在可信集合上采样」。
五、手算:4 个词的对照
词表:{甲, 乙, 丙, 丁},某步 logits:
\[\mathbf{z} = [3.0,\ 1.0,\ 0.5,\ 0.0]\]
1)$T=1$,全词表 Softmax
\[e^{z} \approx [20.09,\ 2.72,\ 1.65,\ 1.00],\quad \sum \approx 25.45\]
\[\mathbf{p} \approx [0.789,\ 0.107,\ 0.065,\ 0.039]\]
贪心 → 永远 甲。
2)$T=0.5$(更尖)
\[z/T = [6.0,\ 2.0,\ 1.0,\ 0.0]\]
\[\mathbf{p} \approx [0.965,\ 0.018,\ 0.007,\ 0.002]\]
几乎锁定甲。
3)$T=1.5$(更平)
\[z/T = [2.0,\ 0.667,\ 0.333,\ 0]\]
\[\mathbf{p} \approx [0.615,\ 0.162,\ 0.116,\ 0.083]\]
乙丙丁都更有机会。
4)top-k,$k=2$,$T=1$
候选 {甲, 乙},原概率 $0.789,\ 0.107$,和 $0.896$,归一化:
\[p'_{\text{甲}} \approx 0.881,\quad p'_{\text{乙}} \approx 0.119\]
丙、丁概率为 0。
5)top-p,$p=0.9$,$T=1$
排序:甲 $0.789$ → 累加 $0.789 < 0.9$
再加乙 $0.107$ → 累加 $0.896 \ge 0.9$
→ 核 = {甲, 乙}(本例与 $k=2$ 相同;分布更平或更尖时,$|\mathcal{V}_p|$ 会与固定 $k$ 分叉)。
1 | logits: 甲 3.0 乙 1.0 丙 0.5 丁 0.0 |
六、实践中怎么拧(经验向)
| 场景 | 常见倾向 |
|---|---|
| 代码、JSON、工具调用参数 | 低 $T$(如 $0.0$–$0.3$),甚至贪心;要结构化时还有约束解码 |
| 创意写作、头脑风暴 | 略高 $T$,配合 top-p(如 $0.9$–$0.95$) |
| 一般助手对话 | 中等 $T$ + top-p,避免纯全词表乱采 |
| 要可复现实验 | 固定随机种子;记录 $T$/top-k/top-p |
没有万能默认值——同一组超参在不同模型、不同任务上手感差很多。把它们理解成「改的是 $\mathbf{p}$ 的形状与支撑集」,调参才有方向。
与 Agent / 工具调用:AI 系列 里讲过的结构化输出,本质是进一步限制合法 token 集合,比 top-p 更硬。
七、和训练损失的关系(收束)
- 训练优化的是 第 12 篇 的交叉熵,通常不在 loss 里加 Temperature/top-p。
- 推理阶段的 $T$/top-k/top-p 是解码策略,不更新权重。
- 因此:同一套权重,换采样策略,输出分布可以完全不同——评测时必须写清解码配置。
八、小结
| 概念 | 要点 |
|---|---|
| 贪心 | $\arg\max$,稳但易呆 |
| Temperature | $z_i/T$ 再 Softmax,调尖锐度 |
| top-k | 只保留最高 $k$ 个再归一化 |
| top-p | 累积概率达 $p$ 的最小核 |
| 顺序 | 改 logits/截断 → 归一化 → 抽样 → 下一步 Decode |
大模型数学速成续篇第 14 篇完。下一篇 量化:从 FP16 到 INT4 的尺度——权重与 Cache 如何用更少比特近似,继续省显存。
系列导航
| 篇号 | 标题 | 状态 |
|---|---|---|
| 13 | 因果掩码与解码循环 | ✅ |
| 14 | 采样:Temperature / top-k / top-p(本篇) | ✅ |
| 15 | 量化:从 FP16 到 INT4 | ✅ |
完整大纲见工作区 docs/MATH_SERIES_OUTLINE_V2.md。









