这门课的目标是造一台会做算术的机器。但在拆零件之前,先看一台最小的机器: 它只有两个数,任务只是猜出「学习时长 → 考试分数」这条直线。 这一课我们会把整台机器从头到尾跑通一遍 —— 数据怎么进来、损失怎么量、参数怎么一点点变好、最后怎么拿去用。 全程只需要加减乘除。
先说清楚这一课的位置。后面十五课要讲的东西 —— 分词、嵌入、注意力、反向传播、优化器 —— 全是零件。 可零件再多,装起来也就是干一件事:给一批数据,把一堆数字调到最合适。
这件事叫训练,而它比你想的朴素得多。 这一课我们把所有零件都先拿掉,只留最小的一台机器, 让你看清「训练」这两个字到底在做什么。 看完你会发现:大模型训练和这条直线,是同一件事的两个尺寸。
假设有 10 个同学,每人记录了两件事:每周学习几小时, 以及考试考了多少分。数据长这样:
(1 小时, 29 分) (2 小时, 36 分) (3 小时, 46 分) …… (10 小时, 100 分)
现在给机器一个任务:看到一个同学的学习时长,猜出他的分数。它该怎么猜?
最偷懒也最经典的办法:画一条直线。 横轴是学习时长 x,纵轴是分数 y,直线写成y = w · x + k —— 就这么两个数:
但问题来了:w 和 k 到底是多少?没人告诉我们。 那就先瞎猜一组 —— 比如「每多学一小时加 5 分,底子 40 分」, 也就是 w = 5、k = 40。下面这条橙线就是它:
机器只认识数字,可「一个同学」「一次考试」都不是数字。所以这条流水线有两头:
中间那两个数(w、k)就是这台机器的全部本事。 「训练」要干的事,就是把它们调对。
记住这个结构,因为它后面一个字都不会变。 最后一课那个 76 亿参数的大模型,也只是「算式更复杂、待定的数字多了 38 亿倍」而已 ——它是这条直线的加强版,不是另一种东西。
现在我们有了一条线,可怎么判断它「猜得好不好」? 光看一眼图不够 —— 训练需要的是一个数字, 这样才能比较「这组参数比那组好多少」。
做法很直接:把每一道题错的量加起来。 先看这 10 道题的明细(就用刚才那组 w = 5、k = 40):
注意「差多少」那一列:有正有负。 正的说明猜高了,负的说明猜低了 —— 如果直接相加,+16 会和 −10 互相抵消,加出来只剩 31,看起来好像「猜得还不错」, 其实完全不是那么回事。
所以要先平方,把负号全变成正的:
这个名字叫均方误差(MSE)。它做了一件了不起的事: 把「这条线到底有多烂」这种模糊的感觉,压成了一个数。 于是「哪组参数更好」变成了比大小。
再开个根号就是人话版:√84.10 ≈ 9.17——「平均每道题差 9.2 分」。 后面看训练有没有效果,就盯着这个数往下掉。
损失是 w 和 k 的函数 —— 换一组参数,就有一个对应的损失。 这句话可以画成一张图:横轴是猜的参数,纵轴是这个猜测的损失。
麻烦在于参数有两个,要画得下就得先钉住一个。 这一站我们作弊一下:假设 k 已经调到了最好的值(k = 20.53),只看 w 这一个方向。 于是损失随 w 变化,画出来是一条U 形曲线:
现在把这条曲线的意思翻译一遍 —— 这是整个训练里最关键的一步:
所以训练根本不需要什么聪明办法。它只要会做一件事: 感受脚下这一点的斜率,然后往低的那边挪一小步。挪完之后脚下的斜率会变,再挪一小步 —— 反复做,自然就滑到谷底了。
我们只有一个 w,所以能画出一条线。真实模型有 76 亿个参数, 那就是 76 亿个方向 —— 谁也没法画出来。
但每一个方向单独看,都是这样一条 U 形曲线。 把 76 亿条这样的曲线拼在一起,就是一个 76 亿维的「碗」。 碗底在哪儿、怎么往下走 —— 规则和这一站一个字都不差, 只是算不过来,得靠机器算。
上一站说了「往低的那边挪」。现在把它写成一行公式 —— 这就是训练的全部:
k 也做一模一样的事。三个词分别是:斜率告诉你「往哪边挪」(负的就往右、正的就往左),学习率告诉你「挪多大一步」, 左边那个 ← 表示「挪完覆盖掉原来的值」。 然后重复。
拿我们的出发位置(w = 5、k = 40)手算第一步试试。 用求导算出来的两个斜率是:
两个方向都对了:w 涨一点、k 降一点,损失从 84.10 掉到 81.90。 步子很小,但方向是对的 —— 重复 1000 次呢?
学习率是训练里最要紧的一个旋钮, 因为它决定了「一步迈多大」,而这件事没有万能答案:
梯度下降:刚才那一整套动作(算斜率 → 往反方向挪一小步 → 重复)的名字。 「梯度」就是「所有方向的斜率打包在一起」。 真实模型里这几亿个斜率是一次全算出来的, 靠的是一种叫反向传播的算法 —— 那是第 11 课的主角。
学习率:一步迈多大。真实训练里它不是个固定值, 而是开头小、中间大、结尾又变小的一条曲线 —— 为什么这么安排,第 12 课会算给你看。
跑完 1000 步,机器停在 w = 7.98、k = 20.54, 损失 1.44 —— 平均每道题差 1.20 分。
可我们心里有个数:这批数据背后的真规则其实是y = 8x + 20(每多学一小时加 8 分,底子 20 分), 只是每条记录上还叠了一个 ±3 分的抖动。 机器猜出来的 7.98 和 20.54,和真规则差了一点点 —— 这不是它偷懒,是数据本身就有抖动, 任何模型都消不掉。它已经把能学的都学到了。
现在把训练完的模型拿去用。问它一个那 10 个同学里根本没出现过的时长:
① 编码 把「一个同学」压成一个数:x = 7(每周学 7 小时)
② 模型 拿数字算出数字:y = w × 7 + k —— 机器肚子里只有 w、k 这两个数
③ 解码 把数字还原成人话:y = 75.4 →「大概考 75 分」
④ 损失 拿 10 道已知答案的题去考它,把「错得多离谱」压成一个数: 均方误差 = 84.10 → 目标:压到最小
⑤ 训练 算斜率 → 往反方向挪一小步 → 重复 1000 次。 损失一路掉到 1.44
⑥ 交付 交出 w、k 两个数。它对任何时长都能开口,包括没见过的
整条流水线,就是这六步。它一个字都不会变。后面的十五课,全都是把这六步里的某一格放大:
左右两列一一对应。这就是为什么这门课敢从一条直线讲起 —— 你已经把整台机器的骨架摸过一遍了,剩下的都是血肉。
训练就五件事:编码把世界压成数字;模型是一堆待定的参数;损失把「错得多离谱」压成一个数;梯度下降反复做「算斜率 → 往反方向挪一小步」; 最后交付那堆调好的参数。 我们这台机器只有两个参数,用一条直线猜分数, 跑 1000 步把损失从 84.10 压到 1.44, 平均差 1.20 分。 而大模型做的事一模一样,只是参数从 2 个变成 76 亿个、 算式从一条直线变成一个 Transformer。「训练」这个词,从今天起对你不再是黑箱。
这一课的「编码」太轻松了 —— 学习时长本来就是个数字。 可大模型的原料是文字:「猫」「国王」「三十四加十二」, 你没法把一句话塞进显卡。 下一课我们去发明那套通用的翻译方式:向量 —— 给万物拍一张数字照片,连「国王 − 男人 + 女人 = 女王」都能算出来。