前言
混乱?不确定?还是惊讶?
熵的概念起初让人困惑,是因为用这么多词来形容它:无序、不确定、惊讶、不可预测、信息量等。如果你现在对熵还是迷惑不解,那么是时候揭开它神秘的面纱了!
大纲
- 谁发明了熵,为什么?
- 如何进行高效无损的编码
- 怎么计算平均编码长度
- 寻找最小平均编码长度
- 怎么计算熵
- 和其他类似概念的比较
- 总结
一、谁发明了熵,为什么?
1948年,克劳德-香农在他的论文“A Mathematical Theoty of Communication”首次提出了信息熵这个概念。
资源: https://en.wikipedia.org/wiki/Claude_Shannon
香农当时在寻找一种能够在不损失信息的情况下高效(率)的发送信息的方式。
香农利用平均(编码)信息长度来衡量效率,因此怎么把原始信息用尽可能小的数据结构来编码便成了首要目标,且要求信息不应该丢失。因此,目的地的解码器必须能够无损的恢复出来原始信息。
香农将熵定义为从源发送到目的地信息的无损编码的最小平均编码大小(长度)。他介绍了如何计算熵,能够有助于对信道的有效利用。
上面的介绍可能对你来说不是很明显,我们来根据一些例子来了解高效和无损的发送消息意味着什么。
二、如何进行高效无损的编码?
假设你想从东京给纽约发送一条关于今天东京天气的消息,如下图。
这样效率高吗?
在这种场景下,东京的发送端和纽约的接收端都知道沟通的消息是关于东京的天气,所以像类似于"今天"、“东京”、“天气”之类的词没必要发送。我们只需要告诉天气的具体情况就可以了。
这样是不是变短了很多?但我们能不能更进一步?
因为目前我们只需要告诉“YES”或"NO"这种二进制的信息。所以我们需要精确的1位来编码上述信息。0代表“好天气”,1代表“坏天气”。
这样是不是更短了?
是的,在只有两种可能的信息(“Fine”和“Not fine”)的情况下,我们完成了对其无损的编码和解码。
但是,我们还想知道是“多云”还是“下雨”更多的信息呢?这样1个bit是没法表达这么多情况的?
那使用2个bits呢?能解决上述问题吗?
这样我们可以表达所有情况了。只需要2 bits便可发送信息。
但是有这么一个问题,:“多云”和“下雨”多属于“坏天气”,这样一来,“坏天气”就多余了,让我们去掉它。
在上面的编码中,“好天气”的“00”中的第二个0不需要,因为当第一个数字为0的时候,就以及代表了“好天气”,且“多云”和“下雨”都是1开头,所以我们稍作更改。
所以更改后的编码,第一位表达了“好或者坏”。第二位表达了“多云或者下雨”。
但是如果东京下雪了怎么办?目前我们没法来表达“下雪”?
所以只能再增加一位,来表达“下雨”或者“下雪”之类的天气。
我们把“下雨”的编码做了变化:11 -> 110 ,增加了"下雪" :111,110和111明显不同,但为什么不用原来的11来继续表达“下雨”呢,因为在多个编码连续发送的时候,11易造成歧义,意思可能表达不明确。
举个例子,“下雨”:11,“下雪”:111。那么5-bit的“11111”既可以解码为“下雨、下雪”,也可以解码为“下雪、下雨”。所以我们用‘110’来编码“下雨”,这样‘110111’ 编码 “下雨、下雪”,‘111110'编码“下雪、下雨 ”,就不会有歧义。
所以,我们用3-bit来编码时,第一位代表“好或坏”,第二位代表“多云或其他”,第三位代表“下雨或下雪”。
举个例子,“0101110111”,代表着“好、多云、下雨、下雪”。“110010111”代表着“下雨、好、多云、下雪”。这样看起来,没有歧义,也无损且足够高效。
实际上,天气的类型不仅是这4种,在此我们只是简化下它。
至此,我们编码成功,但如果我们想知道现在的这种编码形式是不是达到了最小可能平均编码长度呢?这样就涉及到了如何计算平均编码长度?
三、如何计算平均编码长度
假设我们利用了上述的无损编码从东京发送了很多次天气信息到纽约,然后经过统计,获得了各种天气的概率分布。
接着,我们计算下发送这些信息的平均字节数。
(0.6 x 1 bit)+(0.38 x 2 bits)+(0.01 x 3 bits)+(0.01 x 3 bits)=1.42 bits
经过计算,利用上述编码形式的话,每个信息的平均编码需要1.42个bits。上述的公式也表明了,平均字节数依赖于所编码的信息的概率分布。
假设,东京更容易下雨和下雪,那么平均编码长度又会有什么变化?
(0.1 x 1 bit)+(0.1 x 2 bits)+(0.4 x 3 bits)+(0.4 x 3 bits)=2.7 bits
经过计算,我们需要2.7 bits.我们可以通过改变“下雪”和“下雨”的编码,来减小平均编码长度。
(0.1 x 3 bit)+(0.1 x 3bits)+(0.4 x 1 bits)+(0.4 x 2 bits)=1.8 bits
经过计算,1.8 bits,远小于上述的2.7 bits
尽管这种编码产生了较小的平均编码长度,但是我们的代价是失去了先前编码方案中的良好语义性。但是,我们着眼于平均编码长度,不关心编译的语义和解码的难易程度。
至此,我们学会了如何计算平均编码大小,但是怎么样的编码方案才能达到最小平均编码大小的目的呢?
四、寻找最小平均编码长度
假设我们知道了天气的概率分布,那么怎么计算对应的最小平均编码长度的编码方案呢?
“下雨”的最小编码方案是什么?需要几位?
方案1:我们用1位去编码“下雨”,那么“0”代表“下雨”。为了包含所有情况且不含歧义,至少还需要2位去表达其他信息。
在这用情况下,不是最佳的,因为“好”和“多云”更容易发生,所以我们应该给他们保留1位,来使得平均编码长度更小。用超过1位来编码“下雨”,因为它出现的频率更低。
方案2:用2位编码“下雨”。把“下雨”和“好”做个交换。
但这样还是存在着和方案一相同的问题:用更多的bits去描述更容易出现的类型(如多云,用 3bits来描述)
方案3:用3位编码“下雨”。把“多云”和“下雨”做一交换。这样我们得到了最小平均编码长度。
(0.5 x 1 bit)+(0.25 x 2bits)+(0.125 x 3 bits)+(0.125 x 3 bits)=1.75 bits
方案4:用4位编码“下雨”。这样编码就会变得冗余。所以,用3 bits 编码最合适。但是回顾整个流程,我们经过了很多次试错才找到了最终的答案。那有没有其他方法更容易找到答案呢?
那么问题转化为:给定概率分布,是否存在简单的方法来计算无损的平均编码长度的最小值?也就是我们如何计算熵?
五、怎么计算熵?
假设我们有8种消息类型,且每种都是等可能性发生。那么在不含歧义的情况下,去编码它们需要的最小字节数是多少?
面对八种不同的情况,我们需要多少bits去编码?
1 bit可以编码0或1(2个值)。2 bits可以编码4个值。3 bits可以编码8个值,3 bits = 2x2x2 = 8 (000, 001, 010, 011, 100, 101, 110 and 111)。
如果我们减少位数,那么就会造成歧义。如果增加位数,那么就会造成冗余。实际上,如果我们有N个不同的取值,需要用bits来表达的话,那么只需要
bits就可以,不必超过更多了。
举个例子,
换句话说,如果一个消息类型在N次中发生了1次,那么上述的式子就给出了其最小编码长度。假设 P=1/N,则其代表了消息发生的概率,那么上式也可以这么表达:
让我们结果之前的知识,计算最小平均编码长度(以bits为单位),也就是熵:
P(i)是第i个消息类型的概率。 您可能需要坐下来思考这个公式的简洁性和美感。 其实这个公式并没有魔力,我们仅使用每种消息类型的最小编码大小来计算平均编码大小。
继续用上述天气的例子来加深我们的理解。
所以,其最小平均编码长度(也就是熵):
(0.5 x 1 bit)+(0.25 x 2 bits)+(0.125 x 3 bits)+(0.125 x 3 bits)=1.75 bits
六、和其他类似概念的比较
熵有很多类比:无序,不确定,惊讶,不可预测,信息量等等。
如果熵很高(平均编码长度很大),则意味着有许多具有小概率的消息类型。因此,每次新消息到达时,与以前的消息类型相比都不同。您可能会将其视为无序或不确定性或不可预测性。
如果某消息类型的概率比其他消息类型小得多,则会出现意外情况,因为平均上来说,你会期望其他更频繁发送(概率更高)的消息类型。
此外,罕见的消息类型比更频繁的消息类型具有更多信息,因为它消除了其他可能性并告诉我们更具体的信息。
在天气预报中,发送"下雨”(”下雨“”的概率分布为12.5%),我们将概率分布(“好,多云,下雪”)的不确定性降低了87.5%,前提是我们之前没有信息。如果我们发送“好”(50%),我们只会将不确定性降低50%。
如果熵高,则平均编码长度明显是长的,这意味着每个消息倾向于具有更多(特定)信息。同样,这就是高熵与无序,不确定性,惊讶,不可预测性,信息量相关的原因。
低熵意味着我们大多数时候都会收到更可预测的信息,这意味着*更少的无序, 更少的不确定性, 更少的惊喜, 更多的可预测性和 更少(特定)的信息。
我希望这些类比不再让你感到困惑。
七、总结
本文首先介绍了信息熵概念的提出,以及如何计算它。
接着以天气的例子说明了如果无损和高效的编码信息,怎么计算编码长度,然后到计算平均编码长度。
接着,又经过多次试错最后找到了最小平均编码长度的编码方案。
然后,怎么快速的找到最小的平均编码长度,也就是让随机过程中的每个事件的编码最小,你的整体肯定会最小。
最后说明了高熵和低熵以为这什么。
通过本文,我们收获了:
- 信息熵的概念,提出它的动机。
- 计算熵
- 某事件的熵
- 某随机过程的熵(加权平均)
- 给定了概率分布,计算其最小编码长度
- 高熵:混乱、无序、难以预测、更多不确定性、惊喜
- 低熵:更少的无序、更稳定、更易预测。(最小化交叉熵,意味着更容易去做预测)
参考链接:https://medium.com/activating-robotic-minds/demystifying-entropy-f2c3221e2550