熵,交叉熵,KL散度的理解


参考博客:https://colah.github.io/posts/2015-09-Visual-Information/#fn1

什么是熵,什么是信息熵?在机器学习中一直都很难理解,最近读了一篇博客,它用可视化的方法帮助我们更好的理解什么是信息熵。

可视化概率分布

首先举个例子,这个例子在后文中也会用到。假设我在重庆,有时候它会下雨,但是大多数时候是晴天,下雨的概率大概是25%,晴天的概率是75%。简单的用图表示如下:

熵,交叉熵,KL散度的理解

然后大部分时间,我穿的是短袖,概率为62%,有时候穿雨衣,概率为38%

熵,交叉熵,KL散度的理解

假如穿衣服和天气是相互独立的,那么我们可以很好的将这两个变量分布用一个图可视化出来。

熵,交叉熵,KL散度的理解

图中横轴表示穿什么衣服的概率,竖轴表示天气的概率。正方形内部被整齐的划分为4块,这4块都是互相独立的,即穿什么衣服和什么天气是没有关系的。

但是现实生活中不是这样的,这两个条件是相互影响的,比如说上图中的4个子块会因为两个变量之间的相互影响导致有的子块概率变小(下雨导致穿短袖的概率变低);有的子块概率变大(下雨导致穿雨衣的概率变大)。所以我们实际得到的这些子块有的是膨胀的,有的是缩小的,可视化出来如下图:

熵,交叉熵,KL散度的理解

既然两个变量是相互影响的,那么此时,我们考虑引入条件概率,假设天气已知,此时穿衣服的条件概率为:

  • p(穿)=75%p(穿雨衣|下雨)=75\%
  • p(穿)=25%p(穿短袖|下雨)=25\%
  • p(穿)=25%p(穿雨衣|晴天)=25\%
  • p(穿)=75%p(穿短袖|晴天)=75\%

则上图可以转换为(规则化)

熵,交叉熵,KL散度的理解

由条件概率公式p(x,y)=p(x)p(yx)p(x,y)=p(x)*p(y|x),我们可以得到,

  • p(穿,)=p()p(穿)=25%75%=0.187519%p(穿雨衣,下雨)=p(下雨)*p(穿雨衣|下雨)=25\%*75\%=0.1875\approx19\%
  • p(穿,)=p()p(穿)=25%25%=0.06256%p(穿短袖,下雨)=p(下雨)*p(穿短袖|下雨)=25\%*25\%=0.0625\approx6\%
  • p(穿,)=p()p(穿)=75%25%=0.187519%p(穿雨衣,晴天)=p(晴天)*p(穿雨衣|晴天)=75\%*25\%=0.1875\approx19\%
  • p(穿,)=p()p(穿)=75%75%=0.562556%p(穿短袖,晴天)=p(晴天)*p(穿短袖|晴天)=75\%*75\%=0.5625\approx56\%

类似的,假设穿着已知,给定天气的条件概率如下:

  • p(穿)=50%p(下雨|穿雨衣)=50\%
  • p(穿)=25%p(下雨|穿短袖)=25\%
  • p(穿)=8%p(晴天|穿雨衣)=8\%
  • p(穿)=92%p(晴天|穿短袖)=92\%

则可以用另一个方式可视化上述的联合分布

熵,交叉熵,KL散度的理解

编码 Code

在简单介绍了一个可视化概率的例子之后,我们将利用它进一步研究信息熵。信息熵从文字的编码(Code)讲起,现在假设你(Bob)要与你美国的朋友(Alice)通信,因为你是一个狗(dog)的爱好者,所以在你发给Alice的信件中dog的词汇出现频率较高;Alice是猫(cat)的爱好者,所以在她给你的信件中cat出现的频率较高。假设Bob的词向量词频分布为p(x)p(x),Alice的词频分布为q(x)q(x),则他们的分布如下(仅针对动物的词频):

熵,交叉熵,KL散度的理解

他们的词向量相同,不同的仅仅是词频的分布。现在Bob使用如下的编码格式进行发送,将每个单词用0-1来编码。

熵,交叉熵,KL散度的理解

在发送的时候,将每个字符根据上述编码进行替换即可:

熵,交叉熵,KL散度的理解

可变长度-编码(Variable-Length Code)

