技术博客

Softmax 温度参数对采样分布的影响:从玻尔兹曼分布到熵调控

第 19 / 147 篇 · 2026-08-25 · ai · softmax采样信息论

调用大模型 API 时,temperature 大概是最常被随手调的参数:想要稳定输出就调低,想要发散创意就调高。但它的作用机制值得写清楚——softmax 加温度不是工程 hack,它来自统计物理里的玻尔兹曼分布,而且对分布形状的控制有干净的数学刻画。

定义与第一个观察:概率比

设 logits 为 $z_1,\dots,z_n$,温度 $T>0$,带温度的 softmax 是

$$ p_i(T) = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}. $$

直接看单个概率看不出结构,看两个类别的概率比就清楚了:

$$ \frac{p_i}{p_j} = e^{(z_i-z_j)/T}. $$

logit 差固定时,$T$ 越小比值越极端:差 1 的两个 logit,在 $T=0.5$ 时概率比是 $e^2\approx 7.4$,在 $T=2$ 时只有 $e^{0.5}\approx 1.65$。温度的本质是一个作用在 logit 差上的除法器——它等比例地压缩或拉伸所有类别之间的差距,而不改变相对顺序。这一点决定了调温度永远不可能让第二名翻盘成第一名,它只是让第一名"赢得更狠"或"赢得更勉强"。

两个极限:argmax 与均匀分布

不妨把极限算一下。设最大 logit 为 $z_{(1)}$,且唯一($z_{(1)} > z_{(2)} \ge \dots$)。当 $T\to 0^+$,对所有 $i$ 非最大者:

$$ \frac{p_i}{p_{(1)}} = e^{-(z_{(1)}-z_i)/T} \to 0, $$

所以全部概率质量收敛到 argmax 上,$p(T)\to$ one-hot。这就是为什么 temperature 设 0 等价于贪心解码。

另一端,$T\to\infty$ 时 $z_i/T\to 0$,所有 $e^{z_i/T}\to 1$,于是 $p_i\to 1/n$,均匀分布。温度无穷大等于无视模型输出来掷骰子。

熵是 $T$ 的单调增函数

两个极限之间,温度是不是单调地"摊平"分布?先看一组具体数字建立手感。取三个 logits $z = (2.0, 1.0, 0.1)$:

  • $T=0.5$:等效 logits 翻倍为 $(4,2,0.2)$,概率约为 $(0.864, 0.117, 0.019)$,头部高度集中;
  • $T=1$:概率约为 $(0.659, 0.243, 0.099)$;
  • $T=2$:等效 logits 减半为 $(1,0.5,0.05)$,概率约为 $(0.502, 0.304, 0.194)$,三者开始接近。

三个 token 的场景尚且如此,词表五万的模型上,温度对尾部质量的抬升会更明显——这正是高温输出容易"发散"的定量来源。

同一组 logits (2.0, 1.0, 0.1) 在不同温度下的分布 T = 0.5 T = 1 T = 2 0.86 0.12 0.02 0.66 0.24 0.10 0.50 0.30 0.19 z=2.0 z=1.0 z=0.1 z=2.0 z=1.0 z=0.1 z=2.0 z=1.0 z=0.1 H ≈ 0.45 nat H ≈ 0.85 nat H ≈ 1.03 nat

用熵来严格刻画。定义分布的熵

$$ H(T) = -\sum_i p_i \log p_i. $$

借用统计力学的记号:能量 $E_i = -z_i$,配分函数 $Z(T)=\sum_i e^{-E_i/T}$。有一个标准恒等式

$$ H(T) = \log Z + \frac{\langle E\rangle}{T}, $$

其中 $\langle E\rangle = \sum_i p_i E_i$。对 $T$ 求导,经过几步化简(利用 $\partial_T \log Z = \langle E\rangle / T^2$,以及 $\partial_T \langle E\rangle = -\mathrm{Var}(E)/T^2$)可得

$$ \frac{dH}{dT} = \frac{\mathrm{Var}(E)}{T^3} \ge 0. $$

方差非负,等号仅当所有 logit 相等。结论干净利落:只要不是退化分布,熵随温度严格单调上升。所以 temperature 是一个名副其实的"熵旋钮"——你调的就是输出分布的不确定度,而不是什么模糊的"创造性"。

softmax 为什么偏偏是指数形式:最大熵原理

温度 softmax 不是众多候选函数里碰巧好用的一个,它是被约束条件唯一钉死的。问题这样提:已知各类别的"能量" $E_i=-z_i$(logit 越大能量越低),要求分布的期望能量等于观测值 $\sum_i p_i E_i = U$,除此之外不做任何额外假设。数学上"不做额外假设"的严格化就是最大化香农熵:

