← 返回笔记列表
📐 数学原理笔记

LLM 背后的数学原理

理解 LLM 训练中反复出现的数学工具:Sigmoid / 最大似然 / KL 散度 / 交叉熵 / Softmax,每个概念都有完整推导 + 直觉解释 + 在 LLM 中的应用。

核心问题
这些公式为什么长这样?背后的直觉是什么?
覆盖内容
Sigmoid · MLE · KL 散度 · 交叉熵 · Softmax
关联文档
notes-llm-pipeline · notes-rl
持续更新
每次遇到新数学概念就加进来
σ
§1 Sigmoid 等价变形

在 Bradley-Terry 奖励模型、逻辑回归、神经网络输出层里,我们反复看到一个变形:

$$\frac{e^a}{e^a + e^b} = \sigma(a - b)$$

很多教材直接写出结论,但不展示推导。这里完整走一遍。

1.1 完整推导步骤

先回忆 sigmoid 函数的定义:

$$\sigma(x) \;=\; \frac{1}{1 + e^{-x}}$$

现在推导 $\dfrac{e^a}{e^a + e^b} = \sigma(a-b)$,每一步都列出来:

起点 $\dfrac{e^a}{e^a + e^b}$
Step 1 分子分母同除以 $e^a$: $= \dfrac{1}{1 + e^{b-a}}$ // $e^a / e^a = 1$,$e^b / e^a = e^{b-a}$
Step 2 把指数改写为负号形式: $= \dfrac{1}{1 + e^{-(a-b)}}$ // $b - a = -(a - b)$
Step 3 对比 sigmoid 定义 $\sigma(x) = \dfrac{1}{1+e^{-x}}$,令 $x = a - b$: $= \sigma(a - b)$ ✓
一句话总结: $\dfrac{e^a}{e^a+e^b} = \sigma(a-b)$,本质是「归一化指数差」。分子分母同除以分子,把加法变成减法放进指数,恰好符合 sigmoid 的定义。

1.2 在 Bradley-Terry 模型中的应用

Bradley-Terry 假设每个选手有潜在能力值 $s_i$,且令 $s = e^r$(保证正数),则胜率为:

$$P(y_w \succ y_l) = \frac{s_w}{s_w + s_l} = \frac{e^{r_w}}{e^{r_w} + e^{r_l}}$$

直接套用上面的等价变形(令 $a = r_w,\; b = r_l$):

$$P(y_w \succ y_l) = \frac{e^{r_w}}{e^{r_w} + e^{r_l}} = \sigma(r_w - r_l)$$

这意味着:好回答的得分减去差回答的得分,直接输入 sigmoid,就是奖励模型「认为好回答更好」的概率。

1.3 直觉核验

得分差 $r_w - r_l$$\sigma(\cdot)$ 值含义
$+\infty$→ 1模型极度确信好回答更好
$+2$≈ 0.8888% 概率认为好回答更好
$0$= 0.5两者得分相等,完全不确定
$-2$≈ 0.12判断反了!差回答反而得分高
$-\infty$→ 0模型完全判断错误
和 softmax 的关系:这其实是二元 softmax。当只有两个类别时,$\text{softmax}([a, b])_{\text{第一项}} = \dfrac{e^a}{e^a + e^b} = \sigma(a - b)$。sigmoid 是 softmax 在二分类场景的特殊情况。
§2 梯度求导——BT 损失函数

Bradley-Terry 损失函数为(对单个样本):

$$\mathcal{L} = -\log \sigma(r_w - r_l) = -\log \sigma(\Delta), \quad \Delta = r_w - r_l$$

2.1 对 $r_w$ 和 $r_l$ 分别求偏导

📖 前置知识回顾:导数 · 链式法则 · Sigmoid 求导 点击展开

① 导数是什么——「变化率」

导数 $f'(x)$ 表示函数 $f$ 在 $x$ 处的瞬时变化率:$x$ 变化一点点 $\Delta x$,$f$ 会跟着变多少。

形式化定义:$f'(x) = \lim_{\Delta x \to 0} \dfrac{f(x+\Delta x) - f(x)}{\Delta x}$,但实际做题直接套公式,不需要算极限。

你需要记住的 3 个基础导数公式:
$\dfrac{d}{dx} e^x = e^x$ (指数函数,导数等于自身)
$\dfrac{d}{dx} \ln x = \dfrac{1}{x}$ (自然对数,导数是倒数)
$\dfrac{d}{dx} x^n = n x^{n-1}$ (幂函数,指数提前来,原指数减一)

② 链式法则——「复合函数的导数」

如果 $y = f(g(x))$,即先算 $u = g(x)$,再算 $y = f(u)$,那么:

$$\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} = f'(g(x)) \cdot g'(x)$$

口诀:外层导数 × 内层导数。

