信息与概率
在谈论信息的熵,交叉熵,KL 散度的概念之前,我希望能先讨论一下“信息”是什么。
按照香农的定义,“信息”是“不确定性的消除”。也就是说,我们在做决策(中午饭吃什么)的时候,有很多个选项(吃 KFC 还是麦当劳),我们会在这些选项中犹豫,不确定要选择哪个(不确定哪个更便宜,或者哪个更好吃)。这个时候如果我们有一个“信息”(今天是星期四),消除了我们的顾虑,帮助我们确定了自己的决策。
这个角度其实很有意思,因为我比较本能的去理解,会认为“信息”就是“知识”,是一种经得起现实检验的理性结论,是可以写在教科书中的内容。这样想其实就把“信息”想窄了,就如同上面那个例子一样,“今天是星期四”并不是什么值得写入教科书的内容,它只是一个客观事实的表述,但是只要它对于决策有帮助,那么它就是信息。
然后我希望再阐述一下为什么我们在做决策的时候会有不确定性(也就是犹豫不觉)。这是因为选项是差不多的。在上面的例子中,可能 KFC 和麦当劳难分伯仲,无论是在价格还是口味上,都差不多。而如果选项是 KFC 和臭狗屎,那么我相信没有特殊特殊癖好的普通人,是不需要“今天是星期四”这个信息,就可以做出确定性的决策的。
那么我们该如何描述“选项”呢?我们可以用一个随机变量来描述。比如上面的例子,我们可以说 就是当我们中午吃 的时候,我们很开心的概率。我们可以说 , 和 。
也就是说,实际上影响我们决策的有两个因素:
- 待决策对象的不确定性,它被表示成一个概率分布,它的不确定性越高,我们就越难决策;
- 支撑我们做决策的信息,信息可以帮助我们消除原本对象的不确定性。
信息的度量
我打算用一个例子来介绍后面的内容,所以我要先介绍一下这个例子。这是一个关于天气预报的例子,我们一共有四种天气 。我们作为广播员,需要向全国观众广播今天的天气状况。但是我们显然不能随便从 中挑一个广播,我们有一个天气站为我们提供信息,方便我们去广播。
天气站向我们提供的信息,可以是非常正经的“今天的天气是 ” ,也可以是“今天是星期四”。我们直观感受上,第一句话的信息量很高,可以帮助我们判断天气;而第二句话的信息量约等于零,是无关的废话。为了度量一个信息是否是“废话”,我们需要一些设计。
香农认为,我们可以用“传达某个信息所需要的最小 bit 数”,来度量信息量。bit 数越少,信息量就越少。
需要强调的是,我们不关注一个信息表面的 bit 量,而是关注最小的 bit 量。这点也非常符合直觉。“我跟你说,今天我废了八辈子的力,终于知道了今天的天气是 ” 和 “” 所传达的信息量是一致的。
在我们上面的例子中,每次从天气站发来的信息量,是 2bit(00, 01, 10, 11)。也就是说,理想情况下,天气站只需要给我们传递 2 个 bit,就足够告诉我们应该如何播报天气了。
再深入理解下,我们希望在“信息”的指引下,选择出正确的选项。那么 1bit 刚好可以让我们做出一次“二选一”的选择题。当信息是多个 bit 的时候,我们就可以借此组建一个二叉的决策树,来帮助我们做决策。
最小编码与信息熵
那么 2bit 是否就真的是“最小”的 bit 量了呢?乍一看确实是,毕竟有 4 种天气,那么怎么着都得用 2bit 呀。
但是实际上并不是,2bit 是在定长编码下的最优结果,但是如果考虑不定长编码,那么还可以更短一些。这是为什么呢?
我们可以给出一组不定长编码 0, 10, 110, 111 ,其实这种编码所对应的树的高度,一定是大于等于原来定长编码所对应的树的。那么不定长编码的优势在哪里?
优势在于, 并不是等概率出现的。如果一个地方是热带沙漠,那么这个地方下雪的概率就是 0,进而我们给它一个较长的编码(比如 111 ),也不会有太多的损耗,毕竟这个较长的编码,几乎也不怎么可能被使用。而我们如果给“晴天”一个较短的编码(比如 0),那么在沙漠中,最频繁出现的天气,就可以使用 1bit 编码了,这样非常经济。
总结一下,在不定长编码中,如果一个结果出现的概率越高,那么我们越应该给它一个越短的编码。反之,则应该给它一个较长的编码。
那么按照这样设计,极限的编码长度是多少呢?香农给出了答案:
我来解释一下,就是香农证明了,对于某个特定的结果 ,他的编码长度是 。比如说 ,那么我们理论上只需要 bit 就可以编码它。至于这个结论是怎么来的,我确实也证明不了。
除了这个部分,其他部分就只是在算期望。因为本质上不定长编码的长度,是所有编码的长度的期望,需要乘上每个编码所对应的概率,所以才是上面这个式子。
当然香农只是证明了理论上限在这里,但是如何达到这个理论上限,还有赖于具体的算法。比如说霍夫曼算法就是一种逼近理论的不定长编码方案。比如说我们考虑:
那么运行霍夫曼编码,我们可以得到 X1 = 0, X2 = 10, X3 = 110, X4 = 111 ,然后计算它的期望长度:
而根据香农公式算出来的结果,刚好也是 1.75bit,也就是说,在当前概率分布下,1.75bit 是最短的,而且霍夫曼编码实现了这种最短的情况。
此时我们跳出来一下,再回看这个系统,会发现理论上我们能将信息编码的长度压到多短,唯一相关的就是条件变量 的概率分布 ,跟我们的实现无关(因为这是理论上),也跟某个特定的信息和结果无关(因为我们考虑的是全面的期望)。
那么其实这个“理论最小长度”就成了随机变量 的一个特性了。很轻松就知道,如果 比较平均,那么这个长度就会比较长,如果 非常极端,那么这个长度就可以很小。
更直观一些,如果一个 的不确定性越高,那么这个长度也就是越长。可以理解为,为了消除 的不确定性,我们就需要信息量更大的信息。
这种“理论最小编码长度期望”,就被称作“信息熵(Information Entropy)”,用来表示随机变量的不确定性。
交叉熵与 KL 散度
交叉熵(Cross Entroy)的概念,是为了描述理论和现实的差距而建立的。
在前一节的例子中,我们一开始提到了一个编码长度期望为 2bit 的定长编码方案。我们为什么会下意识采用这种方案呢?这是因为我们本质上认为,每个结果出现的概率都是 ,所以我们才会采用 2bit 方案。也就是说,我们在“逆用”香农的公式,正因为我们给某个结果分配了 2bit,所以我们假设它发生的概率是 。
当然可能在上面那个例子中,我们没有那么蠢,如果就是热带沙漠,我们不会让晴天的编码和下雪的编码一样长。但问题是,我们也没有办法真的知道晴天和下雪的概率。可能理想概率是:
而我们的预估概率是
基本上大小关系是对了,但是具体的数值存在差异,这个时候我们的编码长度期望,就变成了:
可以看到现在的实际长度,就变成跟 这个真实分布,和 这个估计分布相关了。这就是交叉熵。
交叉熵表示当你不知道某个系统的概率分布时,用一个估计的概率分布去编码得到的平均编码长度。 表示的是每一条信息的编码长度,由于编码长度是由我们自己决定的,只能用估计的分布来算,所以它用的是 分布。而算期望时,得用真实的概率分布 。
交叉熵有一个很重要的性质:交叉熵一定不小于熵。熵是最优的编码长度,你估计出来的编码方案,一定不会比最优的更好。而交叉熵与理论信息熵的差值,就是相对熵,也被叫作 KL 散度:
它也可以被视作, 与 两个概率分布之间的一种距离。
LLM 中的应用
LLM 推理时,每生成一个 token,本质上都是生成一个词表大小的概率分布 logits。因为 KL 散度可以衡量生成的概率分布,与 label 的概率分布之间的差异,所以被广泛用在训练中作为损失函数。
不过 label 的概率分布在不同情景下,有不同的差异。
在预训练中,label 是完全固定的,所以它的概率分布是独热码,也就是词表中的只有一个 1,其他都是 0 。那么我们又知道( 型洛必达法则)
所以独热码的信息熵为 0 。此时 KL 散度,会退化成交叉熵。这就是我们预训练的时候,使用交叉熵作为损失函数的原因。
而在知识蒸馏中,教师模型和学生模型都生成的是 logits,所以我们用 KL 散度作为损失函数。
而在强化学习中,不再有 label 了。但是 KL 散度依然可以作为损失函数的一部分。比如说我们可以比较模型当前输出的概率分布和经过 SFT 而未经过 RL 的输出的概率分布的 KL 散度,避免 RL 后的模型偏离 SFT 过多。