四杯咖啡:奶油从分层、起卷须到完全混匀 左边写着 27 + 3 和 2.23 bits/char。右边是从上往下看的四只杯子,取自咖啡自动机模拟的四个时刻:奶油浮在上半、边界开始起伏、出现大片卷曲的混合带、最后全部变成均匀的浅褐色;复杂度最高的第三只杯子带强调色的边。 27 + 3 篇论文 2.23 bits/char 预测 = 压缩

30u30 是 GitHub 上一个 1.6k star 的学习仓库1,README 第一行写着:

“If you really learn all of these, you’ll know 90% of what matters today” - Ilya Sutskever

下面是 30 天的课表,一天一篇论文,每篇配从零写起的实现、笔记和练习。第 1 天是 Karpathy 的字符级 RNN,第 13 天是 Attention Is All You Need,最后两天是 PPO 和 RLHF。看起来就是一份现代 AI 的必读清单。

可是第一周的七篇里,后四篇讲的都不是网络怎么搭:两篇讲“最小描述长度”,一篇是 Scott Aaronson 的博客,讲一个封闭系统的“复杂程度”为什么会先升后降,还有一篇用一杯咖啡加奶油的模拟来量化这件事。一份 AI 清单为什么要读咖啡?这真的是 Ilya 开的清单吗?“90%”又指什么?

我们先从清单的来历查起,再看它到底由什么组成。

一、清单的来历

原单已经不存在

这份清单的出处是 John Carmack。他在一次访谈里说,他当年向 Ilya Sutskever 要一份入门深度学习的阅读清单,Ilya 给了他“大约 40 篇论文”,并说了 README 里那句话。但是邮件丢了:Meta 有两年自动删除邮件的策略,他手里只剩一个夹子,里面打印了其中一部分2。Ilya 和 OpenAI 都没有公开过这份清单。

流传的是 27 条

2024 年,一份 27 条的清单开始在 X 和 LinkedIn 上流传,有人说它是一位 OpenAI 研究员给新人的阅读材料2,在网上转了好几周3。保存这份清单的存档页写得很直白:“It is not confirmed if this is the actual list.”4 有人认为它缺了一节元学习,这一点我没有找到原始出处。

这 27 条里有一条很特别。第 26 条不是一篇论文,原文是:

PAGE 434 onwards: Komogrov Complexity

它链接到 Shen、Uspensky、Vereshchagin 的数学专著《Kolmogorov Complexity and Algorithmic Randomness》的扫描版5。这本书 500 多页,清单只让人从第 434 页读起。我们下载了这份 PDF 去翻:第 434 页正好是第 14 章“算法统计”(Algorithmic statistics)的第一页,后面跟着两篇讲随机性的附录,到参考文献为止一共不到 60 页。清单要的不是“Kolmogorov 复杂度是什么”,而是这本书最后讲的那一章。 这一章讲什么,后面会用到。

30u30 又补了三篇

30u30 的 30 篇,是这 27 条再加上三篇:Dropout(第 12 天)、PPO(第 29 天)和 RLHF(第 30 天)。仓库的清单文件仍然叫“Ilya Sutskever’s 30 Papers Reading List”,第 26 条则写成了整本书,“从 434 页起”这几个字没有了。

30 篇清单的三个版本 左边是 Carmack 收到的约 40 篇原单,已经丢失;中间是 2024 年流传的 27 条,第 26 条写着从 434 页起读 Kolmogorov 复杂度那本书;右边是 30u30 的 30 篇,补了 Dropout、PPO、RLHF,第 26 条变成了整本书。 Carmack 收到的原单 2024 年流传的版本 30u30 仓库 约 40 篇 “学会这些,就知道今天 重要内容的 90%” 邮件被 Meta 两年自动 删除策略删掉了 虚线:这份原单已经不存在, 只剩 Carmack 口述和一夹子打印件。 来源:Carmack 的访谈 条目 27 条 1 The Annotated Transformer 2 Complexodynamics … … 25 Machine Super Intelligence 26 PAGE 434 onwards: Komogrov Complexity 27 CS231n 存档页原话:“It is not confirmed if this is the actual list.” 条目 30 天 7 The Coffee Automaton 12 Dropout + … … 26 Kolmogorov Complexity (整本 500 页的书) 29 PPO + 30 RLHF + + 是仓库补的三篇,原单里没有; 第 26 条丢了“从 434 页起”。
图 1 · “Ilya 的 30 篇”其实是三个版本:丢失的约 40 篇、来源未确认的 27 条、再由 30u30 补成的 30 篇