具体例子 1:$y = \ln(\sigma(x))$,这里外层是 $\ln$,内层是 $\sigma(x)$
$\dfrac{dy}{dx} = \underbrace{\dfrac{1}{\sigma(x)}}_{\text{外层导数 }\frac{d\ln u}{du}=\frac{1}{u}} \cdot \underbrace{\sigma'(x)}_{\text{内层导数}}$

具体例子 2:$y = e^{-x}$,外层是 $e^u$,内层是 $u = -x$
$\dfrac{dy}{dx} = e^{-x} \cdot (-1) = -e^{-x}$

③ Sigmoid 的导数——完整推导

$\sigma(x) = \dfrac{1}{1+e^{-x}}$,用链式法则一步步推:

改写 把 $\sigma(x)$ 写成幂函数形式,方便求导: $\sigma(x) = (1+e^{-x})^{-1}$
Step 1 对幂函数 $u^{-1}$ 用幂函数导数公式,外层导数 $= -u^{-2} = -\dfrac{1}{(1+e^{-x})^2}$
Step 2 内层 $u = 1 + e^{-x}$ 对 $x$ 求导:$u' = 0 + (-e^{-x}) = -e^{-x}$
Step 3 链式法则合并: $\sigma'(x) = -\dfrac{1}{(1+e^{-x})^2} \cdot (-e^{-x}) = \dfrac{e^{-x}}{(1+e^{-x})^2}$
Step 4 把结果凑成 $\sigma \cdot (1-\sigma)$ 的形式,注意 $\sigma = \dfrac{1}{1+e^{-x}}$,所以 $1 - \sigma = \dfrac{e^{-x}}{1+e^{-x}}$:
$\sigma'(x) = \dfrac{1}{1+e^{-x}} \cdot \dfrac{e^{-x}}{1+e^{-x}} = \sigma(x) \cdot (1-\sigma(x))$ // 最终结果
记忆口诀:sigmoid 的导数 = 自身 × (1 - 自身),即 $\sigma'= \sigma(1-\sigma)$。
数值感觉:当 $\sigma(x) = 0.5$($x=0$),导数最大为 $0.5 \times 0.5 = 0.25$;当 $\sigma(x) \to 0$ 或 $1$(饱和区),导数趋近于 $0$(梯度消失!)。

④ 偏导数——多变量的导数

当函数有多个变量(如 $\mathcal{L}(r_w, r_l)$ 同时依赖 $r_w$ 和 $r_l$),对某个变量的偏导数是:把其他变量当作常数,只对这一个变量求导。

例子:$\Delta = r_w - r_l$
$\dfrac{\partial \Delta}{\partial r_w} = 1$(把 $r_l$ 当常数,对 $r_w$ 求导,$r_w$ 的系数是 1)
$\dfrac{\partial \Delta}{\partial r_l} = -1$(把 $r_w$ 当常数,对 $r_l$ 求导,$r_l$ 的系数是 $-1$)

符号区别:普通导数用 $\dfrac{d}{dx}$,偏导数用 $\dfrac{\partial}{\partial x}$(∂ 读作「偏」或「curly d」),含义相似,只是强调「多变量里只动这一个」。

有了上面的工具,来推导一个在 §2 全程都要用到的引理:$\dfrac{d}{dx}\log\sigma(x) = 1 - \sigma(x)$

引理 $\dfrac{d}{dx}\log\sigma(x)$ // 外层是 log,内层是 σ(x)
Step 1 用链式法则:外层 $\dfrac{d}{du}\log u = \dfrac{1}{u}$,内层导数为 $\sigma'(x)$: $= \dfrac{1}{\sigma(x)} \cdot \sigma'(x)$
Step 2 代入 $\sigma'(x) = \sigma(x)(1-\sigma(x))$(前置知识③推导的结论): $= \dfrac{\sigma(x)(1-\sigma(x))}{\sigma(x)} = 1 - \sigma(x)$ ✓
直觉:$\dfrac{d}{dx}\log\sigma(x) = 1 - \sigma(x)$,这个值在 $[0, 1]$ 之间。当 $x$ 很大($\sigma(x) \approx 1$),导数接近 $0$——也就是 sigmoid 已经「饱和」了,log 不再有什么变化;当 $x = 0$($\sigma(x) = 0.5$),导数为 $0.5$,变化最明显。

现在对 $\mathcal{L} = -\log\sigma(\Delta)$ 求偏导,注意 $\Delta = r_w - r_l$:

对 $r_w$ 求偏导

$\dfrac{\partial \mathcal{L}}{\partial r_w}$
$= -\dfrac{d}{d\Delta}\log\sigma(\Delta) \cdot \dfrac{\partial \Delta}{\partial r_w}$
$= -(1 - \sigma(\Delta)) \cdot 1$
$= \sigma(\Delta) - 1 \;\leq\; 0$

梯度为负 → 梯度下降时 $r_w$ 增大(好回答分数涨 ↑)

对 $r_l$ 求偏导

$\dfrac{\partial \mathcal{L}}{\partial r_l}$
$= -\dfrac{d}{d\Delta}\log\sigma(\Delta) \cdot \dfrac{\partial \Delta}{\partial r_l}$
$= -(1 - \sigma(\Delta)) \cdot (-1)$
$= 1 - \sigma(\Delta) \;\geq\; 0$

梯度为正 → 梯度下降时 $r_l$ 减小(差回答分数跌 ↓)

2.2 自适应更新强度——梯度的优雅之处

梯度幅度 $= |1 - \sigma(\Delta)|$,它随着得分差 $\Delta$ 自动调整:

场景$\Delta = r_w - r_l$$\sigma(\Delta)$梯度幅度更新力度
已判断正确且很确信$\Delta \gg 0$(如 +4)≈ 0.98≈ 0.02极小,几乎不更新
判断正确但不确定$\Delta$ 小正数(如 +0.5)≈ 0.62≈ 0.38中等,继续拉大差距
举棋不定$\Delta \approx 0$≈ 0.5≈ 0.5最大,重点学习
判断错误$\Delta < 0$(如 -2)≈ 0.12≈ 0.88很大,强力纠错
📚 类比:刷题复习策略

这个自适应机制和「智能刷题」完全一致:

  • 已经会的题(模型判断正确且很确信)→ 快速掠过,不浪费时间
  • 模棱两可的题(举棋不定)→ 重点强化,花最多时间
  • 做错的题(判断反了)→ 强力纠错,立刻重做

这不是人为设计的规则,而是从 BT 损失函数自然涌现的性质——数学自动帮你分配了学习优先级

💡 数值验证:天空为什么是蓝色——四个回答 B>D>A>C

假设当前奖励模型打分:$r(B)=2.1,\; r(D)=1.3,\; r(A)=0.8,\; r(C)=-0.5$

训练对$\Delta$$\sigma(\Delta)$Loss梯度幅度
(B, D):B 应该 > D,差距不大2.1−1.3 = 0.80.690.370.31(需继续学)
(B, A):B 应该 > A,差距较大2.1−0.8 = 1.30.790.240.21
(B, C):B 应该 > C,差距很大2.1−(−0.5) = 2.60.930.070.07(几乎不更新)
(D, A):D 应该 > A,差距最小1.3−0.8 = 0.50.620.480.38(最需要学)

结论:(D, A) 对学习信号最强,因为当前模型对「D 比 A 好」还不够确信。(B, C) 几乎没有学习信号,因为模型已经非常确定 B 比 C 好。

🎯
§3 最大似然估计(MLE)
🚧 先消除两个让人困惑的地方

① 「似然」不是「相似」

「似然」是 Likelihood 的中文翻译,直译是「像是真的的程度」,本质就是概率——某组参数下,观测到这批数据的概率有多大。

类比:你在猜一枚硬币的偏斜度,抛了 10 次得到 7 正 3 反。
「$p=0.7$ 时的似然」= 「用 $p=0.7$ 这个参数,算出看到「7 正 3 反」的概率」= 0.267
「$p=0.5$ 时的似然」= 「用 $p=0.5$ 这个参数,算出看到「7 正 3 反」的概率」= 0.117
$p=0.7$ 的似然更高,说明「$p=0.7$ 更像是产生这批数据的真实参数」。

② 最大似然怎么变成了 Loss(为什么方向反了?)

这是最让人晕的地方。完整链条只有 3 步:

1 目标:找到让「观测数据出现概率」最大的参数 → 最大化 $P_\theta(\text{数据})$
2 取 log:连乘变连加,数值稳定;$\log$ 是单调的,最大值在同一点 → 最大化 $\sum \log P_\theta(x_i)$
3 取负号:神经网络框架(PyTorch/TensorFlow)只能「最小化」,所以加个负号 → 最小化 $-\sum \log P_\theta(x_i)$,这就是 NLL Loss(负对数似然损失)

一句话总结:最大化概率 → 最大化 log 概率 → 取负后最小化 = Loss。方向反了是因为加了负号,内容是完全一样的。

3.1 「似然」是什么——更正式的说法

我们有一批观测数据 $\mathcal{D} = \{x_1, x_2, \ldots, x_N\}$,有一个含参数 $\theta$ 的概率模型 $P_\theta(x)$。

最大似然的问题:哪个 $\theta$ 使得「看到这批数据」的概率最大?

🎲 类比:抛硬币猜偏斜度

你捡到一枚硬币,抛了 10 次,结果是 7 正 3 反。

问:这枚硬币正面朝上的概率 $p$ 最可能是多少?

如果 $p=0.7$,看到「7正3反」的概率 = $\binom{10}{7} (0.7)^7 (0.3)^3 \approx 0.267$

如果 $p=0.5$,看到「7正3反」的概率 = $\binom{10}{7} (0.5)^{10} \approx 0.117$

如果 $p=0.9$,看到「7正3反」的概率 = $\binom{10}{7} (0.9)^7 (0.1)^3 \approx 0.057$

结论:$p=0.7$ 使数据出现概率最大 → 最大似然估计 $\hat{p} = 0.7$(正好等于样本频率)

形式化定义:似然函数(Likelihood)是参数 $\theta$ 的函数:

$$\mathcal{L}(\theta) = P_\theta(\mathcal{D}) = \prod_{i=1}^{N} P_\theta(x_i)$$

(假设数据独立同分布)最大似然估计就是找让似然最大的参数:

$$\hat{\theta}_{MLE} = \arg\max_\theta \; \mathcal{L}(\theta) = \arg\max_\theta \prod_{i=1}^{N} P_\theta(x_i)$$

3.2 为什么取对数——对数似然(Log-Likelihood)

直接对 $\prod P_\theta(x_i)$ 求导非常麻烦(连乘积),而且当 $N$ 很大时,连乘会导致数值下溢(概率都是小数,乘很多次会变成 $10^{-300}$,浮点数无法表示)。

由于 $\log$ 是单调递增函数,最大化 $\mathcal{L}(\theta)$ 等价于最大化 $\log \mathcal{L}(\theta)$:

$$\log \mathcal{L}(\theta) = \log \prod_{i=1}^N P_\theta(x_i) = \sum_{i=1}^N \log P_\theta(x_i)$$

✅ 取对数的好处

  • 连乘变连加,求导更简单
  • 数值稳定,不会下溢
  • $\log P$ 和 $P$ 有相同的极值点(最大值在同一个 $\theta$ 处)

⚠️ 常见混淆

「似然 $\mathcal{L}(\theta)$」和「损失函数 loss」方向相反:

  • 优化目标:最大化似然
  • 训练操作:最小化损失
  • 转换:loss = $-\log \mathcal{L}(\theta)$(取负号)

3.3 从 MLE 到负对数似然损失(NLL Loss)

最大化 $\sum \log P_\theta(x_i)$ 等价于最小化它的负数,再除以 $N$ 取平均(方便梯度稳定):

$$\mathcal{L}_{NLL}(\theta) = -\frac{1}{N}\sum_{i=1}^N \log P_\theta(x_i)$$

这就是负对数似然损失(Negative Log-Likelihood,NLL),它和交叉熵损失在独立同分布假设下完全等价(见 §5)。

🔑 MLE 在 LLM 训练中的统一视角
训练阶段数据 $\mathcal{D}$$P_\theta(x)$ 的含义MLE 目标
预训练 互联网文本 token 序列 $P(x_t \mid x_{<t})$:下一个词的概率 最大化每个位置的下一词预测概率
SFT (prompt, response) 对中的 response token $P(y_t \mid x, y_{<t})$:在 prompt 条件下的回答概率 最大化 response 部分每个 token 的预测概率
奖励模型 偏好对 $(y_w, y_l)$ $P(y_w \succ y_l) = \sigma(r_w - r_l)$:好回答更好的概率 最大化「人类偏好被正确预测」的概率

三个阶段的损失函数本质都是同一件事:最大化模型对观测数据的似然,只是数据和概率的定义不同。

3.4 为什么 MLE 是合理的训练目标

MLE 的一个重要性质:一致性(Consistency)
当数据量 $N \to \infty$ 时,MLE 估计量会收敛到真实参数 $\theta^*$(在一定正则性条件下)。
对 LLM 的启示:数据越多,模型越接近真实的语言分布。这也解释了为什么大家都在争抢更多更高质量的预训练数据。
MLE 的局限:为什么需要 RLHF
MLE 最大化「数据出现的概率」,但训练数据(互联网文本)不等于「我们想要的回答」。互联网上有大量有害、低质量的文本,MLE 会让模型原封不动地学习这些分布。
RLHF 引入了一个额外的目标:最大化「人类认为好的回答」的概率,纠正了 MLE 在对齐方面的不足。

3.5 ✨ 殊途同归:MLE 和交叉熵 Loss 是同一件事

你说的「两边推理最后能重合」就是这个。两个完全独立的学科——统计学和信息论——各自出发,最后写出了同一个公式

📊 路线 A:统计学(MLE)

出发点:「找让数据出现概率最大的参数」

目标:$\max_\theta \prod_i P_\theta(x_i)$
↓ 取 log(连乘→连加)
等价于:$\max_\theta \sum_i \log P_\theta(x_i)$
↓ 取负号变最小化
$\min_\theta \; -\dfrac{1}{N}\sum_i \log P_\theta(x_i)$
🤝
完全相同
的公式
📡 路线 B:信息论(交叉熵)

出发点:「用模型 $P_\theta$ 来编码真实数据分布 $P_{\text{data}}$,最小化编码代价」

目标:$\min_\theta \; H(P_{\text{data}},\, P_\theta)$
↓ 展开交叉熵定义
$= \min_\theta \; \mathbb{E}_{x \sim P_{\text{data}}}[-\log P_\theta(x)]$
↓ 用样本均值估计期望
$\approx \min_\theta \; -\dfrac{1}{N}\sum_i \log P_\theta(x_i)$
🎯 为什么会重合?——背后的道理

两条路的核心操作完全相同:用 $-\log P_\theta(x)$ 来量化「模型在样本 $x$ 上表现有多差」,然后对所有样本取平均。

统计学的解读:
$-\log P_\theta(x)$ = 「参数 $\theta$ 下样本 $x$ 多难以解释」,越小越好
信息论的解读:
$-\log P_\theta(x)$ = 「用模型 $P_\theta$ 编码样本 $x$ 需要多少 bits」,越小越好

两者殊途同归,说明这个公式不是人为凑出来的,而是从「让模型更好地解释数据」这件事情上,数学必然给出的唯一答案。这也是为什么交叉熵 Loss 在分类任务里几乎无处不在——不管你从哪个角度出发,都会走到这里。

💡 具体数值:两条路计算同一个东西

假设真实数据只有 3 个样本:$x_1, x_2, x_3$,模型当前的预测概率为 $P_\theta(x_1)=0.8,\; P_\theta(x_2)=0.3,\; P_\theta(x_3)=0.5$

MLE 路线算出的 loss:
$-\frac{1}{3}[\log 0.8 + \log 0.3 + \log 0.5]$
$= -\frac{1}{3}[-0.22 + (-1.20) + (-0.69)]$
$= -\frac{1}{3} \times (-2.11) \approx \mathbf{0.70}$
交叉熵路线算出的 loss:
$H(P_\text{data}, P_\theta) \approx \frac{1}{N}\sum -\log P_\theta(x_i)$
$= \frac{1}{3}[0.22 + 1.20 + 0.69]$
$= \frac{1}{3} \times 2.11 \approx \mathbf{0.70}$

两条路算出来完全相同:0.70。这不是巧合,而是必然。

📏
§4 KL 散度——衡量两个分布有多不同

KL 散度(Kullback-Leibler Divergence)在 RLHF 里无处不在:PPO 的 KL 惩罚、DPO 的推导都用到它。但它到底在量什么?

4.1 定义

对于离散分布 $P$ 和 $Q$,从 $Q$ 到 $P$ 的 KL 散度为:

$$D_{KL}(P \| Q) = \sum_x P(x) \log \frac{P(x)}{Q(x)}$$
符号含义
  • $P$:「真实」分布(或我们关心的目标分布)
  • $Q$:「近似」分布(用来近似 $P$ 的)
  • $D_{KL}(P \| Q)$:用 $Q$ 来近似 $P$ 时产生的「额外代价」
  • 注意:$D_{KL}(P\|Q) \neq D_{KL}(Q\|P)$,KL 散度不对称!

4.2 直觉理解——「用错了码本的代价」

📦 类比:压缩编码

假设你要传输一段文字,最优编码方案应该根据字符的真实频率 $P$ 设计(常见字符用短编码)。

但如果你用的是基于 $Q$ 设计的码本(以为某些字符更常见),那么平均编码长度会变长。

$D_{KL}(P\|Q)$ = 用 $Q$ 的码本而非最优 $P$ 的码本时,每个符号多花的比特数(单位是 nats,若用 $\log_2$ 则为 bits)。

当 $P = Q$ 时,码本最优,$D_{KL} = 0$;$P$ 和 $Q$ 差异越大,KL 散度越大。

4.3 重要性质

✅ 非负性

$D_{KL}(P \| Q) \geq 0$,当且仅当 $P = Q$ 时取等。

证明:由 Jensen 不等式,对凸函数 $-\log$ 有 $\mathbb{E}[-\log \frac{Q}{P}] \geq -\log \mathbb{E}[\frac{Q}{P}] = 0$。

⚠️ 不对称性

$D_{KL}(P\|Q) \neq D_{KL}(Q\|P)$,因此不是「距离」(违反对称公理)。

两个方向有不同的含义:「前向 KL」vs「反向 KL」在机器学习中表现非常不同。

4.4 在 RLHF 中的作用

RLHF 的优化目标中有这一项:

$$-\beta \cdot D_{KL}\!\left[\pi_\theta(\cdot|x) \| \pi_\text{ref}(\cdot|x)\right]$$

展开来看,对一条回答 $y$ 中每个 token $y_t$,KL 项等于:

$$D_{KL} = \sum_t \pi_\theta(y_t|x, y_{<t}) \log \frac{\pi_\theta(y_t|x, y_{<t})}{\pi_\text{ref}(y_t|x, y_{<t})}$$

这个惩罚项确保当前策略 $\pi_\theta$ 不要偏离 SFT 参考模型 $\pi_\text{ref}$ 太远,防止模型通过「钻奖励模型漏洞」(Reward Hacking)来刷高分。

为什么是 $D_{KL}(\pi_\theta \| \pi_\text{ref})$ 而不是反过来?
「前向 KL」$D_{KL}(\pi_\theta \| \pi_\text{ref})$ 惩罚的是:当前策略在参考模型认为「不可能」的地方赋予了概率。这正是我们想防止的——模型不应该输出 SFT 模型从未见过的奇怪文本。
H
§5 信息熵 · 交叉熵 · KL 散度的关系

这三个概念经常同时出现,但教材往往割裂讲。这里把它们放在一起,看清楚关系。

5.1 信息熵(Shannon Entropy)

信息熵衡量一个分布的「不确定性」:

$$H(P) = -\sum_x P(x) \log P(x) = \mathbb{E}_P[-\log P(x)]$$
💡 直觉:公平硬币 vs 偏斜硬币
公平硬币($P(\text{正})=P(\text{反})=0.5$):
$H = -0.5\log 0.5 - 0.5\log 0.5 = \log 2 \approx 0.693$ nats
不确定性最大,熵最高
偏斜硬币($P(\text{正})=0.9, P(\text{反})=0.1$):
$H = -0.9\log 0.9 - 0.1\log 0.1 \approx 0.325$ nats
基本知道结果,熵较低

极端情况:$P(\text{正})=1$,$H=0$——完全确定,无不确定性,熵为零。

5.2 交叉熵(Cross-Entropy)

交叉熵衡量「用分布 $Q$ 来预测真实分布 $P$ 时的平均编码代价」:

$$H(P, Q) = -\sum_x P(x) \log Q(x) = \mathbb{E}_P[-\log Q(x)]$$

和信息熵的区别:$H(P)$ 用 $P$ 自己编码,$H(P, Q)$ 用 $Q$ 编码真实分布 $P$。

5.3 三者的统一关系

🔑 交叉熵 = 信息熵 + KL 散度
$$H(P, Q) = H(P) + D_{KL}(P \| Q)$$

完整推导(每步都解释清楚):

⚠️ 关键技巧预告:「加一个又减一个同样的东西」
推导的第 2 步会在式子里同时加上 $+\sum P(x)\log P(x)$ 和 $-\sum P(x)\log P(x)$,这两项加起来等于零,所以值没变——这是数学推导里常见的「凑项」技巧,目的是把式子拆成两个我们认识的东西。
起点 交叉熵的定义: $H(P,Q) = -\sum_x P(x)\log Q(x)$
Step 1 同时加上 $\boldsymbol{+\sum P(x)\log P(x)}$ 和 $\boldsymbol{-\sum P(x)\log P(x)}$(两项互相抵消,值不变):
$= \underbrace{-\sum P(x)\log P(x)}_{\text{加上去的}} + \underbrace{\sum P(x)\log P(x)}_{\text{减掉的}} - \sum P(x)\log Q(x)$
Step 2 把后两项合并——两个 $\sum$ 的求和对象相同,可以合并到一起:
$= -\sum P(x)\log P(x) + \sum P(x)\bigl[\log P(x) - \log Q(x)\bigr]$ // $\log a - \log b = \log\frac{a}{b}$
$= -\sum P(x)\log P(x) + \sum P(x)\log\frac{P(x)}{Q(x)}$
Step 3 认出两个已知的式子:
$-\sum P(x)\log P(x)$ 正是信息熵的定义 $H(P)$
$\sum P(x)\log\frac{P(x)}{Q(x)}$ 正是 KL 散度的定义 $D_{KL}(P\|Q)$
结论 $H(P,Q) = H(P) + D_{KL}(P\|Q)$ ✓
为什么要做这步凑项?
因为我们想把 $H(P,Q)$(含两个分布)拆成「只含 $P$ 的部分」+ 「含两个分布之差的部分」,这样就能看出:
  • $H(P)$:真实分布自身的不确定性,和模型 $Q$ 无关,训练时固定不变
  • $D_{KL}(P\|Q)$:模型 $Q$ 和真实分布 $P$ 的差距,这才是训练时真正要压缩的
所以最小化交叉熵 $H(P,Q)$ 等价于最小化 $D_{KL}(P\|Q)$——因为 $H(P)$ 是常数。

5.4 LLM 预训练 loss 就是交叉熵

预训练 loss 写作:

$$\mathcal{L}_{PT} = -\sum_t \log P_\theta(x_t \mid x_{<t})$$

这正是以真实 token 序列 $x_t$(one-hot 分布 $P$)为目标,让模型预测分布 $P_\theta$ 去拟合,即 $H(P_{\text{data}}, P_\theta)$ 的样本估计。

统一视角:
  • 预训练 loss = 交叉熵 = NLL = 负对数似然 → 最小化分布差异
  • SFT loss = 同上,只是 mask 掉了 prompt 部分
  • 奖励模型 loss = BT 损失 = 二元交叉熵(输入是得分差)
  • RLHF KL 惩罚 = 直接最小化 KL 散度防止偏离 SFT 模型
LLM 训练中所有的 loss 都是「让某个模型分布更接近某个目标分布」的不同表现形式。
🌡️
§6 Softmax 与温度系数

语言模型生成下一个词时,输出的是所有词汇表位置的 logit(原始分数),Softmax 把它们转换成概率分布,再进行采样。

6.1 Softmax 定义

$$\text{softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_j e^{z_j}}$$
符号
  • $\mathbf{z} = (z_1, z_2, \ldots, z_V)$:模型输出的 logit 向量,$V$ 是词汇表大小(通常 3~15 万)
  • 输出是归一化的概率分布:所有 $\text{softmax}_i \in (0,1)$,且 $\sum_i \text{softmax}_i = 1$
和 sigmoid 的关系:当词汇表大小 $V=2$ 时,softmax 退化为 sigmoid。更准确地说,$\text{softmax}([a, b])_{\text{第一项}} = \sigma(a-b)$——这解释了为什么 §1 里说「sigmoid 是二元 softmax」。

6.2 温度系数(Temperature)

标准 softmax 对模型 confidence 非常敏感:如果某个词的 logit 远高于其他,softmax 后这个词的概率会接近 1,模型变得「贪婪」。

引入温度系数 $T$:

$$\text{softmax}_T(\mathbf{z})_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}$$
💡 具体数值:「今天天气真___」—— 同样 logit,不同 T 下概率变化

