中文精炼导读

核心观点

  • microgpt 是 Andrej Karpathy 的"艺术项目":单个 Python 文件、仅约 200 行、零第三方依赖,却完整实现了从数据到训练再到推理的 GPT 全流程,他自称"无法再简化了"。
  • 该脚本浓缩了 Karpathy 十年来的系列项目(micrograd、makemore、nanogpt 等)的全部精华,把"大语言模型到底是怎么回事"压缩到算法最本质的部分。
  • 核心思想是:一切"智能"都可以归结为——收集文档数据、字符级分词、标量自动求导(autograd)、GPT-2 风格 Transformer、Adam 优化器、交叉熵损失与温度采样。
  • 它与生产级 LLM 的唯一区别是规模和效率:算法与 ChatGPT 同构,差异只在数据量、tokenizer、张量并行与工程优化上。
microgpt 封面
microgpt 封面

内容精讲

microgpt 的训练数据非常简单:约 32,000 个英文名字,每行一个,每个名字就是一个"文档"。模型的目标是学会这些名字里的统计规律,然后"生成"出听起来像真名字的新名字。作者特意指出一个重要的视角转换:ChatGPT 里你和它的每一段对话,本质上也只是"一篇长得比较奇怪的文档",模型做的不过是对文档做统计续写而已。脚本运行后,模型会"幻觉"出 kamon、karai、vialan、keylen 这类似真似假的名字——看起来不起眼,但机制和 ChatGPT 生成回答完全一致。

接下来是分词器(Tokenizer)。神经网络只能处理数字,所以需要把字符映射成整数。生产级的 tiktoken(GPT-4 使用)按子词块切分,但 microgpt 用最朴素的做法:把数据集里出现的所有唯一字符(26 个小写字母)排个序,每个字母按序号得到一个 token id,再额外加上一个特殊的 BOS(Beginning of Sequence)标记,总共 27 个 token。BOS 告诉模型"一篇文档从这里开始/到这里结束",训练时每个名字会被包裹成 `[BOS, e, m, m, a, BOS]` 这样的形式。作者强调 token 的整数值本身毫无意义,换成 emoji 也一样,它们只是离散符号。

训练神经网络需要梯度,microgpt 用不到 60 行的 `Value` 类从零实现了 autograd(自动微分)。每个 `Value` 包装一个标量,记录它是怎么算出来的(子节点)以及每个局部梯度,就像一个个乐高积木:前向算出结果,同时记住这个操作对输入的小导数。反向传播从 loss 出发按逆拓扑序走回参数,一路上乘上局部梯度——这正是微积分里的链式法则。作者用了一个生动的比喻:"如果汽车速度是自行车的两倍,自行车又是步行的四倍,那汽车就是步行的 2×4=8 倍";链式法则就是把路径上的变化率乘起来。代码里特别用了 `+=`(累加而非赋值),因为当一个值在计算图里被多处使用时(图出现分叉),梯度会沿每条分支流回并求和。这个算法与 PyTorch 的 `loss.backward()` 逐字节等价,只是作用在标量而非张量上。

神经网络本体是一个 GPT-2 风格的 Transformer,仅 4,192 个参数。每个 token 先通过查表得到 token 嵌入(wte)和位置嵌入(wpe),两者相加作为"我是谁 + 我在哪"的表示。Attention 块把当前 token 投影成 Q、K、V 三个向量:Q 是"我在找什么",K 是"我包含什么",V 是"我被选中后能提供什么";每个头用 query 与缓存中的所有 key 做点积(除以 d_head 的平方根缩放),经 softmax 得到注意力权重,再对 value 加权求和。Attention 是 token 之间唯一的通信机制——第 t 个位置只能"看到"0 到 t-1 的过去。MLP 块则是两层全连接(先扩到 4 倍维度再过 ReLU 再压回),做的是"每个位置的思考",与 Attention 交错出现。残差连接让梯度能顺畅地流过深层网络。最后 `lm_head` 把隐藏状态投影到词表大小,输出 27 个 logits,数值越高代表模型越认为该 token 是下一个。有趣的是训练时也显式维护了 KV cache——生产实现里它藏在向量化的注意力计算中,这里因为逐 token 前向而显式建出来,而且缓存里的 key/value 是计算图中的活跃节点,梯度会真的穿过它们。

训练循环反复执行五步:选一个文档、前向过模型、算 loss、反向传播、用 Adam 更新参数。损失是逐位置的交叉熵 `-log p(正确下一个token)`,衡量模型对"真实后续"的惊讶程度。Adam 相比朴素梯度下降聪明之处在于每个参数维护两个滑动平均:m 是一阶矩(动量),v 是二阶矩(自适应学习率),再通过偏差校正处理 m/v 从 0 起步的暖机问题,学习率还随步数线性衰减。1,000 步后 loss 从约 3.3(27 选 1 的随机猜测值)降到约 2.37,说明模型确实学到了名字的统计模式。推理时参数冻结,从 BOS 开始逐 token 自回归采样,temperature=0.5 让分布变尖锐、输出更保守连贯,直到模型输出 BOS 或到达长度上限为止。

文章最后给出了"真实的差距"清单:生产 LLM 用数万亿 token 的互联网文本、BPE 子词分词(词表约 10 万)、GPU/TPU 上的张量运算与 FlashAttention、RoPE/GQA/MoE 等更现代的积木、混合精度与大规模集群训练、以及 SFT + RL 两阶段后训练把"文档续写器"调教成对话助手。microgpt 的意义就在于:它证明了从 4,192 个参数到数千亿参数之间,核心算法并没有变。

阅读价值

适合所有想彻底搞懂 LLM 原理的开发者:无论你是刚入门还是有经验,跟着这 200 行代码就能把 tokenizer、autograd、Transformer、Adam、推理采样全部串起来;读完你会拥有一个可以随时运行、随意改数据集和超参数的最小 GPT,对 ChatGPT 这类系统的理解将从"黑盒"变成"白盒"。

阅读英文原文 → 返回 AI 技术文档

本文为中文精炼导读,由 AI 基于原文整理,内容与图片版权归原作者所有。原文: http://karpathy.github.io/2026/02/12/microgpt/