【翻译】图解信息论

我很喜欢那种获得一种新的方式来思考我们的世界时的那种感觉。尤其是在一些模糊的想法变成一个具体的概念的时候。信息论就是这样一种把模糊的概念具象化的典型的例子。

信息理论为我们描述很多事情提供了准确的语言。关于某个问题我到底有多不确定?问题A的答案会告诉我们多少关于问题B的答案的信息?一组信息和另一组信息的相似度如何衡量?在我小的时候,我就已经形成了一些关于这些问题的模糊的想法,但是信息论将我的这些想法形成了精确的强大的理论。这些理论有着巨大的应用范围,例如数据压缩、量子物理学、机器学习以及其他更广泛的领域。

不过,信息论看起来似乎有些不容易理解,但我不认为信息论应该是这样难以理解的。事实上,信息论中许多核心理论都可以完全用图解的方式来解释!

可视化概率分布

在我们深入信息理论之前,让我们考虑一下如何可视化简单的概率分布。

我住在加利福尼亚州。有些时候这里是下雨天,但大多数时间里这里都是晴天!我们假设有75%的时间是晴天。我们很容易就可以将这些信息可视化的展示出来:

大多数的时间,我都穿T恤衫,但在某些时间,我会穿外套。那么假设我38%的时间里是穿外套的。可视化这个信息也很容易:

如果我想将这两件事同时可视化该怎么做呢?如果这两件事情相互不影响(相互独立),那么这很容易做到。例如,我穿T恤或者外套与下一周的天气并不相关。我们可以通过两个轴分别表示两种不同的变量的方式来可视化这些信息:

请注意水平方向和竖直方向上穿过的直线。这就是独立性的标识!我穿外套的概率并不受那一周天气都是下雨天而改变。换句话说,在下周要下雨并且我恰好也穿外套的概率,是我穿外套的概率与下雨天的概率之积。它们互不影响。

当变量之间相互作用时,对于某组相互排斥的变量而言,他们组成的概率会减少;而某组相互促进影响的变量而言,他们组成的概率会增加。对于在下雨天我穿外套的这种情况,会有额外的概率增加,因为下雨天和外套这两个变量是相关的,它们使得彼此之间更有可能发生。在下雨天我穿外套的概率,比我在其他某天穿外套的概率高。

可视化之后,这些看起来有肿胀的部分是因为额外增加的概率导致的,而其他收缩的部分,是因为这一对事件不太可能同时出现。

这张图虽然这看起来很酷,但对于理解具体发生了什么并不是很有帮助。

相反,让我们焦点集中在其中的某一个变量上,例如天气。我们知道某天是晴天或者下雨天的可能性。对于是否穿外套的两种情况,我们可以看看条件概率。我在晴天穿外套的可能性有多大?如果是下雨天,那么我穿外套的可能性又是多大?

有25%的时间是下雨天。如果是下雨天,那么有75%的可能性我会穿外套。所以,我在下雨天穿外套的概率是25%乘以75%,结果大约是19%。下雨天的概率乘以我在下雨天的情况下穿外套的概率,就是在所有情况下,天气为下雨天并且我穿外套的概率。我们用这样的式子来描述:

$$
p(\text{rain}, \text{coat}) = p(\text{rain}) \cdot p(\text{coat} ~|~ \text{rain})
$$

这就是概率论的最基本的定理之一:

$$
p(x,y) = p(x)\cdot p(y|x)
$$

我们把一个整体的概率拆分成两部分来看。首先,我们来看其中一个变量的概率的值,例如不同天气的概率。然后我们观察另一个变量,例如我的穿衣情况,观察它在第一个变量的条件下的概率。

具体选择哪个变量开始,是任意的。我们可以以我的穿衣情况为第一个被观察的条件,这也许会有点不直观,因为我们知道穿衣情况是受到天气情况影响的,而天气情况并不会受到我的穿衣情况影响的…但其实这里两种方式的效果是一样有效的!

让我们来看一个例子。我已经知道穿外套的概率是38%。假设我已经知道我在某一天是穿外套的,那么这一天下雨的概率有多大呢?我在下雨天比在晴天穿外套的可能性更大,但在加州是很少下雨的,所以有50%的概率这一天是下雨天。因此,某天是雨天并且我穿了外套的概率就等于我穿外套的概率(38%)乘以我穿外套的情况下是下雨天的概率(50%),结果大约是19%。

