在深度学习领域,交叉熵(Cross Entropy)常被用作分类问题的损失函数。
为知其所以然,本文将详细讲解交叉熵,熵(Entropy),KL散度(Kullback-Leibler Divergence) 的基本概念,并分析常用交叉熵作为分类问题损失函数的原因。
设向量 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的独热向量,因此计算神经网络输出与数据标签之间交叉熵时,会依照如上处理。
熵是交叉熵的一种特例: 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部分。
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散度达到最小值
。
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散度等价于优化交叉熵,因此常用交叉熵作为分类问题的损失函数。