深入解释 LLM 生成过程中 temperature/top-k/top-p 的实际机制:它们只改变模型对已有概率分布的采样倾向,不会真正让模型产生新创意。
温度、top-k 和 top-p 对下一个 token 实际做了什么,以及为什么它们都无法改变 token 的排名。
如果你用过语言模型的 API,一定见过这样的建议:调高温度以获得更有创意的输出,调低温度以获得更聚焦的输出。这个建议在描述你将观察到的现象上没有错,但会误导你对底层实际发生的事的理解。
本文的核心观点直截了当地说:温度并不会为模型添加创造力。它只是控制了模型在已有的多样性中探索多深。模型不会因为你调高了温度就发明出一个新的 token。它只是改变了选择已有候选项的意愿。
让我们从更早一步开始——从模型在选择下一个 token 时产生的原始数字讲起。
我假设你对以下内容有大致的理解:
当模型选择下一个 token 时,其最后一步会为词表中每个 token 生成一个原始数字。这些原始数字叫做 logits,也可以叫分数,分数越高表示越被偏好。Logits/分数可以是任意实数,它们加起来没有任何有意义的总和。你可以把它想象成一位厨师对固定菜单上每道菜的偏好分数。
我们无法依据原始分数来做决策,因此需要置信度分数,即概率。为了把分数转换为概率,需要用到 Softmax 函数:它对每个 logit 进行指数化(这使得每个值都变为正数并拉大差距),然后除以总和,使得所有值加起来等于 1。
假设输入的 prompt 是 "The weather today is",模型为五个可能的下一个 token 生成了如下 logits。通过计算 $e^3 \approx 20.1$、$e^2 \approx 7.4$、$e^1 \approx 2.7$、$e^0 = 1.0$、$e^{-1} \approx 0.37$,总和约为 31.6,再用它去除每个值,得到:
(表 1)Logits 转换为概率。
用公式表示,对于 token i:

$z_i$ 是 token i 的 logit,分母对所有 token j 的指数化分数求和,迫使结果总和为 1。
在我们做任何操作之前,注意 purple(紫色)占比是 1.2%。在心里记下这个数字。
温度是一个单独的数值 T,通过对 softmax 做一处修改引入:在指数化之前,将每个 logit 除以 T,这就是全部的机制。

注意,温度并不是一个独立于 softmax 的函数,它就是在 softmax 基础上多了一步。当 T = 1 时,你就得到了普通的 softmax。温度是对 softmax 的泛化,而非替代。
用厨房的比喻来说,温度就是厨师遵循自己排名的严格程度——低 T 非常死板,只选菜单上评分最高的项目;高 T 则会往菜单更下方探索,但菜单本身从未改变。
同样的 logits,三种不同温度:
(表 2)同样的五个 token 在三种温度下的结果。每列的排名完全一致。
当我们降低 T 时,分布会变尖锐,概率质量集中在排名顶部。sunny 攀升到 86.5%,尾部则崩塌。提高 T 则会使分布变平坦,sunny 跌到 42.9%,尾部则被填充——其中 purple 变成了 5.8%,大约是 T = 1 时的五倍。从极限角度看,当 T → 0(趋近于 0)时,所有概率都堆叠在最上面的 token 上;当 T → ∞(趋近于无穷大)时,分布趋近于均匀——每个 token 都等概率,logits 不再重要。
T = 0 会导致除以零,因此实现中永远不会真的计算它。它们直接取最高 logit 的 token(argmax,贪心解码)。另外,有些 API 会将 T 钳制到一个极小的正 epsilon 值,以避免除以零的错误。
基本上,T 的值决定了强候选项主导多少、弱候选项获得多少曝光——而这一切都不触动排名。
表 2 中的顺序在每一列都完全一致,而且永远不会改变。让我们取两个 token 概率的比值。

