在1948年,Glaude Shannon发表了文章《A Mathematical Theory of Communication》首次提出了革命性的概念“信息熵”。
物理中的熵
熵也是物理中的一个概念。简单来说,如果一个系统中的粒子在运动过程中有很多可能的位置,那么这个系统具有比较高的熵值,反之,如果系统中的粒子处于静止状态(粒子的位置相对固定),则系统具有很低的熵值。
例如,水有三种状态:固液气,具有不同的熵值。冰中的分子位置固定,是一个稳定的状态,所以冰具有最低的熵值。水中的分子相对可以进行一些移动,所以水具有中间大小的熵值。水蒸气中的分子几乎可以移动到任何地方,所以水蒸气具有最大的熵值。
但是这个和信息论有什么关系呢?答案需要通过研究“知识”和“概率”来说明。
熵和知识
为了使用概率来介绍熵的概念,这篇文章中我们将用这样一个例子加以说明:有三个桶,每个桶里面有四个小球,每个桶里面的小球的颜色分布如下:
- 桶1:4个红色小球
- 桶2:三个红色小球,1个蓝色小球
- 桶3:两个红色小球,2个蓝色小球
我们将通过从桶里面取出小球的颜色来判断我们可以获得多少知识。结论如下:
- 在第一个桶中,我们可以确定取出来的所有小球颜色都是红色的;
- 在第二个桶中,取出红色小球的概率是75%,取出蓝色小球的概率是25%;
- 在第三个桶中,取出红色小球的概率是50%,取出蓝色小球的概率是50%.
所以,我们可以说桶1给出了关于小球颜色最多的知识(因为我们确定地知道所有小球都是红色),桶2给出了部分知识,而桶3给出了最少量的知识。熵和知识类似,但是却刚好相反。所以,桶1具有最小的熵,桶2次之,桶3具有最高的熵。
我们需要一个公式定量地表示熵,为了找到这样一个公式,我们需要使用概率。
熵和概率
现在的问题是如何创造出一个公式对于桶1中的4个红球具有较低的值,对于桶2中的三个红球1个蓝球具有中等的值,对于桶3中的2个红球和2个蓝球具有较高的值?首先,我们需要记住熵的定义:一个系统中的粒子具有很大的可重新排列的可能性,系统具有较高的熵;反之,具有较低的熵。所以,我们首先计算桶中的球可以重新排列的可能情况。对于桶1,只有一种可能性;对于桶2,有两种可能性;对于桶3,有六种可能。这个可以通过二项式系数计算得到(1,4,6,1)。
对于小球排列情况的计算并不是熵公式的一部分,但是我们可以发现,有越多排列的可能性,则其熵越大;有越少的排列的可能性,则其熵越小。在下一节,我们将会构造熵的计算公式。基本思想通过考虑以某种确定的方式从每个桶中取出特定颜色排列的小球的概率。
熵和有趣的小球实验
现在我们正式开始通过下面的游戏发现用于计算熵的公式。可以提前剧透一下:通过游戏获胜的概率,我们可以得到熵的定义公式。
在这个游戏中,我们给定三个桶。游戏规则如下:
- 首先我们选择一个桶;
- 以某种颜色排列取出该桶里面的小球,然后将小球放回;
- 每次从该桶中取出一个小球并记录颜色,并放回;
- 四次以后如果记录的颜色和2中的颜色排列一致,则我们获胜,可赢得1,000,000人民币,否则游戏失败。
这个听起来可能有些负责,但是实际很简单。举个例子,比如我们选择桶2,里面有三个红球,一个蓝球。我们从桶里面以某种特定的排列取出小球,比如说(红,红,红,蓝)这个颜色排列。然后我们开始一次一次从桶里面取一个小球,如果四次以后,我们取出来的颜色排列也是(红,红,红,蓝)这个组合,我们获胜。那么我们获胜的概率是多少呢?
- 第一次取出红球的概率是3/4,即0.75;
- 第二次取出红球的概率是3/4(我们每次都是有放回的取出);
- 第三次取出红球的概率仍然是3/4;
- 第四次取出蓝球的概率是1/4,即0.25。
这四次操作都是独立事件,独立事件同时发生的概率使用乘法公式即:(3/4)∗(3/4)∗(3/4)∗(1/4)=27/256(3/4)∗(3/4)∗(3/4)∗(1/4)=27/256,即0.105。这是一个很小的概率。下面的图给出了我们使用每个桶想要获胜的概率。
为了方面说明,下面的图给出了使用每个桶获胜的概率。对于桶1,获胜的概率为1;对于桶2,概率为0.105;对于桶3,概率为0.0625.
三个桶获胜的概率总结如下表:
这样我们就可以定量评价使用三个桶获胜的情况。游戏获胜的概率为:
- 桶1为1
- 桶2为0.105
- 桶3为0.0625
为了得到熵的计算公式,我们需要一个大小相反的度量,对于桶1有最小值,对于桶2有一个中间的值,对于桶3有最大值。这个很简单,我们可以使用对数进行处理得到我们想要的结果。
将连乘转变为连加
下面的处理使用了很简单的数学技巧,特别是在机器学习中使用的比较广泛。连乘一般都不会得到一个比较好的结果。这里我们有四个数字,每个都不是特别差,但是如果我们有一百万个数据点,这一百万个概率的连乘会得到一个怎么样的结果?可想而知是特别特别地小。一般我们要尽可能地避免连乘。什么比连乘好呢?当然是连加。我们如何将连乘转变为连加呢?对,使用对数函数,因为下面的恒等式特别有用:
log(ab)=log(a)+log(b)log(ab)=log(a)+log(b)
我们有四个概率的连乘,使用对数以后,可以变为四个数字的连加。对于桶2(三个红球,一个蓝球的排列),我们有如下的计算过程:
0.75∗0.75∗0.75∗0.25=0.105468750.75∗0.75∗0.75∗0.25=0.10546875
通过使用对数变换(为了,使得结果是正数,这里在对数前面添加了一个负号),我们有:
−log2(0.75)−log2(0.75)−log2(0.75)−log2(0.25)=3.245−log2(0.75)−log2(0.75)−log2(0.75)−log2(0.25)=3.245
现在,只剩下最后一步了。为了对结果进行规范化,我们对该结果取平均。这就是我们要找的熵的静思园公式了!对于桶2,其熵为0.811.
14(−log2(0.75)−log2(0.75)−log2(0.75)−log2(0.25))=0.81114(−log2(0.75)−log2(0.75)−log2(0.75)−log2(0.25))=0.811
如果我们计算桶1的熵,可以得到:
14(−log2(1)−log2(1)−log2(1)−log2(1))=014(−log2(1)−log2(1)−log2(1)−log2(1))=0
桶3的熵为:
14(−log2(0.5)−log2(0.5)−log2(0.5)−log2(0.5))=114(−log2(0.5)−log2(0.5)−log2(0.5)−log2(0.5))=1
至此,我们已经找到了熵的定义公式:对概率对对数的负值。注意到桶1具有最低的熵,桶3具有最高的熵,桶2居于中间。总结如下:
对于更通用的公式,我们可以总结如下:假设我们的桶里有mm个红球和nn个蓝球,则:
Entropy=−mm+nlog2(mm+n)+−nm+nlog2(nm+n)Entropy=−mm+nlog2(mm+n)+−nm+nlog2(nm+n)
多类别熵
目前为止我们处理了连个类别的熵(红色和蓝色)。为了使得熵和信息论关联起来,我们有必要看一些多个类别的情况。这里为了是情况更加清晰一些,我们使用字母来进行说明。假设我们有三个桶,每个桶里面有8个字母。桶1中的字母是AAAAAAAA,桶2中的字母是AAAABBCD,桶3中的字母是AABBCCDD。我们可以很直观地感受到桶1中的熵最小,但是桶2和桶3的却并不是很明显。我们下面通过计算知道桶3具有最高的熵值,桶2熵值居中。
对于多个类别的可以推广我们对于熵的定义如下:
Entropy=−∑i=1npilog2piEntropy=−∑i=1npilog2pi
公式中的nn是类别数,pipi是第ii个类别出现的概率。对于我们的三个桶,我们有如下分析:
对于桶1,只有一个类别(字母A),出现的概率肯定是1,所以熵值为:
Entropy=−1log2(1)=0Entropy=−1log2(1)=0
对于桶2,我们有四个类别(字母A,B,C和D),A出现的概率是4/8,B的概率是2/8,C的概率是1/8,D的概率是1/8。所以熵值为:
Entropy=−48log2(48)−28log2(28)−18log2(18)−18log2(18)=1.75Entropy=−48log2(48)−28log2(28)−18log2(18)−18log2(18)=1.75
对于桶3,我们也有四个类别(字母A,B,C和D),每个字母出现的概率都是1/4,所以:
Entropy=−28log2(28)−28log2(28)−28log2(28)−28log2(28)=2Entropy=−28log2(28)−28log2(28)−28log2(28)−28log2(28)=2
对于三个桶,我们总结如下:
更有趣的在下面,这儿就是信息论发挥作用的地方。
信息论
下面还有一种方式来理解熵。我们还是以从桶中随机取出字母为例。我们要判断从桶中取出的字母平均需要提出多少个问题?(假设有一个人从桶里取字母,另外一个人通过提问得到取出来的是哪个字母)
首先看最简单的情况。对于桶1,我们可以确信取出来的肯定是A。所以我们不用提出任何问题就可以知道从桶里面取出来的字母是什么。用公式简单表示如下:
Average Number of Questions=0Average Number of Questions=0
对于桶3和桶4,可能有人认为通过四个问题可以知道到底取出来的是什么字母。这四个问题如下:
- 是不是字母A?
- 是不是字母B?
- 是不是字母C?
- 是不是字母D?
其实,这四个问题是有冗余的,因为如果前面三个问题的答案如果是“NO”的话,那么我们肯定知道取出来的屙屎字母D。所以三个问题足够了,但是我们可以做得更好吗?我们提出的问题需要消除冗余。我们可以这样改进我们的提问:
- 该字母是A或者B?
- 如果1的回答是“YES”,继续提问是否是字母A?如果1的回答是“NO”,继续提问是否是字母C?
如果这样提问,只需要基于两个问题就可以得到答案:
- 对于YES,YES的回答,则取出来的是A
- 对于YES,NO的回答,则取出来的是B
- 对于NO,YES的回答,则取出来的是C
- 对于NO,NO的回答,则取出来的是D
以树状结构表示如下:
对于桶3,每个字母出现的概率都是1/4,所以为了找出取出来的字母平均提问的个数应该为2。计算如下:
Average Number of Questions=14⋅2+14⋅2+14⋅2+14⋅2=2Average Number of Questions=14⋅2+14⋅2+14⋅2+14⋅2=2
对于桶1,我们如果使用桶3的提问策略,当然得出的结果也是2,然而我们可以做得更好。我们可以首先提问是不是A,然后问是不是B,然后再问是不是C。
这样我们的提问顺序如下:
- 如果是字母A,则我们只用了1次提问
- 如果是字母B,则我们只用了2次问题
- 如果是字母C或者D,则我们只用了3次提问
对于是字母C和D,我们3次提问超出了对于桶2的提问策略,但是平均来看,我们可能做得更好。桶3有字母AAAABBCD,A出现了一半,B出现了1/4,C和D都出现了1/8。平均提问次数为:
Average Number of Questions=12⋅1+14⋅2+18⋅3+18⋅3=1.75Average Number of Questions=12⋅1+14⋅2+18⋅3+18⋅3=1.75
总结如下:
这就是熵!熵和信息论就是这样关联起来的。如果我们想要找出从桶里取出来的字母,平均需要提出问题的个数就是熵的值。
当然,这引出了更大问题:我们如何确定我们提问的方式是最可能好的?如果提问的方式不是太明显,当然需要做更多的工作。