熵, 交叉熵, 和KL散度

王 茂南 2019年9月28日07:07:00
评论
16 3915字阅读13分3秒
摘要在机器学习中, 我们经常会遇到熵, 交叉熵还有KL-散度的概念, 这一篇就主要介绍一下这三者的关系.

简介

这一篇主要介绍熵(Entropy), 交叉熵(Cross-Entropy), 和KL散度(KL-Divergence), 这个也是我无意中看到的一个视频, 讲得非常好, 所以我就将其分解的讲一下.

原始视频链接: https://www.youtube.com/watch?v=ErfnhcEV1O8. 下面是视频的封面。

熵, 交叉熵, 和KL散度

关于在PyTorch中CrossEntropyLoss的实际计算, 我单独写了一篇文章进行详细的介绍PyTorch中交叉熵的计算-CrossEntropyLoss介绍. 这里给了具体的例子, 有了predict和target之后是如何计算loss的.

熵(Entropy)的介绍

我们以天气预报为例子, 进行熵的介绍.

  • 假如只有2种天气, sunny 和 rainy, 那么明天对于每一种天气来说, 各有50%的可能性.
  • 此时气象部门告诉你明天是rainy, 他其实减少了你的不确定信息.
  • 所以, 天气部门给了你1 bit的有效信息(因为此时只有两种可能性).
