1 min read 285 words Updated Apr 25, 2026 Created May 03, 2026

KL 散度描述的是两个分布之间的差异,更具体一点,是一个分布相对另一个分布的差异。

$$D_{KL}(P || Q) = \sum_{x \in P} P(x) \log \frac {P(x)}{Q(x)} = {\mathbb E}_{x \sim P}[\log P(x) - \log Q(x)] $$

需要注意的是:

  • 这里计算的 $Q$ 相对 $P$ 的差异
  • 如果 $Q$ 中出现了 $P$ 中不存在的东西,那么不会计入散度
  • 但是如果 $Q$ 中是小概率,但是 $P$ 中概率很大,那么 $P(x)$ 不小并且 $\log \frac {P(x)}{Q(x)}$ 很大,可能会导致散度爆炸。
  • 如果 $P(x)$ 中某个分布的概率很小,那么 $P(x)$ 会使得该概率对散度的影响很小,但如果概率相差很大,还是会构成差距。
    • 补充:考虑 $\log$ 是一个上凸函数,那么利用琴生不等式,有 ${\mathbb E}_{x \sim P}[\log \frac {P(x)} {Q(x)}] = -{\mathbb E}_{x \sim P}[\log \frac {Q(x)} {P(x)}] \ge -\log {\mathbb E}_{x \sim P}[\frac {Q(x)} {P(x)}] = - \log 1 = 0$,故散度不可能为负数,并且当且仅当 $P = Q$ 时等号成立。
  • 数值不稳定,因为 $\log$$< 1$ 时估计与真实值的差距很大。
  • 根据 神秘 言论:KL 散度衡量的是“用分布 $Q$ 去编码分布 $P$ 时,平均多用了多少比特”。既然 $P$ 是最优编码,用任何其他 $Q$ 编码必然效率更低(花费更多比特),不可能更少(负数)或一样

如果利用 KL 散度作为 Loss,那么实际上计算的交叉熵:

$$J(\theta) = {\mathbb E}_{x \sim P} [-\log Q(x)] = \sum_{x \in P} - P(x) \log Q(x) $$

其对于 $\theta$ 偏导:

$$\frac {\partial J(\theta)}{\partial \theta} = \sum_{x \in P} - \frac {P(x)} {Q(x)} \frac {\partial Q(x)} {\partial \theta} $$

由于一般来说,对于模型的回归问题,最终的输出不是归一化的,也就是 $\sum Q(x) \ne 1$,所以需要在外面套一层 softmax 函数,保证概率和为 $1$

$$J(\theta) = {\mathbb E}_{x \sim P} [- \log \frac {e^{Q(x)}}{\sum_x e^{Q(x)}}] = \sum_{x \in P} -P(x) \log \frac {e^{Q(x)}}{\sum_z e^{Q(z)}} $$

那么对于每一个 $x$ 单独求取梯度:

$$\begin{aligned} \frac {\partial J(\theta)} {\partial z_i} &= \frac \partial {\partial z_i} \sum_{j} -y_j \log \frac {e^{z_j}} {\sum_t e^{z_t}} \\ &= \sum_j -y_j \frac {\sum_t e^{z_t}} {e^{z_j}} \frac \partial {\partial z_i} \frac {e^{z_j}} {\sum_t e^{z_t}} \\ &= \sum_j -y_j \frac S {e^{z_j}} \begin{cases} \frac {(e^{z_j} S - e^{z_i} e^{z_j})} {S^2} & i = j \\ - \frac {e^{z_j} e^{z_i}} {S^2} & i \ne j \\ \end{cases} \\ & = \sum_j - y_j (\delta_{ij} - \frac {e^{z_i}}{S}) \\ & = \frac {e^{z_i}} {\sum e^{z_t}} - y_i \end{aligned} $$

需要注意的是,这里默认有 $\sum_i y_i = 1$
形式真好看吧