bobofamilyNIU CHUN
系列36

跟着 AI 学 AI

3Blue1Brown · 理论03
01
02
03
Karpathy V1 · micrograd03
04
05
2026-09-01·—阅读·—点赞

从引擎到网络:三个类,41 个参数

把 Value 包成 Neuron / Layer / MLP。参数个数怎么来的、sz 的滑动窗口如何对齐维度、为什么三行循环就是整个前向传播。

06
2026-09-02·—阅读·—点赞

训练循环:loss 把 41 个梯度接通

把前两篇的零件接通:损失函数把输出汇成一个数,三段循环让 loss 真的降下去。以及故意不清零梯度会发生什么 —— 换十个随机种子跑一遍。

Karpathy V2 · makemore02
07
2026-09-03·—阅读·—点赞

从 2 类到 27 类:只需要补三个零件

猫狗二分类和「预测下一个字符」是同一件事,只是类别数从 2 变成 27。为此要补的三个零件:one-hot、softmax、交叉熵 —— 以及交叉熵为什么不是「更高级的平方误差」。

08
2026-09-04·—阅读·—点赞

两条路做同一个 bigram:数频次与梯度下降

先不用神经网络,只靠数频次做出完整语言模型(loss 2.4544),再用 one-hot + 矩阵乘法 + softmax 重做一遍(2.46)。两条路殊途同归,这回答了「神经网络到底在学什么」。

Karpathy V3 · MLP05
09
2026-09-05·—阅读·—点赞

27 维压成 2 维:结构是压缩逼出来的

one-hot 让 a 和 e 的关系与 a 和 q 完全相同,只有把 27 维压进 2 维才逼得出结构。上下文从 1 扩到 3,统计表 729 → 531441,第一层参数 8100 → 600;以及索引的形状规律和点积为什么不是余弦。

10
2026-09-06·—阅读·—点赞

3481 个参数:数值一样,不等于可以互换

隐藏层就是 3B1B 那个加权求和,只是一次算完 22 万个样本。张量是一条内存加一份说明书,view 零成本、转置之后就不能 view;手写 loss 和 F.cross_entropy 数值相同,却会算出 nan。

11
2026-09-06·—阅读·—点赞

快 820 倍:粗糙的梯度和一条只能排除的曲线

32 个样本算的梯度是错的,却比全量快 820 倍、loss 还更低。学习率靠扫描找:在指数上等长取样就是在学习率上等倍取样 —— 以及这条 U 形曲线为什么只能排除、不能选优。

12
2026-09-06·—阅读·—点赞

2.1752:先有尺子,再谈调参

模型的参数从 train 学,你的超参数从 val 学 —— 所以 test 得再留一份。切分要按名字不按样本,否则验证集当场被污染。调完参 val 2.1752,而那 27 个字符的嵌入图上,元音自己聚成了一团。

13
Karpathy V4 · 激活值与梯度04
14
2026-09-08·—阅读·—点赞

饱和从 62.3% 到 1.4%:四行初始化,和一套查错顺序

初始 loss 17、六成神经元一出生就死掉 —— 病因是标准差在两个矩阵乘上各被放大了一次。修法只有四行,但真正带得走的是那套「按什么顺序查」的清单,以及为什么 Kaiming 在这个网络上反而输给了拍脑袋。

15
2026-09-08·—阅读·—点赞

数学补课 · 方差可加,标准差不可加:√n 是从哪来的

上一篇用 σ_z = √n · σ_W · σ_x 就往下走了。这一篇从期望的定义把它推出来:三条运算规则、交叉项为什么会消失、为什么可加的是方差而不是标准差,以及为什么诊断神经网络盯的是方差,不是均值也不是最大值。

16
2026-09-08·—阅读·—点赞

输入差一千倍,输出都是 1.000:BatchNorm 拿什么换的

初始化只管第 0 步,BatchNorm 管每一步 —— σ_W 差一千倍,过完 BN 的输出完全一样。代价是它成了整个网络里唯一让样本互相影响的操作,于是推理要另存一套统计量,于是有了 model.eval()。

17
Karpathy V5 · 手推反向传播05
18
19
2026-09-16·—阅读·—点赞

