1.熵
熵的本质是香农信息量logp1
现有关于样本的两个概率分布p和q,其中p为真实分布,q为非真实分布。按照真实分布p来衡量识别一个样本所需要的编码长度的期望(即平均编码长度)为:H(p)=−i∑P(i)logP(i)
通用的说,熵被用于描述一个系统中的不确定性。放在信息论的语境里来说,就是一个事件所包含的信息量。变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。
可以看出,当两种取值的可能性相等时,不确定度最大,当p为0或1时,确定其一定不会或一定会发生,信息量(输出概率函数)为H(P)=0。
如果使用错误分布q来表示来自真实分布p的平均编码长度,则应该是:H(p,q)=−i∑P(i)log Q(i)
因为用q来编码的样本来自分布p,所以期望中的概率为p(i),H(p,q)称之为交叉熵, 就是来衡量用特定的编码方案Q来对分布为P的信息进行编码时需要的最少的bits数.
比如含有4个字母(A,B,C,D)的数据集中,真实分布p=(1/2,1/2,0,0),即A和B出现的概率均为1/2,C和D出现的概率都为0。计算H(p)为1,即只需要1位编码即可识别A和B。如果使用分布Q=(1/4,1/4,1/4,1/4)来编码则得到H(p,q)=2,即需要2位编码来识别A和B(当然还有C和D,尽管C和D并不会出现,因为真实分布p中C和D出现的概率为0,这里就钦定概率为0的事件不会发生啦)。
2.KL散度
可以看到上例中根据非真实分布q得到的平均编码长度H(p,q)和根据真实分布p得到的平均编码长度H(p)。事实上,根据Gibbs’ inequality可知,H(p,q)>=H(p)恒成立,当q为真实分布p时,取等号。
对于固定的p,H(p,q)将随着q变得与p越来越不同而增长。 而如果p没有固定,很难将H(p,q)解释为差异的绝对量度,因为它随着p的熵增长。所以我们使用另一种度量方式来度量两个分布的差异性,将由q得到的平均编码长度比由p得到的平均编码长度多出的bit数称为“相对熵”,也叫做KL散度(Kullback–Leibler divergence):
DKL(p∣∣q)=H(p,q)−H(p)=i∑P(i)∗(logP(i)−logQ(i))
它表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若两者相同则KL散度为0,而交叉熵不为0,而是等于p的熵。
KL散度的非对称性
注意,KL散度的非对称性,一些同学把K-L散度看作是不同分布之间距离的度量。这是不对的,因为从K-L散度的计算公式就可以看出它不符合对称性(距离度量应该满足对称性),即$D_{KL}(P||Q) \neq DKL(Q∣∣P)。也就是说用p近似q和用q近似p,二者所得的损失信息并不是一样的。
比如TD-IDF算法就可以理解为相对熵的应用:词频在整个语料库的分布与词频在具体文档中分布之间的差异性。
KL散度与交叉熵的关系
H(p,q)=−∑PlogQ==−∑PlogP+∑PlogP−∑PlogQ
=H(P)+∑PlogP/Q=H(P)+DKL(P∣∣Q)
可见,交叉熵就是真值分布的熵与KL散度的和,而真值的熵是确定的,与模型的参数θ无关,所以梯度下降求导时,∇H(P,Q)=∇DKL(P∣∣Q),即最小化交叉熵与最小化KL散度是一样的;
最大似然估计
交叉熵经常出现在(神经网络)机器学习的损失函数中。p表示真实的分布,q则为训练后的模型的预测标记分布。例如,在分类问题中,通常使用交叉熵损失度量标签的真实分布和由分类器预测的分布之间的差异。每个数据点的真实分布将概率1分配给该数据点所属的类,将0分配给所有其他类。在这种情况下,交叉熵与负对数似然成正比,最小化负对数似然等价于最小化交叉熵:
极大似然估计:
θ^=argmaxθ∏i=1Nq(xi∣θ)
等价于最小化负对数似然
θ^=argminθ−∑i=1Nlog(q(xi∣θ))
=argminθ−∑x∈Xp(x)log(q(x∣θ))
=argminθH(p,q)
交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。??
从优化模型参数角度来说,最小化交叉熵,NLL,KL散度这3种方式对模型参数的更新来说是一样的。从这点来看也解释了为什么在深度学习中交叉熵是非常常用的损失函数的原因了。
参考资料:
- 如何通俗的解释交叉熵与相对熵?
- Why do we use Kullback-Leibler divergence rather than cross entropy in the t-SNE objective function?