---
title: KL 散度与交叉熵
url: https://doc.liz6.com/theory/01-information-theory/02-kl-divergence-and-cross-entropy
locale: zh
area: theory
tags:
- theory
- 信息论
date: 2026-07-18
modified: 2026-07-29
description: KL 散度是"用错分布编码,平均要多付多少 bit";交叉熵是"真实熵 + 这份罚款"。最小化交叉熵损失等价于最大似然——这是信息论直接连到深度学习损失函数的那根线。在目标多峰且近似模型受限时,forward/reverse KL 往往表现出"覆盖模态"与"锁定模态"的不同倾向。
---

# KL 散度与交叉熵

> KL 散度是"用错分布编码,平均要多付多少 bit";交叉熵是"真实熵 + 这份罚款"。最小化交叉熵损失等价于最大似然——这是信息论直接连到深度学习损失函数的那根线。在目标多峰且近似模型受限时,forward/reverse KL 往往表现出"覆盖模态"与"锁定模态"的不同倾向。

## 引子:用错的编码本

上一章说,数据来自分布 $p$ 时,熵 $H(p)$ 是平均码长的理论下界;为 $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 散度最容易被忽略、后果却最大的性质。把 $p$ 和 $q$ 一交换,数值和行为都会变。

根子在求和的权重上。$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)>0$ 但 $q(x)\to 0$ 的地方,$\log(p/q)\to\infty$,代价无穷大。所以 $q$ **不敢在 $p$ 的任何支撑区留空**,被迫覆盖 $p$ 的全部质量。
- **$D_{KL}(q \parallel p)$ 惩罚"$q$ 有而 $p$ 没有"**。凡是 $q(x)>0$ 但 $p(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 中的信息论](/theory/01-information-theory/06-information-theory-in-llms.md))。

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

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

非对称性不是纸上谈兵,它会影响拟合出来的分布长什么样。下面讨论一个有明确前提的典型场景:**目标分布 $p$ 是多峰的,而可调的近似分布族 $q$ 表达能力受限**,比如只能选单峰高斯。离开这些条件,"forward 必覆盖、reverse 必寻峰"并不是无条件成立的定理。

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

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

<svg viewBox="0 0 720 300" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="forward KL 与 reverse KL 拟合双峰分布的对比:forward KL 拟合出覆盖两峰的宽分布,reverse KL 拟合出锁定单峰的窄分布">
  <rect width="720" height="300" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">同一个双峰 p,两种 KL 拟合出完全不同的 q</text>
  <text x="185" y="58" text-anchor="middle" font-size="13" font-weight="700" fill="#4338ca">Forward KL:D_KL(p‖q)</text>
  <text x="185" y="76" text-anchor="middle" font-size="11" fill="#64748b">mode-covering 覆盖两峰</text>
  <line x1="60" y1="230" x2="320" y2="230" stroke="#475569" stroke-width="1.2"/>
  <path d="M70,230 C110,110 150,110 190,150 C230,110 270,110 300,230" fill="none" stroke="#94a3b8" stroke-width="2" stroke-dasharray="5 3"/>
  <path d="M60,230 C120,150 250,150 320,230" fill="#4f46e5" fill-opacity="0.16" stroke="#4f46e5" stroke-width="2.4"/>
  <text x="190" y="252" text-anchor="middle" font-size="11" fill="#3730a3">q(蓝)摊开盖住 p(灰虚线)两峰</text>
  <text x="535" y="58" text-anchor="middle" font-size="13" font-weight="700" fill="#0f766e">Reverse KL:D_KL(q‖p)</text>
  <text x="535" y="76" text-anchor="middle" font-size="11" fill="#64748b">mode-seeking 锁定单峰</text>
  <line x1="410" y1="230" x2="670" y2="230" stroke="#475569" stroke-width="1.2"/>
  <path d="M420,230 C460,110 500,110 540,150 C580,110 620,110 650,230" fill="none" stroke="#94a3b8" stroke-width="2" stroke-dasharray="5 3"/>
  <path d="M455,230 C475,120 505,120 525,230" fill="#0d9488" fill-opacity="0.18" stroke="#0d9488" stroke-width="2.4"/>
  <text x="540" y="252" text-anchor="middle" font-size="11" fill="#0f766e">q(青)缩进左峰,无视右峰</text>
  <rect x="120" y="270" width="480" height="22" rx="6" fill="#eef2ff"/>
  <text x="360" y="285" text-anchor="middle" font-size="11.5" fill="#3730a3">选哪个方向,就选了"宁可模糊也别漏掉"还是"宁可漏掉也别模糊"</text>
</svg>

在上面这个受限拟合场景里,可以用一句话记忆:**forward KL 怕漏(所以倾向变宽),reverse KL 怕错(所以倾向变窄)**。RLHF 常用 $D_{KL}(\pi_\theta\parallel\pi_\text{ref})$ 把策略拴在参考模型附近;这个方向确实重要,但它的主要作用是限制策略漂移,不应仅靠"寻峰"直觉解释,细节见 [LLM 中的信息论](/theory/01-information-theory/06-information-theory-in-llms.md)。

## 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 不等式*
