熵
考虑如下问题:
我们对于一些 symbols 进行编码,如何使编码长度最短?
假设 symbols 有 A,B,C,D 四种,最简单的想法是用相同长度的二进制进行编码,分别为 00,01,10,11。但是对于一段文本中,这四种 symbols 出现的频率是不同的,如果我们将出现频率高的 symbol 用更短的二进制进行编码,出现频率低的 symbol 使用较长的二进制进行编码,那么我们或许就能获得更优秀的编码方案。
e.g.
p
(
A
)
=
1
2
p
(
B
)
=
1
4
p
(
C
)
=
1
8
p
(
D
)
=
1
8
p(A)=\frac12~~~~p(B)=\frac14~~~~p(C)=\frac18~~~~p(D)=\frac18
p(A)=21 p(B)=41 p(C)=81 p(D)=81
那么我们可以将其分别编码为:0,10,110,111。可以算一下平均长度为 1.75 bit,比之前的编码方式减少了 0.25 bit
但是这里出现了一个问题,由于编码长度不同,为了让机器在读取文本编码时知道一个 symbol 的起始位置,需要消除编码的前缀歧义。
e.g.
假设 0 和 01 都是码字,那么对于字符串 011101,机器就分不清到底第一个字符是 0 还是 01。
因此,任何码字都不应该是另一个码字的前缀。 这称为前缀属性,遵守该属性的编码称为前缀编码。
使用前缀编码会损失一些码字空间,比如如果有码字 0,那么所有 0 开头的编码都不可以使用了,这样相当于损失了一半的码字空间。更具体一些,对于一个长度为
L
L
L 的码字,它损失的码字空间,或者它的代价为
c
o
s
t
=
1
2
L
cost=\frac1{2^L}
cost=2L1
代价越大,说明
L
L
L 越小,说明该编码在文本中出现的概率越高。或者可以反过来想,我们想确定一个 symbol 究竟该用多长的编码去表示,我们就需要给
c
o
s
t
cost
cost 一个预算,而这个预算与概率成正比,因此我们可以直接使
c
o
s
t
=
p
(
x
)
cost=p(x)
cost=p(x) 即:
L
(
x
)
=
log
2
1
p
(
x
)
L(x)=\log_2\frac1{p(x)}
L(x)=log2p(x)1
那么由此可以计算平均编码长度为:
H
(
p
⃗
)
=
−
∑
p
i
(
x
)
log
p
i
(
x
)
H(\vec p)=-\sum p_i(x)\log p_i(x)
H(p)=−∑pi(x)logpi(x)
其中
p
⃗
\vec p
p 就是每个 symbol 的概率分布,而
H
(
p
⃗
)
H(\vec p)
H(p) 就是熵。
熵的意义有很多:
- 对一段文本进行编码可以使用的最短编码长度(文本压缩)
- 反应了事件的不确定度。熵越大,事件越不确定。
- − log p ( x ) -\log p(x) −logp(x) 被信息论的创始人香农定义为事件 x x x 的自信息,即一个概率为 p ( x ) p(x) p(x) 的事件 x x x 的信息量(bit)。熵就是所有事件的自信息的加权和,即这些事件的自信息的平均值。
交叉熵
对于两段文本,它们中 symbols 分布的概率是不同的,如果我们用文本 1 的编码规则去对文本 2 进行编码,那么可能得到的结果并不是最优的(不够短),为了形容两个文本分布概率的不同,我们使用交叉熵:
H
p
⃗
(
q
⃗
)
=
−
∑
q
i
(
x
)
log
p
i
(
x
)
H_{\vec p}(\vec q)=-\sum q_i(x)\log p_i(x)
Hp(q)=−∑qi(x)logpi(x)
表示使用
p
⃗
\vec p
p 的编码规则对
q
⃗
\vec q
q 进行编码的平均长度。如果两者概率分布相同,则
H
(
q
)
=
H
p
(
q
)
H(q)=H_p(q)
H(q)=Hp(q),否则差异越大,偏差越大。
注意,交叉熵不是对称的
KL 散度
熵和交叉熵之间的差可以告诉我们,由于我们使用了另一个分布进行编码的代码使得我们的文本变长了多少。 如果两个分布相同,则该差异将为零。 差增加,则消息的长度也增加。
我们称这种差异为Kullback-Leibler散度,或简称为KL散度。
D
q
(
p
)
=
H
q
(
p
)
−
H
(
p
)
=
∑
p
(
x
)
log
p
(
x
)
q
(
x
)
D_q(p)=H_q(p)-H(p)=\sum p(x)\log\frac{p(x)}{q(x)}
Dq(p)=Hq(p)−H(p)=∑p(x)logq(x)p(x)
KL散度就像两个分布之间的距离,可以衡量它们有多不同。
顺便,当
p
,
q
p,q
p,q 为连续而不是离散值时,KL散度为:
D
q
(
p
)
=
∫
p
(
x
)
log
p
(
x
)
q
(
x
)
d
x
D_q(p)=\int p(x)\log\frac{p(x)}{q(x)}{\rm d}x
Dq(p)=∫p(x)logq(x)p(x)dx