所以“Ilya 的 30 篇”至少要打两个折扣:27 条本身来源没有确认,30 篇里有 3 篇是仓库作者补的。“90%”是 Carmack 转述的一句口头话,也不是谁量出来的数字。

不过 27 条的内容本身很有意思。它不像是一个人凭印象列出的“经典论文”,因为里面有几条怎么看都不像入门读物。这份清单到底由什么组成?

二、清单的构成

把 27 条按内容分一下组:

流传的 27 条,按内容分组
分组条目条数
循环网络与注意力Karpathy 的 RNN 博客、Olah 的 LSTM 博客、RNN Regularization、Bahdanau 注意力、Attention Is All You Need、The Annotated Transformer6
卷积网络与视觉AlexNet、ResNet、ResNet v2(Identity Mappings)、空洞卷积、CS231n 课程5
集合、指针、记忆、关系Pointer Networks、Order Matters、Neural Turing Machines、Relational Reasoning、Relational RNN、消息传递网络(量子化学)6
工程与应用GPipe(流水线并行)、Deep Speech 2(语音识别)2
规模Kaplan 的 Scaling Laws(2020,清单里最新的一篇)1
压缩、复杂度与智能的定义
最小描述长度Hinton & van Camp 1993;Grünwald 的 MDL 教程(80 页)2
复杂度Aaronson 的博客 The First Law of Complexodynamics;咖啡自动机论文2
算法信息论Kolmogorov 复杂度专著,从第 434 页(第 14 章“算法统计”)起,约 57 页1
生成模型Variational Lossy Autoencoder1
智能的定义Shane Legg 的博士论文 Machine Super Intelligence(200 来页)1

没有的:GPT 系列、BERT、扩散模型、强化学习、对齐、指令微调。

表 1 · 27 条里有 7 条讲压缩和复杂度,篇幅最重的几条都在这一组

有两点和“AI 必读清单”的印象不一样。

第一,它停在 2020 年。 最新的一篇是 Kaplan 的 Scaling Laws。GPT-2、GPT-3、BERT 都不在里面,强化学习、对齐、指令微调也不在。30u30 补上的 PPO 和 RLHF,正是大众心目中“ChatGPT 是怎么来的”那一段,原单里没有。

第二,理论部分篇数少,篇幅却最重。 架构类的 19 条大多是十几页的会议论文;理论类的 7 条里有一篇 80 页的教程、一篇 200 来页的博士论文、一本专著的最后一章。如果真按“一天一篇”读,这几天会远远超出一天。

这 7 条理论分别出自神经网络(Hinton)、统计学(Grünwald)、计算理论(Aaronson、Kolmogorov 那本书)和通用人工智能(Legg)几个不同的圈子,放在一起读,它们其实在回答同一个问题。我们从清单里最“正常”的一篇说起:第 1 天的字符级 RNN。

三、预测与压缩

现象:语言模型的损失是一个比特数

Karpathy 那篇博客6训练的是一个字符级 RNN:读入前面的字符,输出下一个字符的概率分布。训练时最小化的是交叉熵,也就是模型给真实下一个字符的概率取负对数,再求平均。

这个数有一个很具体的含义。如果对数以 2 为底,它的单位是比特。假设模型给真实字符的概率是 1/4,−log⁡214=2-\log_2 \frac14 = 2,这个字符就“花了 2 个比特”。

为什么能这样说?因为有一种编码方法叫算术编码:只要发送方和接收方手里有同一个预测模型,就能把每个字符编码成大约 −log⁡2p-\log_2 p 个比特,整段文本的总长度和所有字符的 −log⁡2p-\log_2 p 之和只差几个比特。接收方用同一个模型逐字解码,就能还原原文。

换句话说,一个预测模型加上算术编码,就是一个无损压缩器。交叉熵越低,压缩出来的文件越小。

