赞
踩
这片博客从信息论的角度解读信息熵、交叉熵和困惑度。有助于帮助在机器学习之路上理解相应的损失函数和评价指标。要了解交叉熵和困惑度是怎么计算的,以及为什么这样计算是有效的,我们需要从基础的信息量谈起。
另外,在谈及信息量和信息熵的时候,会从数据编码和数据压缩的角度解释,所以阅读本文需具备数据结构中哈夫曼编码的先验知识,并大致了解逻辑回归。
什么是信息量呢?首先我们先用一句话概括,后面再进行说明。
所谓信息量是指从N个相等可能事件中选出一个事件所需要的信息度量或含量,也就是在辩识N个事件中特定的一个事件的过程中所需要提问"是或否"的最少次数.【来自百度百科】
因为信息量和信息熵系统性的定义来自信息论的创始人克劳德·香农(Claude Shannon),美国数学家、电子工程师和密码学家。他发表了发表了划时代的论文——通信的数学原理,也就是最初信息量的提出是为了用数学解决通信问题。所以下面将用一个通信、数据压缩方面的例子作为说明。
【文件压缩(编码)例子】在均匀分布的情况下,假定一个字符(或字符串)在文件中出现的概率是p,因为是均匀分布,所以可知共有1/p个不同的字符,那么在某个位置上最多可能出现1/p种情况,至少需要 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)个二进制位表示这个字符。
如何证明至少需要 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)个二进制位表示这个字符呢?
反证法: l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)个二进制位可以表示 2 l o g 2 ( 1 p ) = 1 p 2^{log_2(\frac{1}{p})}=\frac{1}{p} 2log2(p1)=p1种情况(字符),如果少于这个数量,势必有两个以上的字符使用相同的编码,在解码过程就会出错。
所以,我们至少需要 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)位信息,我们才能从1/p个字符(或字符串)中选出特定字符,所以 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)称为该特定字符的信息量。
结合百度百科的定义去理解,我们需要回答多少次是或否,才能从1/p个字符(或字符串)中选出特定字符,想想我们学过的二叉树(哈夫曼编码树),在均匀分布的情况下,树高必然是 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1),所以需要回答 l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)次。所以它就是信息量。(个人觉得这样的定义是因为后面经过信息论的发展,它的应用场景不仅仅是数据压缩了,而是更广泛的应用场景,所以如此定义)。
那信息熵又是什么?也先简单来概括一下:
信息熵是信息量的期望。
同样是举数据压缩的例子,刚刚我们举的是均匀分布的例子,每个字符的信息量都是
l
o
g
2
(
1
p
)
log_2(\frac{1}{p})
log2(p1),我们求一下期望,就得到信息熵如下:
p
∗
l
o
g
2
(
1
p
)
+
p
∗
l
o
g
2
(
1
p
)
+
.
.
.
+
p
∗
l
o
g
2
(
1
p
)
=
1
∗
l
o
g
2
(
1
p
)
p* log_2(\frac{1}{p}) + p* log_2(\frac{1}{p}) +... + p * log_2(\frac{1}{p}) = 1 * log_2(\frac{1}{p})
p∗log2(p1)+p∗log2(p1)+...+p∗log2(p1)=1∗log2(p1)
那么这个信息熵从数据压缩的角度,代表着什么?我们可以想想哈夫曼编码树,p是某个字符的出现概率, l o g 2 ( 1 p ) log_2(\frac{1}{p}) log2(p1)是它的编码长度,所以加权平均就是所有字符的平均编码长度。所以信息熵越大,平均编码长度就越长,文件能压缩的空间就越小。
上面我们说到熵是传输一个随机变量状态值所需的比特位下界(最短平均编码长度)。
那信息熵和交叉熵有什么关系吗?可以明确的说,交叉熵是信息熵的一种,下面是它的定义。
现在有关于样本集的两个概率分布 p(x) 和 q(x),其中 p(x) 为真实分布, q(x) 非真实分布。如果用真实分布 p(x) 来衡量识别别一个样本所需要编码长度的期望(平均编码长度)为:
H
(
p
)
=
∑
x
p
(
x
)
l
o
g
1
p
(
x
)
H(p) =\displaystyle\sum_{x}p(x)log\frac{1}{p(x)}
H(p)=x∑p(x)logp(x)1
如果使用非真实分布 q(x) 来表示来自真实分布 p(x) 的平均编码长度,则是:
H
(
p
,
q
)
=
∑
x
p
(
x
)
l
o
g
1
q
(
x
)
H(p,q)=\displaystyle\sum _{x}p(x)log\frac{1}{q(x)}
H(p,q)=x∑p(x)logq(x)1
上述公式中,编码长度(信息量)来自于非真实分布q(x), 而概率来自于真实分布p(x),所以这样估算出的信息熵我们称之为交叉熵。
举个例子,考虑一个随机变量 x,真实分布 p ( x ) = ( 1 2 , 1 4 , 1 8 , 1 8 ) p(x)= \left( \displaystyle\frac{1}{2},\frac{1}{4},\frac{1}{8},\frac{1}{8} \right) p(x)=(21,41,81,81),非真实分布 q ( x ) = ( 1 4 , 1 4 , 1 4 , 1 4 ) q(x)=\left( \displaystyle\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{4} \right) q(x)=(41,41,41,41), 则
信息熵 H ( p ) = 1.75 b i t s H(p)=1.75 bits H(p)=1.75bits(最短平均码长),
交叉熵 H ( p , q ) = 1 2 l o g 2 4 + 1 4 l o g 2 4 + 1 8 l o g 2 4 + 1 8 l o g 2 4 = 2 b i t s H(p,q)=\displaystyle\frac{1}{2}log_24+\frac{1}{4}log_24+\frac{1}{8}log_24+\frac{1}{8}log_24=2\ bits H(p,q)=21log24+41log24+81log24+81log24=2 bits。
由此可以看出在该例子中,根据非真实分布 q(x) 得到的平均码长大于根据真实分布 p(x) 得到的平均码长。
我们知道,在逻辑回归和softmax回归中,我们常常用交叉熵来作为损失函数评价模型的性能,那为什么可以这样子干呢?下面将会结合相对熵的定义进行解释。
相对熵
相对熵 (Relative entropy),也称KL散度 (Kullback–Leibler divergence),可以用来衡量两个概率分布之间的差异。
设 p(x)、q(x) 是 离散随机变量 x 中取值的两个概率分布,则 p 对 q 的相对熵是:
D
K
L
(
p
∣
∣
q
)
=
∑
x
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
=
E
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
D_{KL}(p||q)=\displaystyle\sum_{x}p(x)log\frac{p(x)}{q(x)}=E_{p(x)}log\frac{p(x)}{q(x)}
DKL(p∣∣q)=x∑p(x)logq(x)p(x)=Ep(x)logq(x)p(x)
上面公式的意义就是求 p 与 q 之间的对数差(信息量的差)在 p 上的期望值。
下面我们将介绍相对熵的几条性质,以便从相对熵出发解释交叉熵work的原因。
- 如果 p(x) 和 q(x) 两个分布相同,那么相对熵等于0
- D K L ( p ∣ ∣ q ) ≠ D K L ( q ∣ ∣ p ) D_{KL}(p||q)\not=D_{KL}(q||p) DKL(p∣∣q)=DKL(q∣∣p), 即相对熵具有不对称性。
- D K L ( p ∣ ∣ q ) ≥ 0 D_{KL}(p||q)\geq0 DKL(p∣∣q)≥0, 证明如下:(利用Jensen不等式)
D K L ( p ∥ q ) = ∑ x p ( x ) log p ( x ) q ( x ) = − ∑ x p ( x ) log q ( x ) p ( x ) = − E p ( x ) ( log q ( x ) p ( x ) ) ≥ − log E p ( x ) ( q ( x ) p ( x ) ) = − log ∑ x p ( x ) q ( x ) p ( x ) = − log ∑ x q ( x )DKL(p∥q)=x∑p(x)logq(x)p(x)=−x∑p(x)logp(x)q(x)=−Ep(x)(logp(x)q(x))≥−logEp(x)(p(x)q(x))=−logx∑p(x)p(x)q(x)=−logx∑q(x)DKL(p∥q)=∑xp(x)logp(x)q(x)=−∑xp(x)logq(x)p(x)=−Ep(x)(logq(x)p(x))≥−logEp(x)(q(x)p(x))=−log∑xp(x)q(x)p(x)=−log∑xq(x)
因为 ∑ x p ( x ) = 1 \displaystyle\sum_{x}p(x)=1 x∑p(x)=1
所以 D K L ( p ∣ ∣ q ) ≥ 0 D_{KL}(p||q)\geq0 DKL(p∣∣q)≥0
交叉熵的作用
化简相对熵的公式
D
K
L
(
p
∣
∣
q
)
=
∑
x
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
=
∑
x
p
(
x
)
l
o
g
p
(
x
)
−
p
(
x
)
l
o
g
q
(
x
)
D_{KL}(p||q)=\displaystyle\sum_{x}p(x)log\frac{p(x)}{q(x)}=\sum_{x}p(x)logp(x)-p(x)logq(x)
DKL(p∣∣q)=x∑p(x)logq(x)p(x)=x∑p(x)logp(x)−p(x)logq(x)
由于熵和交叉熵的公式分别为
H
(
p
)
=
−
∑
x
p
(
x
)
l
o
g
p
(
x
)
H(p)=-\displaystyle\sum_{x}p(x)logp(x)
H(p)=−x∑p(x)logp(x)
H
(
p
,
q
)
=
∑
x
p
(
x
)
l
o
g
1
q
(
x
)
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
H(p,q)=\displaystyle\sum _{x}p(x)log\frac{1}{q(x)}=-\sum _{x}p(x)logq(x)
H(p,q)=x∑p(x)logq(x)1=−x∑p(x)logq(x)
所以我们有
D
K
L
(
p
∣
∣
q
)
=
H
(
p
,
q
)
−
H
(
p
)
D_{KL}(p||q)=H(p,q)-H(p)
DKL(p∣∣q)=H(p,q)−H(p)
在介绍相对熵的时候我们谈到,相对熵可以用来衡量两个概率分布之间的差异,当我们用一个模型拟合随机变量的真实分布的时候,我们自然希望我们提出的分布和真实分布之间差异越小越好,即他们的相对熵越小越好,由于当数据给定时,其信息熵 H ( p ) H(p) H(p)固定,所以我们最小化交叉熵 H ( p , q ) H(p,q) H(p,q)就是最小化相对熵 D K L ( p ∣ ∣ q ) D_{KL}(p||q) DKL(p∣∣q)
关于交叉熵也可以从另一个角度解释,根据上面相对熵的性质我们知道:
D
K
L
(
p
∣
∣
q
)
≥
0
D_{KL}(p||q)\geq0
DKL(p∣∣q)≥0
所以:
H
(
p
,
q
)
≥
H
(
p
)
H(p,q)\geq H(p)
H(p,q)≥H(p)
因为我们知道交叉熵就是用非真实分布 q(x) 来表示来自真实分布 p(x) 的平均编码长度,而事实证明这个此长度会大于用真实分布 p(x) 来衡量识别别一个样本所需要平均编码长度,我们自然希望前者(即交叉熵)约接近后者(信息熵)越好,所以最终就转换成求交叉熵的最小值的问题。这就是为什么在逻辑回归和softmax回归中使用交叉熵作为损失函数求其最小值的原因。当然,交叉熵当作损失函数的原因也可以极大似然估计的角度解释(详细可以参考李宏毅老师的授课视频)
这小节需要具备语言模型等概念的先验知识。
困惑度(Perplexity) 是评价语言模型的一个指标,它的计算公式为:
Perplexity
(
W
)
=
2
H
(
W
)
=
P
(
w
1
w
2
…
w
N
)
−
1
N
=
1
P
(
w
1
w
2
…
w
N
)
N
=
∏
i
=
1
N
1
P
(
w
i
∣
w
1
…
w
i
−
1
)
N
可以看到公式第一行这里有 H ( W ) H(W) H(W), 所以我们首先从熵的角度解释,从公式上看,困惑度其实就是交叉熵的指数形式。根据上面的理论,我们自然希望交叉熵越小越好,也就是困惑度越小越好,下面是上面一串公式的推导过程,具体就是解释H(W)为什么是交叉熵或者为什么等价于交叉熵。
我们将一个句子看作一个随机变量 W = ( w 0 , w 1 , . . . , w n ) W=(w_0,w_1,...,w_n ) W=(w0,w1,...,wn) , 那么这个随机变量的信息熵就是:
H ( w 1 , w 2 , … , w n ) = − log w 1 n ∈ L p ( w 1 n ) log p ( w 1 n ) H\left(w_{1}, w_{2}, \ldots, w_{n}\right)=-\log _{w_{1}^{n} \in L} p\left(w_{1}^{n}\right) \log p\left(w_{1}^{n}\right) H(w1,w2,…,wn)=−logw1n∈Lp(w1n)logp(w1n)
它对应的单字熵(per-word entropy),也就是熵率(entroy rate)为:
1
n
H
(
w
1
,
w
2
,
…
,
w
n
)
=
−
1
n
log
w
1
n
∈
L
p
(
w
1
n
)
log
p
(
w
1
n
)
\frac{1}{n} H\left(w_{1}, w_{2}, \ldots, w_{n}\right)=-\frac{1}{n} \log _{w_{1}^{n} \in L} p\left(w_{1}^{n}\right) \log p\left(w_{1}^{n}\right)
n1H(w1,w2,…,wn)=−n1logw1n∈Lp(w1n)logp(w1n)
现在我们引入交叉熵,设真实分布为p,模型拟合的非真实分布为m,那么交叉熵为:
H
(
p
,
m
)
=
−
1
n
∑
W
∈
L
p
(
w
1
,
w
2
,
…
,
w
n
)
log
m
(
w
1
,
w
2
,
…
,
w
n
)
H(p, m)=-\frac{1}{n} \sum_{W \in L} p\left(w_{1}, w_{2}, \ldots, w_{n}\right) \log m\left(w_{1}, w_{2}, \ldots, w_{n}\right)
H(p,m)=−n1W∈L∑p(w1,w2,…,wn)logm(w1,w2,…,wn)
这里因为训练样本已经给出,也就是p是定值,故H(p,m)可写成:
H
(
p
,
m
)
=
H
(
W
)
=
−
1
N
l
o
g
P
(
w
1
w
2
.
.
.
w
n
)
H(p,m)=H(W)=-\frac{1}{N}logP(w_1w_2...w_n)
H(p,m)=H(W)=−N1logP(w1w2...wn)
上面的式子只是符号有所改变,意义相同,即P代表的分布为m
所以我们有
Perplexity
(
W
)
=
2
H
(
W
)
=
P
(
w
1
w
2
…
w
N
)
−
1
N
从编码长度的角度来理解,就可认为是在语言模型m下,等可能性的输出结果的个数。所以在给定输入的前面若干词汇即给定历史信息后,当然语言模型等可能性输出的结果个数越少越好,越少表示模型就越知道对给定的历史信息 e 1 , . . . e i − 1 {e_1,...e_{i-1}} e1,...ei−1,应该给出什么样的输出 e i e_i ei ,即 perplexity 越小,表示语言模型越好。
当然,困惑度也有另外一种表述(跟上述表述等价),这种表述跳过信息熵直接进行解释,虽然直观理解挺简单的,但可能对公式构造的由来解释不完全。
表诉2:给测试集的句子赋予较高概率值的语言模型较好,也就是说,当语言模型训练完之后,测试集中的语句的概率
P
(
w
1
w
2
…
w
N
)
P(w_{1} w_{2} \ldots w_{N})
P(w1w2…wN) 越高越好。
Perplexity
(
W
)
=
P
(
w
1
w
2
…
w
N
)
−
1
N
=
1
P
(
w
1
w
2
…
w
N
)
N
=
∏
i
=
1
N
1
P
(
w
i
∣
w
1
…
w
i
−
1
)
N
根据困惑度的公式可知,句子概率越大,语言模型越好,困惑度越小。所以我们说困惑度能够评价语言模型。
笔者认为其中一个原因是计算复杂度。
交叉熵涉及N个log操作,而计算机实现log操作是通过多项式拟合来完成的,这比困惑度的N个乘法操作复杂度要高,
经试验,相同次数的log和乘法操作,前者的时间复杂度是后者的两倍多,验证了这一猜想。
当然,这其中或许也有其他原因,欢迎大家在评论中批评指正。
【1】https://blog.csdn.net/hearthougan/article/details/76192381
【2】http://www.ruanyifeng.com/blog/2014/09/information-entropy.html
【3】https://baike.baidu.com/item/%E4%BF%A1%E6%81%AF%E9%87%8F/420401?fr=aladdin
【4】https://www.cnblogs.com/kyrieng/p/8694705.html
【5】https://www.zhihu.com/question/58482430
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。