记录一下遇到交叉熵时的学习笔记,此处为本文主要参考链接。
1、熵(Entropy)
对于一个特定事件,它的概率p越小,那它所蕴含的信息量就越大,反之,p越大,表明信息量越小。此外,对于相互独立的事件,信息量可以叠加。熵就是依据对应的期望值对一系列信息量求期望值。 信息熵可以理解为对事件不确定性的测量,熵越大,不确定性也就越大,熵的公式定义为
S
(
x
)
=
?
∑
i
P
(
x
i
)
l
o
g
b
P
(
x
i
)
S(x) = -\sum_{i}P(x_i) log_bP(x_i)
S(x)=?i∑?P(xi?)logb?P(xi?)其中:x是消息(或事件),p(x)是x的概率。从公式中可以看出,当概率p等于1时,熵s(x) = 0,符合“p越大,信息量越小”。
2、KL散度(Kullback-Leibler Divergence)
KL散度,用来衡量不同分布之间的差异/区别,也叫KL距离,但它并不满足距离的三个条件:非负性、对称性和三角不等式。 KL散度的计算公式为: (1)针对离散事件A和B,累加求和。
D
k
l
(
A
∣
∣
B
)
=
∑
i
P
A
(
x
i
)
l
o
g
(
P
A
(
x
i
)
P
B
(
x
i
)
)
=
∑
i
P
A
(
x
i
)
l
o
g
(
P
A
(
x
i
)
)
?
P
A
(
x
i
)
l
o
g
(
P
B
(
x
i
)
)
D_{kl}(A||B)=\sum_iP_A(x_i)log(\frac{P_A(x_i)}{P_B(x_i)}) =\sum_iP_A(x_i)log(P_A(x_i)) - P_A(x_i)log(P_B(x_i))
Dkl?(A∣∣B)=i∑?PA?(xi?)log(PB?(xi?)PA?(xi?)?)=i∑?PA?(xi?)log(PA?(xi?))?PA?(xi?)log(PB?(xi?)) (2)针对连续事件A和B,使用积分来运算。
D
k
l
(
A
∣
∣
B
)
=
∫
a
(
x
)
l
o
g
(
a
(
x
)
b
(
x
)
)
d
x
D_{kl}(A||B)=\int a(x)log(\frac{a(x)}{b(x)}) dx
Dkl?(A∣∣B)=∫a(x)log(b(x)a(x)?)dx 其中a(x)和b(x)分别是事件A,B的概率分布。 从以上散度的计算公式中可以看出:(a)如果两个事件的概率
P
A
=
P
B
P_A = P_B
PA?=PB?或者概率分布完全相同,则log1 = 0即KL散度也为0;(b)
D
k
l
(
A
∣
∣
B
)
≠
D
k
l
(
B
∣
∣
A
)
D_{kl}(A||B) \neq D_{kl}(B||A)
Dkl?(A∣∣B)?=Dkl?(B∣∣A),即散度不对称;(c)散度的数学意义可以理解为,求事件A与B之间的对数差在A上的期望值。
3、交叉熵(Cross Entropy)
交叉熵的概念定义是,衡量在给定的真实分布下,使用非真实分布指定的策略消除系统的不确定性所需要付出努力的大小,公式为:
H
(
A
,
B
)
=
?
∑
i
P
A
(
x
i
)
l
o
g
(
P
B
(
x
i
)
)
H(A,B) = - \sum_iP_A(x_i)log(P_B(x_i))
H(A,B)=?i∑?PA?(xi?)log(PB?(xi?)) 可以知道,H(A,A) = S(A)。由此还可以得出三种关系式有如下等式关系:
H
(
A
,
B
)
=
D
k
l
(
A
∣
∣
B
)
+
S
(
A
)
H(A,B) = D_{kl}(A||B) + S(A)
H(A,B)=Dkl?(A∣∣B)+S(A)
当等式中的事件A固定不变时,S(A)是一个常量,此时KL散度和交叉熵是等价的,并且交叉熵的计算公式较为简便,所以倾向于选择交叉熵来计算。在机器学习过程中,训练数据的分布记为事件A(近似认为是真实分布),是事先给定不变的,从训练模型学到的分布记为事件B(非真实分布),当交叉熵最低时,可以认为已经学到了最好的模型(即接近了真实分布)。
交叉熵参考链接:交叉熵计算实例、熵的基础知识。
4、Pytorch中的NLLLoss和CrossEntropyLoss
nll_loss函数的官方文档,可以看出函数内的第一个参数input必须是已经经过log_softmax运算后的结果。CrossEntropyLoss函数官方文档,这个函数相当于把softmax运算、log运算和nll_loss运算全部叠加到一起,即参数input不需要事先经过log_softmax运算。
针对机器学习中的单分类问题,交叉熵损失函数的实例计算过程,就是在已有的标签下(作为真实分布事件A),将计算模型输出的概率结果取对数再与之相乘即可(其实就是交叉熵的计算过程),具体可以参考一文搞懂交叉熵在机器学习中的使用
注:函数NLLLoss和CrossEntropyLoss的区别可以详细参考这个计算过程:https://blog.csdn.net/qq_22210253/article/details/85229988,这里涉及的也是单分类问题。
|