熵的推导
已知随机变量
在这种编码规则下,记
编码长度
现在我们希望编码长度的期望最小,约束条件是代价总和为1:
这是一个有约束条件的最优化问题,可以用拉格朗日乘子法。构建拉格朗日函数
为简化我们用
拉格朗日函数取极值条件:
又有:
最终有:
所以,当事件
举个例子, Bob只能说4个单词”dog”, “cat”, “fish”, “bird”,概率分布为
现在我们需要跟Bob交流,必须先进行编码,如果采用固定长度的编码:
编码长度期望为
而采用最优编码,即概率为
编码长度期望为
编码长度期望的最小值,被称为entropy(熵),它是由随机变量的分布决定的,我们称分布
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)≥0 ∫+∞−∞p(x)dx=1
以及它的离散形式
其中
p(x)≥0 ∑xp(x)=1
这个式子很重要,将会在很多地方看到它的各种各样的形式,举例说明:
(1) 当
(2) 当
(3) 当
(4)物理学的例子,质心=
(5)另一个物理学的例子:
这里
(6)机器学习的例子,在EM算法的E-step中要用到以下的变换:
这里,
(7)当
交叉熵(cross entropy)
现在如果有另一个分布
在使用分布
这个长度称为
这里强调q相对于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([0.06,0.19,0.19,0.56])
1.6224272282706345
Y给定时X的条件熵:
注意 (13)式与(12)式的区别:
与
还可以从另一个角度看条件熵,X|Y=raining 和 X|Y=sunny 是随机变量,它们的熵可以算出来,然后对这两个熵求期望,得到:
推导过程如下:
把(13)式条件熵与交叉熵对比,可以看出条件熵是联合概率
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相互独立(
交互信息在神经网络中有很多应用,如交互信息最大化原则(Infomax),参看Simon Haykin 《神经网络与机器学习》。
参考文献
[1] colah’s blog Visual Information Theory.
[2] Simon Haykin 《神经网络与机器学习》