人工智能:# KL散度 (Kullback-Leibler Divergence) 与交叉熵 (Cross-Entropy)

KL散度和交叉熵是信息论中两个非常重要的概念,在机器学习,特别是深度学习领域,它们被广泛用作损失函数,以衡量两个概率分布之间的差异。两者在数学上紧密相关,在某些特定场景下(如分类任务的损失函数),最小化交叉熵等价于最小化KL散度。

  1. 交叉熵 (Cross-Entropy):衡量使用“错误的”分布Q来表示来自“正确的”分布P的样本所需要的平均信息量(比特数)。
  2. KL散度 (KL Divergence):衡量使用“错误的”分布Q来表示分布P的样本,相对于使用“正确的”分布P自己来表示时,所产生的额外信息量。

一、交叉熵 (Cross-Entropy)

1. 概念与直觉

想象一下,你需要设计一套编码系统来传输一个地区(分布P)的天气信息(晴、阴、雨)。如果你的编码系统是根据另一个地区(分布Q)的天气历史设计的,那么用这套编码系统来传输P地区的天气信息时,平均每个信息所需要的编码长度就是交叉熵

  • 如果分布Q与分布P非常相似,那么这套编码会非常高效,交叉熵就很低。
  • 如果分布Q与分布P差异很大,编码效率就会很低,交叉熵就很高。

在机器学习中,我们通常将:

  • P (真实分布):看作是数据的真实标签,通常是独热编码(One-Hot Encoding)形式,例如 [0, 1, 0] 表示样本真实属于第2类。
  • Q (预测分布):看作是模型(如通过Softmax层)输出的预测概率,例如 [0.1, 0.7, 0.2]

交叉熵损失函数的目标就是让模型的预测分布Q尽可能地接近真实分布P。

2. 数学公式

对于两个离散的概率分布 P 和 Q,其交叉熵定义为:

$$H(P, Q) = - \sum_{i} P(i) \log_b Q(i)$$

其中:

  • i 代表所有可能的事件(或类别)。
  • P(i) 是事件 i 在真实分布 P 中的概率。
  • Q(i) 是事件 i 在预测分布 Q 中的概率。
  • b 是对数的底,在机器学习中通常使用自然对数 e (即 ln)。

3. 计算过程 (以分类任务为例)

假设我们有一个3分类问题,一个样本的真实标签是“狗”。

步骤 1: 定义 P 和 Q

  • 真实分布 P (One-Hot):

    • P = [P(猫), P(狗), P(鱼)] = [0, 1, 0]
  • 模型预测分布 Q (Softmax输出):

    • Q = [Q(猫), Q(狗), Q(鱼)] = [0.2, 0.7, 0.1]

步骤 2: 应用交叉熵公式

$$H(P, Q) = - \left( P(猫)\ln Q(猫) + P(狗)\ln Q(狗) + P(鱼)\ln Q(鱼) \right)$$

步骤 3: 代入数值计算

$$H(P, Q) = - \left( 0 \cdot \ln(0.2) + 1 \cdot \ln(0.7) + 0 \cdot \ln(0.1) \right)$$

由于真实分布P是独热编码,只有真实标签那一项的 P(i) 是1,其余都是0。这极大地简化了计算:

$$H(P, Q) = - \ln(0.7) \approx -(-0.3567) \approx 0.3567$$

重要结论:在机器学习分类任务中,当真实标签是One-Hot形式时,交叉熵损失函数简化为对“正确类别”的预测概率取负对数


二、KL散度 (Kullback-Leibler Divergence)

1. 概念与直觉

KL散度,又称相对熵 (Relative Entropy),衡量的是两个概率分布之间的“距离”或“差异”。它量化了当我们用一个近似分布Q来代替真实分布P时,会损失多少信息。

与交叉熵不同,KL散度衡量的是额外的编码长度。

  • 如果P和Q完全相同,KL散度为0,表示没有信息损失。
  • P和Q差异越大,KL散度越大。
  • 不对称性:KL散度一个非常重要的特性是它不具有对称性,即 $D_{KL}(P || Q) \neq D_{KL}(Q || P)$。因此,它不是一个严格意义上的“距离度量”。

