熵的推导
已知随机变量
X
的概率分布
在这种编码规则下,记 X=xi 编码的长度为 L(xi) ,则它的代价(它所占用的编码空间的比例)记为 C(xi)=12L(xi) 。例如编码10,它的长度为2,任何以10开头的编码都被它占用,10开头的编码占整个编码空间的比例为 1/22=1/4 。
编码长度
Len(X)
也是一个随机变量,它的期望:
现在我们希望编码长度的期望最小,约束条件是代价总和为1:
这是一个有约束条件的最优化问题,可以用拉格朗日乘子法。构建拉格朗日函数
为简化我们用
C(xi)
表示
L(xi)
,即
L(xi)=−log2C(xi)
,则拉格朗日函数变为:
拉格朗日函数取极值条件:
又有:
最终有:
所以,当事件 X=xi 的编码长度对应得代价与其发生的概率相等时,编码长度期望值最小。最小的编码长度为:
举个例子, Bob只能说4个单词”dog”, “cat”, “fish”, “bird”,概率分布为
现在我们需要跟Bob交流,必须先进行编码,如果采用固定长度的编码:
编码长度期望为
1/2∗2+1/4∗2+1/8∗2+1/8∗2=2bits
而采用最优编码,即概率为
P(xi)
的单词编码长度为
−log2P(xi)
:
编码长度期望为
1/2∗1+1/4∗2+1/8∗3+1/8∗3=1.75bits
编码长度期望的最小值,被称为entropy(熵),它是由随机变量的分布决定的,我们称分布
p
的熵为
import math
def H(p_seq):
return sum(-p*math.log(p) for p in p_seq if p>0)/math.log(2)
H([0.25,0.25,0.25,0.25])
2.0
熵的理解
先看几个例子:
x1 | x2 | x3 | x4 | entropy |
---|---|---|---|---|
分布1 | 1 | 0 | 0 | 0 |
分布2 | 0.8 | 0.2 | 0 | 0 |
分布3 | 0.5 | 0.5 | 0 | 0 |
分布4 | 0 | 0 | 0.2 | 0.8 |
分布5 | 0.25 | 0.25 | 0.25 | 0.25 |
分布1只能取x1一个值,它的熵为0。分布2和分布3能取两个值,但分布3更平均,它的熵更大。分布2和分布4是两个不同的分布,但是分布的集中程度相同,他们的熵也相同。分布3和分布5都是均匀分布,但分布5取值范围更广,它的熵更大。
从以上例子可以看出,分布约集中,其熵越小。从这个意义上来说,熵代表着不确定性,不确定度越小,熵越小。熵的取值范围:
(对于连续变量的微分熵,其值可以小于0。)
为了加深对熵这个概念的理解,着重看一下 熵的定义式(6)。它是一个和式,和式的每一项是两个部分的乘积,第一部分是概率函数
p(x)
(在国外教科书中也称为概率质量函数),第二部分是一个随机变量的函数,也是一个随机变量,其含义是最优编码下的编码长度。所以熵是最优编码下消息编码长度的期望。对于连续变量,其定义是:
h(p) 称为分布 p 的微分熵(differential entropy)。其中
下面来看一个更一般的式子:
其中 p(x) 满足:
p(x)≥0
∫+∞−∞p(x)dx=1
以及它的离散形式
其中 p(x) 满足:
p(x)≥0
∑xp(x)=1
这个式子很重要,将会在很多地方看到它的各种各样的形式,举例说明:
(1) 当 g(x)=1logp(x) 时, 它就是熵
(2) 当 g(x)=x 时, 它就是期望
(3) 当 g(x)=(x−E[X])2 时, 它就是方差
(4)物理学的例子,质心= ∫ρ(x)/Mxdx , 这里 g(x)=x , p(x)=ρ(x)/M , ρ(x) 是密度
(5)另一个物理学的例子:
这里 ρ 表示密度, r 表示到转轴的距离。
(6)机器学习的例子,在EM算法的E-step中要用到以下的变换:
这里, Q(z) 是隐含变量 z 的一个分布。
(7)当
交叉熵(cross entropy)
现在如果有另一个分布
q(x)
:
在使用分布
p
的最优编码的情况下,分布
这个长度称为
q
相对于
这里强调q相对于p是因为交叉熵不是对称的,即 Hp(q)≠Hq(p)
def cross_entropy(p_seq, q_seq):
return sum(-q* math.log(p) for (p,q) in zip(p_seq,q_seq) if p>0)/math.log(2)
p_seq=[1/2,1/4,1/8,1/8]
q_seq=[1/8,1/2,1/4,1/8]
print('cross entropy of q with respect to p:',cross_entropy(p_seq,q_seq))
print('cross entropy of p with respect to q:',cross_entropy(q_seq,p_seq))
cross entropy of q with respect to p: 2.25
cross entropy of p with respect to q: 2.375
交叉熵本身并没有多大的意义,有意义的是交叉熵与熵的差,称为Kullback–Leibler距离(简称KL距离):
它的意义是分布q采用另一个分布p的最优编码与采用自身的最优编码比较,消息编码长度的差。它表征的是两个分布的差异。当两个分布相同时,KL距离为0,当两个分布的差异越大,KL距离越大。KL距离在机器学习中经常被当做损失函数来使用。
多变量的熵
先看一个例子:
X与Y的联合熵:
以上图为例把X,Y的组合看成一个随机变量,则它有四种值:raining & t-shirt, raning & coat, sunny & t-shirt, sunny & coat, 其概率分别为6%,19%, 56%, 19%,故 H(X,Y)=0.06∗log(1/0.06)+0.19∗log(1/0.19)+0.56∗log(1/0.56)+0.19∗log(1/0.19)=1.62bits
H([0.06,0.19,0.19,0.56])
1.6224272282706345
Y给定时X的条件熵:
注意 (13)式与(12)式的区别:
与 H(X,Y) 是直接从熵的定义得出的不同, H(X|Y) 是定义式,这是因为 X|Y 并不是随机变量,随机变量的值域必须是基本事件的集合, X|Y 不满足这个条件(在概率论的教科书中,也没有“条件事件”这一说法,只有“条件概率”,而且“条件概率”也是一个定义式)。
还可以从另一个角度看条件熵,X|Y=raining 和 X|Y=sunny 是随机变量,它们的熵可以算出来,然后对这两个熵求期望,得到:
推导过程如下:
把(13)式条件熵与交叉熵对比,可以看出条件熵是联合概率 p(x,y) 相对于条件概率 p(x|y) 的交叉熵。
X_prob=[0.62,0.38] # t-shirt, coat
Y_prob=[0.25,0.75] # raning, sunny
joint_prob = [0.06,0.19,0.56,0.19]
cond_prob_x_y = [0.25,0.75,0.75,0.25]
cond_prob_y_x = [0.08,0.5,0.92,0.5]
print('H(X) =',H(X_prob))
print('H(Y) =',H(Y_prob))
print('H(X,Y) =', H(joint_prob))
print('H(X|Y) =',cross_entropy(cond_prob_x_y, joint_prob))
print('H(Y|X) =',cross_entropy(cond_prob_y_x, joint_prob))
H(X) = 0.9580420222262997
H(Y) = 0.8112781244591328
H(X,Y) = 1.6224272282706347
H(X|Y) = 0.8112781244591328
H(Y|X) = 0.6659961422684021
条件熵和联合熵存在以下关系:
推导过程如下:
上面等式的意义是X,Y联合的信息等于Y中的信息加上X中除去Y的信息。
多变量熵的一个重要概念是交互信息(mutual information),它被定义为:
交互信息表示两个随机变量X,Y之间共享的信息,当X,Y相互独立时,交互信息为0, 当X,Y一一对应时,交互信息最大。
交互信息还可以表示为:
另一个概念是变动信息(variation information),它被定义为:
下面的图有助于理解这几个概念:
把式(13)KL距离定义式变换一下:
上式的意义是p的最优编码和q的最优编码在编码同一分布q的消息时编码长度的差。与式(14)对比可以看出,交互信息表示与假设X,Y相互独立( p(x)p(y) )相比,了解X,Y之间的相互关系 (p(x,y)) 之后,编码长度可以缩短的量。
交互信息在神经网络中有很多应用,如交互信息最大化原则(Infomax),参看Simon Haykin 《神经网络与机器学习》。
参考文献
[1] colah’s blog Visual Information Theory.
[2] Simon Haykin 《神经网络与机器学习》