$$
p(\text{rain}, \text{coat}) = p(\text{coat}) \cdot p(\text{rain} ~|~ \text{coat})
$$

这为我们提供了第二种来可视化这些概率分布的方法:

注意,这里的标签与之前图中稍有不同:T恤和外套现在是边际概率,我穿外套的概率是不需要考虑天气情况的。另一方面,现在有两个雨天和晴天的标签,分别来标识我穿T恤情况下的概率和我穿外套情况下的概率。

你可能已经听说过贝叶斯定理。其实你也完全可以使用贝叶斯定理来解释这部分内容。

Aside:辛普森悖论

这些可视化概率分布的技巧真的很有用吗?我认为的确很有用!在我们图解信息论之前,我还需要一些时间来用可视化的技术探索一下辛普森悖论。辛普森悖论是一种非常不直观的统计状况。它真的很不容易被直观的理解。迈克尔·尼尔森(Michael Nielsen)撰写了一篇很有爱的文章:“创新说明”,探讨了不同方式来解释它。而我想尝试使用我们在上一节中学到的技巧来解释它。

测试两种肾结石治疗方法。对一半的患者使用A治疗方案,而另一半则使用B治疗方案。接受治疗方案B的患者比接受治疗方案A的患者更容易存活。

然而,如果接受治疗方案A的话,患肾小结石的患者更有可能存活。然而大肾结石患者如果接受治疗方案A也更有可能存活!这怎么可能呢?

这个问题的核心是因为患者样本没有被正确随机分组。接受治疗方案A的患者大部分可能患有大肾结石,而接受治疗方案B的患者大部分可能患有小肾结石。

事实证明,肾结石较小的患者通常更有可能生存。

为了更好地理解这一点,我们可以将前两个图表组合为一个三维图,其中将小型和大型肾结石的存活率分开展示。

我们现在可以看到,在两种小肾结石和大肾结石的病例中,治疗方案A是超过治疗方案B的。治疗方案B看起来似乎更好,仅仅是因为应用它的患者本身更有可能存活!

编码

现在我们有了可视化概率的方法,我们可以深入到信息论中了。

首先我向你介绍一位我假想的朋友,Bob。Bob很喜欢动物。他一直不停在谈论动物。事实上,他只会说四个字:“dog”, “cat”, “fish” 和 “bird”。

几周前(虽然这只是我的想象)Bob搬到了澳大利亚。另外,他决定只想要使用二进制来交流。来自Bob的所有(虚构的)消息都是这样的:

为了沟通,Bob和我必须建立一个编码,一种将单词映射成位序列的方式。

要发送消息,Bob用相应的编码字来替换每个单词,然后将它们连接在一起形成编码的字符串。

可变长度码

不幸的是,在假想中的澳大利亚,通信服务是昂贵的。从Bob收到的每条消息中,每一位(bit)数据我都必须支付5美元。我是不是还没有提到Bob喜欢说很多话这件事?为了防止我破产,Bob和我决定来研究一些可以使我们的平均消息长度变得更短的方法。

事实证明,并不是所有的词Bob都会经常说。Bob很喜欢狗,他一直在说“dog”。同时他也会不定期地说其他的动物,尤其是他的狗喜欢追的猫,但它大多数时间他还是在说“dog”。这是一个他的单词频率图:

这似乎看来是有优化空间的。因为我们可以看到,按照旧的编码方式,对于不同的词无论它们是多么常见,都在使用2位长的码字来表示。

我们可以用下面这张图来可视化这些信息。在下面这张图中,我们使用竖直方向的坐标轴来表示每个词的概率$p(x)$,水平方向的坐标轴来表示相应的码字的长度$L(x)$。可以看到在这种情况下平均码字是2位。

也许我们可以用一种非常聪明的方式来制作一种可变长度的编码方式,使得其中常用单词对应的码字特别短。这样做的挑战就是码字之间是存在竞争关系的,我们需要让一部分词对应的码字变短,而另一部分则会变长。为了最大限度地减少消息长度,我们希望理想状态下所有的码字都很短,尤其是那些常用的词我们更希望它们能变短。因此,最终得到的编码对于常用词(例如“dog”)具有较短的码字,并且较长的码字被应用到了不常用的词之上(例如“bird”)。

