从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 40 分钟 页内实验 ×2
D 深度学习地基:机器怎么从例子里学会规律 第 4 课

参数一多,梯度怎么算?

反向传播
逐个参数挪一点、看 loss 变多少:真语料小网络要做 49,792 次前向,约 12 秒一步;Qwen3.8 要 5.6 × 10¹⁰ 次。反向传播把整个计算画成一张图,从 loss 往回走,每条边乘上「本地导数」:一次前向加一次反向,约 3 倍前向的代价拿到全部精确梯度。第 3 课那个 [−0.1912, 0.3736] 在这里亲手算出来。
❓

本课一问:第 3 课的每一步都要一个梯度:每个参数一个数,「它往上挪一点点,loss 变多少」。迷你模型 60 个参数,真语料小网络 24,896 个,Qwen3.8 27,781,427,952 个。这么多个数,怎么算得过来?

这一课先不碰:自动微分框架(PyTorch 的 autograd)的工程实现;梯度太大、太小时怎么办(C5 裁剪、C8 稳定性);显存里为什么要存激活(C9)。

从已有出发

对话样本说「反向传播告诉模型内部的参数:哪些数字应该往哪个方向改一点」。第 3 课用了它的结果:「小猫 喜欢 吃 → 鱼」这个例子,「小猫」两个数的梯度是 [−0.1912, 0.3736]。这一课把这两个数亲手算出来,并且说明:为什么算两个和算两百多亿个,代价差不多。

从已有出发 · 从例子里学的一整圈(点任一环节看它在迷你模型和 Qwen/Qwen3.8-27B 里多大) 本课本章后面的课
训练一个网络要的东西,是一件一件被真数字逼出来的(点名字去那一课;完整版在章首页)
  1. 手写规则 / 把例子背成一张表
  2. 带参数的模型:用例子调数字
  3. 交叉熵:正确答案概率的负对数
  4. 梯度下降
  5. 反向传播(反向模式自动微分)
  6. 非线性多层网络
  7. 验证集、早停与正则化
  8. 深度学习为什么是经验性的
  9. 词向量:按编号查表
第四代反向传播(反向模式自动微分)Linnainmaa 1970;Werbos 1974 / 1982;Rumelhart、Hinton、Williams 1986 推广你在这里
解决了一次前向加一次反向,约 3 倍前向的代价拿到全部精确梯度;与有限差分的相对误差约 10⁻⁸。
卡在模型只会「各部分加起来再打分」:四句组合题的 loss 永远停在 ln 2 = 0.693(第 5 课)。
数字口径:one-hot 维数与乘加次数由锚点 Qwen3.8 的 config 构建时现算;迷你模型(种子 3)、四句组合题(种子 3)、真语料小网络(种子 1)的数字来自本章各课组件的默认设置,浏览器里现场复算;4.771 / 6.906 来自项目真实日志 d00-foundations.json。年份按原始文献核对(2026-09-26)。

先自己设计:一个一个参数去试

梯度的定义就是「挪一点点,看 loss 变多少」。那就照定义算:把第 j 个参数加一个很小的 h,重新前向一遍,(L(θ + h) − L(θ)) ÷ h 就是第 j 个分量;更准一点,用 θ + h 和 θ − h 两边各算一次(中心差分)。每个参数都这样来一遍:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案逐个参数扰动(有限差分)
反向传播 vs 逐个参数扰动:对不对、快多少 字级 MLP · 24,896 参数 · 《三國志演義》24,000 字 · 浏览器内真训练
等待开始(滚动到这里会自动开始)

数字来源:浏览器实时训练(纯 JS,Float64)。模型、语料、种子写在上方;同一组对照里所有 run 共用初始化和取批顺序,只改被比较的那一项。换种子重跑能看到噪声多大——差异小于种子间波动时不下结论。

上面的计时是在你的浏览器里现测的,每次运行略有不同;表格里的误差和「这批没出现的字梯度恰好为 0」每次都一样。差分并不是没用:它是检查反向传播有没有写错的标准办法(相对误差 10⁻⁸ 量级就说明两者一致),只是不能拿来训练。

改进:计算图 + 链式法则 + 反向走

把「小猫 喜欢 吃 → 鱼」的前向计算画成一张图:三个词的两个数 → 相加得 h → 打分 z = U·h + c → softmax 得 p → L = −ln p鱼。每个节点上格是值,下格是梯度:

计算图:前向填值,反向填梯度 迷你模型 · 12 个词 · 60 个参数 · 教学构造 · 浏览器现算

数字来源:浏览器实时计算(纯 JS,Float64)。例子、初始化与种子写在组件说明里;按词切只为演示,真实切分见 C1。已用 Python 独立实现逐位核对默认设置下的全部读数。

🎯

