WhiteDLG's

KL 散度

2026-1-17 Math / AI 21 Views

KL 散度就是量化两个概率分布的区别。

定义

$$ \begin{aligned} D(p\|q) &= H(p, q) - H(p) = \sum p_i I_i^q - \sum p_i I_i^p \\ &= \sum p_i \log_2(\frac{1}{q_i}) - \sum p_i \log_2(\frac{1}{p_i}) \\ &= \sum p_i \log_2(\frac{p_i}{q_i}) \end{aligned} $$

根本上就是,KL 散度 = 交叉熵 - 熵。

性质

  • $D(p\|q) \ge 0$ (Gibbs inequality,只有当两个分布完全一致时才等于 0)
  • $D(p\|q) \neq D(q\|p)$ (非对称性,not a distance metric)

①、KL 散度永远大于等于 0,只有当两个分布一样才会等于 0。
②、交换位置不相等。

KL 散度对 $\theta$ 求梯度

$$ \nabla_{\theta} D(p\|q_{\theta}) = \nabla_{\theta} H(p, q_{\theta}) - \nabla_{\theta} H(p) = \nabla_{\theta} H(p, q_{\theta}) $$

但由于熵 $H(p)$ 这一项与 $\theta$ 无关(梯度 $\Delta$ 为 0),所以优化 KL 散度等价于优化交叉熵这一项。


另一理解

Another Intuition of KL Divergence.

probability of sequences of similar distributions should be similar, vice versa.
a coin with ground truth probability $p(h) = 0.5$, $p(t) = 0.5$.
its estimated probability $q(h) = 0.2$, $q(t) = 0.8$.
throw $N$ times with $N_h$ heads and $N_t$ tails, call it seq.

$$ \begin{aligned} \log((\frac{P(\text{seq}|p)}{P(\text{seq}|q)})^{\frac{1}{N}}) &= \frac{1}{N} \log(\frac{p(h)^{N_h}p(t)^{N_t}}{q(h)^{N_h}q(t)^{N_t}}) \\ &= \frac{N_h}{N}\log(p(h)) + \frac{N_t}{N}\log(p(t)) - \frac{N_h}{N}\log(q(h)) - \frac{N_t}{N}\log(q(t)) \\ &= p(h)\log(p(h)) + p(t)\log(p(t)) - p(h)\log(q(h)) - p(t)\log(q(t)) \\ &= p(h)\log(\frac{p(h)}{q(h)}) + p(t)\log(\frac{p(t)}{q(t)}) \end{aligned} $$

$$D(p\|q) = \sum p_i \log(\frac{p_i}{q_i}) = \log(\frac{P(\text{sequence of distribution } p|\text{distribution } p)}{P(\text{sequence of distribution } p|\text{distribution } q)})$$

解释

背景
假设我们有一个硬币,它正面朝上 (heads, $h$) 的概率是 $p(h) = 0.5$,反面朝上 (tails, $t$) 的概率是 $p(t) = 0.5$。这是硬币的“真实”概率分布,我们称之为 $p$。
然而,我们可能对这个硬币不太了解,我们估计正面朝上的概率是 $q(h) = 0.2$,反面朝上的概率是 $q(t) = 0.8$。这是我们的“估计”概率分布,我们称之为 $q$。

抛硬币实验

我们抛这个硬币 $N$ 次,其中 $N_h$ 次正面朝上,$N_t$ 次反面朝上。我们称这个结果序列为 seq。

计算序列概率

真实分布下的概率: 如果我们使用真实的概率分布 $p$ 来计算得到这个序列的概率,我们有:
$P(\text{seq}|p) = p(h)^{N_h} p(t)^{N_t}$

估计分布下的概率: 如果我们使用我们的估计概率分布 $q$ 来计算得到这个序列的概率,我们有:
$Q(\text{seq}|q) = q(h)^{N_h} q(t)^{N_t}$

序列概率的对数: 我们计算这两个概率的对数,然后求它们的比值:
$\log \left( \frac{P(\text{seq}|p)}{Q(\text{seq}|q)} \right)^{1/N} = \frac{1}{N} \log \left( \frac{p(h)^{N_h} p(t)^{N_t}}{q(h)^{N_h} q(t)^{N_t}} \right)$

简化表达式: 这个表达式可以进一步简化为:
$\frac{N_h}{N} \log \left( \frac{p(h)}{q(h)} \right) + \frac{N_t}{N} \log \left( \frac{p(t)}{q(t)} \right)$

KL散度的定义: 这个表达式实际上就是KL散度的定义:
$D(p\|q) = \sum p_i \log \left( \frac{p_i}{q_i} \right)$

直观理解 & 总结

直观理解:
KL 散度可以被理解为:如果我们用估计分布 $q$ 来代替真实分布 $p$,我们会损失多少信息。在这个例子中,如果我们用 $q$ 来代替 $p$,我们会低估正面朝上的概率,高估反面朝上的概率。KL 散度衡量的就是我们在估计分布下计算得到特定序列的概率与在真实分布下计算得到的概率之间的差异。

总结:
KL 散度是一个衡量两个概率分布差异的指标。它告诉我们,如果我们用一个分布来近似另一个分布,我们会损失多少信息。在机器学习和强化学习中,KL 散度常用于衡量模型预测分布与真实分布之间的差异,或者在策略优化中控制策略更新的幅度。

交叉熵与熵的内容见 "信息、熵、交叉熵" 这一博客
阅读博客
  Tags: Math, Machine Learning, KL Divergence
Comments Section (Giscus Loading...)