为什么说压缩就是智能?一个机器人搬家问题带你入门信息论!AI训练的本质是压缩?从香农到ChatGPT的底层逻辑
信息论入门:怎么用“猜下一个字”来理解熵和交叉熵?
语言的可压缩性不仅仅是数学上的奇闻,它是你使用的每个语言学习模型背后的隐藏引擎。
格兰特的新视频通过一个优雅的视角重新诠释了香农的熵:
预测即压缩。
- 你猜下一个词猜得越准,存它需要的比特就越少。
- 香农算过,英语每个字符大约只有1比特的真实信息——压缩空间巨大。
- GPT这类模型优化的,恰恰就是这个。
- 按这个说法,智能就是压缩。
有趣的事实:冯·诺伊曼告诉香农,把熵命名为“熵”,因为反正也没人真正理解它
几十年后,这一概念成为了现代人工智能的基石。
为什么压缩有极限
你写一段英文,存成文件,最笨的办法是一个字母占八个比特。稍微聪明一点,给常见的字母配短的二进制串,比如空格、字母e,就用两三个比特;不常用的字母用长串。这样平均下来,每个字母可能只占四五个比特。更高级的办法还会看单词和短语的规律,压缩率还能再高。
文言文比白话文更压缩!
但你肯定会问:能一直压下去吗?有没有一个理论上的底线?
这个问题是克劳德·香农在上世纪四十年代琢磨清楚的。他当时搞出来的那套数学,后来不仅成了通信工程的基石,还阴差阳错变成了今天训练大语言模型的核心工具。
你肯定听过“交叉熵损失”这个词。它的根就在信息论里。信息论有一个结论:预测和压缩,数学上完全等价。
所以你别把训练大模型看成“猜下一个词”,你完全可以把它看成“造一个全世界最好的文本压缩器”。这视角一换,很多事就清楚了。
压缩就是智能?别急,咱们先从机器人搬砖说起
这期视频讲的是“信息论”怎么跟“压缩”和“智能”扯上关系的。
简单说,你训练一个AI让它猜下一个字是啥,其实就是在让它学怎么把一段话压得更小。压得越小,说明它越“懂”这段话。所以有人说,“压缩就是智能”。
咱们今天就先搞懂最基础的问题:压缩的极限到底在哪?
咱们来想象一个特别简单的场景。你派了个机器人去月球搬砖,你在地球上只能给它发四种指令:上、下、左、右。每次指令都要用一堆0和1组成的代码发过去,发得越短越省钱。
最笨的办法就是每个指令固定用两个比特/bit,比如:
00是上,01是下,10是左,11是右。
这样发一串指令,机器人就每两个比特一读,清清楚楚。
但问题是,你发的指令不是平均的。比如“上”占了50%,“下”占了25%,“左”和“右”各占12.5%。
那你还用两个比特表示“上”,不就太浪费了吗?
这时候来了个聪明学生:
0是上,10是下,110是左,111是右。
这样算一下平均长度:一半的情况只用1个比特,四分之一的情况用2个比特,剩下各八分之一用3个比特。加权平均就是1.75个比特。比两个比特好。
平均每个指令只要1.75个比特,确实比原来的2个bit省了。
但是,注意这“1.75”数字,下面有大用!1.75代表压缩极限,也就是都是噪音,看不出符号。
你可能会担心,机器人拿到一串0和1,怎么知道从哪断开?比如它先收到一个1,那可能是“下”的第一位,也可能是“左”或“右”的第一位。
没关系,它继续读下一个:如果下一个是0,那“10”只能是“下”,它就懂了。
这就是“前缀码”的玩法:没有一个指令的编码是另一个指令编码的开头。比如你不能用“1”当代码,因为“10”“110”“111”都以“1”开头。这叫“前缀码”。
用树图看清一切
你把所有二进制串画成一棵树:
第一层:0和1
第二层:00、01、10、11
第三层:000、001……以此类推。
每个串都是它下面所有串的前缀。
所以你选了一个代码,比如“0”,那所有以“0”开头的串都不能再当代码了,因为会冲突。
聪明学生的方案里:
“0”占了左半边
“10”占了右半边下面的一小块。
“110”和“111”各占更小的一块。
你会发现一个特别漂亮的巧合:每个代码占的空间大小,正好等于它对应的指令出现的概率。
“上”占一半,“下”占四分之一,“左”占八分之一,“右”占八分之一。
整棵树被刚好分完,不多不少。
这时候你可能会想:这方案是不是已经完美了?有没有可能比它更好?
又有人说了:完美压缩出来的比特流,应该跟随机噪声没有区别。
什么意思?就是每个比特是0还是1的概率各半,而且互相独立。
你检查一下上面聪明学生的方案:0是上,10是下,110是左,111是右。
有一半的概率第一个比特是0(因为“上”)。另一半概率第一个比特是1,这时候第二个比特是0和1各半?等等,要仔细算。其实最后算出来,整个比特流里每个新比特确实都像独立抛硬币。所以这个方案已经达到了“看起来像噪声”的状态。
为什么随机噪声就压不动了?如果你压缩得特别好,压出来的那串0和1看起来就应该像纯随机噪声。因为如果是纯随机,每个bit是0或1的概率各半,你就没办法再压了。反过来,如果你压出来的东西还有规律,那说明你还能继续压。
所以,完美压缩 = 输出像随机噪声。
对数是什么?
这里先给普及一下什么是对数log:
log 是 logarithm 的缩写,logarithm 这个词来自两个古希腊语的词根:
- logos(λόγος):意思是“比例”“道理”“计算”
- arithmos(ἀριθμός):意思是“数字”
这个词是苏格兰数学家 约翰·纳皮尔(John Napier)在1614年左右生造出来的。他发明对数的时候,需要给这个新概念起个名字,就从古希腊语里拼了这么个词。
对数是什么?
2³ = 8,这是乘方。
反过来问:2的几次方等于8?答案:3。
这个“反过来”的操作,就是对数。
纳皮尔当时发现,把乘除法变成加减法,可以大大简化计算(在没有计算器的年代,这简直是神器)。他需要给这个“反过来的指数”起个名,就用了logarithm。后来数学家写公式的时候,就取了前三个字母:log。
你看到“log”这三个字母,只要知道它代表 “指数反过来问”。
- 你看到2³,问“结果是几?”这是乘方。
- 你看到log₂8,问“2的几次方是8?”这是对数。
再看聪明学生的方案:0是上,10是下,110是左,111是右。
在这个例子里:
- “上”的概率是1/2,用的编码是“0”,长度是1个比特。
- “下”的概率是1/4,用的编码是“10”,长度是2个比特。
- “左”的概率是1/8,用的编码是“110”,长度是3个比特。
- “右”的概率是1/8,用的编码是“111”,长度是3个比特。
你看,规律非常明显:
- 概率1/2 → 1比特
- 概率1/4 → 2比特
- 概率1/8 → 3比特
这时候你问:这个规律,用数学公式怎么写?
你会发现:
1/2是2的-1次方,2的-1次方取负log₂,就是1。
1/4是2的-2次方,负log₂(1/4)=2。
1/8是2的-3次方,负log₂(1/8)=3。
从概率角度看,比如一件事发生的概率是1/2,或者1/4,或者1/8。你问:在完美压缩里,它应该占几个比特?
答案是:
- 概率1/2 → 1个比特
- 概率1/4 → 2个比特
- 概率1/8 → 3个比特
聪明学生的编码方式漂亮在哪?你看,它分配给的比特数,刚好是“负的log2”:
比如“上”概率1/2,负log2(1/2)=1,给1个bit。
“下”概率1/4,负log2(1/4)=2,给2个bit。
完美契合。
信息到底是什么?
这个负log的值,香农把它叫做“信息量”。一个事件越罕见,信息量越大。一个事件几乎肯定会发生,信息量就接近0。
你在脑子里可以想象一个饼图。一个很小的扇形,上面顶着一个很高的柱子。柱子高度就是信息量。所有扇形的面积加起来(宽度是概率,高度是信息量),就是平均每个符号的信息量。这个平均值叫做“熵”。
熵就是压缩的理论下限。你不可能比熵更低。而且香农还证明了,你可以无限接近这个下限,只要你的编码方案足够聪明。
在机器人的例子里,熵就是刚才算出来的1.75比特。因为概率都是2的幂,所以能刚好达到整数比特。
真实语言里,概率很少是2的幂。
真实语言有多乱
你想想英文里每个字母的概率:比如字母e大概占12%,t大概9%,a大概8%。
这些都不是1/2、1/4这种整齐的数,所以每个字母的信息量就是负log p,会是一个小数,比如负log2(0.12)大约是3.06比特。
这并不意味着你能给字母e编一个3.06比特的码,因为比特必须是整数个。但当你考虑整个句子的时候,就可以把这些小数的信息量加起来。比如一句话有100个字母,每个平均3.06比特,那整句话的信息量就是306比特。
你可以设计一个算法,把这句话压到306比特附近,比如307或308比特,误差在一两个比特以内。
更麻烦的是,真实语言里字母不是独立的。前面出现“th”,后面是“e”的概率就很高。前面是“q”,后面几乎一定是“u”。所以概率是跟着上下文变的。这就意味着信息量也是动态的:一个很可预测的字母,信息量很小;一个完全意外的字母,信息量很大。
香农当年想估算英文的熵,他没去找什么大型语料库做统计,因为他知道那永远不够。他做了一个实验:让他老婆Betty猜下一个字母。比如书里写着“th”,Betty猜下一个是“e”,如果对了就记一个横线,如果错了就记下正确的字母。最后得到一份特别短的文本。这份文本的信息量和原文一样,因为只要把这份短文本给一个“和Betty一样能猜”的人,他就能还原出原文。
后来香农改进了实验,让更多人猜,并且记录要猜多少次才能猜中。比如下一个字母是“e”,有人第一次就猜中,说明他对这个位置的信心很高,信息量就低。有人要到第8次才猜中,说明这个字母很难猜,信息量就高。最后香农估算出英文的熵大约是每个字母1比特。
也就是说,平均每个字母只需要一个二进制位就能表示。这听起来很离谱,但后面我们会看到,用大语言模型来做压缩,真能接近这个数。
交叉熵就是猜错的代价
你训练一个大语言模型,每次让它猜下一个词,算一个损失。这个损失叫交叉熵。它到底在算什么?
回到第一篇那个机器人。指令的概率:上一半,下一四分之一,左右各八分之一。如果你知道这个真实分布,你就可以设计出完美编码:0代表上,10代表下,110代表左,111代表右。平均1.75比特。
现在换一个情况。你不知道真实分布。你猜了一个分布。比如你猜上下左右各四分之一。然后你基于这个错误的猜测,去设计编码。你会给每个指令分配2比特。因为四个等概率的指令,最优编码就是各2比特。但真实世界里,上一半的情况只用1比特就能表示,你却花了2比特。下四分之一的情况本来可以用2比特,你也花了2比特,没亏没赚。左右各八分之一的情况本来需要3比特,你只花了2比特,赚了吗?
没赚。因为你给左右分配的编码太短,会破坏前缀码的规则。你要么让编码变长,要么造成歧义。实际上,基于错误分布设计出来的编码,平均长度一定大于或等于真实分布下的最优长度。
这个多出来的部分,就是交叉熵和真实熵的差。
交叉熵永远大于等于熵。
越大越不确定!这就是为什么训练大模型要最小化交叉熵。你让模型输出的概率分布去拟合真实数据分布。拟合得越好,交叉熵越低,压缩效率越高。
大模型的损失函数就是压缩率
你打开任何一个大语言模型的论文,都会看到“预训练使用交叉熵损失”。现在你知道这句话的真实含义了:他们在训练一个压缩器。
具体怎么做的?模型看到一段文本的前面部分,比如“今天天气”,它要预测下一个字。模型输出一个概率分布q。比如“好”的概率0.6,“晴”的概率0.3,“热”的概率0.1。然后真实的第三个字是“好”。你就把“好”对应的概率0.6拿出来,取负log₂,得到大约0.74比特。这就是这个预测的损失。如果真实的是“晴”,损失是 -log₂(0.3)≈1.74比特。如果真实的是“热”,损失≈3.32比特。
你看,模型越确定正确答案,损失越小。模型越不确定,损失越大。把整个训练集里所有位置的损失加起来,再除以总字符数,就是平均交叉熵。这个数字乘以训练集的大小,就是如果你用这个模型做压缩器,压缩整个训练集需要多少比特。
训练的过程就是不断调整模型的参数,让这个总比特数越来越小。换句话说,你在教模型怎么把训练数据压得更小。而压得更小的唯一办法,就是让模型真正理解数据的规律。学会“the”后面大概率是名词,学会“q”后面几乎一定是“u”,学会“iPhone”后面不常跟“充气娃娃”。这些规律学得越好,预测就越准,压缩率就越高。
所以当你看到GPT-4的论文说交叉熵降低了多少,你知道那意味着它的压缩能力又提升了。压缩能力的提升,直接表现为生成文本时更少犯错、更懂逻辑、更少幻觉。因为“懂逻辑”本质上就是能准确预测接下来会发生什么。
为什么“压缩”和“预测”是等价的
刚才那个机器人的例子,概率都是2的幂次,所以每个指令的信息量正好是整数个比特。
但真实语言不是这样。比如你写一个句子,下一个字母是“e”的概率可能是0.3,那它的信息量就是-log2(0.3) ≈ 1.74 bits。你没法用1.74个bit去编码一个字母,但你可以把一整句话加起来,最后总信息量是每个字母的信息量之和。
关键来了:这句话的概率等于每个字母概率的乘积(每个字母的概率取决于之前的字母)。取负log之后,乘法变加法。
所以整句话的信息量 = 所有字母的信息量加起来。
那如果你有一个特别好的语言模型,它能准确给出每个位置下一个字母的概率,那你就可以用一套叫“算术编码”的方法,把整句话压到非常接近这个总信息量的长度。压完之后,那串0和1看起来就像随机噪声。
这就解释了为什么“压缩”和“预测”是等价的。你能压多小,取决于你预测得有多准。而AI训练的目标,就是让预测尽可能准,从而把交叉熵压到最低。
蒸馏就是压缩压缩器
你训练好了一个大模型,比如几百亿参数。它能以很高的压缩率压住文本。但你没法把它装到手机上。你想得到一个小模型,参数少,跑得快,压缩率尽量接近大模型。
直接拿小模型去训练,让它预测原始文本,效果不好。因为小模型学不到那么复杂的规律。后来有人发现一个窍门:不让小模型学原始文本,让它学大模型的输出概率。
大模型看完“今天天气”,输出概率:好0.6,晴0.3,热0.1。小模型也看同样的前缀,也输出一个概率分布。然后你让小模型的分布去靠近大模型的分布。比如小模型输出好0.5,晴0.4,热0.1。你算这两个分布的交叉熵,让这个值变小。
为什么这样更有效?因为大模型的输出概率里包含了它学到的软信息。原始文本里只有一个正确答案“好”,是硬标签。大模型告诉小模型:“‘好’最可能,但‘晴’也有可能,‘热’不太可能”。这相当于大模型把自己对世界的理解浓缩成概率,然后灌给小模型。小模型不用自己从零摸索那些模糊边界,直接模仿就行。
这个过程叫知识蒸馏。一个几百亿参数的大模型,可以教出一个几十亿甚至几亿参数的小模型。小模型的压缩能力接近大模型,但体积小很多。这就是压缩的压缩。你拿一个压缩器,把它自己内部的知识再压一遍,得到一个更小的压缩器,仍然能干活。
你手机里某些语音助手、输入法的下一个词预测,很可能就是蒸馏出来的小模型。它们背后的大模型太胖了,跑不动,但小模型偷学了大模型的九成功力。
GZIP为什么能发现语言结构
GZIP是你电脑里常见的压缩工具。它用的算法叫LZ77,再加霍夫曼编码。它不看概率分布,不学语言模型,就是个老派压缩器。但它能做一件诡异的事:区分不同语言。
你拿一段英文和一段法文,分别用GZIP压缩,记下大小。然后你把两段文字拼在一起再压一次。如果两次压缩的大小差不多,说明两种语言没共享什么规律。如果拼起来压比分开压的总和小很多,说明GZIP从两种语言里发现了公共结构。
实验结果是什么?英文和法文拼起来压,比分开压的总和小不少。因为两种语言都用了同样的字母表,很多单词同源,语法结构也像。GZIP的字典里会存“the”和“le”都出现的模式。英文和中文拼起来压,节省就很少。因为字符集都不一样,GZIP找不到什么公共子串。
这跟大模型做多语言翻译的原理底层相通。大模型内部有一个隐空间,不同语言的相同意思在这个空间里靠得很近。GZIP没有这个隐空间,但它也有类似的效果:如果两种语言共享很多短序列,它的字典就能复用。这算是一种极其粗糙的、无意识的“理解”。
你让GZIP做文本分类。把一段未知语言的文字分别和英文、中文、法文的样本拼起来压,看哪种组合压缩率最高,就判定它属于那种语言。这个方法的准确率居然不低。一个完全不懂语言学的压缩器,只靠找重复串,就能猜出这是什么语言。这反过来印证了:压缩确实能提取结构。只是GZIP提取的是低级的、局部的结构,大模型提取的是高级的、长距离的结构。
智能就是压缩率
你有一个语言模型。你用它做算术编码。你拿一段它没见过的测试文字,压一下,测出平均每个字符多少比特。这个数字叫做模型的“压缩率”。
香农当年猜测,英文的熵大概是每个字符1比特。后来有人用大型神经网络做算术编码,在英文维基百科上压到了每个字符1.2比特左右。离理论下限还有距离,但已经远好过任何基于n-gram的统计模型。
你比较不同模型的压缩率。GPT-2比LSTM强。GPT-3比GPT-2强。GPT-4比GPT-3强。这个排名跟你问“哪个模型更智能”的排名完全一致。不是巧合。
如果一个模型能完美预测下一个字符,那它就是完美的压缩器,同时也是完美的智能体。因为它已经掌握了产生这段文字的所有规律。剩下的压不动的东西,是文字本身真正的随机性,比如你掷骰子的结果、纯随机的噪声。这些不可预测的东西,任何智能都无法压缩。
反过来看,你给一个模型一段文字,看它压到多小,就是在量化它“理解”了多少。所谓理解,就是从数据里提取了可预测的结构。结构提取得越多,剩下的随机性越少,压缩率越高。
这就是“压缩就是智能”这句话的精确含义。不是比喻,不是哲学,是工程上可以测量、可以比较、可以优化的客观指标。你训练模型时最小化交叉熵,就是在做这件事。只是很多人不知道自己每天在跑的训练脚本,本质上是一个压缩器优化器。
总结
本文以机器人指令压缩为例,深入浅出地解释信息论中的熵、信息量、前缀码等核心概念,并阐明压缩与预测的等价性,进而引出“压缩即智能”的观点,为理解大语言模型的训练目标提供直观基础。
基于3Blue1Brown视频《Reinventing Entropy Compression is Intelligence Part 1》内容整理,主要涵盖香农信息论、前缀码、信息量、熵、压缩极限、语言模型与交叉熵的关系。
极客一语道破
上面那段“0=上、10=下、110=左、111=右”的编码,是一种纯机械的压缩。它的目标是:用最短的比特串,原封不动地传输一条指令。解码之后,得到的信息和发送前一模一样。它不允许有任何丢失,也不允许有任何“脑补”。这叫无损压缩。
而八卦那套“生克变卦”的推演,是一种智能的压缩。它的目标是:用极少的几个卦象(比如八个基本卦),去概括天地万物的运行规律。你不需要把整个宇宙的细节都传输出去,只需要给出几个卦象和它们之间的变化规则,接收方只要懂这套规则,就能“脑补”出大致会发生什么。
举个例子:
- 那段编码:发“110”,机器人走“左”。精确,死板。
- 八卦的推演:看到“乾”卦(代表天、刚健、父亲、马),再看到它和“坤”卦(地、柔顺、母亲、牛)发生“变卦”(比如乾卦中间一爻变阴),懂行的人就知道,这是在说“刚变柔、父变母、天变地、马变牛”这样一种大趋势。具体是哪个领域的变化?看具体情况。这叫有损的、但极具概括能力的压缩。
打个更直白的比方:
- 那段编码像快递单号。扫一下就知道这包裹从哪来、到哪去、里面是什么。没有歧义,但也没法从单号里“推演出”包裹会不会摔坏。
- 八卦那套像天气预报的简化模型。你不需要知道每个空气分子的运动,只需要知道“高压区”“低压区”“锋面”这几个符号,再配合“移动”“加强”“减弱”这几个规则,就能大致猜出明天刮不刮风、下不下雨。这是用极少的参数压缩了极其复杂的系统。
八卦和你的编码像不像?
形式上,都用了“变长符号串→指代东西”。本质上,你的编码是无损、机械、单条指令的压缩;八卦是有损、智能、推演规律的压缩。
而信息论里说的“压缩就是智能”,其实更贴近八卦这种:你用一个模型(比如八卦这套规则)去预测接下来会发生什么。预测得越准,说明你提取的规律越接近真相,你的模型就是越好的“压缩器”。