01 课 · 训练
LESSON 01 · 卷一 先看全貌

训练,就是不停地猜数字

这门课的目标是造一台会做算术的机器。但在拆零件之前,先看一台最小的机器: 它只有两个数,任务只是猜出「学习时长 → 考试分数」这条直线。 这一课我们会把整台机器从头到尾跑通一遍 —— 数据怎么进来、损失怎么量、参数怎么一点点变好、最后怎么拿去用。 全程只需要加减乘除。

STAGE 01
一台最小的机器
一条直线 + 两个待定的数
STAGE 02
错得有多离谱
把「差」压成一个数字
STAGE 03
所有猜法排成曲线
谷底就是答案
STAGE 04
顺着斜率往下走
梯度下降 · 学习率
STAGE 05
训练完拿去用
从 2 个数到 76 亿个

先说清楚这一课的位置。后面十五课要讲的东西 —— 分词、嵌入、注意力、反向传播、优化器 —— 全是零件。 可零件再多,装起来也就是干一件事:给一批数据,把一堆数字调到最合适

这件事叫训练,而它比你想的朴素得多。 这一课我们把所有零件都先拿掉,只留最小的一台机器, 让你看清「训练」这两个字到底在做什么。 看完你会发现:大模型训练和这条直线,是同一件事的两个尺寸。

第 1 站

一台只有两个旋钮的机器

假设有 10 个同学,每人记录了两件事:每周学习几小时, 以及考试考了多少分。数据长这样:

(1 小时, 29 分) (2 小时, 36 分) (3 小时, 46 分) …… (10 小时, 100 分)

现在给机器一个任务:看到一个同学的学习时长,猜出他的分数。它该怎么猜?

最偷懒也最经典的办法:画一条直线。 横轴是学习时长 x,纵轴是分数 y,直线写成y = w · x + k —— 就这么两个数:

w
每多学一小时,分数加几分。它是直线的陡峭程度
k
一小时都不学时的「底子分」。它是直线在纵轴上的起点

但问题来了:w 和 k 到底是多少?没人告诉我们。 那就先瞎猜一组 —— 比如「每多学一小时加 5 分,底子 40 分」, 也就是 w = 5、k = 40。下面这条橙线就是它:

动手实验拖两个旋钮,看这条线怎么动
0204060801000246810每周学习时长(小时)分数这道错了 16
w(每小时加几分)5.0
k(底子分)40.0
现在的模型:分数 = 5.0 × 时长 + 40.0
损失(均方误差)= 84.10  → 换成「平均差几分」= 9.17
两个滑块就是模型的全部内容 —— 它肚子里没有别的东西,只有这两个数。 把它们调到哪,预测就跟着变到哪。
黑点是 10 个同学的真实成绩,橙线是模型现在的猜测,红色竖线是它每道题错多远。 拖一拖两个滑块 —— 你会发现这台机器全部的脾气都在这两个数里: 调 w,线变陡变平;调 k,线整体上下平移。
图 1-1 · 模型 = 一条固定的直线 + 两个待定的数;换一组 w、k 就是换一台机器
这一课的第一个关键词 · 编码 / 解码

机器只认识数字,可「一个同学」「一次考试」都不是数字。所以这条流水线有两头:

编码:把「一个同学」压成一个数 —— 他每周学 7 小时 → x = 7
模型:拿数字算出另一个数字 —— y = w × 7 + k
解码:把那个数字还原成人话 —— y = 75.4 → 「大概考 75 分」

中间那两个数(w、k)就是这台机器的全部本事。 「训练」要干的事,就是把它们调对。

模型 = 一个固定的算式
加上一堆待定的数字

记住这个结构,因为它后面一个字都不会变。 最后一课那个 76 亿参数的大模型,也只是「算式更复杂、待定的数字多了 38 亿倍」而已 ——它是这条直线的加强版,不是另一种东西。

第 2 站

怎么知道猜得好不好

现在我们有了一条线,可怎么判断它「猜得好不好」? 光看一眼图不够 —— 训练需要的是一个数字, 这样才能比较「这组参数比那组好多少」。

做法很直接:把每一道题错的量加起来。 先看这 10 道题的明细(就用刚才那组 w = 5、k = 40):

时长 x
真实分数 y
模型猜的
差多少
差的平方
1
29
45
+16
256
2
36
50
+14
196
3
46
55
+9
81
4
53
60
+7
49
5
58
65
+7
49
6
68
70
+2
4
7
75
75
0
0
8
85
80
-5
25
9
94
85
-9
81
10
100
90
-10
100

注意「差多少」那一列:有正有负。 正的说明猜高了,负的说明猜低了 —— 如果直接相加,+16 会和 −10 互相抵消,加出来只剩 31,看起来好像「猜得还不错」, 其实完全不是那么回事。

所以要先平方,把负号全变成正的:

损失是怎么算出来的 · 均方误差
第 1 道:猜 45、真 29 → 差 +16 → 平方 256
第 2 道:猜 50、真 36 → 差 +14 → 平方 196
……(10 道全算一遍)
第 10 道:猜 90、真 100 → 差 −10 → 平方 100

10 个平方加起来 = 841
再除以 10 取平均 = 84.10 ← 这就是损失

这个名字叫均方误差(MSE)。它做了一件了不起的事: 把「这条线到底有多烂」这种模糊的感觉,压成了一个数。 于是「哪组参数更好」变成了比大小。

再开个根号就是人话版:84.109.17——「平均每道题差 9.2 分」。 后面看训练有没有效果,就盯着这个数往下掉。

面试常问 · 为什么用平方,而不是绝对值?
  • 把正负号抹平:不然 +16 和 −10 会互相抵消,误差看着小、其实全错。
  • 狠狠惩罚离谱的错:差 10 分贡献 100,差 30 分贡献 900 —— 错得越夸张,在损失里的分量涨得越快。于是模型会先顾那些错得最狠的题
  • 后面好使:平方函数的斜率特别干净(就是 2 倍的差), 第 4 站我们要靠它算「往哪边挪」;绝对值在 0 那个点上有个折角,不好处理。
现在你有了一个数能衡量「猜得好不好」。那接下来该往哪个方向调 w 和 k 呢?先别往下翻,自己想一个办法。
第 3 站

把所有猜法排成一条曲线

损失是 w 和 k 的函数 —— 换一组参数,就有一个对应的损失。 这句话可以画成一张图:横轴是猜的参数,纵轴是这个猜测的损失。

麻烦在于参数有两个,要画得下就得先钉住一个。 这一站我们作弊一下:假设 k 已经调到了最好的值(k = 20.53),只看 w 这一个方向。 于是损失随 w 变化,画出来是一条U 形曲线

核心实验U 形曲线 —— 拖 w,看它在山谷的哪一侧
110100100035791113猜的 w(每小时加几分)损失(对数刻度)谷底 w = 7.98往这边挪,损失更小
猜的 w5.0
你猜 w = 5.00(k 已经钉在最好的 20.53 上),损失 = 342.36
这个位置上的斜率 = -229.1(负数 → 左边更高,该往右)
曲线只有一个最低点。你不需要聪明 —— 只要会看脚下这一点的斜率, 顺着它往下挪,早晚会滚到谷底。这就是训练的全部秘密。
绿虚线是谷底(最好的 w),橙点是你现在猜的位置。 往左拖、往右拖,注意两件事:损失的数值怎么变, 以及脚下这一点的斜率是正还是负 —— 它正好告诉你该往哪边挪。
图 1-2 · 纵轴取了对数刻度(不然谷底会被两边的山壁压成一条线);谷底在 w = 7.98

现在把这条曲线的意思翻译一遍 —— 这是整个训练里最关键的一步:

  • 曲线只有一个最低点:在 w = 7.98 处,损失 1.44。 这个点就是这批数据能给的最好答案
  • 站在谷底左边:曲线还在往下溜,斜率是负的 → 该往右挪。
  • 站在谷底右边:曲线已经翘起来了,斜率是正的 → 该往左挪。
  • 站在谷底:斜率约等于 0 → 不用挪了,这就是终点。

所以训练根本不需要什么聪明办法。它只要会做一件事: 感受脚下这一点的斜率,然后往低的那边挪一小步。挪完之后脚下的斜率会变,再挪一小步 —— 反复做,自然就滑到谷底了。

名桥 · 真实模型也是这条曲线

我们只有一个 w,所以能画出一条线。真实模型有 76 亿个参数, 那就是 76 亿个方向 —— 谁也没法画出来。

每一个方向单独看,都是这样一条 U 形曲线。 把 76 亿条这样的曲线拼在一起,就是一个 76 亿维的「碗」。 碗底在哪儿、怎么往下走 —— 规则和这一站一个字都不差, 只是算不过来,得靠机器算。

第 4 站

顺着斜率往下走

上一站说了「往低的那边挪」。现在把它写成一行公式 —— 这就是训练的全部

w ← w − 学习率 × 斜率

k 也做一模一样的事。三个词分别是:斜率告诉你「往哪边挪」(负的就往右、正的就往左),学习率告诉你「挪多大一步」, 左边那个 表示「挪完覆盖掉原来的值」。 然后重复

拿我们的出发位置(w = 5、k = 40)手算第一步试试。 用求导算出来的两个斜率是:

第一步,可以按计算器核对
在 (w = 5, k = 40) 处:
 损失 = 84.10(平均差 9.17 分)
 对 w 的斜率 = -15.0(负的 → 说明往右挪损失变小,w 该变大)
 对 k 的斜率 = +6.2(正的 → 说明往左挪损失变小,k 该变小)

学习率取 0.02,两个参数同时挪:
 w:50.02 × (-15.0) = 5.30
 k:400.02 × (+6.2) = 39.88

两个方向都对了:w 涨一点、k 降一点,损失从 84.10 掉到 81.90。 步子很小,但方向是对的 —— 重复 1000 次呢?

招牌动画真的开训 —— 左边看直线怎么摆进去,右边看损失怎么掉下去
学习率:刚好
模型现在长什么样
0204060801000246810
损失随步数掉下去
020406080训练步数损失谷底 1.44
0 / 1000 步  w = 5.00  k = 40.00
损失 = 84.10  平均差 9.17 (出发时 84.10,平均差 9.2 分)
注意那条曲线:一开始掉得飞快,后来几乎不动。真实的大模型训练曲线也是这个形状 —— 因为越接近谷底,脚下的斜率越小,一步能挪的距离自然越短。
点「走一步」看每一步的账,或者点「自动训练」一口气跑完 1000 步。 轨迹是当场算出来的,不是画好的示意折线。 跑完之后,把学习率切到 0.002 再跑一遍 —— 你会发现它挪得慢吞吞; 切到 0.03,它几十步之内就炸了。
图 1-3 · 学习率 0.02:损失从 84.10 一路掉到 1.44, 直线也从「太平太高」摆进了点堆里

学习率是训练里最要紧的一个旋钮, 因为它决定了「一步迈多大」,而这件事没有万能答案:

学习率
脾气
1000 步之后
0.002
太磨蹭
损失 16.60(平均差 4.07 分)
0.02
刚好
损失 1.44(平均差 1.20 分)
0.03
太大,直接飞出去
💥 第 51 步就炸了
同一台机器、同一个起点、同一批数据 —— 只有步子大小不同, 结局差了十万八千里。太小不是「稳」,是走不到;太大不是「快」,是翻车。
这一站的两个新词,先混个脸熟

梯度下降:刚才那一整套动作(算斜率 → 往反方向挪一小步 → 重复)的名字。 「梯度」就是「所有方向的斜率打包在一起」。 真实模型里这几亿个斜率是一次全算出来的, 靠的是一种叫反向传播的算法 —— 那是第 11 课的主角。

学习率:一步迈多大。真实训练里它不是个固定值, 而是开头小、中间大、结尾又变小的一条曲线 —— 为什么这么安排,第 12 课会算给你看。

第 5 站

训练完,它学会了什么

跑完 1000 步,机器停在 w = 7.98、k = 20.54, 损失 1.44 —— 平均每道题差 1.20 分。

可我们心里有个数:这批数据背后的真规则其实是y = 8x + 20(每多学一小时加 8 分,底子 20 分), 只是每条记录上还叠了一个 ±3 分的抖动。 机器猜出来的 7.9820.54和真规则差了一点点 —— 这不是它偷懒,是数据本身就有抖动, 任何模型都消不掉。它已经把能学的都学到了。

现在把训练完的模型拿去用。问它一个那 10 个同学里根本没出现过的时长

动手实验问它「学了 7.5 小时能考几分」
0204060801000246810每周学习时长(小时)分数模型说 80.4训练完的模型真规则(模型从没见过)
问它:学了7.5 小时
模型:7.98 × 7.5 + 20.54 = 80.35
真规则:8 × 7.5 + 20 = 80.00 分 → 差了 0.35
这个时长在那 10 个同学里根本没出现过,模型照样答得出来 —— 因为训练结束时它交出来的不是一张答案表,而是两个数(w = 7.98、k = 20.54)。这就是「模型」和「背题」的区别。
橙线是训练完的模型,蓝虚线是它从没见过的真规则 —— 两条几乎贴在一起。 拖滑块换任何时长,橙点都跟着走:它答得出来, 因为它交出来的不是一张答案表,而是两个数。
图 1-4 · 训练完的模型(橙)与真规则(蓝虚线)几乎重合;平均差 1.20
整条流水线 · 从头到尾

