人工智能:# KL散度 (Kullback-Leibler Divergence) 与交叉熵 (Cross-Entropy)
KL散度和交叉熵是信息论中两个非常重要的概念,在机器学习,特别是深度学习领域,它们被广泛用作损失函数,以衡量两个概率分布之间的差异。两者在数学上紧密相关,在某些特定场景下(如分类任务的损失函数),最小化交叉熵等价于最小化KL散度。
- 交叉熵 (Cross-Entropy):衡量使用“错误的”分布Q来表示来自“正确的”分布P的样本所需要的平均信息量(比特数)。
- 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)=0
而P(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)$$
我们发现,这个公式由两部分组成:
- $- \sum_{i} P(i) \log P(i)$:这是信息熵 (Entropy) 的定义,记为 $H(P)$。它衡量的是分布P自身的不确定性。
- $- \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)、策略梯度等。 |