【深刻理解KL散度】为什么许多分类网络使用交叉熵作为损失函数,而非KL散度损失?交叉熵和KL散度的联系与区别。 您所在的位置:网站首页 散度运算的基本公式是什么意思 【深刻理解KL散度】为什么许多分类网络使用交叉熵作为损失函数,而非KL散度损失?交叉熵和KL散度的联系与区别。

【深刻理解KL散度】为什么许多分类网络使用交叉熵作为损失函数,而非KL散度损失?交叉熵和KL散度的联系与区别。

2024-07-11 17:50| 来源: 网络整理| 查看: 265

1. 信息量

对于一个随机事件 x x x来说,其所包含的信息量被定义为:

I ( x ) = log ⁡ 1 p ( x ) = − log ⁡ p ( x ) I(x) = \log\frac{1}{p(x)}=-\log p(x) I(x)=logp(x)1​=−logp(x)

可见事件包含的信息量与其发生的概率呈反比。

这个其实很容易理解,如果一件事情很容易发生,比如说"明天会是晴天",其包含的信息量很小,你会觉得很平常一件事儿,没有什么意思。而如果有个极小概率发生的事情比如"明天会发生地震",你会觉得很震惊,因为它带来的信息量是很大的。

以抛硬币为例,如果定义硬币朝上为事件 a a a,朝下为事件 b b b。

则对于一个均匀正常的硬币来说: p ( a ) = 0.5 ;   I p ( a ) = log ⁡ ( 1 / 0.5 ) = 1 p ( b ) = 0.5 ;   I p ( b ) = log ⁡ ( 1 / 0.5 ) = 1 p(a) = 0.5;~I_p(a)=\log(1/0.5)=1 \\ p(b) = 0.5;~I_p(b)=\log(1/0.5)=1 p(a)=0.5; Ip​(a)=log(1/0.5)=1p(b)=0.5; Ip​(b)=log(1/0.5)=1

而对于一个 q ( a ) = 0.8 q(a)=0.8 q(a)=0.8的不均匀的硬币来说: q ( a ) = 0.8 ;   I q ( a ) = log ⁡ ( 1 / 0.8 ) = 0.32 q ( b ) = 0.2 ;   I q ( b ) = log ⁡ ( 1 / 0.2 ) = 2.32 q(a) = 0.8;~I_q(a)=\log(1/0.8)=0.32 \\ q(b) = 0.2;~I_q(b)=\log(1/0.2)=2.32 q(a)=0.8; Iq​(a)=log(1/0.8)=0.32q(b)=0.2; Iq​(b)=log(1/0.2)=2.32

关于信息量有一条性质,独立事件的信息量是可以相加的。

2. 信息熵

有了信息量的概念之后,香农定义了信息熵,故也称为香农熵。

不同于信息量描述的是一个随机事件,信息熵用于描述一个概率分布的不确定性。

对于离散的概率分布来说,其定义为事件概率与事件信息量的乘积之和: H ( p ) = ∑ x ∈ X p ( x ) I ( x ) = ∑ x ∈ X p ( x ) log ⁡ 1 p ( x ) = − ∑ x ∈ X p ( x ) log ⁡ p ( x ) H(p)=\sum_{x \in \mathcal{X}} p(x)I(x) =\sum_{x \in \mathcal{X}} p(x)\log\frac{1}{p(x)}=-\sum_{x \in \mathcal{X}} p(x)\log p(x) H(p)=x∈X∑​p(x)I(x)=x∈X∑​p(x)logp(x)1​=−x∈X∑​p(x)logp(x)

还拿之前的均匀硬币和不均匀硬币来举例:

对于一个均匀硬币, p ( a ) = 0.5 p(a) = 0.5 p(a)=0.5; p ( b ) = 0.5 p(b) = 0.5 p(b)=0.5

H ( p ) = p ( a ) × l o g ( 1 / p ( a ) ) + p ( b ) × l o g ( 1 / p ( b ) ) = 0.5 × 1 + 0.5 × 1 = 1 H(p)=p(a)\times log(1/p(a))+p(b)\times log(1/p(b))=0.5\times 1+0.5\times 1 = 1 H(p)=p(a)×log(1/p(a))+p(b)×log(1/p(b))=0.5×1+0.5×1=1