必须恰好是 0 的那个梯度:八步手推 softmax 的反向传播

上一篇把张量求导的判据推完了,这一篇把它用满八次 —— 从 loss 一路倒推回 logits。真正带得走的不是那八个式子,是一套给自己判卷的方法、三条操作规则,以及一个「梯度必须恰好是 0」的性质:它反过来能当调试手段用。

20
2026-09-18·—阅读·—点赞

同一个偏差,既当分子又去造分母:BatchNorm 反向的十三步

上一篇停在 logits —— 那是网络的边界,八步里一个参数都没碰到。这一篇往里走十三步,参数第一次出现。而 BatchNorm 那九步之所以是全集最绕的一段,原因和 softmax 是同一个:归一化的分子必须先被拿去造分母。顺带遇到第一个「系数不是 1」的求和反向,以及一个只差 3% 的错 —— 它的 maxdiff 小到像浮点误差。

21
2026-09-18·—阅读·—点赞

看着对的那一行:96 次查表落在 27 行上,和 Ex1 收官

最后五步,没有分叉点,前三步是上一篇的复制粘贴。真正新的是后两步:view 的反向为什么就是它自己的逆操作(判据只有一条 —— 数的个数变没变),以及 dC[Xb] += demb 这行看着完全正确的代码为什么是错的。跑完这五步,4137 个参数的梯度全部手算出来。

22
2026-09-20·—阅读·—点赞

差 0.0001:二十六步压成六组,手写的梯度训出了同一个模型

前三篇把 loss 到每个参数的二十六步全推了一遍,但那是打开黑盒逐步走。这一篇把黑盒合回去:交叉熵的八步压成一行、BatchNorm 的十步压成一行,用的是同一个方法 —— 数一数变量在前向里出现几次,反向就有几项。压完撤掉 backward() 训 20 万步,val loss 2.1105,而 PyTorch 训的是 2.1106。

Karpathy V7 · 从零写 GPT04
23
2026-09-21·—阅读·—点赞

初始 loss 比瞎猜还差一半:从莎士比亚到 2.49 这条基线

换数据集重开:莎士比亚、65 个字符的词表、一条 val 2.49 的 bigram 基线 —— 后面每加一个模块都跟它比。这三段没有新数学,但引入了两样贯穿整集的东西:token 是你自己定义的(顺带解释了阶段四为什么选 Qwen),以及 (B, T, C) 这三个形状。还有一个能一眼看穿的等价:查表就是一层没有偏置的全连接。

24
2026-09-23·—阅读·—点赞

只改一行:注意力公式里的每一个符号是怎么来的

softmax(QKᵀ/√dₖ)V —— 这一篇把它的每个符号一个一个挣出来。从最笨的「求平均」开始,经过「下三角矩阵乘就是加权求和」「softmax 配 −∞ 屏蔽未来」,再到「分数由 q·k 算出来」:从求平均到注意力,代码只改了一行。encoder 和 decoder 也只差一行。最后那个 √dₖ,是第十五篇那条方差公式换了个地方用。

25
2026-09-24·—阅读·—点赞

thou 后面那个 r 是怎么消失的:一个注意力头长成 GPT

把第二十四篇的注意力头装进模型,再堆深、放大,val 从 2.49 一路降到 1.48。多头的参数一个没多,提升来自分工;FFN 补上唯一的非线性;残差让深网络在初始化时约等于浅网络,LayerNorm 换个方向归一化,Dropout 只扔分支、不碰主干。同一个问题问了四次 —— thou 后面接什么:原文里一次都没出现过的 r,从第一名一路跌到 0.001。

26
2026-09-24·—阅读·—点赞

差别都在工程上:对照原论文和 nanoGPT,再看 GPT 怎么变成 ChatGPT

第二十五篇写出来的模型,对着 2017 年的原论文看是解码器那一半、去掉交叉注意力;对着 nanoGPT 看,结构几乎一模一样,差别都在工程。最值得啃的是多头合并那三行:c_attn 把小矩阵并排,view + transpose 把「头」挪到前面 —— 用一个 2 头的小例子手算到底。顺带修正一个说法(q 的偏置不是白加的),算清 6N 那笔账,最后看预训练、SFT、RLHF 怎么把一个只会续写的模型变成 ChatGPT。