让我们再次可视化这些信息。注意那些最常用的词变短了,那些不常用的词变长了。经过这样处理之后,对于传递与之前相同的信息,我们的流量开销的确变少了。平均来说,码字长度现在是1.75位!

你也许会好奇:为什么不用1来作为码字?因为可惜的是,如果我们这么做,当我们对编码的字符串进行解码时,会引起歧义。我们稍后会介绍这些内容。

事实证明,这种编码方式是最好的。对于这个分配问题,没有其他的编码方式能带来平均码字长度小于1.75位的效果了。

这是一个简单的基本限制。这要求我们传达的信息平均码字长度至少是1.75位。无论我们用多么聪明的代码,都不可能让平均消息长度变得更短。我们称这种限制为。关于熵的内容,我们将在稍后详细讨论。

如果我们想了解这个平均最短码字长度的限制,这个问题的关键在于理解如何在使得一些码字变短但同时其他码字变长的过程中进行权衡。一旦我们弄明白了如何进行这种权衡,我们就能够找出最好的编码方式了。

码字的空间

码字长度为1时,能表示2种编码:0和1的编码;码字长度为2时,能表示4中编码:00,01,10和11。下面是每增加一位码字长度,能表示的编码种类数量的递增情况:

但我们感兴趣的是那些可变长度编码。一种比较简单的情况是有八个长度为3位的码字。我们也可能有一些比较复杂的组合,比如长度为2的两个码字,与长度为3的四个码字的组合。那么究竟是什么决定了我们可以有不同长度的码字呢?

回想一下,Bob通过用它的码字替换每个单词并将它们连接在一起,将他的消息转换成编码的字符串。

当制作可变长度代码时,需要注意一个微妙的问题。我们如何将编码过的字符串分割回码字呢?当所有的码字长度相同时,这很简单。我们只需将这个字符串按照固定的码字长度分割成不同的码字即可。但是由于存在不同长度的码字,所以我们需要关注编码过的字符串的内容。

我们希望只有一种方式来解码编码过的字符串。我们不希望我们的编码方式在解码过程中变得含糊不清。如果我们有一些特殊的“码字结束”符号,这个问题这就会变得很容易。但其实我们没有这种符号,我们只能够发送0和1。因此,我们需要能够查看一系列连续的码字,并且说明每个码字应该停止的位置。

而这,很可能出现编码不能被唯一解码的情况。例如,假设0和01都是码字,那么我们就会搞不清楚符串0100111的第一个码字到底是什么。因为这个字符串的第一个码字既可以是0也可以是01!因此,我们想要的效果是没有哪个码字是另一个码字的前缀。这称为前缀属性,遵守它的编码称为前缀编码

思考这个问题的一个好的方法是每个码字需要从可能的码字的空间中做出牺牲。如果我们取代码字01,那么我们就失去了使用任何以01前缀开头的码字的能力。我们不能使用010或011010110,因为会产生歧义。

由于所有码字中,有$\frac{1}{1}$都是从01开始,所以我们牺牲了$\frac{1}{1}$的所有可能的码字。这是我们付出的代价,而换来的结果只是使得其中一个码字的长度缩短到2位长!反过来,这种牺牲意味着所有其他码字需要更长一些。在不同码字的长度之间总是有这种折衷。为获取一个比较短的码字,需要你牺牲更多的其他码字的空间。而我们需要弄清楚,正确的权衡方式是什么?

最佳编码

可以理解为简短编码的长度是有一个限定的度量在里面,每减短一个bit的密文就会牺牲一些编码的可能性从而让其它密文的长度增长。

购买长度为0的码字的成本为1,会牺牲掉所有的码字空间,如果这样做,就不会有其他码字了。长度为1的码字(如“0”)的代价是$\frac{1}{2}$的码字空间,因为有一半的码字以“0”开始的。长度为2的码字的成本(例如“01”)是$\frac{1}{4}$码字空间,因为有$\frac{1}{4}$的码字以“01”开始的。一般来说,码字的代价随代码字的长度而呈指数减小。

如果代价是以指数衰减,那么这个高度和面积也是成指数衰减。

我们想要通过得到比较短的码字来缩短平均消息长度。每个码字的期望长度是每个码字出现的概率乘以码字的长度。假设我们有一个4bit的密文,出现概率是50%,那么我们的期望就是4*50%=2bit。我们可以作图来表示。

