11 分钟
本页目录

KL 散度与交叉熵

KL 散度是"用错分布编码,平均要多付多少 bit";交叉熵是"真实熵 + 这份罚款"。最小化交叉熵损失等价于最大似然——这是信息论直接连到深度学习损失函数的那根线。而 forward/reverse KL 的非对称性,决定了模型是"覆盖所有模态"还是"锁定一个模态"。

引子:用错的编码本

上一章说,数据来自分布 p 时,为它量身定做的最优编码,平均码长就是熵 H(p)

但现实里你往往拿不到真正的 p。你手上只有一个近似 q——模型估出来的、或者假设出来的。于是你只能拿"为 q 优化的编码本"去压缩真正来自 p 的数据。

编码本用错了,会怎样?每条消息平均会多花一点 bit。多花的这部分,就是这一章的主角。

KL 散度:用错分布的代价

相对熵 / KL 散度(Kullback-Leibler divergence) 精确度量这份"多花的 bit":

D_{KL}(p \parallel q) = \sum_x p(x) \log_2 \frac{p(x)}{q(x)}

用上一章的语言拆开看就一清二楚。按 p 的最优编码,平均码长是 H(p);换成为 q 优化的编码,平均码长变成交叉熵 H(p,q)。两者之差,正是 KL 散度:

D_{KL}(p \parallel q) = H(p,q) - H(p)

这个差额是纯粹的浪费——数据没变、信息量没变,只因为编码本选错了,就得多付。

一条关键性质:D_{KL}(p \parallel q) \geq 0(Gibbs 不等式),等号当且仅当 p=q。它很像一个"距离",衡量两个分布有多不像。但它不是真正的距离⁠——下一节的非对称性就是原因。

非对称性:D_{KL}(p \parallel q) \neq D_{KL}(q \parallel p)

这是 KL 散度最容易被忽略、后果却最大的性质。把 pq 一交换,数值和行为都会变。

根子在求和的权重上。D_{KL}(p \parallel q) = \sum_x p(x) \log \frac{p(x)}{q(x)},每一项的权重是 p(x);而 D_{KL}(q \parallel p) 的权重是 q(x)。谁当权重,谁就决定惩罚落在哪:

  • D_{KL}(p \parallel q) 惩罚"p 有而 q 没有"。凡是 p(x)>0q(x)\to 0 的地方,\log(p/q)\to\infty,代价无穷大。所以 q 不敢在 p 的任何支撑区留空⁠,被迫覆盖 p 的全部质量。
  • D_{KL}(q \parallel p) 惩罚"q 有而 p 没有"。凡是 q(x)>0p(x)\to 0 的地方,代价无穷大。所以 q 只敢待在 p 的高密度区⁠,宁可缩进一个峰里,也不越界。

正因为非对称,"最小化 KL"这句话是不完整的——必须说清哪个分布在前。这直接引出下面 forward / reverse 之分。

看个具体数字⁠,别停在抽象。取 p=(0.5,\ 0.5)q=(0.9,\ 0.1):

D_{KL}(p \parallel q) = 0.5\log_2\frac{0.5}{0.9} + 0.5\log_2\frac{0.5}{0.1} \approx 0.74\ \text{bit}

D_{KL}(q \parallel p) = 0.9\log_2\frac{0.9}{0.5} + 0.1\log_2\frac{0.1}{0.5} \approx 0.53\ \text{bit}

同一对分布,两个方向就是不一样。这不是舍入误差,是结构性的。谁做求和权重,谁就决定了惩罚往哪落。

交叉熵与最大似然:连到深度学习的那根线

现在把 KL 拆一下,那根连到深度学习的线就露出来了。

交叉熵(cross-entropy) H(p,q) = -\sum_x p(x) \log_2 q(x),按定义可以拆成:

H(p,q) = H(p) + D_{KL}(p \parallel q)

放进监督学习的场景。这里 p 是数据的真实分布(训练集给定,H(p) 是常数,和模型无关),q 是模型参数 \theta 预测的分布。于是:

最小化交叉熵损失 = 最小化 D_{KL}(p \parallel q)——那个常数项 H(p) 不影响梯度,直接被丢掉。

再走一步。分类任务里 p 通常是 one-hot(真实标签概率为 1,其余为 0),此时求和塌缩成单项:H(p,q) = -\log q(\text{真实类})。对整个数据集求和:

\sum_i -\log q(y_i \mid x_i) = -\log \prod_i q(y_i \mid x_i)

右边恰好是负对数似然⁠。于是三件事被钉成一件:

最小化交叉熵损失 ⟺ 最小化 forward KL ⟺ 最大似然估计(MLE)

这就是为什么几乎所有分类模型、所有 LLM 预训练都用交叉熵损失。它不是随手选的工程 trick,而是"让模型分布尽量贴近数据分布"这个目标的信息论精确表达。LLM 每一步预测下一个 token 的分布 q,对真实 token 的 one-hot p 算交叉熵,走的正是这套逻辑(详见 LLM 中的信息论)。

公式含义
H(p)-\sum p\log pp 自己的最优编码的平均码长(理论下界)
交叉熵 H(p,q)-\sum p\log qq 的编码压 p 的数据的平均码长
KL 散度 D_{KL}(p \parallel q)\sum p\log(p/q)两者之差 = 用错分布多付的 bit

Forward KL vs Reverse KL:覆盖还是锁定

非对称性不是纸上谈兵,它决定了拟合出来的分布长什么样。

设定一个典型场景:p 是固定的目标,常常是双峰的;q 是我们能调的近似,常常受限,比如只能是单峰高斯。优化时选 forward 还是 reverse,拟合出的 q 形状截然不同:

  • Forward KL D_{KL}(p \parallel q)(mode-covering,覆盖型):它惩罚 qp 有质量处留空。于是 q 被迫摊开、盖住 p 的所有模态⁠,哪怕为此在两峰之间的低密度区放上不该有的质量。这就是最大似然 / 监督学习的行为——数据的每一种模式都想照顾到。
  • Reverse KL D_{KL}(q \parallel p)(mode-seeking,寻峰型):它惩罚 q 跑到 p 的低密度区。于是 q 锁定单个模态、缩成窄分布⁠,主动无视其他峰。这是变分推断(VI)的默认行为,也是 RLHF 里策略优化的倾向——宁可坚定押注一个高回报模式,也不平摊。
同一个双峰 p,两种 KL 拟合出完全不同的 q Forward KL:D_KL(p‖q) mode-covering 覆盖两峰 q(蓝)摊开盖住 p(灰虚线)两峰 Reverse KL:D_KL(q‖p) mode-seeking 锁定单峰 q(青)缩进左峰,无视右峰 选哪个方向,就选了"宁可模糊也别漏掉"还是"宁可漏掉也别模糊"

一句话记牢:forward KL 怕漏(所以变宽),reverse KL 怕错(所以变窄)。RLHF 用 reverse 方向的 KL 约束把策略拴在参考模型附近,细节见 LLM 中的信息论

Jensen-Shannon 散度:对称化的补丁

有时候 KL 的非对称很不方便——比如你就想要一个真正的"分布距离"。

Jensen-Shannon 散度(JS divergence) 是它的对称化方案。先取中点分布 m = (p+q)/2,再取两侧 KL 的平均:

\text{JS}(p,q) = \frac{1}{2} D_{KL}(p \parallel m) + \frac{1}{2} D_{KL}(q \parallel m)

它对称(\text{JS}(p,q)=\text{JS}(q,p))、有界(以 2 为底时 0 \leq \text{JS} \leq 1 bit),而且 \sqrt{\text{JS}} 是一个合法的度量。原始 GAN 的判别器目标,本质上就在最小化 JS 散度。

但话说回来:当你需要"编码代价"这层物理意义、或需要和 MLE 对应时,人们还是直接用 KL。对称性不总是免费的好处。

参考

  • 教材⁠: "Elements of Information Theory" (Cover & Thomas — 第 2 章 Relative Entropy,含 Gibbs 不等式证明)
  • 教材⁠: "Pattern Recognition and Machine Learning" (Bishop — 10.1 节变分推断,forward/reverse KL 行为的经典图示)
  • 论文⁠: "Generative Adversarial Nets" (Goodfellow et al., 2014 — 判别器目标与 JS 散度的联系)

关键词: 相对熵 relative entropy, KL 散度 KL divergence, 交叉熵 cross-entropy, 非对称性 asymmetry, 最大似然 MLE, forward KL, reverse KL, mode-covering, mode-seeking, Jensen-Shannon divergence, Gibbs 不等式