假设模型对候选词输出了如下 logit(原始分数):

好:4.0 棒:3.0 热:2.0 差:1.0

温度公式:先把 logit 除以 $T$,再做 softmax。$T$ 越小,除完之后差距被放大;$T$ 越大,差距被压缩。

原始 logit $T=0.5$(低温)
logit÷0.5,差距放大
$T=1.0$(默认)
logit÷1,不变
$T=2.0$(高温)
logit÷2,差距压缩
4.0 88% 🔥 64% 47%
3.0 8% 24% 26%
2.0 3% 9% 16%
1.0 1% 3% 11%
T=0.5 低温
「好」拿走 88%,几乎每次都输出同一个词
→ 确定性强,但没有变化
T=1.0 默认
「好」64%,「棒」24%,偶尔出现其他词
→ 适中,最常用
T=2.0 高温
四个词都有明显概率,「差」也有 11%
→ 多样,但可能出奇怪的词

本质:$T$ 控制的是「模型有多犹豫」。低温 = 模型非常自信,押注最高分;高温 = 模型装作不那么确定,给低分词也留机会。

温度 $T$效果适用场景
$T \to 0$概率集中在 logit 最大的词上(等价于 argmax,贪心解码)确定性任务(代码、数学)
$T = 1$标准 softmax,不做任何调整默认设置
$T > 1$(如 1.5)分布更均匀,增加随机性,生成更多样创意写作、头脑风暴
$T \to \infty$均匀分布,完全随机采样(实际不用,太随机)
🌡️ 类比:物理温度