熵, 交叉熵, 和KL散度
  • 假如只有8种天气, 每一种天气出现是等可能的.
  • 此时气象部门告诉你明天是Rainy, 他其实减少了你的不确定信息, 也就是告诉了你有效信息.
  • 所以, 天气部门给了你3 bit有效信息(因为8中状态需要 2^3=8, 需要3 bit来表示.
熵, 交叉熵, 和KL散度
  • 所以, 有效信息的计算可以使用log来进行计算, 计算过程如下
熵, 交叉熵, 和KL散度
  • 上面所有的情况都是等概率出现的, 假设各种情况出现的概率不是相等的.
  • 例如有75%的可能性是Sunny, 25%的可能性是Rainy.
  • 如果气象部门告诉你明天是Rainy
    • 我们会使用概率的倒数, 1/0.25=4 (概率越小, 有效信息越多)
    • 接着计算有效信息, log2(1/0.25)=2=(-log2(0.25), log的等价计算)
    • 因为和本来的概率相差比较大, 所以获得的有效信息比较多(本来是Rainy的可能性小)
  • 如果气象部门告诉你明天是Sunny
    • 同样计算此时的有效信息, log2(1/0.75)=-log2(0.75)=0.41
    • 因为和本来的概率相差比较小, 所以获得的信息比较少(本来是Sunny的可能性大)
  • 从气象部门获得的信息的平均值(这个就是熵)
    • 75%*0.41+25%*2=0.81
    • 简单解释: 有75%的可能性是Sunny, 得到晴天的有效信息是0.41, 所以是0.75*0.41
  • 于是我们得到了熵的计算公式.
    • 熵是用来衡量获取的信息的平均值, 没有获取什么信息量, 则Entropy接近0.
    • 下面是熵的计算公式
熵, 交叉熵, 和KL散度

 

交叉熵(Cross-Entropy)的介绍

对于交叉熵的介绍, 我们还是以天气预报作为例子来进行讲解.

  • 交叉熵(Cross-Entropy)可以理解为平均的message length, 即平均信息长度.
  • 现在有8种天气, 于是每一种天气我们可以使用3 bit来进行表示(每一种天气的表示方式如下图所示).
  • 此时 average message length=3, 所以此时Cross-Entropy=3
熵, 交叉熵, 和KL散度

现在假设你住在一个sunny region, 出现晴天的可能性比较大(即每一种天气不是等可能出现的), 下图是每一种天气的概率.

熵, 交叉熵, 和KL散度

我们来计算一下此时的熵(Entropy), 计算的式子如下所示:

熵, 交叉熵, 和KL散度
  • 此时有效的信息是2.23 bit.
  • 所以再使用上面的编码方式(都使用3 bit)会有冗余.
  • 也就是说我们每次发出3 bit, 接收者有效信息为2.23 bit.
  • 这时我们可以修改天气的encode的方式, 可以给经常出现的天气比较小的code来进行表示, 于是我们可以按照下图对每一种天气进行encode.
熵, 交叉熵, 和KL散度

此时的平均长度的计算如下所示(每一种天气的概率*该天气code的长度):

熵, 交叉熵, 和KL散度

此时的平均长度为2.42bit, 可以看到比一开始的3 bit有所减少.

如果我们使用相同的code, 但是此时对应的天气的概率是不相同的, 此时计算出的平均长度就会发生改变. 此时每一种天气的概率如下图所示:

熵, 交叉熵, 和KL散度

于是此时的信息的平均长度就是4.58bit, 比Entropy大很多 (如上图所示, 我们给了概率很小的天气的code也很小, 概率很大的天气的code也很大, 此时就会导致计算出的平均长度很大), 下面是平均长度的计算的式子.

熵, 交叉熵, 和KL散度

我们如何来理解我们给每一种天气的code呢, 其实我们可以理解为这就是我们对每一种天气发生的可能性的预测, 我们会给出现概率比较大的天气比较短的code, 这里的概率是我们假设的, 即我们有一个估计的概率, 我们估计这个天气的概率比较大, 所以给这个天气比较短的code.

下图中可以表示出我们预测的q(predicted distribution)和真实分布p(true distribution). 可以看到此时我们的预测概率q与真实分布p之间相差很大(此时计算出的交叉熵就会比较大).

熵, 交叉熵, 和KL散度

关于上面code长度与概率的转换, 我们可以这么来进行理解, 对于概率为p的信息, 他的有效信息为-log2(p). 若此时code长度为n, 我们问概率为多少的信息的有效信息为n, 即求解-log2(p)=n, 则p=1/2^n, 所以我们就可以求出code长度与概率的转换.

此时, 我们就可以定义交叉熵(Cross-Entropy), 这里会有两个变量, 分别是p(真实的分布)和q(预测的概率):

熵, 交叉熵, 和KL散度

这个交叉熵公式的意思就是在计算消息的平均长度, 我们可以这样来进行理解.

  • -log2(q)是将预测概率转换为code的长度(这里看上面code长度与概率的转换)
  • 接着我们再将code的长度(-log2(q))乘上出现的概率p(真实的概率)

我们简单说明一下熵(Entropy),和交叉熵(Cross-Entropy)的性质:

  • 如果预测结果是好的, 那么p和q的分布是相似的, 此时Cross-Entropy与Entropy是相似的.
  • 如果pq有很大的不同, 那么Cross-Entropy会比Entropy.
  • 其中Cross-Entropy比Entropy大的部分, 我们称为relative entropy, 或是Kullback-Leibler Divergence(KL Divergence), 这个就是KL-散度, 我们会在后面进行详细的介绍.
  • 也就是说, 三者的关系为: Cross-Entropy=Entropy+ KL Divergence

 

交叉熵(Cross-Entropy)在机器学习中的应用

在进行分类问题的时候, 我们通常会将loss函数设置为交叉熵(Cross-Entropy), 其实现在来看这个也是很好理解, 我们会有我们预测的概率q和实际的概率p, 若p和q相似, 则交叉熵小, 若p和q不相似, 则交叉熵大.

有一个要注意的是, 我们通常在使用的时候会使用10为底的log, 但是这个我不影响, 因为log2(x)=log10(x)/log(2), 我们可以通过公式进行转换.

我们下面来看一个例子, 在实际情况中的使用.

熵, 交叉熵, 和KL散度

若预测Red Panda为90%, 则Cross-Entropy为0.04.

若预测Red Panda为100%, 则Cross-Entropy为0.

注意: 不是交叉熵越接近0越好, 应该是KL-Divergence越接近0越好. 但是在这里, 多分类使用one-hot表示正好导致了正确结果的时候Cross-Entropy为0.

在PyTorch中, CrossEntropyLoss不是直接按照上面进行计算的, 他是包含了Softmax的步骤的. 关于在PyTorch中CrossEntropyLoss的实际计算, 我单独写了一篇文章进行详细的介绍PyTorch中交叉熵的计算-CrossEntropyLoss介绍. 这里给了具体的例子, 有了predict和target之后是如何计算loss的.

 

KL散度(KL-Divergence)

  • 前面说到, 三者的关系为: Cross-Entropy=Entropy+ KL Divergence
  • 所以, KL-Divergence的计算式子如下所示:
熵, 交叉熵, 和KL散度

我们计算一下上面那个天气的KL-Divergence, 下面是天气的真实概率分布, 和我们预测的概率分布:

熵, 交叉熵, 和KL散度

于是KL-Divergence的计算结果如下:

熵, 交叉熵, 和KL散度

下面是一些更加数学化的表示, 分别看一下离散概率分布连续概率分布下的公式. 我们知道KL-Divergence的计算公式如下所示:

熵, 交叉熵, 和KL散度

我们将熵和交叉熵的计算公式代入, 进行化简, 于是得到了下面的式子, 其中p是真实的概率分布, q是我们预测的概率分布.

熵, 交叉熵, 和KL散度

我们看一下离散情况下的详细计算公式:

熵, 交叉熵, 和KL散度

参考资料: https://zhuanlan.zhihu.com/p/22464760

 

KL-Divergence简单例子

下面我们来看一个简单的KL-Divergence的例子(需要注意的是, KL不是对称的, 即KL(P||Q)!=KL(Q||P)). 假设P和Q为离散部分, 如下所示:

熵, 交叉熵, 和KL散度

那么此时的KL(P,Q)KL(Q,P)的计算分别如下:

熵, 交叉熵, 和KL散度

下面是KL(Q,P)的计算

熵, 交叉熵, 和KL散度

可以看到两者的结果是不同的.

 

KL散度(KL-Divergence)-算例(计算两个高斯分布的KL-Divergence)

  • 这里我们看一下对于两个一维的高斯分布, 我们计算他们之间的KL-Divergence.
  • 假设有两个随机变量x1和x2, 各服从如下的高斯分布:
熵, 交叉熵, 和KL散度

下面计算KL(p1||p2), 将正态分布的概率密度函数代入计算, 下面的计算过程就截图表示:

熵, 交叉熵, 和KL散度

我们进一步进行化简:

熵, 交叉熵, 和KL散度

我们看一下是否是KL-Divergence越小, 表示两个分布越接近.

如果我们假设第二个高斯分布的均值为0, 方差为1(这里假设N2是均值是0和方差是1的正态分布), 那么此时的KL-Divergence可以化简为如下的式子.

熵, 交叉熵, 和KL散度

我们可以猜测此时, 均值为0, 方差为1的时候KL散度最小, 会使得KL-Divergence=0. 我们可以求导进行验证.

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2019年9月28日07:07:00
  • 转载请务必保留本文链接:https://mathpretty.com/11207.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: