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

往哪边改、改多少?

往哪边改、改多少
随便挑一个方向试:在 24,896 维里,它和下坡方向的夹角余弦中位数只有约 0.004。梯度直接给出最陡的下坡方向。可步子太大又会失灵:迷你模型沿梯度走 η = 10,一阶近似预测 loss 降 1.761,实际却升了 0.375。对话样本的「[0.20, 0.70] → [0.21, 0.68]」在这里真算一遍。
❓

本课一问:第 2 课有了尺子:「小猫 喜欢 吃 → 鱼」这一个例子,loss = −ln 0.0526 = 2.944。现在要改参数让它变小。60 个数,每个该往上还是往下?挪多少?

这一课先不碰:梯度怎么高效算出来(第 4 课,这一课先当它已知);动量、Adam、学习率调度这些更聪明的走法(C5);一次看多少例子(C5 岔路课)。

从已有出发

对话样本里,老师把这一步说得很具体:「反向传播算出来,猫这个向量应该第一维 +0.01、第二维 −0.02」,于是「训练前 猫 = [0.20, 0.70] → 训练后 [0.21, 0.68]」,并强调一次训练只改变一点点。这一课就在迷你模型上把这组数真算一遍,顺便回答两个问题:方向凭什么是这个方向;为什么只改一点点。

从已有出发 · 从例子里学的一整圈(点任一环节看它在迷你模型和 Qwen/Qwen3.8-27B 里多大) 本课本章后面的课
训练一个网络要的东西,是一件一件被真数字逼出来的(点名字去那一课;完整版在章首页)
  1. 手写规则 / 把例子背成一张表
  2. 带参数的模型:用例子调数字
  3. 交叉熵:正确答案概率的负对数
  4. 梯度下降
  5. 反向传播(反向模式自动微分)
  6. 非线性多层网络
  7. 验证集、早停与正则化
  8. 深度学习为什么是经验性的
  9. 词向量:按编号查表
第三代梯度下降Cauchy 1847你在这里
解决了沿 −∇L 小步走:真语料小网络 η = 1、600 步,验证 loss 5.550 → 3.606。
卡在梯度要逐个参数去试:中心差分每步 49,792 次前向,作者机器上约 12 秒,反向传播约 0.7 毫秒(第 4 课在你的浏览器里现场计时)。
数字口径:one-hot 维数与乘加次数由锚点 Qwen3.8 的 config 构建时现算;迷你模型(种子 3)、四句组合题(种子 3)、真语料小网络(种子 1)的数字来自本章各课组件的默认设置,浏览器里现场复算;4.771 / 6.906 来自项目真实日志 d00-foundations.json。年份按原始文献核对(2026-09-26)。

先自己设计:随便挑一个方向试

不会算方向,最朴素的办法是试:随机挑一个方向,沿它走一小步,loss 变小就留下,变大就退回。只有两个参数时,这招挺管用——一半的方向是下坡。可参数一多:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案随机挑方向,变好就留下
随机挑方向 vs 沿着梯度走 字级 MLP · 24,896 参数 · 《三國志演義》24,000 字 · 浏览器内真训练
等待开始(滚动到这里会自动开始)

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

维数越高,随机方向越接近和梯度垂直:余弦的典型大小约 1/√n。n = 2 时随机方向常常蒙对;n = 24,896 时几乎白走;锚点 Qwen3.8 有两百七十多亿个参数,1/√n 约 6 × 10−6。

改进一:方向 = 负梯度

在迷你模型上看清楚。只让「小猫」那两个数动(其余 58 个数固定在开局的值),「小猫 喜欢 吃 → 鱼」的 loss 就是这两个数的函数,可以画成一张地形图:

往哪边改、改多少:在「小猫」那两个数上走一步 迷你模型 · 12 个词 · 60 个参数 · 教学构造 · 浏览器现算

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

🎯

试三件事:① 默认 η = 0.1:读「梯度 ∇L = [−0.1912, 0.3736]」——第一维的梯度是负的,所以该往上加;第二维是正的,该往下减,和对话样本说的「第一维 +、第二维 −」一致;点常用里的 0.05,「走完」一栏正好是 [0.2096, 0.6813] ≈ [0.21, 0.68];② 点「对照:随机方向走同样长」几次:只有 2 个数时,随机方向也常常下坡,但余弦为负时 loss 会升;③ 点「走一步」「连走 10 步」,看灰线沿着等高线的垂直方向往谷底走。

把这一步写成式子:

梯度下降的一步(本章唯一用到的更新规则)
= − ·
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
「−」号让参数往下坡走;η·∇L 就是对话样本说的那「一点点」。迷你模型里 η = 0.1:Δ = −0.1 × [−0.1912, 0.3736] = [+0.0191, −0.0374]。

改进二:步长 = 学习率,只改一点点

梯度是在当前这一点量出来的坡度。坡在一小片范围里可以当成平的(一阶近似):走 η·∇L 这一步,loss 应该下降约 η·‖∇L‖²。步子一大,落点离开了这片范围,近似就不准了。回到上面的组件,把 η 换成 1、3、10,对比「一阶近似预测的降幅」和「实际变化」:

η预测降幅 −η‖∇L‖²实际变化判断
0.1−0.0176−0.0175很准
1−0.176−0.164差不多
3−0.528−0.401开始不准
10−1.761+0.375loss 反而升了

(迷你模型,种子 3,「小猫 喜欢 吃 → 鱼」这一个例子,只动「小猫」的两个数;表里的数都能在上面的组件里点出来。)

这就是「一次只改一点点」的真正原因:不是为了稳重,是因为梯度只在附近可信。走一小步,重新算梯度,再走一小步。

真语料上,学习率的影响更直接。先猜,再训练:

学习率三幕:先猜,再训练 字级 MLP · 24,896 参数 · 《三國志演義》24,000 字 · 浏览器内真训练
等待开始(滚动到这里会自动开始)

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

🎯

试三件事:① 先在紫色框里选一个猜测,再看结果:η = 0.001 太小,600 步只到 4.602;η = 1 最低,3.606;② 看左图(对数纵轴):η = 3 的前几步 5.55 → 9.07 → 11.26,冲高后又落回来,最终 3.796;η = 10 第 2 步 30.5,第 3 步一万多,第 9 步变成 NaN——数值溢出,训练报废;③ 换种子 2、3:具体数字变,排序不变。

⚠

常见误解一:「梯度指向最优解。」

梯度只指向此处最陡的下坡。上面的地形图里,从 [0.20, 0.70] 出发的负梯度方向并不正对谷底,灰线是弯着走过去的;在更复杂的地形里,最陡的下坡可能通向一个不怎么好的低洼(岔路课会看到这种「卡住」)。

常见误解二:「学习率越大,学得越快。」

η 从 0.001 加到 1 确实更快;再加到 3 就开始乱跳,到 10 直接发散。好的学习率在「够快」和「不炸」之间,而且会随模型、数据、批大小变化。

常见误解三:「每一步训练 loss 都会下降。」

真语料小网络每一步只看 32 条例子,算的是这一小批上的梯度;对这一批下坡,对全体数据不一定。所以训练 loss 曲线总是毛糙的,要看趋势。这个「随机」是随机梯度下降里的随机,C5 第 1 课细讲。

🔍 负梯度为什么是「最陡」的方向?

一阶近似:走一小步 d,loss 变化约 ∇L·d = ‖∇L‖·‖d‖·cos α,α 是 d 和 ∇L 的夹角。步长 ‖d‖ 固定时,cos α = −1(d 正对 −∇L)下降最多,这是柯西-施瓦茨不等式的直接结论。随机方向在高维里 cos α 集中在 0 附近,典型大小约 1/√n——所以上面 24,896 维的随机试几乎白走。这个方法有一百多年历史:Cauchy 1847 年在求解方程组时提出沿负梯度迭代。

证据三问

问本课的回答
① 它解决什么问题?在几万、几百亿个参数里找到「往哪边改」:随机试在高维里几乎白走
② 数学上为什么可能有效?负梯度是一阶近似下的最速下降方向 ;若 loss 足够光滑(梯度变化有上界 L),η < 2/L 时每一步都保证下降
③ 实验上为什么这样选?η 的具体取值靠试:真语料小网络上 0.001 太慢、1 最好、3 抖、10 发散

一句话

📌

梯度告诉你此处哪个方向下坡最陡;学习率决定沿它走多远——梯度只在附近可信,所以一次只改一点点,走一步再重新算。

🚦

先停在这里:记住 θ ← θ − η∇L:方向由梯度定,步长由 η 定。
再深一层:展开「为什么是最陡」的 Dig;想看这条路在更难的地形(峡谷)里怎么走、怎么加速,直接跳到 C5 第 1 课。

下一个缺口

梯度要对每个参数都算一遍——两万多个、两百多亿个参数,怎么算得过来? → 第 4 课:参数一多,梯度怎么算?

这一课的梯度 [−0.1912, 0.3736] 是组件直接算好给你的。第 4 课从 loss 开始,一格一格往回推,把它亲手算出来。

你可能会问