试三件事:① 先连点「前向 ▶」五次,看值从左往右填满,L = 2.9444;再连点「反向 ◀」五次,看梯度从右往左填:L 的梯度是 1 → p 那一格是 −1 ÷ 0.0526 = −19.00 → z 那一格化简成 p − y(「鱼」是 0.0526 − 1 = −0.9474)→ h → 三个词,每一步的说明里都写着「本地导数 × 上游梯度」;② 看「12 条路径之和」那张表:∂L/∂h 的第 1 个数 = 12 个词各贡献一项,加起来 −0.1912,正是第 3 课那个数;③ 在「有限差分扰动」里选「小猫的第 1 个数」:h = 10⁻⁶ 时实测 ΔL ÷ h 和反向传播对到小数点后 6 位;再选「小狗的第 1 个数」:它不在这句话里,加 h 之后 L 一位都不变。

规则只有一条,在每条边上重复:

链式法则:「小猫」两个数的梯度
= · , ∂L/∂h = ()
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
每个节点只需要知道自己的本地导数;反向走一遍,把上游梯度乘上本地导数传下去,遇到分叉就相加。整张图的梯度就都有了。

输出层 U 的梯度是一个外积:(p − y) 这一列乘 h 这一行。放到锚点模型的真实形状里,Qwen3.8 最后那张输出表(lm_head)的梯度,每个位置也是这样一个外积:

输出层的梯度:一列乘一行(迷你模型 12 × 2;Qwen3.8 的 lm_head 是真实规模)
∂L/∂U = (p − y) · hᵀ
输入输出中间结果 渐变 = 分数(连续值)
边长按对数比例缩放,块边上的数字是真实值;同一维度符号的边在全图等长。
维度含义 真实规模 小规模
V 词表大小(Qwen3.8 vocab_size;迷你模型 12) 248,320 12
d 每个 token 的维数(Qwen3.8 hidden_size;迷你模型 2) 5120 2
n 一个位置(一个例子) 1 1
维度取自 anchor-model.json;Qwen3.8 的输出表单独存一份(tie_word_embeddings = false),一个位置的这个梯度就有 1,271,398,400 个数。一批里所有位置的外积相加,就是这一批对 lm_head 的梯度。

为什么反向这么省:从 L 出发往回走,每个节点只经过一次,做的乘法和前向同一个量级(实测前向 + 反向约是前向的 3 倍);一趟走完,所有参数的梯度都在。反过来从某个参数出发往前推(差分就是这种思路的笨办法),每个参数都要走一趟。loss 只有一个数、参数有几百亿个,所以从 loss 这一头往回走划算 。

⚠

常见误解一:「反向传播是一种学习算法 / 优化器。」

它只负责算梯度。拿梯度怎么改参数,是第 3 课的梯度下降,或 C5 的动量、Adam、Muon;同一个反向传播可以配任何一种优化器。

常见误解二:「反向传播算出的是近似梯度。」

它是链式法则的精确结果,误差只来自浮点舍入。近似的是有限差分:上面 h = 0.1 时误差到百分之几,h = 10⁻⁹ 时舍入误差又回来了。

常见误解三:「反向比前向贵很多倍。」

大约 2 倍:浏览器里实测前向 + 反向约是前向的 3 倍。所以「训练一步 ≈ 3 次前向的计算量」是估算训练成本的常用经验(C6、C9 会用到);真正贵的是要把前向的中间结果存下来给反向用(C9 讲激活显存)。

🔍 谁发明了反向传播?

反向模式自动微分最早见于 Linnainmaa 1970 年的硕士论文(当时与神经网络无关);Werbos 1974 年的博士论文初步讨论了用它训练神经网络,1981 年的会议论文(1982 年出版)是第一次明确的应用;LeCun、Parker 在 1985 年前后各自重新发现;Rumelhart、Hinton、Williams 1986 年在 Nature 上展示了用它训练的隐藏层能学到有用的内部表示,反向传播从此流行 。「谁发明的」和「谁让它流行的」常被混为一谈;引用时分开写。

证据三问

问本课的回答
① 它解决什么问题?参数几万到几百亿个,逐个扰动每步要 2n 次前向;要一种与参数个数无关的算法
② 数学上为什么可能有效?链式法则给出精确梯度 ;反向模式的代价是前向的常数倍 ;差分的误差两头都有(h 大有截断误差,h 小有舍入误差)
③ 实验上呢?浏览器里:反向传播与中心差分(h = 10⁻⁵)相对误差 10⁻⁸ 量级;前向 + 反向约 3 倍前向

一句话

📌

反向传播 = 在计算图上从 loss 往回走,每一步把「本地导数 × 上游梯度」传下去;一次前向加一次反向,拿到所有参数的精确梯度。

🚦

先停在这里:记住「梯度从 loss 往回传,每条边乘本地导数,分叉处相加」。
再深一层:看 Karpathy 的 micrograd;回到组件里,把「12 条路径」每一项手算一遍。

下一个缺口

梯度会算了,可这个模型只会「各部分加起来再打分」——要看组合才能判断的规律,它学得会吗? → 第 5 课:直线拟合不了怎么办?

回扣:本课计算图里「相加」节点把梯度原样复制给三个词,第 7 课会看到,这正是「只有句子里用到的词才被更新」的原因。

你可能会问