对于一个非均匀硬币, q ( a ) = 0.8 q(a) = 0.8 q(a)=0.8; q ( b ) = 0.2 q(b) = 0.2 q(b)=0.2

H ( q ) = q ( a ) × l o g ( 1 / q ( a ) ) + q ( b ) × l o g ( 1 / q ( b ) ) = 0.8 × 0.32 + 0.2 × 2.32 = 0.72 H(q)=q(a)\times log(1/q(a))+q(b)\times log(1/q(b))=0.8\times 0.32+0.2\times 2.32 = 0.72 H(q)=q(a)×log(1/q(a))+q(b)×log(1/q(b))=0.8×0.32+0.2×2.32=0.72

通过上面的计算,我们可以观察到,对于一个概率分布来说,如果其概率分布函数越均匀,或者说发生任何一个离散事件的可能性都差不多,则其具有越大的信息熵,不确定性(或者说随机性)越大;而如果其概率分布函数越聚拢,或者更倾向于发生某些事件的话,其信息熵越小,不确定性(或者说随机性)越小。

3. 交叉熵

当一个均匀硬币,它的真实概率分布为 p ( a ) = 0.5 p(a) = 0.5 p(a)=0.5; p ( b ) = 0.5 p(b) = 0.5 p(b)=0.5。而在实验中,我们预测的概率分布为 q ( a ) = 0.8 q(a) = 0.8 q(a)=0.8; q ( b ) = 0.2 q(b) = 0.2 q(b)=0.2。

这个真实概率分布和预测概率分布怎么理解?   可以简单理解为均匀硬币其正常的概率分布就应该是 0.5 : 0.5 0.5:0.5 0.5:0.5的, 但是我们抛了几次发现8次朝上,2次朝下,那么频率化为概率,所以我们通过观测预测的概率就为 0.8 : 0.2 0.8:0.2 0.8:0.2   再举一个最常见的应用实例,我们利用深度学习模型拟合分布,真实的分布理解为标签label,是一个one-hot的分布; 而预测分布就是在迭代训练过程中,当前模型所输出类别的概率分布。   对于分类问题,此时我们可以计算一个交叉熵衡量预测分布和我们想要拟合的真实分布的差距,作为损失函数,也就是我们熟知的、常用的交叉熵损失。

交叉熵的公式很简单,定义为: H ( p , q ) = − ∑ x ∈ X p ( x ) log ⁡ q ( x ) H(p,q)=-\sum_{x\in \mathcal{X}}p(x)\log q(x) H(p,q)=−x∈X∑​p(x)logq(x)

于是我们可以计算当前真实分布和预测分布间的交叉熵:

q ( a ) = 0.8 q(a) = 0.8 q(a)=0.8; q ( b ) = 0.2 q(b) = 0.2 q(b)=0.2 H ( p , q ) = 0.5 × 0.32 + 0.5 × 2.32 = 1.32 H(p,q)=0.5\times0.32+0.5\times2.32=1.32 H(p,q)=0.5×0.32+0.5×2.32=1.32

过了一段时间后,假如我们预测的分布变为: q ( a ) = 0.6 q(a) = 0.6 q(a)=0.6; q ( b ) = 0.4 q(b) = 0.4 q(b)=0.4 H ( p , q ) = 0.5 × 0.74 + 0.5 × 1.32 = 1.03 H(p,q)=0.5\times0.74+0.5\times1.32=1.03 H(p,q)=0.5×0.74+0.5×1.32=1.03

我们发现有意思的现象:当预测的分布趋近真实分布后,交叉熵会离真实分布的信息熵更近了一些: H ( p , q ) = 1.32 → 1.03 H(p,q)=1.32\rightarrow 1.03 H(p,q)=1.32→1.03,且不会小于真实分布的信息熵: H ( p ) = 1 H(p)=1 H(p)=1

交叉熵具有如下性质:

1) H ( p , p ) = H ( p ) H(p,p)=H(p) H(p,p)=H(p);

2) H ( p , q ) ≠ H ( q , p ) H(p,q) \neq H(q,p) H(p,q)=H(q,p);具有非对称性 ; 3) H ( p , q ) ≥ H ( p ) H(p,q) \geq H(p) H(p,q)≥H(p);当且仅当分布 p p p和 q q q完全相同时为 0 0 0。

