面向程序员的信息量、信息熵和交叉熵的直观解释
信息量、信息熵、交叉熵是非常重要的数学概念。它们非常重要,相关书籍和资料也很多,不过都不够友好——世上的事情总是如此,你尚不理解的,对于你而言太难;而你已然理解的,对你而言又太过简单。
所以很难有适合所有人的学习资料。这是我以程序员的视角,向自己介绍这几个相关概念。
这篇笔记题目起得太大,不是面向程序员的直观解释,而是面向我这个程序员的直观解释。
信息量
考虑一个抛硬币的游戏:抛出一个硬币,问表示这个事件发生的结果,最多需要几个比特?显然,一个比特位就够了(\(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个比特位,如果逐一确定这里的四个比特位分别是多少,我们共需要测试四次。