这两个值(代价和期望长度)与码字的长度相关。信息的长度决定了码字的平均长度。我们可以把这两者画在一起,就像这样。

短码字减少了平均消息长度,但是越短的码字越昂贵,而长码字增加了平均消息长度,但长码字相对便宜。

使用有限预算的最佳方法是什么?我们应该在每个事件的码字上投入多少花费呢?

就像一个人想要把较多的钱投入在经常定期使用的工具上一样,我们更愿意对那些频繁使用的码字支付更高的花费。有一种特别顺其自然的处理方式:按照事件的普遍程度分配我们的预算。如果一个事件发生的概率是50%,那么我们就花费预算的50%来购买这个短的码字。但是,如果一个事件的发生概率只有1%,那么我们就只花1%的预算,因为我们并不是很在意这个不常见的码字变得很长。

这是一件很顺其自然的解决方案,但它是最优解吗?没错,它是,我接下来会证明它!

以下是可视化的证明过程,应该是可以理解的,但理解起来有一定难度,而这部分绝对是这篇文章中最难的部分。读者应该自由地选择是否默认接受这一结论跳过这一部分。

我们来看一个具体的例子,我们需要比较两个可能发生的事件。事件a发生的概率是$p(a)$,事件b发生的概率是$p(b)$。我们按照上述自然的方式分配预算,花费$p(a)$的预算在a获得一个较短的码字上,花费$p(b)$的预算在b获得较短的码字上。

花费的成本和对应的长度贡献的边界完美的对齐了,这是否意味着什么?

那么,请考虑一个问题,如果我们稍微改变码字的长度,会对花费的成本和码字长度贡献值有什么样的影响呢?如果我们稍微增加码字的长度,则消息长度的贡献值将与其边界的高度成比例地增加,而成本则会与边界的高度成正比。

所以,使码字a缩短的代价的值是$p(a)$。同时,我们不关心每个码字的具体长度,我们关心的是使用它们的占比。在a这种情况下,占比就是$p(a)$。对我们来说,就是$p(a)$使码字a的长度变得更短一些。

然而有趣的是,这两者的导数都是一样的。这意味着我们的初始预算有一个有趣的属性,如果你花费了一些用于缩短码字的投入,那么这个投入对于投在任何码字上,效果都是一样的。我们真正关心的是最终的利益/成本比例 - 这就决定了我们应该投资多少。在这种情况下,这个比例是$\frac{p(a)}{p(a)}$等于1。这与$p(a)$的值无关,因为这个结果总是1。我们也可以将相同的参数应用于其他事件。利益/成本总是一,所以在其中任何一方投资更多是平等的。

无论如何,改变预算是没有意义的。但这不证明这是最好的预算。为了证明这一点,我们会考虑使用一个不同的预算。我们将在$b$中投资$ε$,并在$a$中投资相反的花费。这使得a的码字稍短一些,而b的码字稍长一些。

现在为a购买一个较短的码字的成本是$p(a)+ε$,为b购买较短码字的费用b是$p(b)-ε$。但收益还是一样的。这导致了购买$a$的收益成本比例为一个小于1的值:$\frac{p(a)}{p(a) + ε}$。而另一边,对于购买$b$的收益成本比例是一个大于1的值:$\frac{p(b)}{p(b) - ε}$

价格不再保持平衡。b相对于a来说是一笔更好的交易。投资者们尖叫道:“买b!卖a!”我们通过这样做,结束了我们原来的预算计划。所有预算都可以通过转向原始预算的方式来得到改进。

原始预算 - 按照我们使用频率的比例投入每个码字 - 这不仅仅是自然而然的事情,而且这是最好的方法。(虽然这个证明仅适用于两个码字,但它很容易泛化为更多的情况。)

认真的读者可能已经注意到,我们的最优预算有可能提出码字具有分数长度的编码,这似乎很有用!这是意味着什么呢?当然,在实践中,如果你想通过发送一个单码字,你必须取整,但是我们稍后会看到,当我们一次发送很多码字时,可以发送分数码字!现在请你耐心的看我现在的讲解!

计算熵

回想一下,一个长度为$L$的消息代价是$\frac{1}{2^L}$。再做一个简单的变换后,这个信息的长度就是:$\log_2\left(\frac{1}{\text{cost}}\right)$。因为我们对每个码字$x$花费$p(x)$的成本,长度是$\log_2\left(\frac{1}{p(x)}\right)$。这是长度的最佳选择。

