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 页起”这几个字没有了。
所以“Ilya 的 30 篇”至少要打两个折扣:27 条本身来源没有确认,30 篇里有 3 篇是仓库作者补的。“90%”是 Carmack 转述的一句口头话,也不是谁量出来的数字。
不过 27 条的内容本身很有意思。它不像是一个人凭印象列出的“经典论文”,因为里面有几条怎么看都不像入门读物。这份清单到底由什么组成?
二、清单的构成
把 27 条按内容分一下组:
| 分组 | 条目 | 条数 |
|---|---|---|
| 循环网络与注意力 | Karpathy 的 RNN 博客、Olah 的 LSTM 博客、RNN Regularization、Bahdanau 注意力、Attention Is All You Need、The Annotated Transformer | 6 |
| 卷积网络与视觉 | 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 Autoencoder | 1 |
| 智能的定义 | Shane Legg 的博士论文 Machine Super Intelligence(200 来页) | 1 |
没有的:GPT 系列、BERT、扩散模型、强化学习、对齐、指令微调。
有两点和“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,,这个字符就“花了 2 个比特”。
为什么能这样说?因为有一种编码方法叫算术编码:只要发送方和接收方手里有同一个预测模型,就能把每个字符编码成大约 个比特,整段文本的总长度和所有字符的 之和只差几个比特。接收方用同一个模型逐字解码,就能还原原文。
换句话说,一个预测模型加上算术编码,就是一个无损压缩器。交叉熵越低,压缩出来的文件越小。
实验:字符模型和 gzip 比一比
光说不够直观,我们拿 Karpathy 用过的同一份数据做个实验7:111 万个字符的莎士比亚文本。
预测模型用最简单的那种:看前面 个字符,按这个上下文以前出现过的次数来估计下一个字符的概率( 叫“阶”)。模型边读边更新计数,解码端也能按同样的顺序重建出同样的计数,所以把每个字符的 加起来,就是这个压缩器真实的码长。和它比的是 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把这个想法一般化,叫两部分码:
是描述假设(模型、规律)本身的长度, 是知道这条规律之后,再描述数据还需要的长度。最好的假设是让两部分之和最短的那个。规律太简单,第二部分很长;规律太复杂,把噪声也当成规律记下来,第一部分就会膨胀。上一节 6 阶模型输掉的,正是第一部分。
清单指向的 Kolmogorov 那本书第 14 章“算法统计”5,讲的是同一件事的严格版本。那一章开头第一句就是:数理统计要解决的问题是,给定一些实验数据,找一个合理的理论来解释它。它把“理论”定义为一个包含这份数据的集合 ,描述长度是“写出这个集合的程序长度”加上“在集合里指出是哪一个”的 比特。好的理论让数据在集合里看起来像一个毫无特点的“典型成员”,也就是说,剩下的那部分是纯噪声,再也压不下去了。
一个刚好只有规律和噪声的例子
这套说法听起来抽象,但 30u30 的第 25 天恰好提供了一个完美的例子。那一天讲 Scaling Laws,训练脚本用的合成数据是这样生成的:64 个从 0 到 127 均匀随机抽取的数,然后把每第 4 个数改成和前一个一样。
这份数据的两部分码可以直接写出来。规律只有一条,几个比特就够;剩下的 47 个随机数(第 1 个数不需要预测,16 个照抄位置不用记),每个要 7 比特,一共 329 比特,再怎么压也压不掉。换成训练时用的自然对数单位,平均每个预测目标至少要 3.62 nats。无论模型多大,损失都不可能低于 3.62。
实验:这份数据上能看到规模定律吗
30u30 用这份数据训练 4 个尺寸的模型,想“验证 Kaplan 的 L(N) 幂律”。Kaplan 的规模定律10说,模型参数量 增大时,损失按幂律下降:
是不可约的损失,正是两部分码里压不掉的噪声部分; 是模型还没学到的规律。幂律意味着数据里的规律有一条很长的尾巴:模型每大一倍,就能多学到一批更细、更少见的规律。
而第 25 天的数据只有一条规律。我们按同样的设定写了一个同构的小 Transformer,4 个尺寸,先按 30u30 的默认训练 50 步,再训练 3000 步,并且额外拿新抽的同分布序列测一次:
按 30u30 的默认设定训练 50 步,四个模型的损失是 4.53、4.02、3.65、3.63。把损失拆开看,大模型在照抄位置上的损失降到了 0.02,在随机位置上仍然是 4.86,约等于 。也就是说,大模型只是更快学会了那条复制规律,然后停在 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给“智能”下了一个形式化定义:一个智能体在所有可计算环境里的平均表现,每个环境按 加权, 是描述这个环境的最短程序长度。越简单的环境权重越大。也就是说,智能被定义成“在简单规律主导的世界里表现好”,又回到了描述长度。
到这里,“压缩”这条线在清单里已经很清楚了。剩下两篇 Aaronson 的文章看上去离 AI 最远,为什么讲咖啡的论文也在里面?
五、复杂度的先升后降
现象:熵一直在涨,有意思的东西却在中间
Aaronson 2011 年的博客13从一个观察出发:往咖啡里倒奶油,一开始奶油浮在上面,界线分明;搅一会儿,出现了漂亮的卷须和漩涡;最后整杯变成均匀的浅褐色。熵从头到尾都在增加,这是热力学第二定律。但我们直觉上觉得“复杂”“有意思”的,是中间那个阶段,开头和结尾都很无聊。
熵描述不了这个“有意思”。Aaronson 要的是另一个量,它在开始和结束时都小,只在中间大。他用的正是上一节的两部分码:一个状态的“复杂度”,是它两部分描述里第一部分(规律部分)的长度。开头的状态规律很简单(上面奶油、下面咖啡),结尾的状态是纯噪声(规律部分也很短,“均匀随机”),只有中间的卷须需要很长的规律去描述。
尝试:用 gzip 量出来
2014 年他和 Sean Carroll 等人把这个想法做成了实验14:一个 100×100 的网格,上半是奶油、下半是咖啡,每一步随机交换相邻两个不同的格子。
两个量都用 gzip 估计:熵是整个细网格压缩后的大小;表观复杂度是先把网格“粗粒化”(每个格子取周围一片的平均值,再分成“咖啡 / 混合 / 奶油”三档)之后的压缩大小。粗粒化相当于眯着眼看杯子,看不清单个分子的随机位置,只看得见宏观的形状,压缩后的大小就近似那个“规律部分”。
我们按论文的设定自己实现了一遍:
熵从 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 年的论文除了给出 ,还回答了一个实际问题:算力增加时,钱该花在更大的模型上,还是更多的数据上?他的答案是模型增长得更快,算力每增加 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 的代码我们没有直接运行,表中第一行是照它的逻辑重写后测的。
如果想顺着本文的主线读原文,可以按这个顺序:Karpathy 的博客,Hinton 1993,Grünwald 教程的第 1 章,Kolmogorov 那本书的第 14 章,Aaronson 的博客,咖啡自动机论文,最后是 Legg 论文里定义通用智能的那一章。
小结
- “Ilya 的 30 篇”是哪来的? Carmack 收到过约 40 篇,原单已丢;流传的 27 条来源没有确认;30u30 又补了 Dropout、PPO、RLHF 三篇。
- 清单由什么组成? 19 条架构和技巧,1 条规模定律,7 条压缩和复杂度理论。它停在 2020 年,没有 GPT、强化学习和对齐;理论部分篇数少,篇幅最重。
- 为什么从字符级 RNN 开始? 预测下一个字符就是压缩:4 阶字符模型配上算术编码,每字符 2.23 比特,胜过 gzip、xz、bzip2。
- 模型越复杂越好吗? 不一定,模型本身也要花比特。两部分码把数据拆成规律和噪声,最好的模型让两部分之和最短。
- 规模定律来自哪里? 来自数据里规律的长尾。30u30 第 25 天的合成数据只有一条规律,所有模型都停在 3.62 nats 的噪声下限,画不出幂律;训练久了,大模型只会把噪声背下来。
- 为什么读咖啡? 熵一路上升,但“结构”先升后降;Aaronson 用粗粒化后的压缩大小去量它。这个量很依赖粗粒化的选择,我们的复现只复现了一半。
- 这份清单的主线是什么? 除了架构史,它还有一条压缩的主线:学习就是找到数据的规律部分。这和 Ilya 2023 年的演讲一致,但这是我们的读法。
参考资料
Footnotes
-
Ojhaharsh/30u30github.com ↗本文依据 2026-02-19 的最新提交
0edf4bf。清单在ilya_30_papers.md,每天的内容在papers/<NN>_*/。https://github.com/Ojhaharsh/30u30 ↩ -
Deep Learning Legends: Ilya's List, or 90% of Everything That Matters in AIgonzoml.substack.com ↗转引 Carmack 2023 年访谈里的原话:约 40 篇、90%、邮件被 Meta 的两年自动删除策略删掉。https://gonzoml.substack.com/p/deep-learning-legends-ilyas-list ↩ ↩2
-
The 27 paperslesswrong.com ↗https://www.lesswrong.com/posts/t4ZBjAjXk2NqqAqJ7/the-27-papers ↩
-
Ilya Sutskever's reading list(27 条存档)punkx.org ↗2024 年流传版本的存档,第 26 条原文是 “PAGE 434 onwards: Komogrov Complexity”;页面写明 “It is not confirmed if this is the actual list.”https://punkx.org/jackdoe/30.html ↩
-
Kolmogorov Complexity and Algorithmic Randomnesslirmm.fr ↗清单链接的扫描版,共 519 页。PDF 第 434 页是第 14 章 Algorithmic statistics 的开头(书页码 425)。https://www.lirmm.fr/~ashen/kolmbook-eng-scan.pdf ↩ ↩2
-
The Unreasonable Effectiveness of Recurrent Neural Networkskarpathy.github.io ↗https://karpathy.github.io/2015/05/21/rnn-effectiveness/ ↩
-
char-rnn 的 tiny shakespeare 数据raw.githubusercontent.com ↗图 2 的实验文本,1,115,394 个字符。https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt ↩
-
Keeping Neural Networks Simple by Minimizing the Description Length of the Weightscs.toronto.edu ↗https://www.cs.toronto.edu/~hinton/absps/colt93.pdf ↩
-
A Tutorial Introduction to the Minimum Description Length Principlearxiv.org ↗80 页。两部分码在第 1 章,边学边编码(prequential)的形式也在这里讲。https://arxiv.org/abs/math/0406077 ↩
-
Scaling Laws for Neural Language Modelsarxiv.org ↗https://arxiv.org/abs/2001.08361 ↩
-
Variational Lossy Autoencoderarxiv.org ↗https://arxiv.org/abs/1611.02731 ↩
-
Machine Super Intelligencevetta.org ↗https://www.vetta.org/documents/Machine_Super_Intelligence.pdf ↩
-
The First Law of Complexodynamicsscottaaronson.blog ↗https://scottaaronson.blog/?p=762 ↩
-
Quantifying the Rise and Fall of Complexity in Closed Systems: The Coffee Automatonarxiv.org ↗https://arxiv.org/abs/1405.6903 ↩
-
An Observation on Generalizationsimons.berkeley.edu ↗演讲用压缩来解释无监督学习:Kolmogorov 复杂度是理想的压缩器,大网络是它的近似。https://simons.berkeley.edu/news/observation-generalization ↩
-
Training Compute-Optimal Large Language Modelsarxiv.org ↗https://arxiv.org/abs/2203.15556 ↩