$$ \max_{p}\; -\sum_i p_i\log p_i \quad \text{s.t.}\quad \sum_i p_i = 1,\ \sum_i p_i E_i = U. $$

拉格朗日乘子法对 $p_i$ 变分:$-\log p_i - 1 - \lambda - \beta E_i = 0$,解出 $p_i \propto e^{-\beta E_i} = e^{\beta z_i}$。指数形式是"均值约束 + 最大熵"的必然产物,乘子 $\beta$ 就是逆温度 $1/T$。统计物理里 $\beta$ 与温度的关系、机器学习里 softmax 的形式,都是这一个变分问题的解。这也反过来解释了为什么调温度是"自然"的操作:$T$ 不是外挂旋钮,它是指数族分布的自然参数,对应约束 $U$ 的松紧——高温等于放松能量约束,允许低概率(高能量)状态分走更多质量。

这个视角还有一个直接的实用推论。模型训练完后 logits 的整体尺度会漂移,过自信的 softmax 是现代网络的通病(Guo et al., 2017 系统报告过这个失准现象),做置信度校准时最流行的方法恰恰是拟合单个温度参数 $T$ 去最小化验证集 NLL。能用一个标量修好校准,正是因为它只缩放分布形状、不动排序,与准确率的优化目标完全正交。最大熵推导、熵单调性、温度缩放校准,是同一条线上的三颗珠子。

直觉图景:地貌的海拔缩放

我喜欢这样一个类比。logits 是一张地貌图,softmax 把海拔转成"被选中的概率"。温度做的事是把整张地图的海拔除以 $T$:低温时丘陵被放大成悬崖,只有最高峰有概率;高温时悬崖被压成平地,处处都有可能。山峰之间的相对高度差决定一切,绝对高度(logits 整体加一个常数)完全不影响分布——因为 softmax 对平移不变:$\mathrm{softmax}(z+c) = \mathrm{softmax}(z)$。这也解释了为什么温度要和 logits 的原始尺度联合考虑:一个 logit 范围在 $\pm 5$ 的模型和范围在 $\pm 50$ 的模型,同一个 $T=0.7$ 含义完全不同。

温度不是什么:与 logit 干预的边界

顺带澄清一个常见混淆。temperature 和 API 里的 logit_bias 是两类完全不同的操作:前者是等比缩放所有 logit 差距(乘法),后者是对指定 token 加减常数(加法)。想压制某个具体词(比如禁用词),温度无能为力——等比缩放改变不了排序;只有加法干预或硬屏蔽(把 logit 设为 $-\infty$)能做这件事。反过来,想整体控制输出的确定程度,加法干预做不到,必须动温度。分清"改排序"和"改形状"两类需求,调参时就不会拧错旋钮。

和 top-k / top-p 的分工

温度管"形状",top-k 和 top-p 管"支撑集"。实践中几乎总是组合使用:先用 top-p(核采样)把累积概率不足 $p$ 的尾部砍掉,再在剩下的集合上做温度采样。为什么要先截断?因为温度的数学性质保证不了尾部安全——高温会等比抬升所有低概率 token,包括那些纯噪声的。截断把噪声支撑集去掉之后,温度才能在"候选都是合理的"这个前提下放心地增加多样性。

一个我实测中反复出现的现象:温度调高但不动 top-p 时,输出质量崩塌得很快;而把 top-p 收到 0.9、温度开到 1.2,多样性提升明显且基本不产出胡言乱语。从上面的推导看这很自然——温度只缩放差距,它分不清"合理的次优"和"分布尾部的垃圾",区分这两者必须靠截断。

实现侧的一个附注:数值稳定性

写代码时 softmax 从不直接算 $e^{z_i/T}$,而是先减去最大值:

$$ p_i = \frac{e^{(z_i - z_{\max})/T}}{\sum_j e^{(z_j - z_{\max})/T}}. $$

由前面提到的平移不变性,这在数学上严格相等;在浮点上,它把指数函数的输入压到 $\le 0$,杜绝了溢出。交叉熵损失更进一步,从不显式算 softmax,而是直接算 $\log\sum_j e^{z_j} - z_y$,其中 log-sum-exp 用同一个减最大值技巧求值。训练框架里 cross_entropy 要求传 logits 而不是概率,原因就是这个。温度除法发生在这所有技巧之前,等价于先把 logits 缩放 $1/T$ 再走标准流程,所以采样时的温度实现也就是一行 logits /= T。

小结

温度的全部数学:概率比 $p_i/p_j = e^{(z_i-z_j)/T}$ 决定排序不变性,$dH/dT = \mathrm{Var}(E)/T^3 \ge 0$ 决定它是单调熵旋钮,两个极限分别给出贪心解码与均匀噪声。下次调参时可以明确自己在做什么:压缩 logit 差距、抬高分布熵,同时用截断策略守住支撑集的下限。