实验:字符模型和 gzip 比一比

光说不够直观,我们拿 Karpathy 用过的同一份数据做个实验7:111 万个字符的莎士比亚文本。

预测模型用最简单的那种:看前面 kk 个字符,按这个上下文以前出现过的次数来估计下一个字符的概率(kk 叫“阶”)。模型边读边更新计数,解码端也能按同样的顺序重建出同样的计数,所以把每个字符的 −log⁡2p-\log_2 p 加起来,就是这个压缩器真实的码长。和它比的是 gzip、xz、bzip2 三个通用压缩器的实际文件大小。

字符模型的码长与通用压缩器对比 同一份 111 万字符的莎士比亚文本。自适应字符模型从 0 阶到 6 阶,每字符平均码长依次为 4.78、3.55、2.81、2.36、2.23、2.29、2.41 比特;gzip、xz、bzip2 分别为 3.11、2.61、2.36 比特。 tiny shakespeare 1,115,394 个字符,每字符平均要几个比特 0 1 2 3 4 5 0 阶(只看字符频率) 4.78 1 阶 3.55 2 阶 2.81 3 阶 2.36 4 阶 2.23 5 阶 2.29 6 阶 2.41 gzip -9 3.11 xz -9 2.61 bzip2 -9 2.36 上面七行:边读边学的字符模型,码长 = 它给每个字符的概率取 −log₂ 再相加。 下面三行:通用压缩器的实际文件大小。4 阶模型配上算术编码,比三者都小。
图 2 · 预测得越准,码长越短:4 阶字符模型 2.23 比特 / 字符,胜过 gzip、xz、bzip2;但上下文再加长,码长反而变长

4 阶模型每个字符只要 2.23 比特,比 gzip 的 3.11 少了 28%,也胜过 bzip2 和 xz。我们没有写任何关于压缩的代码,只是把“预测下一个字符”做得更准,压缩率自己就上来了。

这也是 Karpathy 这篇值得放进清单的理由之一:“预测下一个 token”和“压缩数据”是同一件事的两种说法。 一个模型对数据理解得越好,就越能把数据压短。

问题:上下文更长,为什么反而变差

图 2 里还有一个反常的地方:5 阶、6 阶模型比 4 阶差。看的上下文更长,预测本应更准才对。

原因在于“边读边学”。6 阶模型的上下文有几十万种,每一种都要从零开始积累计数,在攒够计数之前,它的预测都很差,这些差的预测都算进了码长里。4 阶模型的上下文少,学得快,总账反而更划算。

这里出现了一笔我们之前没有算的账:模型本身也要花比特。 更复杂的模型能把数据压得更短,但它自己的“学费”也更贵。总码长 = 描述模型的代价 + 用模型描述数据的代价。这笔账怎么算,就是清单里那两篇“最小描述长度”在讲的事。

四、两部分码:规律和噪声

最小描述长度

Hinton 和 van Camp 1993 年那篇8的标题就是答案:通过最小化权重的描述长度,让神经网络保持简单。他们把一个网络的总代价写成两部分:把权重发出去要多少比特,加上用这些权重描述训练数据的误差要多少比特。权重记得越精确越费比特,所以他们给权重加噪声,只保留真正需要的精度。

Grünwald 的教程9把这个想法一般化,叫两部分码:

L(D)=L(H)+L(D∣H)L(D) = L(H) + L(D \mid H)

L(H)L(H) 是描述假设(模型、规律)本身的长度,L(D∣H)L(D \mid H) 是知道这条规律之后,再描述数据还需要的长度。最好的假设是让两部分之和最短的那个。规律太简单,第二部分很长;规律太复杂,把噪声也当成规律记下来,第一部分就会膨胀。上一节 6 阶模型输掉的,正是第一部分。

清单指向的 Kolmogorov 那本书第 14 章“算法统计”5,讲的是同一件事的严格版本。那一章开头第一句就是:数理统计要解决的问题是,给定一些实验数据,找一个合理的理论来解释它。它把“理论”定义为一个包含这份数据的集合 AA,描述长度是“写出这个集合的程序长度”加上“在集合里指出是哪一个”的 log⁡2∣A∣\log_2|A| 比特。好的理论让数据在集合里看起来像一个毫无特点的“典型成员”,也就是说,剩下的那部分是纯噪声,再也压不下去了。

