面向程序员的信息量、信息熵和交叉熵的直观解释
信息量、信息熵、交叉熵是非常重要的数学概念。它们非常重要,相关书籍和资料也很多,不过都不够友好——世上的事情总是如此,你尚不理解的,对于你而言太难;而你已然理解的,对你而言又太过简单。
所以很难有适合所有人的学习资料。这是我以程序员的视角,向自己介绍这几个相关概念。
这篇笔记题目起得太大,不是面向程序员的直观解释,而是面向我这个程序员的直观解释。
信息量
考虑一个抛硬币的游戏:抛出一个硬币,问表示这个事件发生的结果,最多需要几个比特?显然,一个比特位就够了(\(2^1=2\)),比如规定:
1
: 代表正面0
: 代表反面
让我们整理一下这里的术语:
- 随机事件:表示一次抛硬币的事件,要么正面朝上,要么反面朝上,只能是其中之一。
- 随机变量:表示一个变量,其值是各个随机事件。对于抛硬币来说,可能是正面朝上,也可能是反面朝上。
- 编码:用数字来对随机事件进行唯一编号。
- 比特:计算机术语,一个存储位,可以表示两种情况。可以用灯来比喻。
我们重新描述一下上面的问题:
用随机变量\(X\)表示一次抛硬币的结果。我们可以用1
来编码正面朝上这个随机事件,用0
来编码反面朝上这个事件。需要分配1
个比特位(一盏灯)就足够了。
如果硬币被人做了手脚,必然正面朝上,那么对于这种必然事件,我们连一个比特位都不需要分配,即需要0
个比特。
同理,如果硬币被人做了手脚,必然反面朝上,我们也不需要分配任何比特位,即需要0
个比特。。
如果你的数学直觉足够好,你可能会意识到,要编码上面丢硬币的结果,需要的比特数和随机事件发生的概率有关:
- 当硬币是正面朝上和反面朝上的概率均是50%时,我们需要1个比特;
- 而当正面朝上是100%的概率时,我们需要0个比特;
- 而当反面朝上是100%的概率时,我们也需要0个比特;
- 如果我们把比特从整数扩展到实数,当正面朝上和反面朝上的概率取其它值时,需要几个比特来编码结果?从直觉上,我们可以猜测,需要的比特数应该介于\((0,1)\)之间。
甚至,我们可以猜测:
- 当概率构成是
(0.5, 0.5)
时,我们所需要的1
个比特有一半分给了编码正面朝上、另一半分给了反面朝上。 - 而当概率构成是
(1.0, 0.0)
时,正面朝上是必然事件,无需比特进行编码;反面朝下也是必然事件,也无需比特进行编码。 - 而当概率构成是
(0.0, 1.0)
时,正面朝下是必然事件,无需比特进行编码;反面朝上也是必然事件,也无需比特进行编码。 - 当概率构成是
(p, 1-p)
时,这个需要的比特量里有一部分被分给了对正面朝上编码,另一部分属于反面朝上进行编码。至于这个构成是多少,我们留待下面进行更多的探究。
再考虑需要的比特量稍大一点的情况。已知有一个随机整数,取值范围是\([1,16]\)。那么表示这个数到底是多少,需要几个比特?显然,\(2^4=16\),也就是需要4个比特。这个问题也可以换个角度观察:由于有4个比特位,如果逐一确定这里的四个比特位分别是多少,我们共需要测试四次。
或者采用等价的做法——使用二分法:
- 这个数大于8吗? 是
- 这个数大于12吗? 是
- 这个数组大于14吗? 否
- 这个数组大于13吗? 否
到这一步,我们可以唯一确定答案是13
这意味着,对于一个随机变量\(X\),取值范围是\(N\)个随机事件之一:\({{x_1, x_2, ..., x_N }}\)。我们可以用二进制对事件种类分别进行编码,显然这\(N\)个事件需要 \(log_2 N\) 个比特。含有的比特量越多,能编码的事件种类越多。
既然我们说,需要的比特量和概率有关,我们不妨把上面的N
替换成概率形式:
\[
\text{需要的存储空间} = log_2 N = log_2 (\frac{1}{P}) = -log_2 P
\]
信息学给它起了一个专业术语,叫“信息量”——表示编码随机事件\(x_i\)发生时需要的比特数。如果我们把随机事件\(x_i\)发生的概率表示为\(P(x_i)\),则随机事件\(x_i\)发生后的信息量\(I(x_i)\)被定义为:
\[
I(x_i) = - log_2 P(x_i)
\]
举个例子,对于等可能的丢硬币过程,
- 编码正面朝上(概率为
0.5
)这个随机事件,需要的信息量(比特数)=\(-log_2{0.5}=1\) - 编码反面朝上(概率为
0.5
)这个随机事件,需要的信息量(比特数)=\(-log_2{0.5}=1\)
特别的,对于概率为1
的随机事件,需要的信息量(比特数)=\(-log_2{1}=0\)。
你可能会想,编码正面朝上需要1
个比特,编码反面朝上也需要1
个比特,那么编码正面朝上或者编码反面朝上这两个事件,需要几个比特? 这就引出了“信息熵”的概念。
我上面说“如果你的数学直觉足够好”是在开玩笑,第一个意识到这个问题的人叫香农,正是他开创了“信息论”这门学科。
信息熵
对于离散随机变量\(X\),其取值为 \({x_1,x_2,...,x_n}\),我们把信息熵定义为随机变量\(X\)各可能取值对应的信息量的加权平均:
\[
H(X)=−\sum_i P(x_i) log_2 P(x_i)
\]
一言以蔽之,信息量衡量的是单个随机事件的不确定性(或信息含量)。信息熵是整个事件空间包含的平均信息量,即从所有可能的事件的信息量的期望角度,度量整个系统的不确定性。
这个公式看起来面目可憎。让我们仍然考虑抛硬币游戏,理解这里的含义:表达正面朝上和反面朝上这两个随机事件结果构成的信息空间,其信息熵计算方式如下:
- 正面朝上这个随机事件的信息量= \(-log_2{0.5}=1\),即需要
1
个比特 - 反面朝上这个随机事件的信息量= \(-log_2{0.5}=1\),即需要
1
个比特 - \( X={ \text{正面朝上}, \text{反面朝上} } \) 这个随机变量的信息熵,是用概率作为权重对这两个随机事件信息量的加权平均= \( 0.5 \cdot 1 + 0.5 \cdot 1 = 1 \) ,即最终也只要1个比特的存储空间。
信息熵的极值
信息熵是对一个随机变量 \(X\)多个可能取值情况下的平均信息量的度量。
为了考察多个事件发生的概率取值对信息熵的影响,我们先只考虑其中两个事件的情况 \({x_1, x_2}\):
\[
H(X)= - (P(x_1) log_2 P(x_1) + P(x_2) log_2 P(x_2))
\]
表示随机变量\(X\)在取值\(x_1\)或\(x_2\)的平均信息量。
如果这两个事件的总概率是一个定值,我们将其记成\(C\),同时简化一下记号把 \(P(x_1)\)记成p
,则写成:
\[
P(x_2) = C - p
\]
那么信息熵可写成
\[
H(X)= - (p log_2 p + (C - p) log_2 (C - p))
\]
则其偏导为
\[
\frac{\partial H(X)}{\partial p}= - ( log_2 p + p \frac{1}{p} + (C - p) \frac{1}{C-p} (-1) + (-1) log_2(C-p) ) = log_2 \frac{C - p }{p}
\]
令偏导为0,则\(log_2 \frac{C - p }{p} = 0\),则\(\frac{C - p }{p} = 1\),进而\(p = \frac{1}{2}\)。意味着当 \(P(x_1)\) 和\(P(x_2)\)相等时,事件\(x_1\)和事件\(x_2\)的信息熵取到极值。可以通过单调性分析发现,这个极值是最大值。
这个结论不止对随机变量中\(X\)的任意两个随机事件\({ x_1, x_2}\)成立,可以证明,对任意多个事件\({x_1,x_2,...,x_n}\),当其各随机事件发生概率相等,信息熵\(H(X)\)将达到最大值。
在物理学里有个熵的概率,热力学的熵表示系统的混乱程度或无序程度,而信息熵表示信息系统的无序程度。
考虑有一个二元分类情况,输出阳性或者阴性两种预测结果。在未经过任何特征测试之前,我们可能会假设阳性和阴性的可能性各为50%。在经过特征测试后,我们会调整我们的预测输出——比如,把阳性结果概率上调到80%。
从信息论的角度来说,这里输出概率变化的过程,减低了系统的不确定性,降低了信息熵。 决策树模型中,我们希望随着我们的划分进度的推进,新系统的分类情况越来越清晰明了,也就是系统不确定性越来越小——信息熵越来越小。
交叉熵
假设随机变量\(X\)真实的概率分布为\(P(X)\),在实际中,我们会为之假设一个估计的概率分布\(Q(X)\),那么怎么在数学上衡量我们的估计的概率分布准不准?
一种策略是,用K-L散度
(Kullback-Leibler divergence
)来衡量两个分布的差异:
\[
D_{KL}(P || Q) = \sum_{i=1}^{n} P(x_i) log \frac{P(x_i)}{Q(x_i)}
\]
当两个分布完全一致,\( D_{KL}(P || Q)\)为0
。
对上式进行变形,可以得到,
\[
D_{KL}(P || Q) = \sum_{i=1}^{n} P(x_i) log \frac{P(x_i)}{Q(x_i)} \\
= \sum_{i=1}^{n} P(x_i)logP(x_i) - \sum_{i=1}^{n} P(x_i) log Q(x_{i})
\]
这里分解出的两部分,前者是信息熵的负数,后者被称之为交叉熵。由于给定的信息系统的概率分布是确定、不变的,所以其信息熵可以视作为常量,所以只需要考虑后部分的交叉熵即可:
\[
H(P,Q) = - \sum_{i=1}^{n} P(x_i) log Q(x_{i})
\]
交叉熵在机器学习中非常重要,经常被用作分类场景下的损失函数。它的取值越小,意味着分类系统估算的概率分布和真实的概率分布越贴近。
这里的真实概率由训练集预先提供的数据得到,而预测值\(Q(x_i)\)是由我们的预测系统输出得到——在一个机器学习/深度学习过程中,会反复调整权重参数,直至这里的损失函数取到最小值。一旦达成学习目标,也就意味着我们的分类系统预测出的概率分布和真实的概率分布比较接近。
联合熵
信息熵表示单个随机变量在事件空间熵的混乱程度;如果把信息熵推广到多个随便变量,就有了联合熵。其物理意义是,观测多个变量的随机过程所获得的信息量。
比如,对于二元随机变量构成的系统,其信息熵为:
\[
H(X,Y)=−\sum_i −\sum_i P(x_i, y_i) log_2 P(x_i, y_i)
\]
\(P(x_i, y_i)\)表示联合概率。
既有宏观视野,又兼顾微观细节。
?励志类评语?
文字流畅如丝,语言优美动人,读来令人心旷神怡。