使用上述编码策略,我们平均需要2比特长度,对于每个字符:
Average(Lold)=xXp(x)L(x)=12×2+14×2+18×2+18×2=2bitAverage(L_{old})=\sum_{x\in X}p(x)L(x)=\frac{1}{2}\times 2+\frac{1}{4}\times 2+\frac{1}{8}\times 2+\frac{1}{8}\times 2=2 bit
注意到上述编码并没有考虑词频的不同,而是统一用两个字符来编码,如果再多一个单词的话,则平均需要3个bit。学习过哈夫曼树的同学对于带权最短路径会想到,可以通过构建哈夫曼编码缩短上述的平均编码长度Average(Lold)Average(L_{old})。新的编码策略如下:

熵,交叉熵,KL散度的理解

在下图中,我们使用横轴表示编码长度L(x)L(x),纵轴表示词频分布p(x)p(x)。则对比新旧的平均编码如下(矩形的面积):

熵,交叉熵,KL散度的理解  熵,交叉熵,KL散度的理解

新的平均编码长度如下:
Average(Lnew)=xXp(x)L(x)=12×1+14×2+18×3+18×3=1.75bitAverage(L_{new})=\sum_{x\in X}p(x)L(x)=\frac{1}{2}\times 1+\frac{1}{4}\times 2+\frac{1}{8}\times 3+\frac{1}{8}\times 3=1.75 bit
通过分析会发现,针对上述的词频分布,平均至少需要1.751.75 bit,无论我们如何优化,都不可能小于这个值,这里可以将它理解为平均编码长度的一个下限。这个下限就是该分布的

熵,交叉熵,KL散度的理解

编码空间(The Space of Codewords)

针对老版本的编码,一个bitbit可以编码的字符数为212^{1}nbitn个bit可以编码的长度为2n2^{n}个字符;但是在哈夫曼编码中,可变长的编码的空间是多少呢? 答案是2n12^{n-1} ,因为它需要另外1bit1 bit来保证前缀码的不同。

前缀码:在可变长的编码中,如果前缀码相同,是会引起歧义的,比如假设0 和 01 都在可变长的编码中都编码不同的字符,此时,当接收方解码的时候,它不知道是应该解码为{0和1}还是{01}为整体。换句话说,每个字符的编码都不应该是其它字符的前缀码。假设我们想编码4个字符(看作完全二叉树),需要2个bit,为了保证前缀码不同,在两个分支上加1bit,保证前缀码不同。

为了缩小平均的编码长度,引入了可变长度的编码,但由于前缀码的原因,会损失掉一部分编码空间。例如假设我们使用了01编码一个字符,那么010,011…等等都不能再编码其它字符,如下图:

熵,交叉熵,KL散度的理解

图中是3个bit编码的空间,因为拥有了一个2bit的编码(01),我们损失了14\frac{1}{4}的编码空间,同时这种损失也意味着其它字符需要更长的字符来编码。而且可以看到,越短的编码,它损失的空间越大,但是越短的编码,意味着越少的花费。此时有两个矛盾需要平衡:短编码花费少,但是损失了其它短编码的编码空间,使得其它字符需要更长的编码,其它字符则需要更多的花费。我们需要找到一种最优的编码来解决这个问题。

优化编码(Optimal Encodings)

单独考虑一个字符的编码。假设我们选择了1个长度的编码0,那么有0开头的任意长度的编码将不能使用,损失的空间是12\frac{1}{2};若继续选择长度为2的编码10,则损失的空间为14\frac{1}{4}。随着编码长度LL的增加,损失呈指数型降低。如下图:

熵,交叉熵,KL散度的理解

注意到一个字符如果用短的编码,它会减少信息长度,但是编码损失较高,比较
我们知道平均编码长度为Average(Lold)=xXp(x)L(x)Average(L_{old})=\sum_{x\in X}p(x)L(x),可以用如下矩形的面积表示:

熵,交叉熵,KL散度的理解

那怎么求解L(x)L(x)呢? 如下图, 因为是指数分布,函数图像为y=2xy=2^{-x},已知y=p(a)=cost=12Ly=p(a)=cost=\frac{1}{2^{L}}, x=log2y=log2p(a)x=-log_{2}^{y}=-log_{2}^{p(a)}; 即L(x)=log(1p(x))=log(1cost)L(x)=log{(\frac{1}{p(x)})}=log{(\frac{1}{cost})}。这里y=p(a)=costy=p(a)=cost还可以这样理解,就是一个字符出现的概率越高,那么它的不确定性就越低,提供的信息就越少,所以和损失是正比的。

熵,交叉熵,KL散度的理解

信息熵计算公式如下:H(p)=xp(x)log2(1p(x))H(p)=\sum_{x}p{(x)}log_{2} \left(\frac{1}{p(x)}\right)