一个刚好只有规律和噪声的例子

这套说法听起来抽象,但 30u30 的第 25 天恰好提供了一个完美的例子。那一天讲 Scaling Laws,训练脚本用的合成数据是这样生成的:64 个从 0 到 127 均匀随机抽取的数,然后把每第 4 个数改成和前一个一样。

一条训练序列的两部分描述 上面是 30u30 Day 25 合成数据里的一条序列,每第 4 个数字照抄前一个,其余是随机数。下面把它拆成两部分:规律只需一句 x[4k+3]=x[4k+2],剩下 47 个随机目标每个 7 比特,共 329 比特,折合每个目标平均 3.62 nats。 30u30 Day 25 的一条训练序列(64 个 token,词表 128) 1 120 80 87 87 74 99 106 106 7 38 36 36 116 0 63 63 17 16 102 15 15 104 38 43 43 92 32 126 126 61 64 74 74 33 65 127 103 103 89 79 43 43 59 27 108 108 109 78 14 14 49 56 4 18 18 124 59 103 103 105 80 56 56 34 63 48 48 强调色的格子:每第 4 个 token 照抄前一个。其余 48 个是均匀随机数,没有任何规律可学。 第一部分:规律 第二部分:按规律之后剩下的 x[4k+3] = x[4k+2] 一句话就写完,几个比特,与序列多长无关。 模型学会这一条,16 个位置的损失降到 0。 47 个预测目标 × log₂128 = 329 bit 每个随机 token 必须原样记下,压缩不了。 平均到 63 个目标:47/63 × ln128 = 3.62 nats。
图 3 · 两部分码:一份数据 = 规律(短)+ 按规律编码后剩下的噪声(长)。模型能学走的只有第一部分

这份数据的两部分码可以直接写出来。规律只有一条,几个比特就够;剩下的 47 个随机数(第 1 个数不需要预测,16 个照抄位置不用记),每个要 7 比特,一共 329 比特,再怎么压也压不掉。换成训练时用的自然对数单位,平均每个预测目标至少要 3.62 nats。无论模型多大,损失都不可能低于 3.62。

实验:这份数据上能看到规模定律吗

30u30 用这份数据训练 4 个尺寸的模型,想“验证 Kaplan 的 L(N) 幂律”。Kaplan 的规模定律10说,模型参数量 NN 增大时,损失按幂律下降:

L(N)=L∞+(NcN)αL(N) = L_\infty + \left(\frac{N_c}{N}\right)^{\alpha}

L∞L_\infty 是不可约的损失,正是两部分码里压不掉的噪声部分;(Nc/N)α(N_c/N)^\alpha 是模型还没学到的规律。幂律意味着数据里的规律有一条很长的尾巴:模型每大一倍,就能多学到一批更细、更少见的规律。

而第 25 天的数据只有一条规律。我们按同样的设定写了一个同构的小 Transformer,4 个尺寸,先按 30u30 的默认训练 50 步,再训练 3000 步,并且额外拿新抽的同分布序列测一次:

第 25 天合成数据上,模型大小与损失的关系 横轴是 4 个模型的参数量。训练 50 步时,损失依次为 4.53、4.02、3.65、3.63,逼近 3.62 的下限。训练 3000 步后,训练集损失降到 3.05、1.27、0.06、0.06,但在新抽的同分布序列上,损失是 4.26、7.16、10.33、9.14,远高于下限。 四个尺寸的模型,损失(nats)对参数量(横轴对数) 0 2 4 6 8 10 d=64 · 9.8万 d=128 · 39万 d=256 · 157万 d=384 · 354万 4.26 7.16 10.33 9.14 0.06 0.06 训练 3000 步 新抽的同分布序列 训练 50 步(默认) 训练集,停在下限 下限 3.62 训练 3000 步 训练集(虚线) 50 步:大模型只是更快学会复制规律,四个点挤在 3.62 附近。3000 步:训练损失一路降到 0.06, 看上去“越大越好”,其实是把 2048 条序列里的随机数背了下来;换新序列一测,损失升到 9 以上。
图 4 · 损失压不过噪声下限:训练集上“越大越好”的曲线,是模型把随机数背下来了