关于这一性质,百度或者很多博客有如下的性质推断: H ( p , q ) ≥ 0 H(p,q) \geq 0 H(p,q)≥0,当分布 p p p和 q q q相同时取最小值 0 0 0   其实这个是不正确的的,或者说是一种特殊情况。   H ( p , q ) ≥ H ( p ) H(p,q) \geq H(p) H(p,q)≥H(p)其实可以通过下一节KL散度的定义(2)和性质(3)得到, D ( p ∥ q ) = H ( p , q ) − H ( p ) D ( p ∥ q ) ≥ 0 \begin{align} D(p\parallel q)&= H(p,q) - H(p) \\ D(p\parallel q)& \geq0 \end{align} D(p∥q)D(p∥q)​=H(p,q)−H(p)≥0​​什么时候满足 H ( p , q ) ≥ 0 H(p,q) \geq 0 H(p,q)≥0呢?当然只有 H ( p ) = 0 H(p)=0 H(p)=0时,也就是说此时分布 p p p为完全确定的,其不确定性为 0 0 0(常出现在分类任务的监督标签,其分布永远确定为label)。

4. KL散度(相对熵)

KL散度也称为相对熵,它是一种量化地衡量两个分布之间区别的函数。其公式定义也很简单:

D ( p ∥ q ) = − ∑ x ∈ X p ( x ) log ⁡ q ( x ) p ( x ) D(p\parallel q)=-\sum_{x\in \mathcal{X}}p(x)\log\frac{q(x)}{p(x)} D(p∥q)=−x∈X∑​p(x)logp(x)q(x)​

通过一些推导变换,我们得到KL散度本质上就是交叉熵减去信息熵: D ( p ∥ q ) = − ∑ x ∈ X p ( x ) log ⁡ q ( x ) p ( x ) = − ∑ x ∈ X ( p ( x ) log ⁡ q ( x ) − p ( x ) log ⁡ p ( x ) ) = H ( p , q ) − H ( p ) \begin{align*} D(p\parallel q)&=-\sum_{x\in \mathcal{X}}p(x)\log\frac{q(x)}{p(x)} \\ &= -\sum_{x\in \mathcal{X}}(p(x)\log q(x) -p(x)\log p(x)) \\ &= H(p,q) - H(p) \end{align*} D(p∥q)​=−x∈X∑​p(x)logp(x)q(x)​=−x∈X∑​(p(x)logq(x)−p(x)logp(x))=H(p,q)−H(p)​

KL散度具有如下性质:

1) D ( p ∥ q ) ≥ 0 D(p\parallel q) \geq0 D(p∥q)≥0;当且仅当分布 p p p和 q q q完全相同时为 0 0 0;

2) D ( p ∥ q ) ≠ D ( q ∥ p ) D(p\parallel q) \neq D(q\parallel p) D(p∥q)=D(q∥p);即KL散度不是距离度量,具有非对称性。

4. 为什么许多分类网络使用交叉熵作为损失函数,而非KL散度损失

经过上面的定义和分析,我们对信息量,信息熵,交叉熵,KL散度的由来、性质、关系等有了一个基本的了解。

那么我们引申到一个在实际应用中发现的一个问题:在衡量分布差距时,我们普遍采用KL散度损失。但为什么许多分类网络中却使用交叉熵作为损失函数,而非KL散度损失?

其实表面原因很简单,就是在一些特殊情况下,KL散度损失等价于交叉熵损失;或者优化KL散度损失等价于优化交叉熵损失。

第一种情况:

当我们预测分布为 q q q,真实分布为 p p p,且KL散度损失通过 D ( p ∥ q ) D(p\parallel q) D(p∥q)计算时,如果满足真实分布 p p p是完全确定的(比如多分类问题的target label的one-hot分布),其不确定性为 0 0 0,则 H ( p ) = 0 H(p)=0 H(p)=0。于是: D ( p ∥ q ) = H ( p , q ) − H ( p ) = H ( p , q ) D(p\parallel q) = H(p,q) - H(p)=H(p,q) D(p∥q)=H(p,q)−H(p)=H(p,q)

