Information Theory | Kullback-Leibler Divergence
概述
KL 散度(Kullback-Leibler Divergence),也称为相对熵(Relative Entropy),是信息论和统计学中用于衡量两个概率分布差异的重要度量。它在机器学习、深度学习、变分推断等领域有广泛应用。
本笔记重点介绍 KL 散度的基础定义、数学推导、核心性质以及其在机器学习中的意义。
数学定义
离散概率分布
对于离散概率分布 $P$ 和 $Q$,KL 散度定义为:
$$D_{KL}(P||Q) = \sum_{x} P(x) \log\frac{P(x)}{Q(x)}$$
连续概率分布
对于连续概率分布,KL 散度定义为:
$$D_{KL}(P||Q) = \int p(x) \log\frac{p(x)}{q(x)} dx$$
其中:
- $P$ 是真实分布(或目标分布)
- $Q$ 是近似分布(或模型分布)
- $\log$ 通常使用自然对数(以 $e$ 为底),单位为 nats;使用以 2 为底的对数时,单位为 bits
核心性质
1. 非负性
$$D_{KL}(P||Q) \geq 0$$
当��仅当 $P = Q$ 时,等号成立(即 $D_{KL}(P||Q) = 0$)。
2. 非对称性
$$D_{KL}(P||Q) \neq D_{KL}(Q||P)$$
这意味着 KL 散度不是真正的距离度量,因为它不满足对称性。
3. 不满足三角不等式
KL 散度不满足三角不等式:
$$D_{KL}(P||R) \not\leq D_{KL}(P||Q) + D_{KL}(Q||R)$$
因此,KL 散度不是度量空间中的距离函数。
4. 凸性
KL 散度关于第一个参数 $P$ 是凸函数。
直观理解
信息论角度
KL 散度表示:用分布 $Q$ 来编码分布 $P$ 的样本时,相比用 $P$ 自身编码所需的额外信息量(以比特或 nats 为单位)。
- 如果 $Q$ 与 $P$ 完全相同,则不需要额外信息,$D_{KL}(P||Q) = 0$
- 如果 $Q$ 与 $P$ 差异很大,则需要更多额外信息来补偿编码效率的损失
统计学角度
KL 散度衡量分布 $Q$ 对分布 $P$ 的近似程度:
- 值越小,$Q$ 越接近 $P$
- 值越大,$Q$ 与 $P$ 的差异越大
机器学习角度
在机器学习中,通常:
- $P$ 是真实数据分布(未知但可以从数据中采样)
- $Q$ 是模型学习的分布(由参数 $\theta$ 决定)
- 最小化 $D_{KL}(P||Q)$ 等价于让模型分布尽可能接近真实分布
数学推导
1. 从信息熵推导
信息熵(Entropy)
分布 $P$ 的信息熵定义为:
$$H(P) = -\sum_{x} P(x) \log P(x)$$
它表示编码分布 $P$ 的样本所需的平均最小比特数。
交叉熵(Cross Entropy)
用分布 $Q$ 来编码分布 $P$ 的样本所需的平均比特数:
$$H(P, Q) = -\sum_{x} P(x) \log Q(x)$$
KL 散度 = 交叉熵 - 信息熵
$$\begin{align}
D_{KL}(P||Q) &= H(P, Q) - H(P) \
&= -\sum_{x} P(x) \log Q(x) + \sum_{x} P(x) \log P(x) \
&= \sum_{x} P(x) [\log P(x) - \log Q(x)] \
&= \sum_{x} P(x) \log\frac{P(x)}{Q(x)}
\end{align}$$
这表明 KL 散度是使用次优编码方案 $Q$ 相比最优编码方案 $P$ 所需的额外信息量。
2. 非负性证明(Gibbs 不等式)
我们使用 Jensen 不等式来证明 KL 散度的非负性。
Jensen 不等式
对于凸函数 $f(x)$ 和概率分布 $P$:
$$f\left(\sum_{x} P(x) \cdot x\right) \leq \sum_{x} P(x) \cdot f(x)$$
对于凹函数(如 $\log$),不等号反向。
证明过程
由于 $f(x) = -\log(x)$ 是凸函数,我们有:
$$\begin{align}
D_{KL}(P||Q) &= \sum_{x} P(x) \log\frac{P(x)}{Q(x)} \
&= -\sum_{x} P(x) \log\frac{Q(x)}{P(x)} \
&\geq -\log\left(\sum_{x} P(x) \cdot \frac{Q(x)}{P(x)}\right) \quad \text{[Jensen 不等式]} \
&= -\log\left(\sum_{x} Q(x)\right) \
&= -\log(1) \
&= 0
\end{align}$$
等号成立当且仅当 $\frac{Q(x)}{P(x)}$ 为常数,即 $P(x) = Q(x)$ 对所有 $x$ 成立。
结论:$D_{KL}(P||Q) \geq 0$,且仅当 $P = Q$ 时等号成立。
3. 与最大似然估计的关系
在机器学习中,我们通常希望找到参数 $\theta$ 使得模型分布 $P_\theta$ 尽可能接近真实数据分布 $P_{data}$。
最小化 KL 散度
$$\begin{align}
\min_\theta D_{KL}(P_{data}||P_\theta) &= \min_\theta \sum_{x} P_{data}(x) \log\frac{P_{data}(x)}{P_\theta(x)} \
&= \min_\theta \left[\sum_{x} P_{data}(x) \log P_{data}(x) - \sum_{x} P_{data}(x) \log P_\theta(x)\right] \
&= \min_\theta \left[-\sum_{x} P_{data}(x) \log P_\theta(x)\right] \quad \text{[第一项与 $\theta$ 无关]} \
&= \max_\theta \sum_{x} P_{data}(x) \log P_\theta(x)
\end{align}$$
经验分布近似
在实践中,我们无法直接访问 $P_{data}$,但可以从数据集 ${x_1, x_2, \ldots, x_N}$ 中采样。使用经验分布:
$$P_{data}(x) \approx \frac{1}{N} \sum_{i=1}^{N} \delta(x - x_i)$$
代入上式:
$$\max_\theta \sum_{x} P_{data}(x) \log P_\theta(x) \approx \max_\theta \frac{1}{N} \sum_{i=1}^{N} \log P_\theta(x_i)$$
这正是最大似然估计(Maximum Likelihood Estimation, MLE)的目标函数!
结论:最小化 KL 散度等价于最大化似然函数。
实际计算示例
示例 1:离散分布
假设真实分布 $P = [0.5, 0.3, 0.2]$,近似分布 $Q = [0.4, 0.4, 0.2]$。
计算 $D_{KL}(P||Q)$:
$$\begin{align}
D_{KL}(P||Q) &= 0.5 \cdot \log\frac{0.5}{0.4} + 0.3 \cdot \log\frac{0.3}{0.4} + 0.2 \cdot \log\frac{0.2}{0.2} \
&= 0.5 \cdot \log(1.25) + 0.3 \cdot \log(0.75) + 0.2 \cdot \log(1) \
&= 0.5 \times 0.2231 + 0.3 \times (-0.2877) + 0 \
&= 0.1116 - 0.0863 \
&\approx 0.0253 \text{ nats}
\end{align}$$
转换为 bits(除以 $\ln 2 \approx 0.693$):
$$D_{KL}(P||Q) \approx 0.0365 \text{ bits}$$
示例 2:高斯分布
对于两个一维高斯分布:
- $P = \mathcal{N}(\mu_1, \sigma_1^2)$
- $Q = \mathcal{N}(\mu_2, \sigma_2^2)$
KL 散度的闭式解为:
$$D_{KL}(P||Q) = \log\frac{\sigma_2}{\sigma_1} + \frac{\sigma_1^2 + (\mu_1 - \mu_2)^2}{2\sigma_2^2} - \frac{1}{2}$$
特殊情况:当 $Q = \mathcal{N}(0, 1)$(标准正态分布)时:
$$D_{KL}(P||Q) = \frac{1}{2}\left(\mu_1^2 + \sigma_1^2 - \log\sigma_1^2 - 1\right)$$
这个公式在 VAE(变分自编码器)中被广泛使用。
机器学习中的应用
1. 变分推断(Variational Inference)
在贝叶斯推断中,我们希望计算后验分布 $P(\theta|X)$,但通常难以直接计算。变分推断使用一个简单的分布 $Q(\theta)$ 来近似:
$$\min_Q D_{KL}(Q(\theta)||P(\theta|X))$$
2. 变分自编码器(VAE)
VAE 的损失函数包含 KL 散度项,用于正则化潜在空间:
$$\mathcal{L} = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x)||p(z))$$
其中:
- 第一项是重建损失
- 第二项是 KL 散度,约束编码器输出接近先验分布
3. 策略优化(强化学习)
在强化学习中,KL 散度用于约束策略更新的幅度:
$$\max_\theta \mathbb{E}{\pi_\theta}[R] \quad \text{s.t.} \quad D{KL}(\pi_{old}||\pi_\theta) \leq \delta$$
这是 TRPO(Trust Region Policy Optimization)和 PPO(Proximal Policy Optimization)的核心思想。
4. 模型蒸馏(Knowledge Distillation)
使用 KL 散度让小模型(学生)学习大模型(教师)的输出分布:
$$\mathcal{L} = D_{KL}(P_{teacher}||P_{student})$$
5. 生成对抗网络(GAN)
虽然 GAN 不直接优化 KL 散度,但理论分析表明,GAN 的目标函数与 JS 散度(Jensen-Shannon Divergence)相关,而 JS 散度是基于 KL 散度定义的:
$$D_{JS}(P||Q) = \frac{1}{2}D_{KL}(P||M) + \frac{1}{2}D_{KL}(Q||M)$$
其中 $M = \frac{1}{2}(P + Q)$。
前向 KL 与反向 KL
前向 KL:$D_{KL}(P||Q)$
- 含义:用 $Q$ 近似 $P$
- 特点:
- 当 $P(x) > 0$ 但 $Q(x) = 0$ 时,散度为无穷大
- 要求 $Q$ 覆盖 $P$ 的所有支撑集(zero-avoiding)
- $Q$ 倾向于覆盖 $P$ 的所有模式,可能过于分散
反向 KL:$D_{KL}(Q||P)$
- 含义:用 $Q$ 近似 $P$(但优化方向相反)
- 特点:
- 当 $Q(x) > 0$ 但 $P(x) = 0$ 时,散度为无穷大
- 要求 $Q$ 集中在 $P$ 的高概率区域(zero-forcing)
- $Q$ 倾向于选择 $P$ 的某一个模式,可能过于集中
对比表格
| 特性 | 前向 KL $D_{KL}(P||Q)$ | 反向 KL $D_{KL}(Q||P)$ |
|---|---|---|
| 优化目标 | 最大似然估计 | 变分推断 |
| 行为 | Zero-avoiding(避免零概率) | Zero-forcing(强制零概率) |
| 多模态处理 | 覆盖所有模式(分散) | 选择单一模式(集中) |
| 应用 | 监督学习、MLE | VAE、变分推断 |
与其他散度的关系
1. JS 散度(Jensen-Shannon Divergence)
JS 散度是 KL 散度的对称化版本:
$$D_{JS}(P||Q) = \frac{1}{2}D_{KL}(P||M) + \frac{1}{2}D_{KL}(Q||M)$$
其中 $M = \frac{1}{2}(P + Q)$。
性质:
- 对称:$D_{JS}(P||Q) = D_{JS}(Q||P)$
- 有界:$0 \leq D_{JS}(P||Q) \leq \log 2$
- 满足三角不等式的平方根
2. Wasserstein 距离
Wasserstein 距离(也称为 Earth Mover’s Distance)是另一种衡量分布差异的度量,在 GAN 中被广泛使用(WGAN)。
与 KL 散度相比:
- Wasserstein 距离是真正的度量(满足对称性和三角不等式)
- 即使两个分布没有重叠,Wasserstein 距离仍然有意义
- KL 散度在分布不重叠时可能为无穷大
3. $\chi^2$ 散度
$$D_{\chi^2}(P||Q) = \sum_{x} \frac{(P(x) - Q(x))^2}{Q(x)}$$
与 KL 散度相比,$\chi^2$ 散度对分布差异更敏感。
常见问题
问题 1:为什么 KL 散度不对称?
原因:KL 散度的定义中,$P$ 和 $Q$ 的角色不同:
$$D_{KL}(P||Q) = \sum_{x} P(x) \log\frac{P(x)}{Q(x)}$$
- $P$ 作为权重出现在求和中
- $Q$ 出现在对数的分母中
交换 $P$ 和 $Q$ 会得到不同的结果。
直观理解:
- $D_{KL}(P||Q)$ 衡量”用 $Q$ 编码 $P$ 的样本”的额外信息
- $D_{KL}(Q||P)$ 衡量”用 $P$ 编码 $Q$ 的样本”的额外信息
- 这两者通常不相等
问题 2:什么时候使用前向 KL,什么时候使用反向 KL?
**前向 KL $D_{KL}(P||Q)$**:
- 当你希望 $Q$ 覆盖 $P$ 的所有模式时
- 最大似然估计
- 监督学习
**反向 KL $D_{KL}(Q||P)$**: - 当你希望 $Q$ 集中在 $P$ 的高概率区域时
- 变分推断
- VAE、变分贝叶斯
问题 3:KL 散度可以为负吗?
不可以。根据 Gibbs 不等式,KL 散度始终非负:
$$D_{KL}(P||Q) \geq 0$$
当且仅当 $P = Q$ 时,$D_{KL}(P||Q) = 0$。
问题 4:如何处理 $Q(x) = 0$ 的情况?
当 $P(x) > 0$ 但 $Q(x) = 0$ 时,$\log\frac{P(x)}{Q(x)} = \infty$,导致 KL 散度为无穷大。
解决方法:
- 拉普拉斯平滑:给 $Q(x)$ 加一个小的常数 $\epsilon$
- 确保支撑集匹配:保证 $Q$ 的支撑集包含 $P$ 的支撑集
- 使用其他散度:如 Wasserstein 距离,对不重叠分布更鲁棒
最佳实践
1. 数值稳定性
在实现 KL 散度时,避免直接计算 $\log\frac{P(x)}{Q(x)}$,而是使用:
1
2
3
4
5
# 不稳定的实现
kl = P * np.log(P / Q)
# 稳定的实现
kl = P * (np.log(P) - np.log(Q))
### 2. 处理零概率
1
2
3
# 添加小的 epsilon 避免 log(0)
epsilon = 1e-10
kl = P * (np.log(P + epsilon) - np.log(Q + epsilon))
### 3. 使用库函数
大多数深度学习框架提供了优化的 KL 散度实现:
1
2
3
4
5
6
7
8
9
10
11
# PyTorch
import torch.nn.functional as F
kl_loss = F.kl_div(Q.log(), P, reduction='batchmean')
# TensorFlow
import tensorflow as tf
kl_loss = tf.keras.losses.KLDivergence()(P, Q)
# SciPy
from scipy.stats import entropy
kl_div = entropy(P, Q)
1 | # 不稳定的实现 |
1 | # 添加小的 epsilon 避免 log(0) |
1 | # PyTorch |
参考资源
- Information Theory, Inference, and Learning Algorithms - David MacKay
- Pattern Recognition and Machine Learning - Christopher Bishop
- Deep Learning Book - Ian Goodfellow et al.
- Kullback-Leibler Divergence Explained