统计物理里,粒子的能量分布也有类似的 Boltzmann 分布:$P_i \propto e^{-E_i / (kT)}$,高温时粒子分布更均匀,低温时更集中在低能态。

语言模型的「温度」直接借用了这个概念:高温 = 更多随机探索,低温 = 更确定地走已知的好路

6.3 采样策略:top-k 和 top-p(nucleus sampling)

温度控制分布形状,但实际采样时通常还要配合截断策略,防止出现概率极低但仍可能被采到的「意外词」:

Top-k 采样

只保留概率最高的 $k$ 个词,其余概率设为 0,然后在 $k$ 个词上归一化后采样。

问题:$k$ 是固定的,有时候「合理词」只有 3 个但 $k=50$ 会引入噪声,有时候「合理词」有 200 个但 $k=50$ 会过度截断。

Top-p(Nucleus)采样

按概率从高到低排列,累计到概率和 $\geq p$(如 $p=0.9$)为止,只在这个「核」里采样。

优点:自适应词数——分布尖锐时核小(保守),分布平缓时核大(多样),更符合直觉。

⚠️ 「温度」和「top-k/top-p」的关系——你说的这个观察完全正确

温度改变的是分布形状(概率数值),但不一定能改变「候选集合是谁」。三种解码方式受温度影响的程度完全不同:

解码方式温度有没有用?原因
贪心解码(每次取 argmax) ❌ 完全没用 永远选最高分,温度压缩差距也不改变排名第一的词
Top-k 采样(先选 k 个再采样) ⚠️ 只影响 k 个词内部 候选集合固定不变,但高温让这 k 个词概率更均匀,低温让第一名更垄断——你说的就是这个
Top-p 采样(累计概率截断) ✅ 影响候选集大小 高温让分布更平,要累计到 p 需要更多词,候选集会扩大;低温让分布尖锐,候选集会缩小
Beam Search(保留 k 条路径) ⚠️ 单步影响小,多步有差异 每步候选不变,但各路径得分累积不同,最终保留的完整句子可能不同

结论:这就是为什么实践中 top-p 比 top-k 更常用——top-p 是温度 + 截断真正联动的采样方式,高温时自动放宽候选范围,低温时自动收窄,行为更符合直觉。用 top-k 时如果想让温度真正起作用,需要把 $k$ 设得足够大(比如 $k=50$ 甚至更大),让分布有展开的余地。

💡 举例:「今天天气真___」的采样
logit原始 softmax 概率top-p=0.9 是否纳入
4.255%✅(累计 55%)
3.120%✅(累计 75%)
2.410%✅(累计 85%)
1.96%✅(累计 91% ≥ 0.9,纳入后停止)
糟糕0.51.5%❌(累计已超过 0.9,截断)
(其他 3 万个词)<0<0.1%