① 编码 把「一个同学」压成一个数:x = 7(每周学 7 小时)
② 模型 拿数字算出数字:y = w × 7 + k —— 机器肚子里只有 w、k 这两个数
③ 解码 把数字还原成人话:y = 75.4 →「大概考 75 分」
④ 损失 拿 10 道已知答案的题去考它,把「错得多离谱」压成一个数: 均方误差 = 84.10 → 目标:压到最小
⑤ 训练 算斜率 → 往反方向挪一小步 → 重复 1000 次。 损失一路掉到 1.44
⑥ 交付 交出 w、k 两个数。它对任何时长都能开口,包括没见过的

整条流水线,就是这六步。它一个字都不会变。后面的十五课,全都是把这六步里的某一格放大:

这一步
这一课(玩具)
大模型(76 亿参数)
编码
学习时长 → 一个数
一句话 → 一串 token 编号 → 一串向量(第 3、4、5 课)
模型
y = w·x + k,2 个参数
注意力 + FFN 堆 28 层,76 亿个参数(第 6~9 课)
解码
一个数 → 分数
一串分数 → 一个字,循环着吐出一整句话(第 10 课)
损失
均方误差(猜错了差多少)
交叉熵(给正确答案的概率有多低)(第 11 课)
训练
2 个斜率,手算得出来
76 亿个斜率一次算完(反向传播),再交给优化器(第 11、12 课)
交付
2 个数
一个 .safetensors 文件(15 GB 的数字)(第 16 课)

左右两列一一对应。这就是为什么这门课敢从一条直线讲起 —— 你已经把整台机器的骨架摸过一遍了,剩下的都是血肉。

第 6 站 · 收官

把这一课钉在墙上

本课核心 · TAKEAWAY

训练就五件事:编码把世界压成数字;模型是一堆待定的参数;损失把「错得多离谱」压成一个数;梯度下降反复做「算斜率 → 往反方向挪一小步」; 最后交付那堆调好的参数。 我们这台机器只有两个参数,用一条直线猜分数, 跑 1000 步把损失从 84.10 压到 1.44, 平均差 1.20 分。 而大模型做的事一模一样,只是参数从 2 个变成 76 亿个、 算式从一条直线变成一个 Transformer。「训练」这个词,从今天起对你不再是黑箱。

这一课你亲手做完了

  • 拖过两个旋钮:w 管陡峭、k 管高低,这台机器的全部内容就是这两个数 (出发时 w = 5、k = 40)。
  • 算过一遍损失:10 道题的「差的平方」加起来 841,除以 10 得 84.10 —— 均方误差把「有多烂」压成了一个数。
  • 看过那条 U 形曲线:谷底在 w = 7.98(损失 1.44), 斜率告诉你往哪边挪。
  • 手算过第一步:斜率 (-15.0, +6.2),w 从 5 挪到 5.30、k 从 40 挪到 39.88
  • 试过三个学习率0.002 / 0.02 / 0.03 —— 磨蹭(16.60)、刚好(1.44)、第 51 步飞出去。
  • 问过它一个没见过的时长:训练完的 w = 7.98、k = 20.54,和真规则(820)只差一点点 —— 剩下那点差是数据自带的抖动(1.26 分),谁都消不掉。

学习小测验

已完成 0 / 60.0%答对 0
还没提交过 —— 每题先选一个选项,再点「提交」,答完就能看到诊断。
Q1我们这条直线模型里,所谓「参数」指的是什么?
Q2损失(均方误差)算的是什么?
Q3为什么误差要平方,而不是直接把「差多少」加起来?
Q4第 3 站那条 U 形曲线,谷底代表什么?
Q5学习率设成 0.03,会发生什么?
Q6训练完模型交出 w = 7.98、k = 20.54,而数据背后的真规则是 8 和 20。这说明什么?
NEXT · 第 2 课

向量与张量:万物皆可变成数字

这一课的「编码」太轻松了 —— 学习时长本来就是个数字。 可大模型的原料是文字:「猫」「国王」「三十四加十二」, 你没法把一句话塞进显卡。 下一课我们去发明那套通用的翻译方式:向量 —— 给万物拍一张数字照片,连「国王 − 男人 + 女人 = 女王」都能算出来。

从零手册 —— 下一课:向量与张量:万物皆可变成数字