Math-05.信息论-03.交叉熵与KL散度

本页是 ML 最核心的信息论篇:交叉熵(cross-entropy)作为训练损失,KL 散度(Kullback–Leibler divergence)作为分布差异与 RLHF 约束。

段末注释KL 散度 $D_{\mathrm{KL}}(P | Q) = \sum_x p(x) \log \frac{p(x)}{q(x)} \ge 0$,当且仅当 $P=Q$ 时为 0;不对称,一般 $D_{\mathrm{KL}}(P | Q) \neq D_{\mathrm{KL}}(Q | P)$。

系列入口00.系列规划 | 前置:02 熵Math-00/50


1. 交叉熵定义(D2–D3)

图 1 用 Q 编码 P 的代价

离散 $P$、$Q$($q(x)>0$ 当 $p(x)>0$):

$$
H(P, Q) = -\sum_x p(x) \log q(x)
$$

含义:真实分布 $P$ 的样本,用基于 $Q$ 的最优码长编码,平均每条多少 nat。

分类:one-hot 标签 $P=(0,\ldots,1,\ldots,0)$,模型 softmax 输出 $Q$:

$$
H(P,Q) = -\log q(y_{\mathrm{true}}) = \text{单样本 CE}
$$

batch 平均即 CrossEntropyLoss


2. KL 散度与分解(D3)

图 2 H(P,Q) = H(P) + D_KL(P||Q)

$$
D_{\mathrm{KL}}(P | Q) = \sum_x p(x) \log \frac{p(x)}{q(x)} = H(P,Q) - H(P)
$$

性质 内容
非负 $D_{\mathrm{KL}}(P | Q) \ge 0$
等号 当且仅当 $p(x)=q(x)$ 处处成立
不对称 方向 $P | Q$ 有意义:「$P$ 相对 $Q$ 的额外比特」
非度量 不满足三角不等式

训练:$P$(数据)固定 → $\min_Q H(P,Q) \Leftrightarrow \min_Q D_{\mathrm{KL}}(P | Q)$。

反向 KL $D_{\mathrm{KL}}(Q | P)$:mode-seeking;正向 $D_{\mathrm{KL}}(P | Q)$:mode-covering——VAE、变分推断中方向选择重要(Math-07)。


3. 连续形式(D3)

$$
D_{\mathrm{KL}}(P | Q) = \int p(x) \log \frac{p(x)}{q(x)} ,\mathrm{d}x
$$

高斯 $P=\mathcal{N}(\mu_1,\sigma_1^2)$,$Q=\mathcal{N}(\mu_2,\sigma_2^2)$ 有闭式(用于 VAE、扩散部分推导)。


4. ML 场景(D7)

图 3 CE 与 KL 在 ML 中的位置

场景 公式
多分类 $\mathcal{L} = -\frac1N\sum_i \log q_\theta(y_i \mid \mathbf{x}_i)$
语言模型 $\mathcal{L} = -\sum_t \log p_\theta(x_t \mid x_{<t})$
知识蒸馏 $\mathcal{L} = D_{\mathrm{KL}}(p_{\mathrm{teacher}} | p_{\mathrm{student}})$
RLHF 奖励 $+ \beta D_{\mathrm{KL}}(\pi_\theta | \pi_{\mathrm{ref}})$ 防偏离
t-SNE $\min D_{\mathrm{KL}}(P_{\mathrm{high}} | P_{\mathrm{low}})$
VAE $\mathcal{L} = \mathbb{E}[-\log p(x
Label smoothing $P=(1-\varepsilon)\delta_y + \varepsilon/K$ 降低过拟合

15.多项分布损失函数 存量 衔接。


5. 局限与实现(D8)

图 4 局限

问题 对策
$q(x)\to 0$ 而 $p(x)>0$ KL → $\infty$;数值 clip
PyTorch kl_div 输入需 log_q,注意 reduction
CE 与 BCE 多类用 CrossEntropyLoss(含 softmax);二分类可用 BCEWithLogitsLoss
只看 CE 不看校准 加 ECE、温度缩放评估
KL 方向搞反 RLHF 通常惩罚相对 参考策略 的偏离

6. PyTorch 示例(D12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import torch
import torch.nn.functional as F

# 多分类 CE(内部 log_softmax + NLL)
logits = torch.randn(32, 10)
target = torch.randint(0, 10, (32,))
loss_ce = F.cross_entropy(logits, target)

# 手动 CE
log_q = F.log_softmax(logits, dim=-1)
loss_manual = F.nll_loss(log_q, target)
assert torch.allclose(loss_ce, loss_manual)

# KL:P 为 target 分布,log Q 为模型
P = torch.softmax(torch.randn(32, 10), dim=-1)
log_Q = F.log_softmax(torch.randn(32, 10), dim=-1)
kl = F.kl_div(log_Q, P, reduction="batchmean") # sum P*(log P - log Q)

7. 小结

CE = 分类/语言模型的标准损失;KL = CE 减去不可训练的 $H(P)$,也是分布匹配与 RLHF 的核心度量。下一篇:05 最大熵与 Softmax | 10 语言模型

系列导航01 总论 | 20 RLHF

-------------本文结束感谢您的阅读-------------