此时,KL散度损失就等价于交叉熵损失。而第一种情况就对应解答了"为什么许多分类网络使用交叉熵作为损失函数"。

举个例子,一个3分类任务,target label对应索引0,所以有 p 0 = 1 , p 1 = 0 , p 2 = 0 p_0=1,p_1=0,p_2=0 p0​=1,p1​=0,p2​=0。   计算 H ( p ) = ∑ p i log ⁡ 1 p i = 1 × log ⁡ 1 + 0 + 0 = 0 H(p)=\sum p_i\log\frac{1}{p_i}=1\times \log1+0+0=0 H(p)=∑pi​logpi​1​=1×log1+0+0=0 (当 x x x趋向于 0 0 0, x log ⁡ x = 0 x\log x=0 xlogx=0)。   所以此时KL散度损失就等价于交叉熵损失。而计算KL散度损失的复杂度明显要大于交叉熵损失,所以一般的分类任务中都使用交叉熵作为损失函数。

第二种情况:(引申讨论)

当我们用待优化分布 q q q去迭代优化,拟合真实分布 p p p时,如果满足:(1)KL散度损失通过 D ( p ∥ q ) D(p\parallel q) D(p∥q)计算;(2)真实分布 p p p是固定不变的,与网络参数 θ \theta θ无关时: 我们最小化KL散度: ▽ θ D ( p ∥ q θ ) = ▽ θ H ( p , q θ ) − ▽ θ H ( p ) \triangledown_{\theta}D(p \parallel q_{\theta}) =\triangledown_{\theta}H(p ,q_{\theta})-\triangledown_{\theta}H(p) ▽θ​D(p∥qθ​)=▽θ​H(p,qθ​)−▽θ​H(p)

就是对参数求偏导并使其为 0 0 0,而 p p p与网络参数 θ \theta θ无关,所以 ▽ θ H ( p ) = 0 \triangledown_{\theta}H(p)=0 ▽θ​H(p)=0,则在这种情况下,优化KL散度也等于优化交叉熵损失。 ▽ θ D ( p ∥ q θ ) = ▽ θ H ( p , q θ ) \triangledown_{\theta}D(p \parallel q_{\theta}) =\triangledown_{\theta}H(p ,q_{\theta}) ▽θ​D(p∥qθ​)=▽θ​H(p,qθ​)

但其实,我们通常用模型优化待拟合分布 q q q时,用的还是KL散度损失而非交叉熵损失。

这是因为拟合分布q到真实分布p时,通常计算 D ( q ∥ p ) D(q\parallel p) D(q∥p),而非 D ( p ∥ q ) D(p\parallel q) D(p∥q),也就是条件(1)不满足。要知道根据非对称性, D ( q ∥ p ) ≠ D ( p ∥ q ) D(q\parallel p) \neq D(p\parallel q) D(q∥p)=D(p∥q)。

此时优化KL散度不等于优化交叉熵损失。 ▽ θ D ( q θ ∥ p ) = ▽ θ H ( q θ , p ) − ▽ θ H ( q θ ) \triangledown_{\theta}D(q_{\theta} \parallel p) =\triangledown_{\theta}H(q_{\theta},p)-\triangledown_{\theta}H(q_{\theta}) ▽θ​D(qθ​∥p)=▽θ​H(qθ​,p)−▽θ​H(qθ​)

那么为什么在一些生成模型如VAE中,拟合分布时计算的是 D ( q ∥ p ) D(q\parallel p) D(q∥p);而在分类任务中,计算 D ( p ∥ q ) D(p\parallel q) D(p∥q)呢?

解答这个问题,涉及到实际应用中前向散度和后向散度的区别,我们留到下一节[link]更深入地讨论KL散度,进一步探究KL散度的对称性。

5. 参考链接

【10分钟】了解香农熵,交叉熵和KL散度_哔哩哔哩_bilibili

[pytorch] 深入理解 nn.KLDivLoss(kl 散度) 与 nn.CrossEntropyLoss(交叉熵)_哔哩哔哩_bilibili

一个视频彻底搞懂交叉熵、信息熵、相对熵、KL散度、交叉熵损失、交叉熵损失函数、softmax函数、softmax求概率、各种熵的公式_哔哩哔哩_bilibili



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有