KL 散度

定义

**KL 散度(Kullback–Leibler divergence)**衡量两个概率分布 pp 与 qq 之间的差异:

DKL(p ∥ q)=∑xp(x)log⁡p(x)q(x)D_{KL}(p\,\|\,q)=\sum_x p(x)\log\frac{p(x)}{q(x)}

直觉:如果真实分布是 pp,你却用 qq 来理解/编码它,会额外付出多少信息代价。DKLD_{KL} 越小,qq 越接近 pp;p=qp=q 时 DKL=0D_{KL}=0。

直观理解

关键在不对称。看两个极端场景(设真实分布是 pp):

  • KL(p∥q)KL(p\|q) 惩罚「pp 高但 qq 低」的地方——真实会发生的事,你的模型却说几乎不可能,代价极大(log⁡\log 爆炸)。这偏向不漏报。
  • KL(q∥p)KL(q\|p) 惩罚「qq 高但 pp 低」的地方——模型瞎猜的事,真实几乎不会发生。这偏向不误报。

两种惩罚取向不同,所以 KL(p∥q)≠KL(q∥p)KL(p\|q)\neq KL(q\|p)——它是「差异」但不是「距离」(不满足对称性)。

公式推导

性质

  • 非负:DKL(p∥q)≥0D_{KL}(p\|q)\geq 0,当且仅当 p=qp=q 时取 0(Gibbs 不等式);
  • 不对称:DKL(p∥q)≠DKL(q∥p)D_{KL}(p\|q)\neq D_{KL}(q\|p);
  • 与 熵、交叉熵 的关系:H(p,q)=H(p)+DKL(p∥q)H(p,q)=H(p)+D_{KL}(p\|q),pp 固定时最小化交叉熵等价于最小化 KL 散度。

两个高斯的闭式解

当 p=N(μ1,σ12)p=\mathcal N(\mu_1,\sigma_1^2)、q=N(μ2,σ22)q=\mathcal N(\mu_2,\sigma_2^2) 时,KL 散度有解析式:

DKL(N(μ1,σ12) ∥ N(μ2,σ22))=log⁡σ2σ1+σ12+(μ1−μ2)22σ22−12D_{KL}\big(\mathcal N(\mu_1,\sigma_1^2)\,\big\|\,\mathcal N(\mu_2,\sigma_2^2)\big) = \log\frac{\sigma_2}{\sigma_1} + \frac{\sigma_1^2 + (\mu_1-\mu_2)^2}{2\sigma_2^2} - \frac12

这个闭式解在 VAE 和扩散模型里都被直接使用。

与扩散模型的联系

扩散模型的损失推导 把 ELBO 拆成三项,其中两项就是 KL 散度:

  • LT=DKL(q(xT∣x0) ∥ p(xT))L_T = D_{KL}\big(q(x_T\mid x_0)\,\|\,p(x_T)\big):让前向终点逼近标准噪声;
  • Lt−1=DKL(q(xt−1∣xt,x0) ∥ pθ(xt−1∣xt))L_{t-1} = D_{KL}\big(q(x_{t-1}\mid x_t,x_0)\,\|\,p_\theta(x_{t-1}\mid x_t)\big):逐时间步比较「真实后验」与「网络反向」。

因为两侧都是 高斯分布,这些 KL 才能套闭式解,最终化简成预测噪声的 MSE(LsimpleL_{simple})。

相关

  • 熵 — 分布自身的不确定性
  • 交叉熵 — H(p,q)=H(p)+DKL(p∥q)H(p,q)=H(p)+D_{KL}(p\|q)
  • 扩散模型的损失推导 — KL 项的来源
  • VAE — KL 约束潜在分布接近 N(0,I)\mathcal N(0,I)
  • 高斯分布 — 两个高斯的闭式解