按 30u30 的默认设定训练 50 步,四个模型的损失是 4.53、4.02、3.65、3.63。把损失拆开看,大模型在照抄位置上的损失降到了 0.02,在随机位置上仍然是 4.86,约等于 ln⁡128=4.85\ln 128 = 4.85。也就是说,大模型只是更快学会了那条复制规律,然后停在 3.62 的下限上。四个点之间的差别是“学得快慢”,不是幂律。

训练到 3000 步,情况更有意思。训练集上的损失变成 3.05、1.27、0.06、0.06,模型越大越低,甚至远远低于 3.62 的下限,乍看像是规模定律在起作用。但换一批同样方式生成的新序列去测,损失是 4.26、7.16、10.33、9.14,比瞎猜(4.85)还差。训练数据只有 2048 条序列,大模型把里面的随机数全背了下来。

用两部分码的话说:背下来的随机数被塞进了模型的“规律部分”,第一部分膨胀,换到新数据上毫无用处。这正是 Hinton 要给权重“计费”的原因。

所以这份数据画不出规模定律,原因不在模型或训练步数,而在数据本身:规模定律是数据性质的反映。 自然语言里的规律有长长的尾巴,模型越大,学到的越多;一份只有一条规律的数据,学会那一条就到头了。

同一条线上的另外两篇

用这个视角回头看清单,另外两篇也落在同一条线上。

VLAE11(变分有损自编码器)研究的是信息该放在哪:给图像学一个隐变量编码时,故意限制解码器只能看局部,让隐变量只存全局结构,纹理这类局部细节交给解码器按概率补上。标题里的“有损”,就是有意识地决定哪些比特属于“规律”、哪些属于可以随机生成的“细节”。

Legg 的博士论文12给“智能”下了一个形式化定义:一个智能体在所有可计算环境里的平均表现,每个环境按 2−K(μ)2^{-K(\mu)} 加权,K(μ)K(\mu) 是描述这个环境的最短程序长度。越简单的环境权重越大。也就是说,智能被定义成“在简单规律主导的世界里表现好”,又回到了描述长度。

到这里,“压缩”这条线在清单里已经很清楚了。剩下两篇 Aaronson 的文章看上去离 AI 最远,为什么讲咖啡的论文也在里面?

五、复杂度的先升后降

现象:熵一直在涨,有意思的东西却在中间

Aaronson 2011 年的博客13从一个观察出发:往咖啡里倒奶油,一开始奶油浮在上面,界线分明;搅一会儿,出现了漂亮的卷须和漩涡;最后整杯变成均匀的浅褐色。熵从头到尾都在增加,这是热力学第二定律。但我们直觉上觉得“复杂”“有意思”的,是中间那个阶段,开头和结尾都很无聊。

熵描述不了这个“有意思”。Aaronson 要的是另一个量,它在开始和结束时都小,只在中间大。他用的正是上一节的两部分码:一个状态的“复杂度”,是它两部分描述里第一部分(规律部分)的长度。开头的状态规律很简单(上面奶油、下面咖啡),结尾的状态是纯噪声(规律部分也很短,“均匀随机”),只有中间的卷须需要很长的规律去描述。

尝试:用 gzip 量出来

2014 年他和 Sean Carroll 等人把这个想法做成了实验14:一个 100×100 的网格,上半是奶油、下半是咖啡,每一步随机交换相邻两个不同的格子。

两个量都用 gzip 估计:熵是整个细网格压缩后的大小;表观复杂度是先把网格“粗粒化”(每个格子取周围一片的平均值,再分成“咖啡 / 混合 / 奶油”三档)之后的压缩大小。粗粒化相当于眯着眼看杯子,看不清单个分子的随机位置,只看得见宏观的形状,压缩后的大小就近似那个“规律部分”。

我们按论文的设定自己实现了一遍:

咖啡自动机里熵和表观复杂度随时间的变化 上排是互作用模型在 t=0、691、6437、60000 时粗粒化后的样子:奶油和咖啡先分层,中间出现一条起伏的混合带,最后整片变成均匀的混合。下排两条曲线:细网格的 gzip 大小(熵)一路上升到 1723 字节后持平;粗粒化图的 gzip 大小(表观复杂度)从 48 升到 645 再降回 56。 粗粒化后的样子(100×100 网格,9×9 窗口平均,分 3 档) t = 0 复杂度 48 B t = 691 复杂度 174 B t = 6437 复杂度 645 B t = 60000 复杂度 56 B 浅 = 奶油,深 = 咖啡,中间色 = 混合 gzip 后的字节数随时间(横轴对数) 0 600 1200 1800 0 10 100 1000 10000 60000 熵:细网格 gzip,一路上升到 1723 表观复杂度:粗粒化后 gzip,48 → 645 → 56 sweep 次数
图 5 · 熵一路上升,表观复杂度先升后降:最“有结构”的时刻在中间

熵从 46 字节涨到 1723 字节后持平;表观复杂度从 48 字节升到 645 字节,又降回 56 字节。先升后降复现出来了。

问题:这个量有多可靠

“复杂度先升后降,所以生命和智能出现在宇宙的中间阶段”是这篇论文最常被转述的结论,30u30 的清单文件也是这么写的。但论文本身要谨慎得多,而且我们的复现也暴露了它的软肋。

第一,峰值很尖,而且和分档的门槛有关。 图 5 的峰值只出现在 t = 6437 附近一个很窄的区间。从图上看,那时大片区域的平均浓度正落在两档的分界附近,一点点随机涨落就让格子在两档之间来回跳,gzip 把这些跳动也算成了“结构”(这是我们根据图的判断)。论文第 6 节专门讨论了这种“阈值伪影”,改用 7 档加按行取多数的修正。我们用修正后的量再算一遍,互作用模型的复杂度只从 57 升到 87,起伏小了很多。

第二,对照组没有复现出来。 论文还有一个对照模型:奶油粒子各自独立随机游走、可以重叠。论文的结论是,修正之后这个模型的复杂度一直很小,并且在附录里给了证明,由此说明“粒子之间的相互作用才产生宏观复杂度”。我们的小规模复现里,修正后的对照模型复杂度反而比互作用模型还高(最高 265 字节),换成更大的窗口也是如此。可能的原因是重叠计数的涨落比 0/1 网格大,更容易跨档,论文用的网格也更大。

这两点说明,表观复杂度这个量很依赖“怎么眯眼”:窗口多大、分几档、怎么修正。作者自己也把“为互作用模型证明先升后降”留作了开放问题。这篇论文在清单里的价值,恐怕不在“解释了生命为什么存在”,而在它把“结构”这个模糊的直觉落成了一个可以计算的量,也就是两部分码的第一部分,同时诚实地展示了这样做有多难。

回到清单

现在回头看第一节那个“PAGE 434 onwards”。算法统计这一章讲的是怎样给数据找到合理的规律部分;Aaronson 的复杂度用的就是这个规律部分的长度;MDL 用它来选模型;Kaplan 的公式里,它是那一项会随模型变大而减少的损失。清单的理论部分像是有意按这条线挑出来的。

2023 年,Ilya 在 Simons Institute 做过一个演讲,题目叫《An Observation on Generalization》15。他用压缩来解释无监督学习为什么有效:Kolmogorov 复杂度是理想的压缩器,用梯度下降训练的大网络是它的一个近似。这和清单的理论部分是同一个视角。需要说明的是,把清单和这次演讲联系起来是我们的推断,Ilya 本人并没有这样解释过这份清单。

六、清单之外的东西

清单停在 2020 年,这一点在“规模”这条线上最明显。

Kaplan 2020 年的论文除了给出 L(N)L(N),还回答了一个实际问题:算力增加时,钱该花在更大的模型上,还是更多的数据上?他的答案是模型增长得更快,算力每增加 10 倍,模型大约扩大 5 倍,数据只增加约 2 倍。两年后 DeepMind 的 Chinchilla16重新做了这组实验,得出的结论是两者应该同比例增长,大约每个参数配 20 个 token。按这个结论,GPT-3 这一代模型普遍“模型太大、数据太少”。

