我喜欢有一个新的思维方式来思考这个世界。我特别喜欢把一些模糊的想法正式化为一个具体的概念。信息理论就是一个很好的例子。
信息理论为我们描述了许多事情提供了精确的描述。例如我对问题答案的不确定性是多少?知道问题A的答案告诉我问题B的答案是多少?一套理论与另一套理论有多相似?自从我还是个小孩子,我就有了很多的想法,但是信息理论将它们变成了精确的想法。这些想法从数据压缩到量子物理,到机器学习,以及在这两者之间的广阔领域都有着广泛的应用。
不幸的是,信息理论似乎有点吓人。我认为没有任何理由。事实上,许多核心思想可以完全可视化地解释!
在我们深入到信息理论之前,让我们思考一下如何可视化简单的概率分布。稍后我们将需要这个,现在处理可视化是很简单的。并且,这些可视化概率是非常有用的!
我在加州的时候偶尔会下雨,但绝大部分时间都是晴天!假设有75%的时间是晴天。这很容易将数据可视化:
大多数日子里,我只穿一件T恤,但有时候我会穿外套。假设我38%的时间穿外套。为此制作可视化的图片也很容易!
如果我想同时看到两者呢?如果他们互不关联,我们会很容易 - 如果他们是我们所说的独立的。例如,今天我是不是穿了一件T恤或是一件外套,并没有真正与下周的天气有什么关系。我们可以通过设置一个坐标为穿T-shirt还是外套,另一个坐标轴为天气如何,则可以画出下图:
注意直线的垂直和水平线都是互相穿过的。这就是独立的可视化表示!1我穿着大衣的可能性不会因为一周内下雨而发生变化。换句话说,我穿上大衣与下周下雨同时发生的可能性等于我穿着大衣的可能性乘以下雨的可能性。他们互不干涉。
当变量相互作用时,对于特定的变量对有影响,而对其他变量则没有影响。因为变量是相关的,所以我穿着一件外套还有下雨的可能性更大,它们会互相作用是彼此的可能性加大。在下雨的日子里,我穿上外套的可能性要大于我穿上外套而不下雨的可能性。
从视觉上来看,这看起来像是一些正方形膨胀的概率增加了,而其他方格正在缩小,因为这两个事件不太可能相互关联:
但是,虽然这可能看起来很有意思,但对于了解内部发生的改变并不是很有用。
相反,让我们把重点放在像天气这样的变量上。我们知道一天有可能是晴天或者是下雨。对于这两种情况,我们可以看看条件概率。阳光充足的话,穿T恤的可能性有多大?如果下雨,我有可能穿上大衣吗?
下雨的可能性有25%。如果下雨,我有75%的机会穿上外套。所以,下雨和穿大衣的可能性是25%乘以75%,大约是19%。下雨的可能性,我穿的外套,是下雨的概率,乘以下雨的可能性。我们写这个:
p(雨,外套)= p(雨)⋅ p(外套|雨)
这是概率论最基本的特征之一:
p(x,y) = p(x) ⋅ p(y|x)
我们保理分布,将它分解为两件产品。首先我们来看一个变量,比如天气,将会具有固定值。然后,我们看看另一个变量(比如我的衣服)作为因变量,会以第一个变量(天气)作为自变量,观察因变量随自变量的变化过程。
从哪个变量开始的选择是任意的。我们可以先看看我的衣服这个变量,然后在观察天气条件。这可能会感觉有些奇怪,因为一般都是根据天气才决定穿衣多少的,而不是反过来的,但它针对我们的研究来说仍然有效!
我们来看一个例子。如果我们随便选一天的话,我有38%的机会穿上大衣。如果我们知道我穿着大衣,那么下雨的可能性有多大?那么我在雨中比在阳光下更可能穿上外套,但加利福尼亚州下雨的情况很少,所以有50%的机会下雨。因此,下雨和穿外套的可能性是我穿外套的概率(38%),如果我穿着一件外套(50%)乘以下雨的概率乘以约19%。
p (雨,外套)= p (外套)⋅ p (雨|涂层)
这给了我们第二种方式来可视化完全相同的概率分布。
请注意,标签的含义与上图略有不同:T恤和外套现在是边际概率,即我穿这件衣服而不考虑天气的概率。另一方面,现在有两个雨和阳光明媚的标签,因为他们的概率是有条件的,他们的概率取决于我穿的是T恤还是外套。
(你可能已经听说过贝叶斯定理,如果你愿意的话,你可以把它想象成在这两种显示概率分布的不同方法之间进行转换的方法!)
这些可视化概率分布的技巧是否有帮助?我认为他们是有帮助的!在我们将信息理论用于可视化之前还有一段时间,所以我想稍微深入一点,用它来探索辛普森的悖论。辛普森的悖论是一个非常不直观的统计情况。在一个直观的层面上很难理解。迈克尔·尼尔森(Michael Nielsen)写了一篇有意思的文章“ Reinventing Explanation”,探讨了不同的解释方式。我想尝试用我们在前一节中研究的技巧自己试下。
对肾结石的两种治疗进行测试。一半的患者接受治疗A而另一半接受治疗B.接受治疗B的患者比接受治疗A的患者更有可能存活下来。
但是,如果接受治疗A的,患有小肾结石的患者更有可能存活 ,而且我们还发现接收治疗A的,患有大型肾结石的患者也更有可能生存下来!怎么会这样?
其实问题的核心是这项研究没有适当的随机化。接受治疗A的患者可能大部分是有大的肾结石,而接受治疗B的患者可能大部分是有小的肾结石。
事实证明,小肾结石患者一般生存的可能性要大得多。
为了更好地理解这一点,我们可以结合以前的两个图表。就做成了一张三维图,生存率分裂为小的和大的肾结石。
现在我们可以看到,在小病例和大病例中,治疗A都比治疗B要好。治疗B比较好只是因为应用的患者更可能会被第一时间治愈!
现在我们有可视化概率的很多方法,可以应用到信息理论。
让我告诉你我想象中的朋友——鲍勃。鲍勃真的很喜欢动物。他经常谈论动物。事实上,他只说过四个字:“狗”,“猫”,“鱼”和“鸟”。
几周前,鲍勃搬到了澳大利亚。而且,他决定他只想用二进制来沟通。我所有来自Bob的(假想)消息都是这样的:
为了沟通,Bob和我必须建立一个代码,一种将单词映射成比特位序列的方式。
为了发送消息,鲍勃用相应的码字替换每个符号(字),然后将它们连接在一起以形成编码的字符串。
不幸的是,澳大利亚的通讯服务(虚拟的)非常昂贵。每收到一封鲍勃的消息,我都得付5美元。我是否在前面提到过鲍勃很喜欢聊天的呢?为了防止我破产,鲍勃和我决定,我们应该调查是否有一些方法可以使我们的平均消息长度更短。
事实证明,鲍勃其实只经常性的讨论四个词中的一个。鲍勃很喜欢狗。他一直在谈狗。有时候,他会谈论其他的动物——尤其是他的狗喜欢追赶的猫 - 但主要是他谈论狗。这是他的词频图:
这似乎给了我们某种启示。我们的旧代码固定使用2位长的代码字,不管它们出现的频率。
有一个很好的方式来可视化这个。在下面的图表中,我们使用垂直轴来显示每个单词的概率p(x)和水平轴以可视化相应码字的长度L(x)。注意,该区域是我们发送的码字的平均长度,在这种情况下是2比特。
也许我们可以非常聪明地制作一个可变长度的代码,其中用于常见单词的代码字尤其短小。难在于代码字之间需要互不重复 - 缩短代码使我们能够使其他代码更长。为了最大限度地减少消息长度,理想情况下我们希望所有的代码字都很短,但是我们特别希望常用的代码字是。所以得到的代码对于常见的单词(比如“狗”)具有较短的代码字,对较不常见的单词(比如“鸟”)可以使用较长的代码来表示。
让我们把它形象化表示。请注意,要使常见的代码字变得更短,即使不常用的代码字变得更长。结果是,净面积较小。这对应于较小的期望码字长度。平均来说,一个码字的长度现在是1.75位!
(你可能会想:为什么不把自己当作代码字使用呢?不幸的是,当我们对编码后的字符串进行解码的时候,这会造成模棱两可的问题,我们稍后再谈。
事实证明,这个代码是最好的代码。对于这种分布,没有代码会给我们一个小于1.75位的平均码字长度。
只有一个根本的限制。通过说出什么字,发生了什么事件,要求我们至少平均通信1.75位。不管我们的代码有多聪明,都不可能使平均消息长度变小。我们把这个基本的限制称为分布的熵,我们用很短的时间详细讨论它。
如果我们想要理解这个极限,问题的关键是要理解一些代码短和其他很长的代码之间的权衡。一旦我们明白了,我们就能理解最好的代码是什么样的。
有两个长度为1位的代码:0和1.有四个长度为2位的代码:00,01,10和11.每添加一位,可能的代码数就增加一倍。
我们对可变长度代码感兴趣,其中一些代码字比其他代码字长。我们可能有简单的情况,我们有八个长度为3位的码字。我们也可能会有更复杂的混合,比如长度为2的两个码字和长度为3的四个码字。什么决定了我们可以有多少个不同长度的码字?
回想一下,鲍勃把他的消息变成编码字符串,用代码代替他的文字并将它们关联起来。
在制作可变长度代码时,需要小心一些微妙的问题。我们如何将编码的字符串拆分回代码字?当所有的代码字长度相同时,很容易 - 只需每隔几步就分割一次字符串。但是由于存在不同长度的代码字,我们需要注意代码字的内容。
我们真的希望我们的代码是唯一可解码的,只有一种解码编码字符串的方法。我们当然不希望哪个代码字组成编码的字符串是模糊的。如果我们有一些特殊的“码字结束”符号,这将是比较简单的。2但我们没办法 - 因为我们只发送0和1。我们需要能够看一连串的代码字,并告诉程序每一个应该分割的地方。
制作不可唯一解码的代码是很有可能的。例如,假设0和01都是码字。那么编码字符串0100111的第一个码字是什么也不清楚 - 它可能是!我们想要的属性是,如果我们看到一个特定的码字,不应该有一个更长的代码字版本。另一种方法是不要将码字作为另一个码字的前缀。这被称为前缀属性,服从它的代码被称为前缀代码。
考虑这个问题的一个有用的方法是,每个码字都需要从可能的码字空间中作出牺牲。如果我们把码字01,我们失去了使用它的前缀的任何代码字的能力。由于含糊不清,我们不能再使用010或011010110 - 它们对我们来说是无法识别的。
由于所有码字的四分之一以01开头(因为两位的码字只有四种排序00,01,10,11),所以我们牺牲了所有可能码字的四分之一。这是我们付出的代价,只有一个码字的长度是2位的!反过来这个牺牲意味着所有其他码字需要更长一点。不同代码字的长度之间总是有这种折衷。短码字要求您牺牲更多可能的码字空间,防止其他码字不足。我们需要弄清楚什么是正确的权衡!
你可以这样想,有一个有限的预算消耗在获取短编码字。我们牺牲一小部分可能的码字组合来使用一个(短) 编码字。
购买长度为0的编码字的成本是1(此处是假设有长度为0的编码字,即下图的纵轴与曲线相交的那点),对于所有可能的编码字组合,如果你想有一个长度为0的编码字,你就不能有任何其他的编码字组合了。长度为1的码字的成本(例如“0”或者“1”)为1/2,因为一半的可能编码字组合是以“0”开始。长度为2的码字(如“01”、“00”、“11”、“10”)的代价是1/4,因为所有可能代码字的四分之一以“01”开头。一般来说,码字的成本随着码字长度呈指数下降。
请注意,如果成本衰减呈现(自然)指数递减,则递减规律既适用于高度又适用于面积!3
我们获取简短的编码字,因为我们想要短的平均消息长度。每个编码字的平均消息长度是该编码字的长度乘以编码字长度出现的概率。例如,如果我们需要在50%的时间内发送长度为4位的码字,那么我们的平均消息长度比不发送那个码字的长度长2个比特。我们可以把它画成一个矩形。
这两个值与码字的长度有关。我们花费决定了码字的长度。编码字的长度决定了平均消息长度的增量。我们可以把这两个图像合在一起,像这样。
短编码字减少平均消息长度,但是花费更高了,而长代码字虽然增加平均消息长度,但是便宜。
使用我们有限的预算最好的方法是什么?我们应该在每个事件的代码字上花多少钱?
就像人们喜欢用自己经常性使用的工具一样,我们希望在经常使用的代码字上花费更多。有一种特别自然的方式来做到这一点:根据事件的普遍程度来分配我们的预算。所以,如果有一个事件发生在50%的时间里,我们花50%的预算购买一个简短的代码字。但是,如果一个事件只发生在1%的时间内,我们只花费我们预算的1%,因为如果码字很长,我们不会太在意。
这是非常自然的事情,但这是最好的事情吗?接下来我会证明!
下面的证明是可视的,应该是可以让大家理解的,但是需要各位也认真思考才能比较理解透彻,而且绝对是这篇文章中最难的部分。读者可以选择把本节结论直接当做一个定论,跳过此节内容。
让我们来描述一个具体的例子,我们需要讨论两个结果中可能发生的事件是其中的哪一个。我们假设事件a发生的概率是p(a),事件b发生的概率是p(b)。我们经过上面讨论的结论知道编码字的是随编码字长度呈指数下降的,我们在预算中花费p(a)得到的一个a的短编码字,并且p(b)的花费得到b的一个短编码字。
成本和长度确定的边界可以很好地 显示出来。这是否意味着什么?
那么,考虑一下如果我们稍微改变码字的长度,会发生什么样的成本和长度变化。如果稍微增加码字的长度,消息的长度就会随着它在边界的高度成比例地增加,而成本则会随着边界的高度成比例地下降。
所以,成本p(a)使a 有一个较短的编码字。我们不关心每个编码字的长度,我们只关心我们使用它们的概率。对于a来说p(a)就是它的使用概率。使用编码字给我们的好处——对于a来短1 bit位的编码字花销就是p(a)。
有趣的是,两个的结果是相同的。这意味着我们最初的预算有一个有趣的特性,不论你是多1bit位还是采用短编码花费是一样。我们最关心的是收益/成本比率 - 这决定了我们应该多投入一些花销。在这种情况下,比例是p(a)/p(a),等于一。这是独立于p(a)的值 - 这个比例总是一。而且我们可以对其他事件应用相同的论点。收益/成本永远是一,因此在其中任何一个方面投入更多资金是相当合理的。
无限地,改变预算是没有意义的。但这还不是证明这是最好的预算这个结论的。为了证明这一点,我们将考虑一个不同的预算,我们花一些额外的代码字在另一个码字上。我们将投资ε(此处应该是正花销) 从b的总花销中移到a。这使得该编码字一个a变短,对编码字b长一点。
现在对于a来说一个较短的码字的花销是 ε+p(a) ,和对于b购买更短的编码字对的成本是 p(b) - ε。但总花销仍然是一样的。这一改变导致a的收益/成本比率购买一个一个a为p(a) / (p(a) + ε),这个比率小于一。另一方面,购买b的收益/成本比率是p(b)/ (p(b) - ε) ,而这比一大。
花费不再平衡。对于投资者来说投资b明显比a要好。于是投资者争先恐后的喊着:“买b!卖a!”我们这样做,最终回到我们原来的预算计划。所有的预算都可以通过转向我们原来的计划来改善。
原来的预算 - 按照我们使用频率的比例投入每个代码字 - 不仅是自然而然的事情,而且这是最好的事情。(虽然这个证明只适用于两个代码字,但很容易推广到更多。)
(一个仔细的读者可能已经注意到,我们的最优预算可能会建议代码字的分数长度的代码,这似乎很重要!这是什么意思?当然,在实践中,如果你想通过发送单码字,你必须四舍五入,但是我们稍后会看到,当我们一次发送多个码字时,可以发送小数码字是非常真实的意义,我请你先耐心等待!)
回想一下,长度为L的消息的成本是1/2^L 。我们可以反转这个来得到一个给定数量消息的长度:\log_2\left(\frac{1}{\text{cost}}\right)。由于我们花费p(x) 在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%的概率可能发生两件事情,我只需要发送1位。但是,如果有64个不同的事情可能以相同的概率发生,我将不得不发送6位。概率越集中,我就可以制作出一个短平均信息的巧妙编码。概率越分散,我的信息长度就越长。
平均而言,结果越不确定,我们为了知道发生了什么事情,我们就需要学得越多(因为编码位数变长了)。
我又幻想了一个例子,在搬到澳大利亚前不久,鲍勃娶了爱丽丝。令人惊奇的是我竟然还幻想到很奇葩的事情:爱丽丝是一个不喜欢狗,反而喜欢猫的人。尽管如此,他们两个却能够在仅仅几次不长的交谈中展现出对于动物的共同热爱。
他们两个总是在不同频道但是却都说着有关动物的话题。鲍勃总是谈论狗,爱丽丝总是谈论猫。
最初,Alice用Bob的编码给我发送消息。不幸的是,她的信息比他们需要的要长。鲍勃的代码是根据他的概率分布优化的。而爱丽丝具有不同的概率分布,由此而知爱丽丝的编码很不理想。当鲍勃使用自己的代码时,码字的平均长度是1.75位,而爱丽丝使用他的代码时,它是2.25。这还是因为两者比较相似(都在谈论动物),如果两者完全不同则情况会更糟糕!
这个长度 - 从一个分布与另一个分布的最优代码交流事件的平均长度 - 被称为交叉熵。形式上,我们可以定义交叉熵为: H_p(q) = \sum_x q(x)\log_2\left(\frac{1}{p(x)}\right)
在这种情况下,猫爱好者——爱丽丝的词频相对于爱狗者——鲍勃的话语频率是交叉熵。
为了保持我们的沟通成本,我要求爱丽丝使用自己的代码。让我欣慰的是,使用自己的代码后压低了她的平均消息长度。但是它却引入了一个新的问题:有时Bob会不小心使用Alice的代码。令人惊讶的是,鲍勃使用爱丽丝的代码比爱丽丝使用他的代码更糟!
所以,现在我们有四种可能性:
这样不太直观。例如,我们可以看到H p(q )≠ H q(p )Hp(q)≠ Hq(p )H_p(q) \neq H_q(p)。有什么方法可以看出这四个值如何相互关联?
在下图中,每个子图表示这四种可能性中的一种。每个子图都以与我们以前的图表相同的方式显示平均消息长度。它们被可视化在一个正方形中,所以如果消息来自同一分布,那么这些图彼此相邻,并且如果它们使用相同的代码,则它们是彼此重叠的。这使您可以在视觉上一起显示出分布概率和代码。
你能明白为什么H_p(q) \neq H_q(p)?Hq(p)很大,因为在p下有一个事件(蓝色)是非常常见的,但由于在q下非常罕见,所以在q下信息长度比较长。g 同样的,在q下比较常见的事件在p下又不太常见,但差别不大,所以H_p(q)并不高。
交叉熵不对称。
那么,为什么要关心交叉熵呢?因为交叉熵给了我们一种表达不同的两个概率分布的方式。p和q的分布差异越大,则p相对于q的交叉熵将大于p的熵。
类似地,p相对于q的分布差异越大,则q相对于p的交叉熵将大于q的熵。
真正有趣的是熵和交叉熵之间的差异。这个差别是我们的信息长度不同造成的,因为我们使用了针对不同分布进行优化的编码。如果分布是相同的,这个差别将是零。随着差异的增长,它会变得更大。
我们把这个区别称为Kullback-Leibler分歧,或者说KL分歧。的KL散度p相对于q,D_q(p)5被定义为:6
D_q(p) = H_q(p) - H(p)
这个KL分歧真的是个很好的研究方法,就像两个分布之间的距离。它测量他们是多么的不同!(如果你认真思考,你最终将会学到信息几何的知识。)
交叉熵和KL散度在机器学习中是非常有用的。通常,我们希望一个分布接近另一个分布。例如,我们可能希望预测分布接近实际情况。KL分歧给了我们一个很自然的方式来做到这一点,所以KL分歧真是无处不在。
让我们回到以前的天气和服装的例子:
我的母亲和许多父母一样,有时担心我没有按季节穿合适的衣服。(她有理由怀疑,因为冬天我经常不穿外套)所以,她经常想知道我这边的天气和我穿了多少。我需要发送多少位的信息给她进行沟通?
那么考虑这个问题的简单方法就是平滑概率分布:
现在我们可以找出这些概率事件的最佳码字并计算平均消息长度:
我们称之为X和Y的联合熵X,定义
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)的共同催生。7
一旦我们以这种方式思考事情,很多事情就会变得更容易。
例如,我们以前指出,为了沟通X和Y(就是“联合熵” ,H(X,Y))比只与X交流(“边际熵” H(X))需要更长的信息。但如果你已经知道Y的概率,那么相比于你不知道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中的消息熵加上在X中但是不在Y中的熵。
同样,在方程式中很难看出,但是如果你正在考虑了这些重叠的信息条,就很容易看出来。
此时,我们已经渐渐从几个不同的方面了解X和Y中的信息。我们把相关信息记为H(X)和H(Y),还有一个X和Y的联合信息H(X,Y)。我们还有一个X与Y相互排斥的信息H(Y|X)。很多这似乎围绕变量之间共享的信息,他们的信息的交集。我们称之为“交集信息”,I(X,Y),其定义为:8
I(X,Y) = H(X) + H(Y) - H(X,Y)
这个定义是有效的,因为H(X) + H(Y)重复计算了两次联合信息H(X,Y),由于联合信息H(X,Y)它既在X中也在Y中,而H(X,Y)只应该有一个,所以需要减去一个。(考虑以前的条形图。)
与交集信息密切相关的是信息的变化。信息的变化是变量之间不共享的信息。我们可以这样定义:
V(X,Y) = H(X,Y) - I(X,Y)
信息的变化是很有意思的,因为它给了我们一个度量,在不同的变量之间距离的概念。如果知道其中一个变量的值就可以推出另一个的值,并且两个变量之间渐渐相互独立,那么我们就称这两个变量之间的信息变化是零。
这与KL分歧又有何关系,难道KL分歧也给了我们一个距离的概念?没错,KL分歧给了我们在同一个变量或变量集上的两个分布之间的距离。相反,信息的变化给了我们两个联合分布变量之间的距离。KL分歧是分布之间信息的变化。
我们可以把所有这些不同类型的信息整合到一张图中:
关于信息理论的一个非常不直观的事情就是我们可以有小数位。但是什么叫做比特位的一半呢,这就很让人迷惑了?
这里有个通俗的解答:通常,我们更关心消息的平均长度,而不是特定条件下的消息长度。如果其中一个发送1比特位,另一个发送2比特位,那么平均每人发送1.5比特位。平均下来出现小数是很正常的。
码字的最佳长度是分数的——这个答案其实巧妙的帮我们回答了这个疑问。这是什么意思?
那我们具体考虑一个概率分布,其中事件a有71%的可能性发生和另一个事件b有29%的概率发生。
最佳的编码将使用0.5比特位来表示a,1.7比特位来表示b。那么,如果我们想要发送这些代码字中的一个,那简直是不可能的。我们被迫四舍五入到整数位,平均发送1位。
...但是,如果我们一次发送多条消息,其实我们可以很好的避过这个问题。让我们考虑从这个分配中传达两个事件。如果我们分别发送a和b,我们需要发送两比特位的数据。我们有没有办法可以做得更好?
50%的时间,我们需要发送aa,21%的时间我们需要发送一个ab或ba,和8%我们需要发送b。再一次,最佳编码涉及到小数。
这个编码给我们一个平均消息长度1.8位的。当我们独立发送它们时,这会比2比特位少。另一种思考的方式是我们每个事件平均发送0.9位。如果我们要一次发更多的事件,它会变得更小。作为n往往是无穷大的,由于四舍五入我们的代码的开销将消失,并且每个码字的比特数将接近熵。
此外,请注意,对于a最佳的码字长度为0.5比特,对于aa的最佳码字长度是1位。最佳的码字长度会随着事件多少而增加,即使增量是分数也会增加!所以,如果我们一次传达很多事件,长度就会增加。
即使实际的编码只能使用整数,但是研究有分数比特位的平均长度也是有其实际的意义。
(实际上,人们使用的编码方式在不同程度上是有效的,霍夫曼编码基本上就是我们在这里所描绘的那种编码,它不能很好地处理小数位 —— 此时就必须按照我们上面的做法把符号分组,或者用更复杂的技巧来逼近熵极限,算术编码有点不同,但仍然可以合理地处理分数位是获得最佳编码)。
如果我们关心用最少的比特来沟通,这些想法显然是最基本的。如果我们关心压缩数据,信息理论就已经解决了核心问题,并为我们提供了抽象的方法。如果我们只是因为兴趣而研究那就?
信息理论的观点出现在机器学习,量子物理学,遗传学,热力学,甚至博弈等许多领域。这些领域的从业者通常不关心信息理论,因为他们想压缩信息。他们在乎,因为它与他们的领域有着紧密的联系。量子纠缠可以用熵来描述。9个在统计力学和热力学许多结果可以通过假设你不知道的事最大熵导出。10赌徒的赢或输直接与KL背离有关,特别是迭代设置。11
信息理论出现在所有这些地方,因为它为我们需要表达的许多东西提供了具体的,有原则的形式化。它给我们提供了衡量和表达不确定性的方法,两组信念是如何不同的,以及一个问题对其他人的回答告诉了我们多少:概率分布如何,概率分布之间的距离以及两个变量之间的依赖关系。有没有其他的,类似的想法?当然。但是信息论的思想是清洁的,它们具有非常好的性质和一个原则性的起源。在某些情况下,他们恰恰是你在乎的东西,而在其他情况下,他们在一个混乱的世界里是一个方便的代理。
机器学习是我最了解的,所以让我们来谈谈一下。机器学习中一个非常常见的任务就是分类。假设我们想看一张照片,并预测它是一只狗还是一只猫的图片。我们的模型可能会说“这个图像是一只狗有80%的机会,有20%的机会是一只猫”。让我们说,正确的答案是狗 - 我们只是说有一个80的好或坏有机会,这是一只狗?说85%会好多少?
这是一个重要的问题,因为我们需要一些关于我们的模型是好还是坏的概念,以便使其优化。我们应该优化什么?正确的答案实际上取决于我们使用的模型是什么:我们只关心最重要的猜测是对的,还是关心我们对于正确答案的自信程度?有多自信地错了?没有一个正确的答案。往往不可能知道正确的答案,因为我们不知道如何以足够精确的方式来使用模型来形式化我们最终关心的内容。结果就是有些交叉熵确实正是我们所关心的情况,但情况并非总是如此。更多的时候,我们并不确切地知道我们关心什么,交叉熵是一个非常好的代理。12
信息为我们提供了一个强大的思考世界的新框架。有时它完全适合手头的问题; 其他时候这不是一个确切的适合,但仍然非常有用。这篇文章只是刮擦了信息论的表面 - 有一些主要的话题,比如纠错码,我们根本没有触及 - 但是我希望我已经证明信息论是一个美丽的主题,不需要恐吓。
为了帮助我成为更好的作家,请考虑填写这个反馈表。
克劳德·香农(Claude Shannon)关于信息理论的原始论文“交际的数学理论”非常容易理解。(这在早期的信息论文中似乎是反复出现的模式,是时代吗?缺少页面限制?贝尔实验室的文化?)
盖和托马斯的信息理论的要素似乎是标准的参考。我发现它很有帮助。
我非常感谢DanMané,David Andersen,Emma Pierson和Dario Amodei花时间在这篇文章上给出了非常详细和广泛的评论。我也很感谢Michael Nielsen,Greg Corrado,Yoshua Bengio,Aaron Courville,Nick Beckstead,Jon Shlens,Andrew Andrew,Christian Howard和Martin Wattenberg的评论。
也感谢我的第一个两个神经网络研讨会系列作为豚鼠这些想法。
最后,感谢读者帮我纠正错误。特别感谢Connor Zwick,Kai Arulkumaran,Jonathan Heusser,Otavio Good以及匿名评论者。
理解卷积
神经网络,流形和拓扑
↩
9. 量子信息理论有一个完整的领域。我对这个问题一无所知,但我敢打赌,Michael Nielsen和Issac Chuang的量子计算和量子信息是一个很好的介绍,这是一本基于迈克尔的著作而写的一本书。↩
10. 作为一个对统计物理一无所知的人,我尝试去勾画出统计物理与我理解的信息理论之间的联系。 香农发现信息理论之后,许多人注意到热力学方程式和信息论方程式之间的很多相似之处。ET Jaynes发现了一个非常深刻和有价值的联系。假设你有一些系统,并采取一些像压力和温度的测量。你应该怎么看待这个系统的特定状态?Jaynes建议我们应该假定在我们测量的约束下,使熵最大化的概率分布。(请注意,这个“最大熵原理”比物理学要普遍得多!)也就是说,我们应该假设最可能的信息。从这个角度可以得出许多结果。 (阅读杰恩斯论文的前几部分(第一部分,第二部分)我对他们看起来有多容易印象深。) 如果你对这种关系感兴趣,但不希望通过原始论文工作,Cover&Thomas中有一个部分从马尔可夫链中推导出热力学第二定律的统计版本!↩
11. 信息理论和赌博之间的联系最初是由约翰·凯利在他的论文“ 信息率的新解释”中提出的。这是一篇非常容易读懂的论文,虽然这需要一些我们在本文中没有提出的想法。 凯利关于信息论和赌博之间的研究是有其动机的。他注意到熵被用于许多与编码信息无关的成本函数中,并想要找出一些让人信服的理由。在写这篇文章的时候,我也遇到了同样的问题,我不觉得熵的普遍性完全具有说服力,所以非常感谢凯利的作品。凯利只能用熵来结束,因为他认为迭代赌博是在每一次投注所有资本的地方进行再投资。不同的设置不会导致熵。 关于凯利赌博与信息理论之间的联系的一个很好的讨论可以在信息论的标准参考中找到,Cover&Thomas的“信息论要素”。↩
13. 这不能解决问题,但我仍然要为KL散度辩解。 例如有一个结果,盖和托马斯称斯坦的引理,虽然它看起来是无关的结果,通常称为斯坦因的引理。在高层次上,这是这样的: 假设你有一些你比较了解的数据来自两个概率分布其中之一。你可以自信地确定它来自哪个分布么?一般来说,当你获得更多的数据点时,你的确定性应该会呈指数增长。例如,对于每个数据点你看到的分布是真实的,你可能会确认性变成之前的1.5倍(如果我们量化了你的自信)。 你的信心增加多少取决于分布的差异。如果他们数据差异很大,你很快就会变得自信(就是说你可以很确定这个数据到底是哪种概率分布的)。但是,如果他们只是稍微不同,那么在你一个确定的答案之前,你可能需要搜集大量的数据。 Stein的引理概括地来说:你的确定性增长的倍数其实就是由KL分歧控制的。(关于假阳性和假阴性之间的折衷有一些微妙之处)。这似乎是关注KL分歧的一个很好的理由!↩