揭开“熵”的神秘面纱

如题所述

第1个回答  2022-07-12

混乱?不确定?还是惊讶?

熵的概念起初让人困惑,是因为用这么多词来形容它:无序、不确定、惊讶、不可预测、信息量等。如果你现在对熵还是迷惑不解,那么是时候揭开它神秘的面纱了!

1948年,克劳德-香农在他的论文“A Mathematical Theoty of Communication”首次提出了 信息熵 这个概念。

香农当时在寻找一种能够在 不损失信息 的情况下 高效(率) 发送信息 的方式。

上面的介绍可能对你来说不是很明显,我们来根据一些例子来了解高效和无损的发送消息意味着什么。

假设你想从东京给纽约发送一条关于今天东京天气的消息,如下图。

这样效率高吗?

在这种场景下,东京的发送端和纽约的接收端都知道沟通的消息是关于东京的天气,所以像类似于"今天"、“东京”、“天气”之类的词没必要发送。我们只需要告诉天气的具体情况就可以了。

这样是不是变短了很多?但我们能不能更进一步?

因为目前我们只需要告诉“YES”或"NO"这种二进制的信息。所以我们需要精确的1位来编码上述信息。0代表“好天气”,1代表“坏天气”。

这样是不是更短了?

是的,在只有 两种可能 的信息(“Fine”和“Not fine”)的情况下,我们完成了对其无损的编码和解码。

但是,我们还想知道是“多云”还是“下雨”更多的信息呢?这样1个bit是没法表达这么多情况的?

那使用2个bits呢?能解决上述问题吗?

这样我们可以表达所有情况了。只需要2 bits便可发送信息。

但是有这么一个问题,:“多云”和“下雨”多属于“坏天气”,这样一来,“坏天气”就 多余 了,让我们去掉它。

所以更改后的编码,第一位表达了“好或者坏”。第二位表达了“多云或者下雨”。

但是如果东京下雪了怎么办?目前我们没法来表达“下雪”?

所以只能再增加一位,来表达“下雨”或者“下雪”之类的天气。

我们把“下雨”的编码做了变化: 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来表达的话,那么只需要

举个例子,

换句话说,如果一个消息类型在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

相似回答