30u30 第 25 天的笔记里提到了这个修正,README 末尾还写着下一天是“Day 26: Chinchilla”,但仓库里的第 26 天实际是 Kolmogorov 复杂度,Chinchilla 被放进了“即将推出”的附加篇。这个链接大概是调整课表时留下的。

同样不在清单里的,还有 30u30 补上的强化学习和 RLHF。仓库在第 29 天特意注明:“与 InstructGPT、ChatGPT 的联系是我们事后加的,不是 2017 年论文里的内容。”这个说明很有必要。如果把补上的三篇去掉,原清单讲的几乎全是“怎样从数据里学到规律”,也就是预训练这一半;至于怎样让模型听话、对齐,原清单没有涉及。

七、30u30 作为学习材料

最后简单看一下仓库本身。每一天的目录结构相同:一份讲解 README、一份论文笔记、一个从零写起的实现(大多是 NumPy,后面几天用 PyTorch)、5 道带答案的练习和一个 Jupyter notebook,全仓库的实现代码约 1.5 万行。许可证是 CC BY-NC-ND 4.0,可以阅读和转发,不能商用,也不能发布改编版本。

我们读了和本文主线相关的几天,讲解部分写得认真,比如第 7 天把论文第 6 节的阈值伪影讲得很清楚。实现里也有几处值得注意:

和本文主线相关的几天,实现里值得注意的地方
位置现象影响
第 7 天
咖啡自动机
为了提速,一次抽 n²/4 个格子各配一个邻居,挑出值不同的对后一次性交换,没有排除同一格同时出现在两对里。按同样逻辑重写测试(50×50):奶油格数第 0、10、100、1000 步依次为 1250、1254、1230、1241奶油会凭空增减,粒子数不守恒;注释里写的是 non-conflicting swaps
第 25 天
规模定律
合成数据只有一条复制规律,其余是均匀随机数;默认训练 50 步原理上画不出 L(N) 幂律,见第四节
第 26 天
Kolmogorov
清单条目去掉了“从 434 页起”,内容是 Huffman 编码、算术编码和压缩距离聚类没有覆盖清单真正指向的第 14 章算法统计
清单文件AlexNet 条目下多了一个无关链接 arXiv 1211.5063(《On the difficulty of training recurrent neural networks》);第 25 天 README 链接的“Day 26: Chinchilla”不存在编辑残留,不影响内容

30u30 的代码我们没有直接运行,表中第一行是照它的逻辑重写后测的。

表 2 · 讲解写得认真,但实现里有一处会让咖啡自动机的粒子数不守恒

如果想顺着本文的主线读原文,可以按这个顺序:Karpathy 的博客,Hinton 1993,Grünwald 教程的第 1 章,Kolmogorov 那本书的第 14 章,Aaronson 的博客,咖啡自动机论文,最后是 Legg 论文里定义通用智能的那一章。

小结

  1. “Ilya 的 30 篇”是哪来的? Carmack 收到过约 40 篇,原单已丢;流传的 27 条来源没有确认;30u30 又补了 Dropout、PPO、RLHF 三篇。
  2. 清单由什么组成? 19 条架构和技巧,1 条规模定律,7 条压缩和复杂度理论。它停在 2020 年,没有 GPT、强化学习和对齐;理论部分篇数少,篇幅最重。
  3. 为什么从字符级 RNN 开始? 预测下一个字符就是压缩:4 阶字符模型配上算术编码,每字符 2.23 比特,胜过 gzip、xz、bzip2。
  4. 模型越复杂越好吗? 不一定,模型本身也要花比特。两部分码把数据拆成规律和噪声,最好的模型让两部分之和最短。
  5. 规模定律来自哪里? 来自数据里规律的长尾。30u30 第 25 天的合成数据只有一条规律,所有模型都停在 3.62 nats 的噪声下限,画不出幂律;训练久了,大模型只会把噪声背下来。
  6. 为什么读咖啡? 熵一路上升,但“结构”先升后降;Aaronson 用粗粒化后的压缩大小去量它。这个量很依赖粗粒化的选择,我们的复现只复现了一半。
  7. 这份清单的主线是什么? 除了架构史,它还有一条压缩的主线:学习就是找到数据的规律部分。这和 Ilya 2023 年的演讲一致,但这是我们的读法。