早些时候,我们讨论了如何从一个特定的概率分布$p$中获取平均消息来传达事件的基本限制。这个将平均消息长度缩短到最优的编码的限制,我们称之为$p$的熵,$H(p)$。现在我们知道了码字的最佳长度,而且我们可以精确的计算出来!

$$
H(p) = \sum_x p(x)\log_2\left(\frac{1}{p(x)}\right)
$$

人们通常将熵写作$H(p) = - \sum p(x)\log_2(p(x))$这种形式,因为$\log(1/a) = -\log(a)$。但我认为第一种写法更直观,并且我在这篇文章的后续部分会继续使用这种形式。

无论我做什么,平均来说,如果我想要进行通信交流,信息平均长度最少都是这个值。

这个需要发送的信息的平均长度对信息的压缩有明显的影响,这个熵还有其它方面的意义吗?当然!它描述了随机性,并且提供了一种量化信息的方式。

如果我确实知道会发生什么事件,我根本就不必发消息!如果有两件可能发生的概率为50%,我只需要发送1bit的数据。如果有64个不同的事情可能以相等的概率发生,我必须发送6bit。发生的概率越集中在某一件事上,就越能用巧妙的编码方式来减少信息的平均长度。概率扩散的范围越大,信息越长。发生的概率越分散到不同事情上,我需要发送的信息平均长度就越长。

结果越不明确,在发生事情时就能学到越多的东西。

交叉熵

在Bob搬到澳大利亚不久之后,他和我假想的另一个女孩Alice结婚了(让我惊讶的是,我脑海里居然还有其他角色)。然而Alice并不是一个狗狗爱好者。她是一个猫猫爱好者。尽管如此,他们俩也可以在仅有非常有限的关于动物的词汇的情况下,找到共同话题。

他们两以不同的频率说着相同的话。Bob总是谈论狗,而Alice却总是谈论猫。

最初,Alice使用Bob的编码向我发送消息。不幸的是,她的消息比他们实际需要的要长。Bob的编码是按照Bob的概率分布优化得到的。而Alice与Bob有不同的信息概率分布,并且Bob编码对她来说并不是最佳的。当Bob使用自己的编码时,码字的平均长度是1.75,但Alice在使用这组编码时,她的码字平均长度是2.25。如果他们两的概率密度越不相似,这个结果就越糟糕。

这种根据一边信息概率分布优化过的编码方式来传输另一种概率分布不同的信息时,消息的平均长度称为交叉熵。关于交叉熵,更正式的定义如下:

$$
H_p(q) = \sum_x q(x)\log_2\left(\frac{1}{p(x)}\right)
$$

在这种情况下,Alice的猫爱好者的词频与Bob的狗爱好者词频存在交叉熵。

为了让我们的通信的花费减少,我让Alice来使用她自己的编码。让我感到安慰的是,这使得她的平均消息长度变短了。但是,这也引入了一个新的问题:有时Bob会不小心使用Alice的编码。令人惊讶的是,Bob使用Alice的编码时,Bob信息的平均长度比Alice用Bob编码时的最优方式还长

所以,现在我们有四种可能的情况:

  • Bob使用它自己的编码$(H(p) = 1.75 ~\text{bits})$
  • Alice使用Bob的编码$(H_p(q) = 2.25 ~\text{bits})$
  • Alice使用她自己的编码$(H(q) = 1.75 ~\text{bits})$
  • Bob使用Alice的编码$(H_q(p) = 2.375 ~\text{bits})$

这并不能直观的展示出这种值之间的关联关系。我们可以使用下图来寻找它们之间的关系。

在下图中,每个子图分别表示这四种情况之一。每个子图以与之前相同的方式来显示平均消息长度。处于同一行的两种情况有相同的概率分布,处于同一列的两种情况有相同的编码方式。通过这种方式,可以可视化的观测到概率分布和编码方式的关系。

你能看出来为什么$H_p(q) \neq H_q(p)$吗?$H_q(p)$比较大因为在概率分布$p$之下有一个非常常见的码字比较长的事件(蓝色),因为这个事件在概率分布$q$的情况下并不常见。然而,另一边,在$q$的情况下比较常见的事件,在$p$的情况下比较少见,但差异较小,所以$H_p(q)$不是很高。