最终从「好、棒、差、热」这 4 个词中按归一化概率采样,既保证了多样性,又避免了低概率的奇怪词出现。

6.4 温度系数在训练时有没有用?

温度系数是推理时的工具,训练时几乎不用——但有一个重要例外。

为什么训练时不用温度?
训练的目标是计算 loss 做反向传播,用的是整个概率分布,而不是「采样选一个词」。预训练和 SFT 的核心 loss 是:
$$\mathcal{L} = -\log P_\theta(x_t \mid x_{<t})$$
直接用真实词在当前分布里的概率,根本不涉及「从分布里选谁」,所以温度没有介入的机会。
🤔 「温度会影响真实词的概率,那对梯度有影响吗?」——你的观察完全正确

如果在训练时对 softmax 加了温度 $T$,真实词的概率会变:

$$P_\theta^T(x_t) = \frac{e^{z_{x_t}/T}}{\sum_v e^{z_v/T}} \quad \text{(标准训练时 } T=1\text{,这项就是普通 softmax)}$$

对 loss 求梯度时,温度会以 $\frac{1}{T}$ 的倍率缩放梯度:

$$\frac{\partial \mathcal{L}}{\partial z_v} = \frac{1}{T}\left(P_\theta^T(v) - \mathbf{1}[v = x_t]\right)$$
$T > 1$(高温)训练效果
梯度被 $\frac{1}{T}$ 缩小,分布更平缓,模型对每个位置都更「谦虚」,不那么自信。 相当于隐式的正则化,防止模型太快收敛到某个词。
$T < 1$(低温)训练效果
梯度被放大,分布更尖锐,模型被「逼着」更快把正确词推到接近 1。 可能导致训练不稳定,很少这样用。