交叉熵(Cross-Entropy)

交叉熵 使用概率分布A进行最佳编码,使用分布B进行解码的平均长度。公式定义如下:Hp(q)=xq(x)log2(1p(x))H_{p}(q)=\sum_{x}q(x)log_{2} \left(\frac{1}{p(x)}\right)
回顾Bob和Alice,他们的词向量一样,只是说的频率不一样,Bob的是p(x)p(x), Alice的是q(x)q(x),则交叉熵可以用如下的图表示:

熵,交叉熵,KL散度的理解

Bob和Alice都各有自己的最优编码,所以可以组合出2种熵和交叉熵(右下角编码器,括号内解码器),如下:

  • Bob使用Bob的编码 (Hp(p)=1.75bitsH_{p}(p)=1.75 bits
  • Bob使用Alice的编码 (Hq(p)=2.375bitsH_{q}(p)=2.375 bits
  • Alice使用Bob的编码 (Hp(q)=2.25bitsH_{p}(q)=2.25 bits
  • Alice使用Alice的编码(Hq(q)=1.75bitsH_{q}(q)=1.75 bits
熵,交叉熵,KL散度的理解

注意到交叉熵不是对称的,Hq(p)Hp(q)H_{q}(p)\neq H_{p}(q),它衡量的是两个分布的不同。两个分布越接近,他们的交叉熵越小。当两个分布不同的时候,多出来的部分我们称之为Kullback–Leibler divergence (KL散度),定义如***意解码器一致):
Dq(p)=Hq(p)H(p)D_{q}(p)=H_{q}(p)-H(p) Dp(q)=Hp(q)H(q)D_{p}(q)=H_{p}(q)-H(q)
图示如下:

熵,交叉熵,KL散度的理解                 熵,交叉熵,KL散度的理解

多变量的熵(Entropy and Multiple Variable)

会议之前穿衣服和天气的例子,它是一个多变量的分布,如图:

熵,交叉熵,KL散度的理解

可以看出这个联合分布中一共包含4块内容,每块内容的概率也是知道的,知道了每块的概率,有上述熵的定义,我们可以求得它的编码长度,可视化如下:

熵,交叉熵,KL散度的理解

我们称该联合分布的平均最短编码为XXYY的联合熵,定义如下:
H(X,Y)=x,yp(x,y)log2(1p(x,y))H(X,Y)=\sum_{x,y}p(x,y)log_{2}\left(\frac{1}{p(x,y)}\right)

如果我们不把概率扁平化,采用三维的方式来可视化,那么熵就是下图中的体积。

熵,交叉熵,KL散度的理解

假设现在我已经从天气预报中得知了天气状况,那么现在我还需要提供多少穿衣信息呢?【p(x,y)p(xy)p(x,y)\leq p(x|y),因为后者乘了一个小于等于1的数p(y)p(y); 也就是说p(xy)p(x|y)概率更大,提供了更少的不确定性(只需提供更少的信息),L(x,y)=log2(1p(xy))L(x,y)=\log_{2}\left(\frac{1}{p(x|y)}\right) 越小】

熵,交叉熵,KL散度的理解

从编码的角度讲,因为天气已知,我穿衣服的概率变了,也就是说 p(x,y)p(x,y) 变成了 p(xy)p(x|y),我们需要重新设立一套更短编码,解码的概率是不变的,所以条件熵 就定义出来了,如下:
H(XY)=x,yp(x,y)log2(1p(xy))H(X|Y)=\sum_{x,y}p(x,y)log_{2}\left(\frac{1}{p(x|y)}\right)

互信息(Mutual Information)

在上一节中,我们发现两个变量之间如果不独立,是存在一定的影响的。假设每个变量都包含了一定量的信息,用一个矩形条表示,那么联合概率 H(X,Y)H(X,Y) 包含的总信息应该是 H(X)H(X)H(Y)H(Y) 的并集。如下图:

熵,交叉熵,KL散度的理解
那缺掉的部分是什么呢?如图:
熵,交叉熵,KL散度的理解

从图中可以看出 H(X,Y)=H(Y)+H(XY)H(X,Y)=H(Y)+H(X|Y),它表示 变量 XXYY 包含的信息是由变量 YY 包含的信息 加上 在变量 XX 但不在 YY 中的信息 。如图:

熵,交叉熵,KL散度的理解

通过进一步对变量 XXYY 中包含的信息进行分析,可以得到如下图:
持续更新。。。