因此我们发现交叉熵是不对称的。

那么,为什么要关心交叉熵呢?交叉熵给我们一种表达两种概率分布不同的方法。概率分布$p$和$q$的差异越大,那么$p$关于$q$的交叉熵就比$p$的熵越大。

同样的,概率分布$p$和$q$差异越大,$q$关于$p$的交叉熵就比$q$本身的熵越大。

真正有趣的东西是熵与交叉熵之间的差异。差异在于我们的信息具体长多少,因为我们对不同的概率分布使用了同一套优化过的编码方式。如果概率分布相同,那么这个差异将为零。随着差异的增长,这个差值将变得更大。

我们称这种差异为Kullback-Leibler分歧,或者简称为KL分歧。概率分布$p$关于$q$的KL分歧$D_q(p)$定义如下:

$$
D_q(p) = H_q(p) - H(p)
$$

关于KL分歧真正在做的事情,其实就像是在衡量不同概率分布之间的差异程度。(如果继续研究这个概念就会进入信息几何的领域。)

交叉熵和KL分歧在机器学习中有着难以置信的用处。通常,我们希望一个分布与另一个分布相互靠近。例如,我们希望一个用于预测的概率分布与真实情况更接近。KL分歧为我们提供了一种很自然的方式来做到这一点,所以它在任何地方都有用武之地。

熵和多变量

让我回到之前关于天气和穿着的例子:

我的妈妈,就像大多数的家长一样,都会担心我的衣着跟天气不搭配。(她的这种担心不是没有道理的,因为我在冬天经常不穿外套。)所以她总是想要知道我这边有关天气和穿衣的信息。我需要发送几个bit的数据来传达这些信息呢?

为了更方便的分析这个问题,我们把概率扁平化分析:

现在我们可以找出这些概率的事件的最优码字,并计算平均消息长度:

我们把这个称之为$X$和$Y$的联合熵,定义如下:

$$
H(X,Y) = \sum_{x,y} p(x,y) \log_2\left(\frac{1}{p(x,y)}\right)
$$

这与我们关于熵的正规定义完全相同,唯一的区别就是这里有两个变量,而之前是一个。

我们再把这个图形表现得更形象话一些,加入码字长度作为第三个维度,让图形更立体。现在,熵的大小就是体积的大小。

假设我的妈妈已经知道了天气信息(她可以通过新闻知道这些信息)。那么现在我需要提供多少的信息量呢?

似乎我需要发送很多信息来传达我的穿衣情况。但实际情况,我发送的信息比之前要少,因为天气与我的衣着有着密切的联系!我们来分别思考关于下雨天和晴天下的两种情况。

在这两种情况下,平均来看,我不需要发送特别多的信息,因为天气信息对我的穿衣情况有着很好的预示。当阳光明媚的晴天,我可以使用一个特定的“晴天优化版”编码,对于下雨天,我可以使用一个特定的“雨天优化版”编码。分别在这两种情况下用不同的编码会比用同一种通用编码的长度少很多。为了得到我需要发送给我妈妈的平均信息量,我把这两个例子放在一起…

我们称之为条件熵。可以把它写成如下的数学表达式:

$$
H(X|Y) = \sum_y p(y) \sum_x p(x|y) \log_2\left(\frac{1}{p(x|y)}\right)
$$

$$
~~~~ = \sum_{x,y} p(x,y) \log_2\left(\frac{1}{p(x|y)}\right)
$$

交互信息

在上一节,我们得到一个结论,那就是在知道一个变量的情况下,可能会意味着导致传达另一个变量需要更少的信息。

一种思考这种情况的很好方式是将信息的总量想象成一个条。如果不同的消息之间在共享信息,就叠加显示。例如,$X$和$Y$存在一部分共享信息,因此$H(X)$和$H(Y)$是有重叠部分。并且$H(X,Y)$是两者的共同信息,是$H(X)$和$H(Y)$的集合。

一旦我们开始以这种方式思考事情,很多事情就变得简单了。

例如,我们之前注意到同时传递$X$和$Y$(“联合熵”$H(X,Y)$)比仅仅使用$X$来通信(“边际熵”$H(X)$)需要更多的信息。如果你已经知道了$Y$,那么它会用更少的信息来对$X$进行通信(“条件熵”$H(X|Y)$)。

