KL散度

KL 散度(全称 Kullback-Leibler Divergence,也叫相对熵),本质就是衡量两个概率分布的 “不一样程度”,更准确地说:用一个近似分布去描述真实分布时,会损失 / 多浪费多少信息。

两个基础的概念:

概率分布:就是一件事所有可能结果的出现概率。比如抛正常硬币,正面 50%、反面 50%,这就是一个分布;作弊硬币正面 90%、反面 10%,这是另一个分布。

信息熵:香农老爷子的定义,简单说就是「一个分布本身的最小平均信息量」。可以看下这里

公式

KL散度的公式,拆开来就是:

D_KL(P || Q) = 交叉熵H(P,Q) - 真实分布的熵H(P)


离散型事件(比如抛硬币这种可数的结果)的KL散度公式:

\[D_{KL}(P \parallel Q) = \sum_{x} P(x) \cdot \log\left( \frac{P(x)}{Q(x)} \right) \]

我们把它拆开:

  • \(\sum P(x) \cdot \log P(x) = -H(P)\),就是真实分布熵的负数

  • \(\sum P(x) \cdot \log Q(x) = -H(P,Q)\),就是交叉熵的负数

连续型事件的公式只是把求和换成积分,核心逻辑完全不变。


核心特性

  1. 永远非负

    KL散度≥0,只有当P和Q两个分布完全一模一样时,KL散度才等于0。KL散度越小,说明分布越接近。

  2. 绝对不对称

    \(D_{KL}(P \parallel Q) \neq D_{KL}(Q \parallel P)\)

    • 前面的P,永远是真实分布、目标分布;后面的Q,永远是用来拟合的近似分布、模型预测的分布
  3. 0概率会直接爆炸

    如果真实分布P里有出现概率>0的事件,但是近似分布Q给这个事件定了0概率,那公式里的\(\log(P(x)/0)\)会直接变成无穷大,KL散度直接爆炸。

    所以实际使用时,都会给Q的概率加一个极小值,避免出现0概率的情况。


常见用途

  1. 机器学习的分类损失函数
    分类任务里,我们希望模型预测的分布Q,和真实标签的分布P越像越好,也就是KL散度越小越好。
    而真实分布P的熵H(P)是固定不变的,所以最小化KL散度,就等价于最小化交叉熵H(P,Q)——这就是为什么所有分类任务都用交叉熵损失,它的本质就是最小化KL散度。

  2. 生成模型的核心(比如VAE变分自编码器)
    VAE里,我们需要用一个简单的正态分布Q,去近似一个复杂的、没法直接算的真实后验分布P。核心就是最小化\(D_{KL}(Q \parallel P)\),让Q尽可能贴近P,这样就能用简单分布代替复杂分布,实现生成图片、音频等功能。

posted @ 2026-03-14 13:41  wljss  阅读(2)  评论(0)    收藏  举报