Karpathy V8 · 分词器09
27
2026-09-26·—阅读·—点赞

基础补课 · 一个「你」,五串字节:字符集管编号,编码管存储

第 23 篇说 tokenizer 把文本变成整数,但没说第一步是把文本变成字节。字符集只管「这是第几号字」,编码只管「这个号码写成哪几个字节」—— 分开之后,UTF-8 的四种模板能手算,半个汉字为什么显示成 � 有了确定的答案,而分词器词表最底下那 256 个条目也不再是约定,是机械事实。

28
2026-09-26·—阅读·—点赞

一张合并表就是分词器:为什么要分词,以及从零写 BPE

模型只看编号,分词器负责在文字和编号之间翻译。码点当 token 词表太大、字节当 token 序列太长,BPE 从 256 个字节出发,反复把最常挨在一起的一对合并成新 token —— 训练完手里只剩一张按顺序排好的合并表。编码时每一步挑表里最早学到的那一对,所以表里明明有 ' th',切 'the thin' 时却用不上:顺序决定结果。

29
2026-10-09·—阅读·—点赞

先划边界,再学合并:BPE 前面的那条正则

BPE 会把常挨在一起的字节合并,但不切块就会学出 e 加空格、逗号加空格这样的跨类别 token。GPT-2 用一条正则先划边界:每块独立统计和合并,全语料共用一张规则表。看懂四个缩进空格怎样被分成三加一,就能分清哪些差别来自正则,哪些来自训练。

30
2026-10-09·—阅读·—点赞

词表里的 Ġ 是什么:沿着 GPT-2 源码走完一次编解码

GPT-2 的 encoder.py 不直接合并字节编号,而是先把 256 种字节映射成可逆字符别名。沿着 Hi 你! 看清两张资源表、rank 与 ID、BPE 的两层循环、缓存和结束条件,最后把跨 token 的 UTF-8 字节拼齐再解码。附官方十四轮合并与七轮教学例子的交互动画。

31
2026-10-09·—阅读·—点赞

编号已经有了:minbpe 怎么恢复规则,又怎么处理特殊 Token

cl100k_base 给的是字节串到 rank / ID 的表,minbpe 要从中恢复左右两个组成部分。用 hello 追到 max_rank 为什么必须严格小于目标编号,再区分 merges 与完整 vocab、byte_shuffle 与原始字节。特殊标记则先由调用方策略决定走专用 ID 还是普通 BPE;最后核对完整编解码与测试范围。

32
2026-10-10·—阅读·—点赞

同一个 abc,为什么换了切法:Unigram 的训练与编码

Unigram 从候选词表出发,用所有合法切分的期望次数更新概率,再按删除代价缩小词表。沿着同一份 abc 语料推导 p、w、Z、q、C,接着用训练结果手算 abcabc 最后一个 c 的动态规划,最后核对 SentencePiece 的字节回退。

33
34
2026-10-12·—阅读·—点赞

输入查几行,输出算整表:从 Token ID 到下一 Token

Tokenizer 交出一串 ID 之后,模型怎样继续?用同一个五 Token 小模型,查两张向量表、走完一个 Transformer Block、展开 lm_head 的每个候选分数,再手算训练损失、概率抽取、温度、top-k 与 top-p。附三张双语图解、两个交互演示和可复算的完整代码。

35
2026-10-12·—阅读·—点赞

词表不只决定切几刀:模型成本、多模态与分词边界

词表翻倍、序列缩短,为什么输出计算反而可能增加?从参数账与 ID 对应关系出发,区分连续视觉向量和离散视觉码,走完 Token Healing 的八个步骤,再用中文、数字、空白和 JSON / YAML 的切分例子说明表示差异。附双语图解与交互动画。

GPT · 训练与推理串联01
36
2026-10-14·—阅读·—点赞

同一套 GPT,两条完整路线:训练更新与逐 Token 生成

沿 Hi 你! 串起 GPT 的完整计算:位置向量、LN 与 QKV、两次残差、MLP、全词表 logits、交叉熵和 AdamW,再看固定参数怎样逐 Token 生成与增量解码。用三张双语图解、两份分步动画区分参数、激活、梯度与生成上下文。