参考资料

Footnotes

  1. Ojhaharsh/30u30GitHubgithub.com ↗本文依据 2026-02-19 的最新提交 0edf4bf。清单在 ilya_30_papers.md,每天的内容在 papers/<NN>_*/。https://github.com/Ojhaharsh/30u30 ↩

  2. Deep Learning Legends: Ilya's List, or 90% of Everything That Matters in AISubstackgonzoml.substack.com ↗转引 Carmack 2023 年访谈里的原话:约 40 篇、90%、邮件被 Meta 的两年自动删除策略删掉。https://gonzoml.substack.com/p/deep-learning-legends-ilyas-list ↩ ↩2

  3. The 27 papersLessWrong · 2024-05-30lesswrong.com ↗https://www.lesswrong.com/posts/t4ZBjAjXk2NqqAqJ7/the-27-papers ↩

  4. Ilya Sutskever's reading list(27 条存档)punkx.orgpunkx.org ↗2024 年流传版本的存档,第 26 条原文是 “PAGE 434 onwards: Komogrov Complexity”;页面写明 “It is not confirmed if this is the actual list.”https://punkx.org/jackdoe/30.html ↩

  5. Kolmogorov Complexity and Algorithmic RandomnessA. Shen, V. A. Uspensky, N. Vereshchagin · AMS Mathematical Surveys and Monographs 220 · 2017lirmm.fr ↗清单链接的扫描版,共 519 页。PDF 第 434 页是第 14 章 Algorithmic statistics 的开头(书页码 425)。https://www.lirmm.fr/~ashen/kolmbook-eng-scan.pdf ↩ ↩2

  6. The Unreasonable Effectiveness of Recurrent Neural NetworksAndrej Karpathy · 2015-05-21karpathy.github.io ↗https://karpathy.github.io/2015/05/21/rnn-effectiveness/ ↩

  7. char-rnn 的 tiny shakespeare 数据GitHubraw.githubusercontent.com ↗图 2 的实验文本,1,115,394 个字符。https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt ↩

  8. Keeping Neural Networks Simple by Minimizing the Description Length of the WeightsGeoffrey Hinton, Drew van Camp · COLT 1993cs.toronto.edu ↗https://www.cs.toronto.edu/~hinton/absps/colt93.pdf ↩

  9. A Tutorial Introduction to the Minimum Description Length PrinciplePeter Grünwald · 2004-06-04arxiv.org ↗80 页。两部分码在第 1 章,边学边编码(prequential)的形式也在这里讲。https://arxiv.org/abs/math/0406077 ↩

  10. Scaling Laws for Neural Language ModelsJared Kaplan 等 · OpenAI · 2020-01-23arxiv.org ↗https://arxiv.org/abs/2001.08361 ↩

  11. Variational Lossy AutoencoderXi Chen 等 · 2016-11-08arxiv.org ↗https://arxiv.org/abs/1611.02731 ↩

  12. Machine Super IntelligenceShane Legg · 博士论文 · 2008vetta.org ↗https://www.vetta.org/documents/Machine_Super_Intelligence.pdf ↩

  13. The First Law of ComplexodynamicsScott Aaronson · 2011-09-23scottaaronson.blog ↗https://scottaaronson.blog/?p=762 ↩

  14. Quantifying the Rise and Fall of Complexity in Closed Systems: The Coffee AutomatonScott Aaronson, Sean Carroll, Lauren Ouellette · 2014-05-27arxiv.org ↗https://arxiv.org/abs/1405.6903 ↩

  15. An Observation on GeneralizationIlya Sutskever · Simons Institute · 2023-08simons.berkeley.edu ↗演讲用压缩来解释无监督学习:Kolmogorov 复杂度是理想的压缩器,大网络是它的近似。https://simons.berkeley.edu/news/observation-generalization ↩

  16. Training Compute-Optimal Large Language ModelsJordan Hoffmann 等 · DeepMind · 2022-03-29arxiv.org ↗https://arxiv.org/abs/2203.15556 ↩