信息量、信息熵、交叉熵是非常重要的数学概念。它们非常重要,相关书籍和资料也很多,不过都不够友好——世上的事情总是如此,你尚不理解的,对于你而言太难;而你已然理解的,对你而言又太过简单。

所以很难有适合所有人的学习资料。这是我以程序员的视角,向自己介绍这几个相关概念。

这篇笔记题目起得太大,不是面向程序员的直观解释,而是面向我这个程序员的直观解释。

信息量

考虑一个抛硬币的游戏:抛出一个硬币,问表示这个事件发生的结果,最多需要几个比特?显然,一个比特位就够了(\(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个比特的存储空间。

二分法猜数字的信息论视角

让我们回过头来看上面的二分法猜数字游戏:已知有一个随机整数,取值范围是\([1,16]\)。那么表示这个数到底是多少,需要几个比特?

  1. 首先,我们可以准确知道,编码这个数字可能的事件空间,需要4个比特。
  2. 其次,我们测试它的首个比特是0还是1。不管结果如何,都会确定1个比特的信息量。在测试完成之后,我们的目标系统发生了更新,表述可能性的事件空间“缩小”了,只剩下了3个比特。
  3. 如此递归测试,每次都会带来1个比特的信息量(或者说减少了1个比特的不确定性)。
  4. 随着我们不停测试,不确定性越来越小,直至全部的比特都测试完。

交叉熵

随机变量\(X\)的概率分布可以理解成每个事件的该率函数。假设随机变量\(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

这其实是一种损失函数的视角——当我们的估计和实际概率分布完全一致,损失为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)\)是由我们的预测系统输出得到——在一个机器学习/深度学习过程中,会反复调整权重参数,直至这里的损失函数取到最小值。一旦达成学习目标,也就意味着我们的分类系统预测出的概率分布和真实的概率分布比较接近。

标签: 信息量, 信息熵, 交叉熵, 相对熵, 机器学习, 深度学习

已有 3 条评论

  1. 既有宏观视野,又兼顾微观细节。

  2. ?励志类评语?

  3. 文字流畅如丝,语言优美动人,读来令人心旷神怡。

添加新评论