Appearance
Temperature、Top-p 与 Top-k
一、它们解决什么问题
大模型生成文本是逐 Token 自回归的:每生成一个 Token,模型先输出一个覆盖整个词表(vocab)的对数几率(logits),经过 Softmax 变成每个候选 Token 的概率分布,再从分布里"抽"出一个 Token 作为输出。
模型输出 logits ──▶ Softmax ──▶ 概率分布 ──▶ 【采样策略】──▶ 选中一个 TokenTemperature、Top-p、Top-k 都属于解码(decoding)阶段的采样参数,作用是:在最终"抽哪个 Token"这一步,怎么去调整那个概率分布、限制候选范围、控制随机性。
关键点:这三个参数不改模型的权重,也不改变模型"知道什么",只影响"在已知的概率分布上怎么挑下一个字"。调它们 = 调生成的随机度与多样性。
二、Temperature(温度)
原理
Temperature 在 Softmax 之前对 logits 做缩放:
p_i = exp(z_i / T) / Σ exp(z_j / T)z_i:第 i 个 Token 的 logitT:温度值
直观效果
| T 取值 | 分布形状 | 生成表现 |
|---|---|---|
| T → 0(趋近 0) | 分布被"压"成只有一个尖峰 | 趋近贪心解码(Greedy):永远选概率最高的词,几乎确定、重复、保守 |
| T = 1 | 原分布不变 | 忠实反映模型原始判断 |
| T > 1(如 1.5~2) | 分布被"摊平",高低概率差距缩小 | 更随机、更多样、更有创意,但容易胡说、跑题 |
| T < 1(如 0.2~0.7) | 分布更"尖锐" | 更聚焦、更严谨、更确定 |
T 小(聚焦) T 大(发散)
▲ ▲
│ ██ │ ▆▆
│ ████ │ ▆▆▆▆
│ ██████ │ ▆▆▆▆▆▆
│████████ │ ▆▆▆▆▆▆▆▆
└──────────▶ └──────────▶ 候选 Token记忆:温度越低越"轴"(认死理、保守),温度越高越"飘"(发散、创意但易跑偏)。
三、Top-k(按数量截断)
原理
不做任何缩放,而是只保留概率最高的 k 个 Token,把其余所有 Token 的概率置 0(或 -∞),重新归一化后再采样。
原始分布(词表很大)
│
│ 只保留前 k 个 ──▶ [top1, top2, ..., topk] ──▶ 重新归一化 ──▶ 采样
│ 其余全部剔除k = 1:等价于贪心解码(永远选第一名)。k很小(如 10~40):候选极少,输出稳定、可控,但可能缺乏变化。k很大(如 100+):退化成"几乎不截断",多样性上升但可能把低质量词也放进来。
局限
Top-k 是固定数量截断,不灵活:
- 当分布很"尖"(某个词概率极高)时,第 k 名可能已经是莫名其妙的次要词,却被强行纳入。
- 当分布很"平"(多个词概率接近)时,只取 k 个又可能漏掉一批同样合理的候选。
于是有了更聪明的 Top-p。
四、Top-p(核采样 / Nucleus Sampling)
原理
按概率从高到低排序,取累计概率刚好达到 p 的最小 Token 集合(这个集合叫"核 / nucleus"),把集合之外的 Token 全部剔除,再归一化采样。
按概率降序排列:
tokA 0.4 │
tokB 0.25│
tokC 0.15│
tokD 0.10│
tokE 0.05│
... 其余很小
设 p = 0.9:
累计:0.4 → 0.65 → 0.80 → 0.90 ✅ 到此停止
⇒ 核 = {tokA, tokB, tokC, tokD},其余全部剔除后归一化采样p = 1.0:不截断,等于在所有 Token 上采样。p越小(如 0.7~0.9):核越小,越聚焦高概率词。p越大(接近 1):候选越多,越发散。
相比 Top-k 的优势
Top-p 是按分布形状动态截断:
- 分布尖时,核自动很小(只留真正高概率的几个词)。
- 分布平时,核自动更大(把一批旗鼓相当的候选都纳入)。
所以 Top-p 比 Top-k 更"自适应",是现在的主流默认(很多 API 用 top_p 而非 top_k)。
五、三者如何组合(典型解码流水线)
实际推理时,这三个参数往往串联起作用,标准顺序是:
logits
│
├─ 1. ÷ Temperature (缩放分布形状)
▼
Softmax 概率分布
│
├─ 2. Top-k 截断 (先按数量砍掉太靠后的候选,作为安全上限)
▼
├─ 3. Top-p 截断 (再按累计概率砍,保留"核")
▼
└─ 4. 从最终候选里随机采样 ──▶ 输出一个 Token- Temperature 决定"分布是尖还是平"(整体随机基调)。
- Top-k 是一道"硬性数量护栏"(防止极端情况下把一堆垃圾词放进来)。
- Top-p 是"柔性动态护栏"(按分布自适应保留核心候选)。
工程实践:多数框架先 temperature,再 top_k(可选),再 top_p。也有说法建议 temperature 和 top_p 二选一调,不要同时大幅改动,否则随机性叠加难预期。常见稳妥组合:
temperature=0.7~1.0+top_p=0.9+top_k=40~50。
六、参数怎么选(场景速查)
| 场景 | 推荐设置 | 理由 |
|---|---|---|
| 代码生成、事实问答、SQL/JSON 等确定性输出 | temperature 低(0~0.3),top_p 低(0.1~0.5) | 要准确、可复现,少创意 |
| 通用对话、摘要 | temperature 0.7 左右,top_p 0.8~0.95 | 平衡准确与流畅 |
| 创意写作、头脑风暴、诗歌 | temperature 0.8~1.2,top_p 0.9~1.0 | 鼓励多样与新颖 |
| 需要完全可复现(评测/调试) | temperature=0(贪心)或固定随机种子 | 消除随机性 |
| 翻译 | temperature 低(0~0.3) | 翻译要忠实,不宜发挥 |
七、常见误区
误区 1:Temperature 越高模型越"聪明" 错。温度只调随机性,不增加知识。温度过高只会让它更爱胡编(幻觉更多),不会更聪明。
误区 2:Top-k 比 Top-p 更先进,应该只用 Top-k 恰恰相反。Top-p(核采样)因自适应截断,通常是更优的默认;Top-k 多作为"数量护栏"配合 Top-p 使用。
误区 3:temperature 和 top_p 同时拉满能得到"又准又活"的效果 随机性会叠加,结果往往不可控。建议二选一主调,另一个保持默认或不动。
误区 4:调这些参数能改变模型"懂不懂" 不能。它们只影响"在已知分布上怎么挑下一个字"。模型不会的内容,调再高温度也编不出来(只会编得更花)。
八、一句话总结
- Temperature:把概率分布"压尖"或"摊平",控制整体随机基调。
- Top-k:只在前 k 个最高概率词里选,固定数量护栏。
- Top-p(核采样):只在累计概率达 p 的最小集合里选,自适应动态护栏。
- 三者串联:先温度缩放 → 再 Top-k 截断 → 再 Top-p 截断 → 采样。
口诀:温度定基调,k 限数量,p 圈核心;低温求稳、高温求变,核采样自适应最靠谱。