2. 数学公式

KL散度的定义如下:

$$D_{KL}(P || Q) = \sum_{i} P(i) \log_b \frac{P(i)}{Q(i)}$$

3. 计算过程 (使用相同例子)

步骤 1: 定义 P 和 Q

  • 真实分布 P: [0, 1, 0]
  • 模型预测分布 Q: [0.2, 0.7, 0.1]

步骤 2: 应用KL散度公式

$$D_{KL}(P || Q) = P(猫)\ln\frac{P(猫)}{Q(猫)} + P(狗)\ln\frac{P(狗)}{Q(狗)} + P(鱼)\ln\frac{P(鱼)}{Q(鱼)}$$

步骤 3: 代入数值计算

由于 P(猫)P(鱼) 为0,这些项对总和的贡献也是0。我们只需计算 P(狗)=1 的那一项。

注意: 当 P(i)=0 时,P(i) * log(...) 项为0。当 Q(i)=0P(i)≠0 时,KL散度为无穷大。

$$D_{KL}(P || Q) = 1 \cdot \ln\frac{1}{0.7} = \ln(1) - \ln(0.7) = 0 - \ln(0.7) \approx 0.3567$$

你会发现,在这个特定的例子中,计算出的KL散度值与交叉熵的值完全相同。这并非偶然。


三、KL散度与交叉熵的关系

我们可以通过简单的数学变换揭示两者的深刻联系。

从KL散度的公式开始:

$$D_{KL}(P || Q) = \sum_{i} P(i) \log \frac{P(i)}{Q(i)}$$

使用对数运算法则 $\log(a/b) = \log(a) - \log(b)$:

$$D_{KL}(P || Q) = \sum_{i} P(i) (\log P(i) - \log Q(i))$$

将求和拆开:

$$D_{KL}(P || Q) = \sum_{i} P(i) \log P(i) - \sum_{i} P(i) \log Q(i)$$

我们发现,这个公式由两部分组成:

  1. $- \sum_{i} P(i) \log P(i)$:这是信息熵 (Entropy) 的定义,记为 $H(P)$。它衡量的是分布P自身的不确定性。
  2. $- \sum_{i} P(i) \log Q(i)$:这正是交叉熵 (Cross-Entropy) 的定义,记为 $H(P, Q)$。

于是,我们得到了它们之间的关系式:

$$D_{KL}(P || Q) = -H(P) + H(P, Q)$$

移项后得到更清晰的形式:

$$H(P, Q) = H(P) + D_{KL}(P || Q)$$

交叉熵 = 熵 + KL散度

在机器学习中的意义

在监督学习中,真实分布P(即数据标签)是固定的,因此它的熵 $H(P)$ 是一个常数

当我们训练模型时,我们的目标是调整模型的参数来最小化损失函数。因为 $H(P)$ 是一个常数,所以最小化交叉熵 $H(P, Q)$ 就等价于最小化KL散度 $D_{KL}(P || Q)$

由于交叉熵的计算比KL散度更简单(它不需要计算 $H(P)$),所以在实践中,分类模型的损失函数几乎总是使用交叉熵。

总结

特性 交叉熵 (Cross-Entropy) KL散度 (KL Divergence)
全称 Cross-Entropy Kullback-Leibler Divergence / Relative Entropy
公式 $H(P, Q) = - \sum P(i) \log Q(i)$ $D_{KL}(P
直观意义 用Q的编码方案来编码P的平均成本 用Q的编码方案代替P的方案所带来的额外成本
对称性 不对称 不对称 ($D_{KL}(P|Q) \neq D_{KL}(Q|P)$)
与熵的关系 $H(P,Q) = H(P) + D_{KL}(P|Q)$ $D_{KL}(P|Q) = H(P,Q) - H(P)$
主要用途 在分类任务中作为损失函数 衡量分布差异,用于变分自编码器(VAE)、策略梯度等。