1. 前言
在深度学习领域,交叉熵(Cross Entropy)常被用作分类问题的损失函数。
为知其所以然,本文将详细讲解交叉熵,熵(Entropy),KL散度(Kullback-Leibler Divergence) 的基本概念,并分析常用交叉熵作为分类问题损失函数的原因。
2. 交叉熵(Cross Entropy)
设向量
p
=
[
p
1
,
p
2
,
⋯
,
p
m
]
T
\bm{p}=[p_1,p_2,\cdots,p_m]^T
p=[p1,p2,⋯,pm]T和
q
=
[
q
1
,
q
2
,
⋯
,
q
m
]
T
\bm{q}=[q_1,q_2,\cdots,q_m]^T
q=[q1,q2,⋯,qm]T表示两个
m
m
m维的离散概率分布。其中,向量
p
\bm{p}
p和
q
\bm{q}
q的元素都非负,且
∑
j
=
1
m
p
j
=
1
,
∑
j
=
1
m
q
j
=
1
\sum_{j=1}^mp_j=1,\sum_{j=1}^mq_j=1
∑j=1mpj=1,∑j=1mqj=1。则向量
p
\bm{p}
p和
q
\bm{q}
q之间的交叉熵定义为:
H
(
p
,
q
)
=
−
∑
j
=
1
m
p
j
⋅
ln
q
j
(
1
)
H(\bm{p},\bm{q})=-\sum_{j=1}^mp_j\cdot\ln{q_j}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(1)
H(p,q)=−j=1∑mpj⋅lnqj (1)
在分类问题中,向量 p \bm{p} p一般是训练数据的标签,即一个独热(one-hot)向量。向量 q \bm{q} q一般是神经网络前向计算的输出;
很容易记忆和理解向量 p \bm{p} p、 q \bm{q} q与数据标签、神经网络输出的对应关系:因为 ln 0 = − ∞ , ln 1 = 0 \ln{0}=-\infty,\ln{1}=0 ln0=−∞,ln1=0,且标签是一个某个元素值为1,其余元素值均为0的独热向量,因此计算神经网络输出与数据标签之间交叉熵时,会依照如上处理。
3. 熵(Entropy)
熵是交叉熵的一种特例:
H
(
p
,
p
)
=
−
∑
j
=
1
m
p
j
⋅
ln
p
j
H(\bm{p},\bm{p})=-\sum_{j=1}^mp_j\cdot\ln{p_j}
H(p,p)=−∑j=1mpj⋅lnpj是概率分布
p
\bm{p}
p的熵,简写为
H
(
p
)
H(\bm{p})
H(p)。
熵可以用来衡量概率分布
p
\bm{p}
p的信息量,详细解释见我的另一篇博客小样本学习(Few-Shot Learning)(二)中3.1.2 Entropy Regularization部分。
4. KL散度(Kullback-Leibler Divergence)
KL散度也被称作相对熵(Relative Entropy),用来衡量两个概率分布的区别有多大。对于离散分布,KL散度的定义为:
K
L
(
p
,
q
)
=
∑
j
=
1
m
p
j
⋅
ln
p
j
q
j
(
2
)
KL(\bm{p},\bm{q})=\sum_{j=1}^mp_j\cdot\ln\frac{p_j}{q_j}~~~~~~~~~~~~~~~~~~~~~~~(2)
KL(p,q)=j=1∑mpj⋅lnqjpj (2)
其中,约定
ln
0
0
=
0
\ln\frac{0}{0}=0
ln00=0。
因为向量 p \bm{p} p和 q \bm{q} q是两个离散概率分布,因此 p j ∈ [ 0 , 1 ] , q j ∈ [ 0 , 1 ] , f o r j = 1 ∼ m p_j\in[0,1],q_j\in[0,1],for~j=1\sim{m} pj∈[0,1],qj∈[0,1],for j=1∼m且 ∑ j = 1 m p j = 1 , ∑ j = 1 m q j = 1 \sum_{j=1}^mp_j=1,\sum_{j=1}^mq_j=1 ∑j=1mpj=1,∑j=1mqj=1,KL散度总是非负的。又因为 ln 1 = 0 \ln{1}=0 ln1=0,根据式(2)可知,当概率分布 p \bm{p} p和 q \bm{q} q越接近(即向量 p \bm{p} p和 q \bm{q} q的每个对应分量值趋近于相等)则 K L ( p , q ) KL(\bm{p},\bm{q}) KL(p,q)越小,而且 K L ( p , q ) = 0 KL(\bm{p},\bm{q})=0 KL(p,q)=0当且仅当 p = q \bm{p}=\bm{q} p=q,即
两个概率分布一致时,它们的KL散度达到最小值
。
5. 常用交叉熵作为分类问题损失函数的原因
KL散度可以衡量两个概率分布的区别大小,将KL散度作为损失函数,更新模型参数来最小化损失,可以使神经网络输出的概率分布与数据标签更接近。
根据交叉熵、熵和KL散度的定义可知:
K
L
(
p
,
q
)
=
∑
j
=
1
m
p
j
⋅
ln
p
j
q
j
=
∑
j
=
1
m
p
j
⋅
(
ln
p
j
−
ln
q
j
)
=
∑
j
=
1
m
p
j
ln
p
j
−
∑
j
=
1
m
p
j
ln
q
j
=
−
∑
j
=
1
m
p
j
ln
q
j
−
(
−
∑
j
=
1
m
p
j
ln
p
j
)
=
H
(
p
,
q
)
−
H
(
p
)
KL(\bm{p},\bm{q})=\sum_{j=1}^mp_j\cdot\ln\frac{p_j}{q_j}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\ =\sum_{j=1}^mp_j\cdot(\ln{p_j}-\ln{q_j})~~~~~~~~~~~~~~~\\ =\sum_{j=1}^mp_j\ln{p_j}-\sum_{j=1}^mp_j\ln{q_j}~~~~~~~~~~~\\ =-\sum_{j=1}^mp_j\ln{q_j}-(-\sum_{j=1}^mp_j\ln{p_j})\\ =H(\bm{p},\bm{q})-H(\bm{p})~~~~~~~~~~~~~~~~~~~~~~~~~~
KL(p,q)=j=1∑mpj⋅lnqjpj =j=1∑mpj⋅(lnpj−lnqj) =j=1∑mpjlnpj−j=1∑mpjlnqj =−j=1∑mpjlnqj−(−j=1∑mpjlnpj)=H(p,q)−H(p)
由于熵
H
(
p
)
H(\bm{p})
H(p)是不依赖于
q
\bm{q}
q的常数,一旦固定
p
\bm{p}
p,则KL散度等于交叉熵加上常数。
由于在分类问题中,向量
p
\bm{p}
p一般是训练数据的标签,即
p
\bm{p}
p是固定不变的,因此关于
q
\bm{q}
q优化KL散度等价于优化交叉熵,因此常用交叉熵作为分类问题的损失函数。