赞
踩
《关于交叉熵的故事》
做视觉三年多了,自己能力虽然提升了,但是总感觉没有沉淀下来一些可见的东西,所以从去年年末开始写博客,或者是翻译论文,或者是整理对一些知识理解的文章,总的来说赠人玫瑰,手有余香吧,还是挺有收获的,所以还是会继续坚持,把一些相对抽象的数学公式以故事的形式呈现出来,这也感谢很多前辈的文章。
Key Words:熵、KL散度、交叉熵、BCE
Beijing, 2020
作者:RaySue
Code:
交叉熵是信息论中的一个概念,要想了解交叉熵的本质,需要先从最基本的概念讲起。在信息论中定义一个事件 X = x X=x X=x 的自信息(self-information)为:
I ( p ) = l o g ( 1 p ) I(p) = log~(\frac{1}{p}) I(p)=log (p1)
概率越小,信息量越大
必然事件的信息量为 0
该函数的图像和我们所理解的“信息量”,恰好契合,横轴代表事件发生的概率,纵轴代表自信息。也就是说一件事发生的概率越小,那么如果其发生了,信息量就越大。打个比方,你的屌丝同学和女神在一起了,本该你认为不可能的事情发生了,这里面的“信息量”就很大,你需要足够的信息来知道为什么。
我们把一个事件所有可能的结果及其信息量求一个期望值就是信息熵,也叫做 香农熵。可以用来对整个概率分布中的不确定性总量进行量化,也就是指遵循这个分布的事件所产生的期望信息总量,计算公式:
H ( x ) = E x ∼ p [ I ( x ) ] = − E x ∼ p [ l o g p ( x ) ] H(x) = E_{x \sim p}[I(x)] = - E_{x\sim p}[log ~ p(x)] H(x)=Ex∼p[I(x)]=−Ex∼p[log p(x)]
H ( x ) = − ∑ i p ( x i ) ∗ l o g p ( x i ) H(x) = - \sum_{i} p(x_i) * log~p(x_i) H(x)=−i∑p(xi)∗log p(xi)
如果这个值越小,说明这个事情在你的掌握之中,这个事情构成的系统也足够的稳定,因为所有出现的信息量都很小。相反这个值很大,说明所有事情都违背了原有的样子,那你可能要怀疑人生了。
独立事件的信息量可叠加:比如,发生了一系列的事件,且每个事件是相互独立的,那么这一系列事件发生的信息量是可叠加的。所以你是可以对自己一天经历的不同事情来叠加信息量的。
如果我们对于同一个随机变量 x 有两个单独的概率分布A = P(x) 和 B = Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异。
在机器学习中,P 往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型对当前样本所预测的分布,比如[0.7,0.2,0.1]。
直观的理解就是如果用P来描述样本,那么就非常完美。而用Q来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些“信息增量”才能达到和P一样完美的描述。如果我们的Q通过反复训练,也能完美的描述样本,那么就不再需要额外的“信息增量”,Q等价于P。
D K L ( A ∣ ∣ B ) = ∑ i P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) D_{KL}(A||B) = \sum_i P_A(x_i)log(\frac{P_A(x_i)}{P_B(x_i)}) DKL(A∣∣B)=i∑PA(xi)log(PB(xi)PA(xi))
D K L ( A ∣ ∣ B ) ≠ D K L ( B ∣ ∣ A ) D_{KL}(A||B) \neq D_{KL}(B||A) DKL(A∣∣B)=DKL(B∣∣A)
打个比方,还是女神的择偶问题,你对不同的结果赋予了不同的概率,真实的结果我们是未知的,我们只能对你的想法计算信息熵。但是现在我们找到了女神,并向她介绍了KL散度,希望她能够提供真实的想法,女神照做了。现在我们就可以利用KL散度看下你是否真的懂女神了。
我们把女神的分布作为A事件,你的分布作为B事件,那么从女神的角度,你们想法之间的距离计算如下:
D K L ( A ∣ ∣ B ) = ∑ i P A ( x i ) l o g ( P A ( x i ) ) + P A ( x i ) l o g ( 1 P B ( x i ) ) D_{KL}(A||B) = \sum_i P_A(x_i)log(P_A(x_i)) + P_A(x_i)log(\frac{1}{P_B(x_i)}) DKL(A∣∣B)=i∑PA(xi)log(PA(xi))+PA(xi)log(PB(xi)1)
我们把女神的分布作为A事件,你的分布作为B事件,那么从你的角度,你们想法之间的距离计算如下:
D K L ( B ∣ ∣ A ) = ∑ i P B ( x i ) l o g ( P B ( x i ) ) + P B ( x i ) l o g ( 1 P A ( x i ) ) D_{KL}(B||A) = \sum_i P_B(x_i)log(P_B(x_i)) + P_B(x_i)log(\frac{1}{P_A(x_i)}) DKL(B∣∣A)=i∑PB(xi)log(PB(xi))+PB(xi)log(PA(xi)1)
你发现KL散度由两部分组成:
D K L ( A ∣ ∣ B ) = ∑ i P A ( x i ) l o g ( 1 P B ( x i ) ) − H A D_{KL}(A||B) = \sum_i P_A(x_i)log(\frac{1}{P_B(x_i)}) - H_A DKL(A∣∣B)=i∑PA(xi)log(PB(xi)1)−HA
其中前半部分就是我们接下来要介绍的交叉熵。
接上文,我们知道KL散度是刻画两个分布之间的距离,具有不对称性,且和交叉熵有如下的关系。
D K L ( A ∣ ∣ B ) = C E ( A , B ) − H A D_{KL}(A||B) = CE(A, B) - H_A DKL(A∣∣B)=CE(A,B)−HA
如果A表示真实分布,B表示模型推理得到的分布,那么 H A H_A HA就是一个常数,是我们已知的,在机器学习过程中,计算两个分布的距离的时候就可以忽略 H A H_A HA,此时交叉熵的优化效果等同于KL散度的优化效果,也就是KL散度和交叉熵在特定条件下是等价的,所以我们优先选择更简单的公式,所以使用交叉熵。
各个类别损失权重都相同的情况下的交叉熵表达式:
C E ( A , B ) = ∑ i P A ( x i ) l o g ( 1 P B ( x i ) ) CE(A, B) = \sum_i P_A(x_i)log(\frac{1}{P_B(x_i)}) CE(A,B)=i∑PA(xi)log(PB(xi)1)
交叉熵的优点:
用梯度下降法做参数更新的时候,模型学习的速度取决于两个值:一、学习率;二、偏导值。其中,学习率是我们需要设置的超参数,所以我们重点关注偏导值。偏导值的大小取决于 x x x 和 s o f t m a x ( s ) − y softmax(s) - y softmax(s)−y,我们重点关注后者,后者的大小值反映了我们模型的错误程度,该值越大,说明模型效果越差,但是该值越大同时也会使得偏导值越大,从而模型学习速度更快。所以,使用逻辑函数得到概率,并结合交叉熵当损失函数时,在模型效果差的时候学习速度比较快,在模型效果好的时候学习速度变慢。
交叉熵的缺点:
sigmoid(softmax) + cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax、Center Loss等。
BCE 是交叉熵的一个特例,用于二分类,其激活函数是sigmoid函数,模型返回的结果是一个值,然后把这个值通过sigmoid函数映射到(0,1)之间,然后使用BCE loss来计算损失,对应一个二分类的问题而言,就是以0.5为界限,大于0.5就认为该样本符合这个类别。
各个标签损失权重都相同的情况下的BCE表达式:
B C E = − 1 n ∑ i n y i ⋅ l o g ( x i ) + ( 1 − y i ) ⋅ l o g ( 1 − x i ) BCE = - \frac{1}{n}\sum_i^n y_i \cdot log(x_i) + (1 - y_i) \cdot log(1 - x_i) BCE=−n1i∑nyi⋅log(xi)+(1−yi)⋅log(1−xi)
BCE loss 适用于多标签分类的场景,即一个样本既是类别A,也是类别B,这样的数据就可以使用BCE来训练。
BCE loss 的计算步骤,模型输出结果为 z i z_i zi:
例如:一个多标签分类,标签个数为3的例子:
c1 = 0 * log(0.8707) + (1 - 0) * log(1 - 0.8707)
c2 = 1 * log(0.7517) + (1 - 1) * log(1 - 0.7517)
c3 = 2 * log(0.8162) + (1 - 1) * log(1 - 0.8162)
bce_loss = -(c1 + c2 + c3) / 3
熵:可以表示一个事件A的自信息量,也就是A包含多少信息。
KL散度:可以用来表示从事件A的角度来看,事件B有多大不同。
交叉熵:可以用来表示从事件A的角度来看,如何描述事件B。
机器学习优化过程中,使用KL散度来计算模型预测结果和真实分布标签的距离,由于此时真实分布标签是已知的,所以KL散度等价于交叉熵。
和KL散度一样,交叉熵也是非对称,且值是非负的。
Q1: 交叉熵对称吗?
A1: 交叉熵损失是不对称的,因为交叉熵与KL散度在一定条件下是等价的。
Q2: 为什么有KL散度和交叉熵两种算法?为什么他们可以用来求分布的不同?什么时候可以等价使用?
A2:
熵的意义是对A事件中的随机变量进行编码所需的最小字节数。
KL散度的意义是“额外所需的编码长度”,如果我们用B的编码来表示A。
交叉熵指的是当你用B作为密码本,来表示A时所需要的“平均的编码长度”。
KL散度和交叉熵的不同处:交叉熵中不包括“熵”的部分
KL散度和交叉熵的相同处:a. 都不具备对称性 b. 都是非负的
当 A A A固定不变时,那么最小化KL散度 D K L ( A ∣ ∣ B ) D_{KL}(A||B) DKL(A∣∣B) 等价于最小化交叉熵 H ( A , B ) H(A,B) H(A,B) 。 D K L ( A ∣ ∣ B ) = H ( A , B ) D_{KL}(A||B) = H(A,B) DKL(A∣∣B)=H(A,B)
Q3:二分类问题使用BCE和使用交叉熵一样吗?
A3:二分类的问题就是是互斥的所以使用这两个loss的效果是一样的。
Q4:为什么分类问题使用交叉熵而不是MSE?
A4:
直观上,对于分类问题而言,我们只关注对应正确的类别所产生的误差,而MSE也会把非该类别产生的误差计算进去,这是不利于分类问题学习的。
理论推导,我们关注两个变量 误差大小(损失),参数的变化幅度(梯度),理论上我们需要其正相关的,也就是误差大那么变化也大,模型学习的信息多,而误差小的时候,说明接近收敛,那么参数变换的幅度也应该小,否则就会不收敛。而通过对交叉熵和MSE求导来找到和梯度的关系,就可以证明了,具体细节参见:https://zhuanlan.zhihu.com/p/63731947
https://www.zhihu.com/question/65288314/answer/244557337
https://blog.csdn.net/u010521842/article/details/82186910
https://blog.csdn.net/geter_CS/article/details/84761204
https://zhuanlan.zhihu.com/p/35709485
https://www.jianshu.com/p/f89ffc3151a6
https://www.jianshu.com/p/f23453d42415
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。