为什么标准训练固定 $T=1$?
因为温度的效果完全可以被学习率替代——$T=2$ + 某学习率,等价于 $T=1$ + 一半学习率(梯度幅度减半,效果相同)。所以没必要引入额外超参数,直接调学习率就够了。训练时用温度的唯一理由是知识蒸馏(见下),那里的温度有独特的语义,不能被学习率替代。

训练/推理阶段用温度吗?原因
预训练 / SFT❌ 不用直接算 NLL loss,不采样,温度无处介入
奖励模型训练❌ 不用算 BT loss,比较两个回答的得分差,不采样
RLHF(PPO)生成 rollout 时⚠️ 有时用策略模型需要采样生成回答,可以加温度增加样本多样性,避免所有样本都一样
知识蒸馏(KD)训练✅ 专门用见下方详解 ↓
推理 / 生成文本✅ 主战场控制输出的多样性和确定性
🎓 训练时用温度的重要场景:知识蒸馏(Knowledge Distillation)

知识蒸馏是让小模型(Student)去学大模型(Teacher)的一种方法。朴素做法是让小模型直接预测正确答案(hard label),但更好的做法是让小模型去拟合大模型对所有词的完整概率分布(soft label)——这里就需要温度。

Hard Label(不用温度)

正确答案是「猫」,就用 one-hot:$[0, 0, 1, 0, \ldots]$

小模型只知道「猫对狗错」,学不到「狗虽然错但也挺像,鱼差得远」这些排名信息。

Soft Label(大模型输出 + 高温)

大模型(高温软化后)输出:$[0.01, 0.08, 0.70, 0.15, \ldots]$

小模型能学到「猫最可能,狗差一点,鱼很不可能」这些排名中间的隐含知识,效果更好。

蒸馏时对教师模型用高温($T=4\sim10$):

$$\mathcal{L}_{KD} = -\sum_v \underbrace{P_{\text{teacher}}^T(v)}_{\text{高温软化后的教师分布}} \cdot \log \underbrace{P_{\text{student}}^T(v)}_{\text{同样高温的学生分布}}$$

高温把教师分布「摊平」,让「第2名、第3名」的词也有一定概率,小模型才能真正学到排名信息,而不只是在模仿「第1名是谁」。这种软化的分布被称为 soft target,是知识蒸馏效果好的核心原因(Hinton et al., 2015)。