这听起来有点复杂,但从条状显示图来看,就很简单了。$H(X|Y)$是指我们在向已经知道$Y$的信息的人在传达$X$的信息时的熵,蕴含在$X$中的信息并不包含在$Y$中。从视觉上来看,这意味着$H(X|Y)$是$H(X)$的条中,不与$H(Y)$重叠的那一部分。

你可以从下图中得出这个不等式:$H(X,Y) \geq H(X) \geq H(X|Y)$。

另一个特性:$H(X,Y) = H(Y) + H(X|Y)$。也就是说$X$和$Y$的信息也就是$Y$的信息加上不在$Y$中的$X$的信息。

从方程中很难看出这些信息,但如果你将这些信息用条状图显示出来,就变得容易了。

在这里,我们以多种方式组织了$X$和$Y$的信息。我们有每个变量所包含的信息$H(X)$和$H(Y)$。我们有着两种信息的交集$H(X,Y)$。我们有只存在与一个变量但不存在与另一个变量的信息$H(X|Y)$和$H(Y|X)$。还有很多这些围绕着变量之间共享的信息,即他们之间信息的交集。我们称之为“相互信息”$I(X,Y)$,定义如下:

$$
I(X,Y) = H(X) + H(Y) - H(X,Y)
$$

这个定义是有效的,因为$H(X) + H(Y)$存在有两个相互信息的副本,因为他们同时蕴含在$X$中以及$Y$中,而$H(X,Y)$只有一份。(想想上一个条形图。)

与信息密切相关的是信息的变化。信息的变化是变量之间不共享的信息。我们可以这样定义它:

$$
V(X,Y) = H(X,Y) - I(X,Y)
$$

信息的变化很有趣,因为它给了我们一个不同变量之间度量距离的概念。两个变量如果知道一个值的值可以得出另一个变量的值,那么这两者之间的信息变化是零,并且这个信息变化的值随着他们彼此之间变得更加独立而增加。

这和同样可以告诉我们距离信息的KL分歧之间的关系是什么呢?KL分歧给了我们两个分布之间在同一个变量或一组变量上的距离。相反,信息的变化给我们两个相同分布的变量之间的距离。KL分歧是应用在不同信息的概率分布中的,标识这概率分布中的信息变化。

我们可以将所有这些信息全部汇集成一个单独的图表:

分数形式的位

关于信息理论的一个非常不直观的事情是我们可以拥有小数位数。这看起来很奇怪,半个位(0.5bit)意味着什么?

有一种简单的答案:通常,我们对消息的平均长度感兴趣,而不是任何特定的消息长度。如果一半的时间发送一个位的长度,一半时间发送两个位的长度,那么平均发送的长度是1.5位。对于平均数是小数的情况并没有什么奇怪的。

但是,这个答案其实是在避开这个问题。通常,码字的最佳长度都是分数形式。这意味着什么呢?

具体来说,让我们考虑一个概率分布,其中事件$a$发生的概率是$71%$,另一个事件$b$发生的概率为$29%$。

最佳编码将使用0.5位来表示$a$,用1.7位来表示$b$。那么,如果我们要发送这些码字中的任何一个,都是不可能的。我们会强制被安排发送整数位数的信息,并且发送的平均消息长度是1位。

但是,如果我们一次性发送多条消息,我们可以处理的更好。让我们来考虑按照这种概率分布的情况下来同时传递两个事件。如果我们每次只发送一个事件,那么我们需要发送两位的长度。我们可以处理的更好吗?

有一半的概率,我们需要传递$aa$的信息,有21%的概率我们需要发送$ab$或者$ba$,而我们传递$bb$的概率只有8%。我们再一次把编码优化到理想的小数位数的形式。

如果我们对码字长度取整,我们将得到这样的结果:

这个编码给我们带来的平均消息长度为1.8位。这比我们每次分别只传递一个事件的平均消息长度2位要小。另一种思考这个问题的方式是我们平均每个事件发送的信息是0.9位。如果我们一次发送更多的事件,那么这个值会更小。由于$n$趋向于无穷大,取整造成的损失将逐渐减少,并且每个码字的位数将接近熵。

另外,请注意,$a$的理想码字为0.5位,$aa$的理想码字是1位。即使理想码字的长度是小数,它们的长度也在增加!所以,如果我们一次传达很多事件时,长度会增加。

