1 引言
最近频繁使用交叉熵,虽然之前学习过,但感觉对交叉熵的认识还是不够全面,打算再详细的总结一下。搜索了一番资料发现已经有人对这一块的知识讲解非常全面,所以就不再重复细说,只总结一下我认为比较关键的知识脉络吧。
要全面地搞懂交叉熵得从这一条概念链条着手:信息量—>熵—>KL散度—>交叉熵
2 信息量
假设X是一个离散型随机变量,其取值集合为χ,概率分布函数
p
(
x
)
=
P
(
X
=
x
)
,
x
∈
χ
p(x)=P(X=x),x∈χ
p(x)=P(X=x),x∈χ,则定义事件
X
=
x
0
X=x_0
X=x0的信息量为
I
(
x
0
)
=
−
l
o
g
(
p
(
x
0
)
)
I(x_0)=−log(p(x_0))
I(x0)=−log(p(x0))
至于信息量的计算公式为啥是这样?因为-logx这个函数的性质恰好是我们需要的,即随着x增大该函数不断减小,恰如信息量随着发生概率的增大而减小。
信息量描述的是一个事件发生的不确定性的大小。
3 熵
有了上面关于信息量的定义,我们就可以定义熵了,即:
H
(
X
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(X)=−∑_{i=1}^np(x_i)log(p(x_i))
H(X)=−i=1∑np(xi)log(p(xi))
为啥上面的式子是求和形式呢?
因为一个事件可能有很多种发生情况,每一种情况的发生都对应着一个发生概率,那么熵就是用来表示一个事件的信息量的期望。
4 KL散度
相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异。
KL散度的计算公式:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(\frac{p(x_i)}{q(x_i)})
DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))
其中,n为事件的所有可能性。
D
K
L
D_{KL}
DKL的值越小,表示q分布和p分布越接近。
在机器学习分类任务中(假设分为三类),P往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布,比如[0.7,0.2,0.1] 。
5 交叉熵
在机器学习分类任务中,我们需要评估label和predict之间的差距,使用KL散度刚刚好,即
D
K
L
(
y
∣
∣
y
′
)
D_{KL}(y||y^{'})
DKL(y∣∣y′),其中
y
y
y是label值,
y
′
y^{'}
y′是predict值。
但是为啥我们却普遍使用交叉熵呢,而不是使用KL散度呢?
因为根据前面KL散度的公式我们可以继续推导出如下过程:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
=
−
H
(
p
(
x
)
)
+
[
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
]
D_{KL}(p||q)=∑_{i=1}^{n}p(x_i)log(p(x_i))−∑_{i=1}^{n}p(x_i)log(q(x_i)) \\ =-H(p(x))+[−∑_{i=1}^{n}p(x_i)log(q(x_i))]
DKL(p∣∣q)=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))+[−i=1∑np(xi)log(q(xi))]
加号的前一部分恰巧就是p的熵,加号的后一部分就是交叉熵,我们将其单独拎出来:
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
H(p,q)=−∑_{i=1}^{n}p(x_i)log(q(x_i))
H(p,q)=−i=1∑np(xi)log(q(xi))
其中p是样本的label真实概率值,q是对样本predict的概率值。
由于KL散度中的前一部分
−
H
(
p
(
x
)
)
-H(p(x))
−H(p(x))不变(因为样本的标签不变),故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
6 交叉熵在机器学习中的应用
假设为二分类任务,在单个样本中的label的真实值确定的y,模型预测值为y’。则单个样本的交叉熵损失函数:
L
=
−
[
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
]
L=−[ylog \hat y+(1−y)log (1−\hat y)]
L=−[ylogy^+(1−y)log(1−y^)]
其中,由于每个样本中的label是真实类别是确定的,那么y在正样本中为1,负样本中取0,而不是取(0,1)区间内的值。
如果训练样本有N个,则在分类任务中的目标损失函数的计算公式为:
L
=
−
∑
i
=
1
N
[
y
(
i
)
l
o
g
y
^
(
i
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
y
^
(
i
)
)
]
L=-\sum_{i=1}^N[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]
L=−i=1∑N[y(i)log y^(i)+(1−y(i))log (1−y^(i))]
7 推荐资料
本文的总结来自如下这些资料,其中资料[1]给了比较详细的讲解且作者经验丰富,非常阅读。资料[2]给了比较全面的概括。
[1].https://www.zhihu.com/question/65288314/answer/244557337
[2].https://blog.csdn.net/tsyccnh/article/details/79163834
[3].https://blog.csdn.net/red_stone1/article/details/80735068