文章目录
基本概念
联合熵
联合熵是一集变量之间不确定性的衡量手段。
两个变量
X
X
X 和
Y
Y
Y 的联合信息熵定义为
[
1
]
{ }^{[1]}
[1] :
H
(
X
,
Y
)
=
−
∑
x
∑
y
P
(
x
,
y
)
log
2
[
P
(
x
,
y
)
]
\mathrm{H}(X, Y)=-\sum_{x} \sum_{y} P(x, y) \log _{2}[P(x, y)]
H(X,Y)=−x∑y∑P(x,y)log2[P(x,y)]
其中
x
x
x 和
y
y
y 是
X
X
X 和
Y
Y
Y 的特定值,相应地,
P
(
x
,
y
)
P(x, y)
P(x,y) 是这些值一起出现的联合概率, 若为 0 ,则定义为 0 。
对于两个以上的变量,该式的一般形式为:
H
(
X
1
,
…
,
X
n
)
=
−
∑
x
1
…
∑
x
n
P
(
x
1
,
…
,
x
n
)
log
2
[
P
(
x
1
,
…
,
x
n
)
]
\mathrm{H}\left(X_{1}, \ldots, X_{n}\right)=-\sum_{x_{1}} \ldots \sum_{x_{n}} P\left(x_{1}, \ldots, x_{n}\right) \log _{2}\left[P\left(x_{1}, \ldots, x_{n}\right)\right]
H(X1,…,Xn)=−x1∑…xn∑P(x1,…,xn)log2[P(x1,…,xn)]
其中是 的特定值,相应地,
P
(
x
1
,
…
,
x
n
)
P\left(x_{1}, \ldots, x_{n}\right)
P(x1,…,xn) 是这些变量同时出现的概率,若
P
(
x
1
,
…
,
x
n
)
=
0
P\left(x_{1}, \ldots, x_{n}\right)=0
P(x1,…,xn)=0 为 0 ,则 被定义为 0 .
条件熵
条件熵 H(X|Y) 表示在已知随机变量Y的条件下,随机变量 X 的不确定性。
H
(
X
∣
Y
)
H(\mathrm{X} \mid \mathrm{Y})
H(X∣Y) 定义为在给定条件
Y
Y
Y 下,
X
\mathrm{X}
X 的条件概率分布的滳对
Y
\mathrm{Y}
Y 的数学期望:
H
(
X
∣
Y
)
=
∑
y
p
(
y
)
H
(
X
∣
Y
=
y
)
=
−
∑
y
p
(
y
)
∑
x
p
(
x
∣
y
)
log
(
p
(
x
∣
y
)
)
=
−
∑
y
∑
x
p
(
x
,
y
)
log
(
p
(
x
∣
y
)
)
=
−
∑
x
,
y
p
(
x
,
y
)
log
(
p
(
x
∣
y
)
)
\begin{aligned} H(X \mid Y) &=\sum_{y} p(y) H(X \mid Y=y) \\ &=-\sum_{y} p(y) \sum_{x} p(x \mid y) \log (p(x \mid y)) \\ &=-\sum_{y} \sum_{x} p(x, y) \log (p(x \mid y)) \\ &=-\sum_{x, y} p(x, y) \log (p(x \mid y)) \end{aligned}
H(X∣Y)=y∑p(y)H(X∣Y=y)=−y∑p(y)x∑p(x∣y)log(p(x∣y))=−y∑x∑p(x,y)log(p(x∣y))=−x,y∑p(x,y)log(p(x∣y))
交叉熵
交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。语言模型的性能通常
在信息论中,交叉熵是表示两个概率分布
p
,
q
,
p, q ,
p,q, 其中
p
p
p 表示真实分布,
q
q
q 表示非真实分布,在相同的一组事件中,其中,用非 真实分布q来表示某个事件犮生所需要的平均比特数。从这个定义中,我们很难理解交叉熵的定义。下面举个例子来描述一下:
假设现在有一个样本集中两个概率分布
p
,
q
p, q
p,q ,其中
p
p
p 为真实分布,
q
q
q 为非真实分布。假如,按照真实分布
p
p
p 来衡量识别一个样本 所需要的编码长度的期望为:
H
(
p
)
=
∑
i
p
(
i
)
⋅
log
(
1
p
(
i
)
)
\mathrm{H}(\mathrm{p})=\sum_{i} p(i) \cdot \log \left(\frac{1}{p(i)}\right)
H(p)=i∑p(i)⋅log(p(i)1)
但是,如果采用错误的分布
q
q
q 来表示来自真实分布
p
p
p 的平均编码长度,则应该是:
H
(
p
,
q
)
=
∑
i
p
(
i
)
⋅
log
(
1
q
(
i
)
)
\mathrm{H}(\mathrm{p}, \mathrm{q})=\sum_{i} p(i) \cdot \log \left(\frac{1}{q(i)}\right)
H(p,q)=i∑p(i)⋅log(q(i)1)
此时就将
H
(
p
,
q
)
\mathrm{H}(\mathrm{p}, \mathrm{q})
H(p,q) 称之为交叉熵。交叉樀的计算方式如下:
对于离散变量采用以下的方式计算:
H
(
p
,
q
)
=
∑
x
p
(
x
)
⋅
log
(
1
q
(
x
)
)
\mathrm{H}(\mathrm{p}, \mathrm{q})=\sum_{x} p(x) \cdot \log \left(\frac{1}{q(x)}\right)
H(p,q)=∑xp(x)⋅log(q(x)1)
对于连续变量采用以下的方式计算:
−
∫
X
P
(
x
)
log
Q
(
x
)
d
r
(
x
)
=
E
p
[
−
log
Q
]
-\int_{X} P(x) \log Q(x) d r(x)=E_{p}[-\log Q]
−∫XP(x)logQ(x)dr(x)=Ep[−logQ]
Python编程实现交叉熵计算
# -*-coding:utf-8-*-
# Author: WSKH
import numpy as np
def cross(M,N):
return -np.sum(M*np.log(N)+(1-M)*np.log(1-N))
M = np.asarray([0.8,0.3,0.12,0.04],dtype=float)
N = np.asarray([0.7,0.28,0.08,0.06],dtype=float)
print("M,N的交叉熵为",cross(M,N))
M,N的交叉熵为 1.6863771350635854
相对熵(KL散度)
相对熵 (relative entropy),又被称为Kullback-Leibler散度 (Kullback-Leibler divergence) 或信自散度 (information divergence),是两个概率分布 (probability distribution) 间差异的非对称性度量 。在信自理论中,相对熵等价于两个概率 分布的信自熵(Shannon entropy)的差值 。
相对熵是一些优化算法,例如最大期望算法 (Expectation-Maximization algorithm, EM) 的捑失函数, 此时参与计算的 一个概率分布为真实分布,员一个为理论 (拟合) 分布,相对樀表示使用理论分布拟合真实分布时产生的信自损耝 。
设
P
(
x
)
,
Q
(
x
)
P(x), Q(x)
P(x),Q(x) 是随机变量
X
X
X 上的两个概率分布,则在离散和连续随机变量的情形下,相对樀的定义分别为:
K
L
(
P
∥
Q
)
=
∑
P
(
x
)
log
P
(
x
)
Q
(
x
)
K
L
(
P
∥
Q
)
=
∫
P
(
x
)
log
P
(
x
)
Q
(
x
)
d
x
\begin{aligned} \mathrm{KL}(P \| Q) &=\sum P(x) \log \frac{P(x)}{Q(x)} \\ \mathrm{KL}(P \| Q) &=\int P(x) \log \frac{P(x)}{Q(x)} d x \end{aligned}
KL(P∥Q)KL(P∥Q)=∑P(x)logQ(x)P(x)=∫P(x)logQ(x)P(x)dx
这里给出一个对相对熵进行计算的具体例子。假如一个字符发射器,随机发出0和1两种字符,真实发出概率分布为A,但实 际不知道
A
\mathrm{A}
A 的具体分布。通过观粆,得到概率分布
B
\mathrm{B}
B 与
C
\mathrm{C}
C ,各个分布的具体情况如下:
A
(
0
)
=
1
/
2
,
A
(
1
)
=
1
/
2
B
(
0
)
=
1
/
4
,
B
(
1
)
=
3
/
4
C
(
0
)
=
1
/
8
,
C
(
1
)
=
7
/
8
\begin{aligned} &A(0)=1 / 2, A(1)=1 / 2 \\ &B(0)=1 / 4, B(1)=3 / 4 \\ &C(0)=1 / 8, C(1)=7 / 8 \end{aligned}
A(0)=1/2,A(1)=1/2B(0)=1/4,B(1)=3/4C(0)=1/8,C(1)=7/8
可以计算出得到如下:
K
L
(
A
∥
B
)
=
1
/
2
log
(
1
/
2
1
/
4
)
+
1
/
2
log
(
1
/
2
3
/
4
)
=
1
/
2
log
(
4
/
3
)
K
L
(
A
∥
C
)
=
1
/
2
log
(
1
/
2
1
/
8
)
+
1
/
2
log
(
1
/
2
7
/
8
)
=
1
/
2
log
(
16
/
7
)
\begin{aligned} &\mathrm{KL}(A \| B)=1 / 2 \log \left(\frac{1 / 2}{1 / 4}\right)+1 / 2 \log \left(\frac{1 / 2}{3 / 4}\right)=1 / 2 \log (4 / 3) \\ &\mathrm{KL}(A \| C)=1 / 2 \log \left(\frac{1 / 2}{1 / 8}\right)+1 / 2 \log \left(\frac{1 / 2}{7 / 8}\right)=1 / 2 \log (16 / 7) \end{aligned}
KL(A∥B)=1/2log(1/41/2)+1/2log(3/41/2)=1/2log(4/3)KL(A∥C)=1/2log(1/81/2)+1/2log(7/81/2)=1/2log(16/7)
由上式可知,按照概率分布
B
B
B 进行编码,要比按照
C
C
C 进行编码,平均每个符旦增加的比特数目少。从分布上也可以看出,实 际上
B
B
B 要比
C
C
C 更接近实际分布 (因为其与
A
A
A 分布的相对熵更小)。
Python编程实现KL散度计算
# -*-coding:utf-8-*-
# Author: WSKH
import numpy as np
import scipy.stats as ss
def KL_d(M,N):
return ss.entropy(M,N)
M1 = np.array([0.8,0.3,0.12,0.04],dtype=float)
N1 = np.array([0.7,0.28,0.08,0.06],dtype=float)
print("M1,N1的KL散度为:",KL_d(M1,N1))
M2 = np.array([0.9,0.5,0.15,0.02],dtype=float)
N2 = np.array([0.8,0.45,0.07,0.06],dtype=float)
print("M2,N2的KL散度为:",KL_d(M2,N2))
M1,N1的KL散度为: 0.009169491481994904
M2,N2的KL散度为: 0.030901989333311144
自信息和互信息
自信息
自信息是指由克劳德•夏农提出的用来衡量单一事件发生时所包含的信息量多鿒。它的单位是bit,或是nats。
假设事件
ω
n
\omega_{n}
ωn 发生的机率是
ρ
(
ω
Ω
)
\rho\left(\omega_{\Omega}\right)
ρ(ωΩ) ,自信息
I
(
ω
Ω
)
I\left(\omega_{\Omega}\right)
I(ωΩ) 的就是:
I
(
ω
n
)
=
log
(
1
P
(
ω
n
)
)
=
−
log
(
P
(
ω
n
)
)
I\left(\omega_{n}\right)=\log \left(\frac{1}{P\left(\omega_{n}\right)}\right)=-\log \left(P\left(\omega_{n}\right)\right)
I(ωn)=log(P(ωn)1)=−log(P(ωn))
因此,一个随机产生的事件所包含的信息本体数量,只与事件发生的机率相关。事件发生的机率越低,在事件真的发生时,接收到的信息中,包含的信息本体越大。
信息量的大小不同于信息作用的大小,这不是同一概念。信息量只表明不确定性的减少程度,至于对接收者来说,所获得的信息可能事关重大,也可能无足轻重,这是信息作用的大小。
互信息
称为先验概率。我们定义
x
x
x 的后验概率与先验概率比值的对数为
y
y
y 对
x
x
x 的互信息量,也称交互信息量(简称互信自)。
互信息是指信息论里一种有用的信息度量,它是指两个事件集合之间的相关性。
两个事件X和Y的互信息定义为:
I
(
X
;
Y
)
=
∑
y
∈
Y
∑
x
∈
X
p
(
x
,
y
)
log
(
p
(
x
,
y
)
p
(
x
)
p
(
y
)
)
I(X ; Y)=\sum_{y \in Y} \sum_{x \in X} p(x, y) \log \left(\frac{p(x, y)}{p(x) p(y)}\right)
I(X;Y)=∑y∈Y∑x∈Xp(x,y)log(p(x)p(y)p(x,y))
, 又可以表示成:
I
(
X
;
Y
)
=
H
(
X
)
−
H
(
X
∣
Y
)
I(X ; Y)=H(X)-H(X \mid Y)
I(X;Y)=H(X)−H(X∣Y)
=
H
(
Y
′
)
−
H
(
Y
∣
X
)
=H\left(Y^{\prime}\right)-H(Y \mid X)
=H(Y′)−H(Y∣X)
=
H
(
X
)
+
H
(
Y
)
−
H
(
X
,
Y
)
=H(X)+H(Y)-H(X, Y)
=H(X)+H(Y)−H(X,Y)
=
H
(
X
,
Y
)
−
H
(
X
∣
Y
)
−
H
(
Y
∣
X
)
=H(X, Y)-H(X \mid Y)-H(Y \mid X)
=H(X,Y)−H(X∣Y)−H(Y∣X)
≥
0
\geq 0
≥0
其中
H
(
X
,
Y
)
\mathrm{H}(\mathrm{X}, \mathrm{Y})
H(X,Y) 是联合熵 (Joint Entropy),其定义为:
H
(
X
,
Y
)
=
−
∑
p
(
x
,
y
)
log
p
(
x
,
y
)
H(X, Y)=-\sum p(x, y) \log p(x, y)
H(X,Y)=−∑p(x,y)logp(x,y)
H
(
X
∣
Y
)
\mathrm{H}(\mathrm{X} \mid \mathrm{Y})
H(X∣Y) 是条件樀 (conditional entropy),定义重属于熵的定义。
困惑度
在信息论中,perplexity(困惑度)用来度量一个概率分布或概率模型预测样本的好坏程度。它也可以用来比较两个概率分布或概率模型(比较两者在预测样本上的优劣)。低困惑度的概率分布模型或概率模型能更好地预测样本。
基于概率分布的困惑度
离散概率分布
p
\mathrm{p}
p 的困惑度由下式给出
2
H
(
p
)
=
2
−
∑
x
p
(
x
)
log
2
p
(
x
)
2^{H(p)}=2^{-\sum_{x} p(x) \log _{2} p(x)}
2H(p)=2−∑xp(x)log2p(x)
其中
H
(
p
)
\mathrm{H}(\mathrm{p})
H(p) 是该分布的樀,
x
\mathrm{x}
x 遍历事件空间。
随机变量X的复杂度由其所有可能的取值X定义。
一个特殊的例子是
k
k
k 面均匀骰子的概率分布,它的困惑度恰好是
k
。
k_{。}
k。 一个拥有
k
k
k 困惑度的随机变量有着和
k
k
k 面均匀骰子一样多的 不确定性,并且可以说该随机变量有着
k
k
k 个困惑度的取值(k-ways perplexed)。(在有限样本空间离散随机变量的概率分布中, 均匀分布有着最大的樀)
困惑度有时也被用来衡量一个预测问题的难易程度。但这个方法不总是精确的。例如:在概率分布
B
(
1
,
P
=
0.9
)
\mathrm{B}(1, \mathrm{P}=0.9)
B(1,P=0.9) 中,即取得1的 概率是
0.9
0.9
0.9 ,取得 0 的概率是
0.1
0.1
0.1 。
基于概率模型的困惑度
用一个概率模型
q
q
q 去估计真实概率分布
p
p
p ,那么可以通过测试集中的样本来定义这个概率模型的困惑度。
b
−
1
N
∑
i
=
1
N
log
b
q
(
x
i
)
b^{-\frac{1}{N} \sum_{i=1}^{N} \log _{b} q\left(x_{i}\right)}
b−N1∑i=1Nlogbq(xi)
其中测试样本
x
1
,
x
2
,
…
,
x
N
x 1, x 2, \ldots, x \mathrm{~N}
x1,x2,…,x N 是来自于真实概率分布
p
p
p 的观测值, b通常取 2 。因此,低的困惑度表示
q
q
q 对p拟合的越好,当模型
q
q
q 看到测试样本时,它会不会"是到"那么"困惑"。
我们指出,指数部分是交叉熵。
H
(
p
^
,
q
)
=
−
∑
x
p
^
(
x
)
log
2
q
(
x
)
H(\hat{p}, q)=-\sum_{x} \hat{p}(x) \log _{2} q(x)
H(p^,q)=−x∑p^(x)log2q(x)
其中
p
^
\hat{p}
p^ 表示我们对直实分布下样本点X出现概率的估计。比如用
p
(
x
)
=
n
/
N
p(x)=n / N
p(x)=n/N.