即使在实际的编码中,只能使用整数长度的码字,这里也有使用小数位数码字的实际的意义。

在实践中,人们使用在不同程度上有效的特定编码方案。霍夫曼编码,是一种基本类似于我们在这里草拟的这种编码,并没有非常优雅地处理小数位。你必须像上面那样对符号进行分组,或者使用更复杂的技巧来处理熵限制。算术编码有点不同,它优雅地处理了小数位以渐近最优。

总结

如果我们关心如何使用最少数量数据进行通信,那么这些想法显然是最基本的。如果我们关心压缩数据,信息理论将可以解决数据压缩的核心问题,并给出我们从根本上正确的抽象。但是,如果我们不在乎这些问题,那么除了好奇,我们还有其他什么原因呢?

来自信息理论的观点在很多情况下都会出现:机器学习,量子物理学,遗传学,热力学,甚至赌博。这些领域的从业者通常不关心信息理论。量子纠缠可以用熵来描述,通过假定关于你不知道的事物的最大熵,可以得出统计力学和热力学中的许多结果。赌徒的胜利或损失与KL分歧直接相关,特别是迭代设置。

信息理论在所有这些地方出现,因为它为许多我们需要表达的事情提供了具体的,有原则的形式化表示。它给了我们衡量和表达不确定性的方法,两组数据有多么的不同,不同概率分布之间的距离是多少,以及但对于某个问题的答案中蕴含了多少其他问题的信息:扩散概率是怎样的,概率分布之间的距离以及相互依赖的两个变量是怎样的。有其他类似的理论或者观点吗?当然。但是信息论的思想是干净的,它们具有很好的性质和原则性的起源。在某些情况下,它们正是你所关心的,而在其他情况下,它是混乱世界中的一个方便的代理。

机器学习是我最了解的领域,所以我们来谈一下。在机器学习中,分类是一种非常常见的问题。假设我们想看一张图片,并预测它是一只狗还是一只猫。我们的模型可能会告诉我们“这张图片中有80%的概率是一只狗,有20%的概率是一只猫”。那么我们就说正确答案是狗,那么我们以80%的概率做出的判断是好还是坏呢?以85%的概率做出的判断会比80%好多少呢?

这是一个重要的问题,因为我们需要一些衡量我们模型好坏的概念,以便把它优化的更好。我们应该优化什么呢?正确的答案确实取决于我们使用的模型:我们是只关心最顶部的猜测是否正确呢,还是关心我们在获取正确答案中的信心呢?错误的自信会有多糟?没有一个正确的答案。而且通常不可能知道正确的答案,因为我们不知道如何以精确的方式使用模型来形式化我们最终关心的内容。然而很多问题中,交叉熵都是我们真正需要在意的,但并不总是如此。更常见的情况是我们并不知道我们关心什么,而交叉熵就是解决这些问题的一个很好的工具。

信息为我们提供了一个强大的新框架来思考我们的世界。有时它能完美的解决一些问题,而有时并不可以,但它依然很有用。这篇文章仅仅是对信息论的一个概览,而信息论中还有许多其他主要的概念,例如我们没有提到的纠错码,但我希望我已经展示出了信息论是一个很美丽的主题,它并不是那么高不可攀。

进一步阅读

这里是克劳德·香农(Claude Shannon)关于信息论的原创论文通信数学理论。(这在早期的信息论论文中,似乎是一个重复的模式。是时代原因吗?还是因为缺少页面限制?或者是来自贝尔实验室的文化?)

封面和托马斯的信息要素理论似乎是标准参考。我觉得很有帮助。

致谢

我非常感谢Dan ManéDavid AndersenEmma Pierson和Dario Amodei抽出时间来给出这篇文章令人难以置信的详细和广泛征求意见。我也很感激Michael NielsenGreg CorradoYoshua BengioAaron CourvilleNick BecksteadJon Shlens,Andrew Dai,Christian HowardMartin Wattenberg的评论。

还感谢我的前两个神经网络研讨会系列作为这些想法的豚鼠。

最后,感谢读者发现错误和遗漏。尤其感谢Connor Zwick,Kai Arulkumaran,Jonathan Heusser,Otavio Good,以及匿名评论者。

更多的文章

了解卷积

分组和分组卷积

神经网络,歧管和拓扑

可视化展示深度学习和人类

坚持原创技术分享,您的支持将鼓励我继续创作!