当我们用第一个 token 的 softmax 除以第二个 token 的 softmax 时,softmax 的分母相互抵消。整个比值就归结为 $e$ 的 (gap / T) 次方。如果对照 T = 2 时的表格,gap 是 3 − 2 = 1,所以比值应该是 $e^{1/2} \approx 1.65$,而 42.9 / 26.0 ≈ 1.65。
这里有两点值得注意:
排序由 gap 的符号决定——T 总是正数,所以除以它永远不会改变符号。因此,只要 sunny 的 logit 更大,sunny 在任何温度下都始终更可能。温度无法重排 token。
间距由 gap 的绝对值除以 T 决定——T 越大,指数越趋近于 0,比值趋近于 1,分布变平坦。T 越小,指数被放大,质量堆叠到顶部 token。
温度只是缩放概率之间的差距,但无法改变差距的方向。而所谓"创造力"的一切,都由此而来。
如果温度既不能提升一个更好的 token,也不能添加一个新的 token,为什么调高它会让人觉得有创意?
如果我们专门看 purple——在 T = 2 时,它的概率大约是 T = 1 时的五倍,所以当模型说出意想不到的内容时,这看起来像创造力。但实际上 purple 在 T = 1 时就已经存在于分布中,占比 1.2%。温度并没有创造它,只是把它的份额喂大了。多样性一直存在于尾部,温度只是决定了你能往尾部探多深。
温度可以产生看起来有创意的输出,但它并没有在生成那种创造力。它只是在控制对模型分布中已有多样性的获取权限。这带来的实际后果是:
温度只在模型本来就不确定的地方才有杠杆效应。如果某个 logit 比其余的高出一大截,在那种情况下几乎没有尾部可以探索,所以高 T 改变不了多少。另一方面,如果几个 token 的 logits 接近,温度就有很大的杠杆。因此,高温度的"创造力"不会均匀地出现在整个生成过程中。它恰好出现在模型本来就有多个合理接续的位置。模型的不确定性决定了是否存在多样性,然后温度决定了你采样多少。
两个极端都不是有创意的。当解码变成贪心的和确定性的,模型倾向于给重复短语赋予越来越高的概率,所以一旦重复开始,它就会自我强化,而贪心没有随机性来打破这个循环。长文本的贪心生成往往正因为这个原因崩溃成循环。非常高的 T 则不加区分地采样尾部,而尾部里既有 purple 也有糟糕的 token,所以输出会退化成像噪声一样。
温度保留了所有 token,只是重新加权,因此在任何有限的 T 下每个 token 都保持非零概率,而 top-k 和 top-p 则是截断——因为它们直接从候选项中删除 token,采样只在存活的 token 中进行。在厨房的比喻中,它们是在菜单上划掉菜品,而不是改变厨师的偏好。
top-k 非常简单,名字本身就是解释。它按概率对 token 排序,保留前 k 个,丢弃其余,最后对存活者重新归一化使其总和为 1。在我们的例子中,当 k = 3 时,只有 sunny、cloudy 和 warm 能存活。k 是一个固定数字,这也是它的弱点。当模型非常自信、假设 k = 40 时——它仍然会把 39 个它不想要的 token 拉进来;但当模型分散在数百个选项中时,k = 40 会武断地丢弃 60 个。因此固定的数量无法区分这两种情况。
top-p(也叫 nucleus sampling)解决了 top-k 的弱点。top-p 也是按概率对 token 排序,只保留概率之和刚好达到设定 p 值的最小 token 集合。它还包含那个刚好使 p 超过阈值的 token,然后重新归一化。在表 1 上设置 p = 0.8,sunny 是 63.6%,加上 cloudy 达到 87%,停止,存活者是 {sunny, cloudy}。这个集合的大小是可变的——因为自信的分布用两个 token 就能覆盖 p,而不确定的分布需要几十个。top-p 根据模型的置信度调整候选池大小,这就是为什么它通常比 top-k 更受欢迎。
在大多数实现中,流程按特定顺序进行:
logits -> temperature reshapes -> top-k / top-p truncate -> sample
temperature 和 top-p
top-p 在温度已经重塑了分布之后才考虑累积概率,因此提高温度也会作为副作用扩大 top-p 的集合。更平坦的分布需要更多 token 才能达到 p。一个旋钮,两个纠缠的效应。这就是为什么通常的建议是调整 temperature 或 top-p,而不是同时调整两者。
最后一步是采样。把存活的 token 放在 0 到 1 的数轴上,每个 token 的区间宽度与其概率成正比。画一个均匀的随机数,它落在哪个区间,哪个 token 就被选中。一个占比 60% 的 token 约 60% 的时间会被命中,一个占比 1.2% 的 token 是一个非常窄的切片,偶尔会胜出。而那个薄薄的切片,就是意想不到的 token 最终出现的地方(这就是它被称为"创造力"的原因)。
所以这三个旋钮只设置了区间宽度。如果你跳过采样这一步、总是取最宽的区间,那么它们根本不会改变任何输出,因为最宽的区间在每个 T 下都是一样的。排名永远不会改变,这些旋钮之所以重要,只是因为有随机采样的存在。
除非你想要接近随机的输出,否则避免 T 大幅超过 1.5。因为超过某个点后,尾部就不再有趣而是变成噪声。
后续文章的主题:为什么更新的推理模型会完全限制 temperature,并引导你使用更高层次的控制。
感谢阅读!知道这些参数不能做什么和能做什么一样有用。
Is Temperature the Creativity Parameter of Large Language Models?
The Curious Case of Neural Text Degeneration