Andrej Karpathy 最近发布了一个叫 microgpt 的项目——200行纯 Python,零依赖,包含了训练和推理一个 GPT 所需要的全部算法内容。数据集、分词器、自动微分引擎、GPT-2 架构、Adam 优化器、训练循环、推理循环,全在一个文件里。
这个项目在 Hacker News 上拿了 1200 多分,评论区有几百条讨论。但真正让我觉得值得写的,不是这个项目的技术实现,而是它背后的思维方式。
十年的执念
Karpathy 自己说,这个脚本是多个项目的终点:micrograd、makemore、nanoGPT……一条持续了十年的简化之路。每一步都在问同一个问题:还能不能再简单一点?
micrograd 是一个标量级的自动微分引擎。makemore 是字符级的语言模型。nanoGPT 是能训练真实规模 GPT-2 的简化实现。microgpt 把所有这些压缩到 200 行里,然后他说:我没办法再简化了。
这句话的分量,来自于它不是一个初学者的"我写了个简单版本",而是一个深度理解底层原理的人说"这就是本质,再少一行都不行"。
本质是什么
microgpt 训练出来的模型只能生成听起来像真名字的假名字——kamon、karai、vialan 这些。看起来微不足道。但 Karpathy 指出了一个关键的认知框架:从 ChatGPT 的视角来看,你和它的对话就是一个"长相奇怪的文档"。当你输入提示词的时候,模型的回复本质上就是在做统计意义上的文档补全。
整个 GPT 的核心算法可以拆成这几个部分:
分词器把文本变成整数序列。在 microgpt 里,它简单到只是给每个唯一字符分配一个编号。26 个小写字母加一个特殊的"序列开始"标记,一共 27 个 token。生产级的分词器比如 tiktoken 会在字符块上操作以提高效率,但算法思想完全一样。
自动微分是训练的核心。一个叫 Value 的类,包裹一个标量数值,追踪它是怎么被计算出来的。每次做加法、乘法、幂运算,结果都是一个新的 Value,记住了它的输入和局部梯度。backward() 方法按拓扑逆序走一遍计算图,用链式法则把梯度从损失传播回每个参数。
Karpathy 用了一个很好的比喻来解释链式法则:如果一辆车的速度是自行车的两倍,自行车的速度是步行的四倍,那车的速度就是步行的 2×4=8 倍。链式法则就是沿着路径把变化率乘起来。
这就是 PyTorch 的 loss.backward() 在做的事情,只不过 PyTorch 操作的是张量(数组),microgpt 操作的是标量——算法完全一样,只是效率差了几个数量级。
架构是一个简化版的 GPT-2:嵌入层、自注意力、前馈网络、输出投影。简化之处在于用 RMSNorm 替代 LayerNorm、不用偏置项、用 ReLU 替代 GeLU。整个模型只有 4192 个参数。GPT-2 有 16 亿,现代大模型有几千亿。但结构是同构的。
简化的价值
为什么一个只能生成假名字的 200 行脚本值得这么多人关注?
因为简化是理解的终极证明。你没办法把自己不理解的东西简化。每去掉一行代码,都意味着你确认了那行代码不是本质的一部分。这个过程需要的不是编程技巧,而是对底层原理的透彻把握。
microgpt 的代码可以完美地排成三列展示——Karpathy 特意提到了这一点。这不是巧合,是刻意的美学追求。当你把一个系统理解到足够深,它的表达形式自然会变得优雅。就像物理学家追求方程的简洁,或者建筑师追求结构的纯粹。
这也是为什么"一切皆效率"这句话如此精妙。microgpt 包含了 GPT 的全部算法内容,而从 microgpt 到 GPT-4 的差距,全部都是效率优化:更好的分词让词汇表更紧凑,张量运算让矩阵乘法跑在 GPU 上,混合精度训练节省内存,分布式训练跨越数千张卡……这些都极其重要,但它们不改变算法的本质。
教育的启示
Karpathy 有一个 2.5 小时的视频专门讲自动微分的原理。microgpt 的博文本身就是一份精心编排的教程,从数据集开始,经过分词、自动微分、参数初始化、模型架构、损失函数、训练循环、推理,完整地走了一遍。
这种教学方式有一个很值得学习的特点:它不是"从简单到复杂"的递进,而是"把复杂的东西还原到本质"的剥离。学生不是在逐步搭建积木,而是在看一个已经完成的建筑被拆解成最少的承重结构。两种路径最终到达同一个地方,但后者给你的直觉更深刻——因为你知道了什么是可以去掉的,什么是必须留下的。
这让我想到费曼。费曼判断自己是否理解一个概念的标准是:能不能给大一新生讲明白。不是"用简单的语言复述",而是真正从头推导,不跳过任何环节,同时不引入任何不必要的复杂性。microgpt 就是这种精神的代码化身。
对我们的意义
对于每天在用大模型但不一定理解其原理的程序员来说,microgpt 提供了一个完美的入口。它小到可以一行一行读完,完整到覆盖了所有核心概念,而且它真的能跑——你可以看着它从随机参数开始,慢慢学会生成像名字的东西。
不过更深一层的启发可能不是关于 GPT 本身的。它是关于一种思维习惯:面对复杂系统时,不断追问"这里面什么是本质的"。这个习惯在任何工程领域都适用。能把一个复杂系统简化到 200 行的人,对那个系统的理解,比写了 20000 行的人更深。