采样参数:temperature 与 top_p

LLM 与 Prompt 基础入门6讲解 2

采样是从每步的概率分布里挑一个 token 的规则:temperature 改分布的陡峭程度,top_p 截断候选集,一般只调一个。temperature=0 也不保证复现,因为采样上游还有浮点、批处理等不确定源;新一代模型正把这层旋钮收回去,稳定性要靠约束解码与校验而不是调参。

也叫:temperature · top_p · 采样 · sampling · 贪心解码 · 确定性

原理拆解出自 T0-2

把温度压到 0,只关掉了最后一层随机
一条链走完才吐出一个 token:改形状 → 转概率 → 砍尾巴 → 重新归一化 → 抽一个

logits模型这一步的原始打分
÷ T · 改形状
T=0.2 分布尖锐差距被放大,头部几乎必选
T=1.5 分布平坦差距被压缩,冷门也有机会
softmax到这一步才是概率
top_p / top_k · 砍尾巴
top_p 累到 p 就停后面的直接撤下
top_k 只留前 k 个更粗暴的同类
重新归一化 → 抽一个本步输出的 token
同一组 logits 走一遍
这一步算出什么读法
原始 logits8.0 6.0 5.5 2.0 1.0模型这一步的原始打分
÷ T,T=0.240 30 27.5 10 5差距放大 → 分布尖锐
÷ T,T=1.55.3 4.0 3.7 1.3 0.7差距压缩 → 分布平坦
softmax0.55 0.20 0.15 0.06 0.04这才是概率
top_p=0.90.55+0.20+0.15=0.90只保留前 3 个
top_k=2只保留前 2 个更粗暴的同类

贪心解码消掉的只是采样这一层随机,它上游还有四处:浮点加法不满足结合律(GPU 归约顺序随批次与调度变化,末位差异足以翻转两个接近的 logits)、动态批处理(跟谁拼在一个 batch 里会影响 kernel 选择与计算路径)、MoE 路由在批内有交互、版本漂移(同名模型的小版本更新)。

准确的表述只有一句:temperature=0 让输出高度稳定,但不等于确定性可复现。真想复现,靠的是固定模型版本号(不要用浮动别名)、把结构交给约束解码,以及最终 —— 把确定性需求下沉到代码里,别指望模型。
原文示意
logits   [ 8.0   6.0   5.5   2.0   1.0  ... ]
           │
           ├── ÷ T(temperature)
           │     T=0.2 → [40, 30, 27.5, 10, 5]      差距放大 → 分布尖锐
           │     T=1.5 → [5.3, 4.0, 3.7, 1.3, 0.7]  差距压缩 → 分布平坦
           ▼
        softmax → 概率 [0.55  0.20  0.15  0.06  0.04 ...]
           │
           ├── top_p=0.9:0.55+0.20+0.15=0.90 → 只保留前 3 个
           ├── top_k=2  :只保留前 2 个
           ▼
        重新归一化 → 随机抽一个 → 本步输出的 token
def sample(logits, temperature=1.0, top_p=1.0):
    if temperature == 0:
        return int(argmax(logits))              # 贪心:不再随机
    probs = softmax(logits / temperature)       # 改形状
    order = argsort(probs, descending=True)
    cum, keep = 0.0, []
    for i in order:                             # 砍尾巴
        keep.append(i)
        cum += probs[i]
        if cum >= top_p:
            break
    return random_choice(keep, weights=probs[keep])

为什么 temperature=0 也不保证复现——这是本篇最值钱的一段。

贪心解码消除了「采样」这一层随机,但它上游还有一堆不确定:

  1. 浮点加法不满足结合律。GPU 上的归约(reduce)顺序会随批次和调度变化,末位差异足以翻转两个接近的 logits 的大小关系;
  2. 动态批处理(continuous batching)。你的请求跟谁拼在一个 batch 里,会影响 kernel 选择与计算路径;
  3. MoE(专家混合)路由在批内是有交互的;
  4. 版本漂移。供应商随时可能对同名模型做小版本更新。

所以准确的表述是:temperature=0 让输出高度稳定,但不等于确定性可复现。 想真复现,得靠固定模型版本号(不要用浮动别名)、把结构交给约束解码、以及最终——把确定性需求下沉到代码里,别指望模型。

以上节选自T0-2 采样参数:temperature、top_p,以及它们正在退场,读全文能看到前后语境。

延伸阅读

考这个知识点的题1

会连带问到5