【机器学习】信息论基础

文章目录


基本概念

联合熵

联合熵是一集变量之间不确定性的衡量手段。

两个变量 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)=∑x​p(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] −∫X​P(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∈X​p(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−∑x​p(x)log2​p(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=1N​logb​q(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)log2​q(x)
其中 p ^ \hat{p} p^​ 表示我们对直实分布下样本点X出现概率的估计。比如用 p ( x ) = n / N p(x)=n / N p(x)=n/N.


上一篇:JS 闭包


下一篇:js 面试题总结