30u30 中文导读 / 30 天目录 / 第 6 天

第 6 天 · 熵一路上升,复杂度为什么先升后降?

第 1 单元The First Law of ComplexodynamicsScott Aaronson博客(Shtetl-Optimized) · 2011
这是导读,不是翻译。先用 10 分钟拿到这篇论文的思想地图,再去读 原论文 →,去原仓库的 06_Complexodynamics/ 目录 → 动手写代码。
给孩子讲:这一天有 10 岁孩子能听懂的讲义,带猜字游戏和动手活动,可打印。打开儿童讲义 → · PDF 简体 · PDF 繁體

一句话

物理学家 Sean Carroll 问:熵随时间单调上升,为什么系统的“复杂度”先升后降?Aaronson 在这篇博文里提出“复杂熵”(complextropy):在计算时间受限时,描述状态所属的典型集合需要的最短程序长度。他猜想它先升后降,并提议用咖啡与牛奶混合的模拟来检验。

论文讲了什么

问题。往咖啡上倒一层牛奶。开始时两层分明,状态简单。最后完全混匀,状态也简单。中间阶段出现卷须和漩涡,看起来最复杂。熵(entropy)从头到尾单调上升,符合热力学第二定律。“复杂度”却先升后降。宇宙也一样:大爆炸后很简单,热寂时也简单,现在有星系和生命。2011 年,Sean Carroll 在 FQXi 的一次时间主题会议上提出这个问题:怎样严格定义这种“复杂度”,并证明它先升后降?

候选 1:Kolmogorov 复杂度。不行。完全混匀的状态没有规律,Kolmogorov 复杂度最高。它度量的是随机性,和熵一起单调上升。

候选 2:精巧度(sophistication)。这个概念源自 Kolmogorov 1970 年代的观察:随机串的 Kolmogorov 复杂度接近最大,却是最无趣的串。Aaronson 采用的定义如下。找一个集合 S,满足:

精巧度是所有这类 S 中 K(S) 的最小值,也就是 x 中“非随机部分”的长度。全 0 串可以取 S = {x},随机串可以取 S = 全部 n 位串,二者的精巧度都很低。只有“既不简单也不随机”的串精巧度高。

精巧度的缺陷。确定性系统从简单初始状态出发时,时刻 t 的状态可以用“初始状态 + 演化规则 + t”描述。所以它的精巧度不超过 log2 t + c,永远很小。概率性系统在多数情况下也受同样的上界限制。

Aaronson 的提议:复杂熵(complextropy)。他把计算资源限制加进定义,加在 2 个地方:

复杂熵是满足条件的最短采样程序的长度。缺少第 1 个限制,“初始状态 + 跑 t 步”的捷径又会被允许,上界退回 log2 t + c。缺少第 2 个限制,复杂熵可能一直上升,不会回落。

猜想与检验。Aaronson 猜想:复杂熵在初始时小,中间大,混匀后又变小。他不知道怎样证明。他建议先做数值实验:在二维黑白像素格上模拟咖啡和牛奶,每一步随机交换一对相邻的异色像素。复杂熵无法计算,就用 gzip 压缩后的文件大小作粗略代理。博文发布时,MIT 本科生 Lauren Ouellette 已经开始和他做这个项目,成果就是第 7 天的论文。

关键概念

Kolmogorov 复杂度(Kolmogorov complexity)
输出某个字符串的最短程序长度,记作 K(x)。有规律的串 K 小,随机串 K 接近串长。它不可计算,实践中常用压缩器的输出大小作上界近似。
精巧度(sophistication)
把 x 的描述拆成“所属集合 S”和“S 中的编号”两部分,取集合部分的最短长度。它只计规律部分,随机细节不计入,所以简单串和随机串的精巧度都低。
复杂熵(complextropy)
Aaronson 提出的度量,等于加了计算时间限制的精巧度。时间限制排除了“从初始状态模拟 t 步”这种耗时捷径,使中间状态的值可以变大。
粗粒化(coarse-graining)
把细节平均掉,只保留宏观结构。例如把像素格分成 4×4 的小块,每块取平均颜色。不粗粒化时,压缩大小主要反映随机噪声。
资源受限 Kolmogorov 复杂度(resource-bounded Kolmogorov complexity)
只允许运行时间不超过给定上限的程序,再取最短长度。确定性系统的状态在这种定义下复杂度会随时间增长,更接近人对“熵”的直觉。

历史位置:为什么值得读

这是一篇博文,不是论文。它没有定理,只有一个定义和一个猜想。它进清单的原因是:它问了一个好问题,并给出了一条可检验的路线。

它站在两条线的交汇点上:

Aaronson 是计算复杂性理论学者。他的贡献是用“计算资源限制”这个复杂性理论的工具,把两条线接起来。

后续:2014 年,Aaronson、Carroll 和 Ouellette 发表 The Coffee Automaton 论文,用模拟和压缩代理检验了“复杂度先升后降”(第 7 天)。

和清单的关系:第 4–5 天讲“压缩即学习”,第 26 天讲 Kolmogorov 复杂度。本篇把同一套工具用来回答“什么是有趣的结构”。对机器学习的启发是:好模型应该抓住数据的规律部分,不要把随机细节也背下来。精巧度的两部分划分,正是这个要求的形式化。

学前准备

在原仓库怎么学

原仓库第 6 天实现了博文提议的咖啡混合模拟,并用 4 种压缩代理测量复杂度。建议按下面的顺序学:

  1. 先读 Aaronson 原博文,再打开 README.md 看本天的结构。
  2. 读 implementation.py。先看模拟部分 create_initial_grid 和 swap_step,再看测量部分 gzip_complexity、coarse_grained_kc、multiscale_kc、sophistication_proxy。
  3. 运行 train_minimal.py。它是模拟的命令行入口,跑完后检查复杂度曲线是否先升后降。
  4. 打开 notebook.ipynb,用 visualization.py 画“复杂度驼峰”和熵的单调曲线。数据说明见 data/README.md。
  5. 做 exercises/ 里的 5 个练习:gzip 复杂度、咖啡混合、多尺度分析、两部分编码、几种度量的对比。
  6. 对照 exercises/solutions/ 检查答案,最后用 CHEATSHEET.md 复习。

建议:练习 2 和 3 是核心。先不做粗粒化,确认 gzip 曲线单调上升;再加上粗粒化,看驼峰是否出现。这一组对照能说明粗粒化为什么必不可少,也能对应博文中复杂熵的直觉。

今天再看

问题仍然开放。Aaronson 的猜想至今没有被严格证明。复杂熵无法计算,研究者仍然用压缩器做代理。

压缩代理在大模型时代更常见了。Jiang 等人 2023 年用 gzip 加最近邻做文本分类,引发了大量讨论。研究者也常用语言模型的压缩率评估数据质量和模型能力。“用压缩后大小衡量信息量”,正是本篇的实用部分。

和大语言模型的联系。精巧度把数据拆成“规律”和“随机细节”。语言模型训练时,参数学到的是规律部分,不可预测的部分留在损失里。损失降到某个值后不再下降,剩下的就是数据本身的不可约熵。2022 年 Chinchilla 论文的规模定律拟合公式里就有这一常数项。从这个角度看,模型参数存的东西接近数据的“精巧度”。

容易卡住的地方

延伸阅读