好文推荐:链接
交叉熵(Cross Entropy)函数和KL散度(Kullback-Leibler Divergence)函数都是用于度量概率分布之间的相似性或差异性的函数。它们在信息论和机器学习中都有着重要的应用,尤其在深度学习中常用于损失函数的设计和模型训练中。
1. 交叉熵(Cross Entropy):
交叉熵是用来度量两个概率分布之间的差异性的函数,它的计算方式如下:
对于离散型分布:
H ( p , q ) = − ∑ x p ( x ) log ( q ( x ) ) = ∑ x p ( x ) log ( 1 q ( x ) ) H(p, q) = -\sum_{x} p(x) \log(q(x)) =\sum_{x}p(x)\log(\frac{1}{q(x)}) H(p,q)=−x∑p(x)log(q(x))=x∑p(x)log(q(x)1)
对于连续型分布:
H
(
p
,
q
)
=
−
∫
p
(
x
)
log
(
q
(
x
)
)
d
x
H(p, q) = -\int p(x) \log(q(x)) dx
H(p,q)=−∫p(x)log(q(x))dx
其中, p p p 表示真实分布(ground truth), q q q 表示预测分布(predicted distribution)。在分类问题中,通常 p p p是表示真实标签的概率分布(通常以one-hot编码的形式),而 q q q 是表示模型预测的概率分布。
交叉熵函数具有以下特点:
- 交叉熵函数的值总是非负的,并且当且仅当两个概率分布相同时取得最小值为0。
- 交叉熵函数是非对称的,即 H ( p , q ) ≠ H ( q , p ) H(p, q) \neq H(q, p) H(p,q)=H(q,p)。
在机器学习中,交叉熵函数通常被用作分类问题的损失函数,用于衡量模型的预测值与真实标签之间的差异,帮助模型进行优化。
使用 PyTorch 内置函数计算交叉熵的示例:
import torch
import torch.nn.functional as F
# 定义真实标签和预测概率
target = torch.tensor([0, 1]) # 真实标签
output = torch.tensor([[0.6, 0.4], [0.2, 0.8]]) # 预测概率,注意:这里需要是概率值,而不是 logit 或 log-probability
# 计算交叉熵
cross_entropy = F.cross_entropy(output, target)
print("Cross Entropy:", cross_entropy.item())
2. KL散度(Kullback-Leibler Divergence):
KL散度用于度量两个概率分布之间的相对熵,也就是一个分布相对于另一个分布的不确定性差异。其计算方式如下:
D
K
L
(
p
∣
∣
q
)
=
∑
x
p
(
x
)
log
p
(
x
)
q
(
x
)
D_{KL}(p||q) = \sum_{x} p(x) \log \frac{p(x)}{q(x)}
DKL(p∣∣q)=x∑p(x)logq(x)p(x)
其中, p p p 和 q q q 分别表示两个概率分布。KL散度表示了将 q q q 用于拟合 p p p 时产生的信息损失(或增益)。
KL散度函数具有以下特点:
- KL散度的值始终为非负,当且仅当两个分布相等时取得最小值为0。
- KL散度是非对称的,即 D K L ( p ∣ ∣ q ) ≠ D K L ( q ∣ ∣ p ) D_{KL}(p||q) \neq D_{KL}(q||p) DKL(p∣∣q)=DKL(q∣∣p)。
KL散度通常用于衡量两个概率分布之间的相对差异,它并不是一个真正的距离度量,因为它不满足对称性和三角不等式。
使用 PyTorch 内置函数计算 KL 散度的示例:
import torch
import torch.nn.functional as F
# 定义真实分布和预测分布
p = torch.tensor([0.3, 0.7]) # 真实分布
q = torch.tensor([0.4, 0.6]) # 预测分布
# 计算 KL 散度
kl_divergence = F.kl_div(q.log(), p, reduction='sum')
print("KL Divergence:", kl_divergence.item())
联系和区别:
-
联系: 交叉熵函数可以被视为KL散度的一种特例。事实上,交叉熵可以表示为两个分布 (p) 和 (q) 之间的KL散度加上一个常数项。在机器学习中,交叉熵通常与KL散度一起使用,作为损失函数来衡量模型的预测分布与真实分布之间的差异。
-
区别:
- 交叉熵函数是一种损失函数,用于衡量模型的预测值与真实标签之间的差异。
- KL散度是一种度量两个概率分布之间差异的函数,它衡量了使用一个分布来拟合另一个分布时产生的信息损失。