张芷铭的个人博客

KL 散度(Kullback-Leibler Divergence)衡量两个概率分布差异,是信息论和机器学习的核心概念。

数学定义

离散分布

$$D_{KL}(P \parallel Q) = \sum_{x \in \mathcal{X}} P(x) \log \frac{P(x)}{Q(x)}$$

连续分布

$$D_{KL}(P \parallel Q) = \int_{-\infty}^{\infty} p(x) \log \frac{p(x)}{q(x)} dx$$

核心性质

性质说明
非负性$D_{KL} \geq 0$,当且仅当 $P=Q$ 时等于 0
不对称性$D_{KL}(P \parallel Q) \neq D_{KL}(Q \parallel P)$
信息解释用 $Q$ 近似 $P$ 时损失的信息量

原理推导

$$D_{KL}(P \parallel Q) = H(P, Q) - H(P)$$

其中 $H(P)$ 是熵,$H(P, Q)$ 是交叉熵。

应用场景

领域应用
变分推断变分下界目标函数
生成模型GAN、VAE 评估生成分布与真实分布差异
强化学习策略优化中限制更新幅度

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np

def kl_divergence(p, q):
    p = np.asarray(p, dtype=np.float64)
    q = np.asarray(q, dtype=np.float64)
    return np.sum(np.where(p != 0, p * np.log(p / q), 0))

P = [0.1, 0.4, 0.5]
Q = [0.2, 0.3, 0.5]
print(kl_divergence(P, Q))

实践经验

  1. 数值稳定性:添加小常数避免除零
  2. 对称化处理:使用 Jensen-Shannon 散度
  3. 分布归一化:确保输入为有效概率分布

相关度量

度量公式
Jensen-Shannon 散度$D_{JS} = \frac{1}{2}D_{KL}(P \parallel M) + \frac{1}{2}D_{KL}(Q \parallel M)$
Rényi 散度$D_\alpha = \frac{1}{\alpha-1} \log \sum P(x)^\alpha Q(x)^{1-\alpha}$

Comments