🧠 第一章 AI入门:认识人工智能模型训练
📄 一句话概括

同样 1e21 的算力,token 与参数的比值配成 2 倍还是 40 倍,损失差 0.078。 而最优比值不是固定的 20——它随算力从 26 倍涨到 74 倍。 「参数量和数据量要 1 比 20」这句话,是特定条件下的结论,不是定律。

📝 本节和前面几节的关系

上一节讲了 GPT 在做什么,这一节讲它为什么有效。 答案不是「参数多」,是「参数和数据配得对」——这两件事经常被混为一谈。

一、规模定律:损失随规模可预测地下降

2020 年前后几篇论文发现一件事:模型的损失和「参数量 N」「训练 token 数 D」之间, 存在一条相当稳定的幂律关系。写成式子大概是: 损失 = 常数 + A / N^0.34 + B / D^0.28。前一项管「模型装得下多少」,后一项管「看了多少东西」。 这条式的意义不在于精确,在于可预测:小规模上跑几十次,拟合出常数, 就能估出大规模上大概什么水平,不用真的花几千万美元去试。 这是大模型能变成一门生意的前提。没有它,每一次扩规模都是赌博;有了它,扩规模变成投资决策。

二、钱要按什么比例分

训练一次的总算力大概是 6 × N × D(前向两倍、反向四倍)。 给定预算 C,N 和 D 就有一个权衡:N 大了 D 就小,反之亦然。 Demo 里对每个预算扫了一遍 N(D 由 C = 6ND 反推),找出损失最小的那个点。 结果:算力 1e18 时最优是 1 亿参数配 21 亿 token(26 倍); 1e23 时是 150 亿参数配 11139 亿 token(74 倍)。 比值从 26 涨到 74,不是常数。 这与坊间流传的「1 比 20」不符——但那不是谁的错: 20 这个数来自另一组拟合参数、另一段算力区间。换个拟合式就换个数。 可搬的不是那个数字,是做法:先在你自己的任务上拟合损失曲线,再扫一遍分配比例。 别人给的比值,只能当起点。

三、配错了要付多少

同样 1e21 的算力,配成 2 倍(参数多、数据少)损失 2.407;配成 40 倍是 2.329。差 0.078。 0.078 听起来微不足道,但损失是对数尺度的东西。 零点零几的损失差,换算到下游任务的准确率,常常是几十分。 这也解释了一个现象:同样标称「百亿参数」的两个模型,能力可能差一大截——因为一个喂了三千亿 token, 另一个只喂了三百亿。光看参数不看数据量,等于只看车不看油。 反过来也有教训:数据不够的时候硬堆参数,是在给一个空壳子扩容。 2020 年之前很多模型就吃了这个亏——参数上去了,效果不如预期,因为数据配得太少。

四、技术之外,还有两件事

第一件是工程化。 把上万个 GPU 连起来训练几个月不崩,这件事本身是巨大的工程挑战:通信、容错、检查点、数据加载, 任何一环出问题都是几百万美元打水漂。 第二件是产品化。 GPT-3 在 2020 年就有了,但真正让所有人用上的是 2022 年底的对话框——同一个模型,换了个交互方式, 从「研究者玩的 API」变成「全民工具」。 这两件跟算法无关,但它们决定了「有没有人用」。 对训练师来说这是很重要的一课:模型效果好不等于产品成立,中间还隔着交互、成本、信任三关。

五、动手 Demo:扫六档算力,找出最优的参数与数据配比

用一条近似的缩放规律(损失 = 1.69 + 406.4/N^0.34 + 410.7/D^0.28), 对每个算力预算扫一遍参数量 N,D 由 C = 6ND 反推,找出损失最小的配法。 再固定算力、变配比,看配错要付多少。

def loss(npar, d):
    return 1.69 + 406.4 / npar ** 0.34 + 410.7 / d ** 0.28

for e in (18, 19, 20, 21, 22, 23):
    C, best = 10.0 ** e, None
    for ln in np.linspace(7, 14, 281):
        npar = 10.0 ** ln
        d = C / (6.0 * npar)
        if d < 1e8:
            continue
        L = loss(npar, d)
        if best is None or L < best[2]:
            best = (npar, d, L)
    print(e, best[0], best[1], best[1] / best[0], best[2])

实跑输出:

--------------------------------------------------------------------
GPT 为什么成功:钱怎么分给参数和数据,比总共花多少更重要
--------------------------------------------------------------------
  算力(FLOPs)   最优参数   最优 token 数   token/参数    损失
  ----------------------------------------------------------
  1e18              1 亿           21 亿        26 倍   3.535
  1e19              2 亿           74 亿        33 倍   2.986
  1e20              6 亿          264 亿        42 倍   2.600
  1e21             18 亿          937 亿        53 倍   2.329
  1e22             53 亿         3139 亿        59 倍   2.139
  1e23            150 亿        11139 亿        74 倍   2.005

  第四列从 26 倍涨到 74 倍,**不是个固定常数**。这也是这一节最该记住的一件事:所谓「参数量和数据量要 1 比 20」是某组拟合参数、某段算力区间下的结论,换个拟合式就换个数。
  可搬的不是那个 20,是**做法**:先拟合出你自己任务的损失曲线,再扫一遍分配比例。

  差多少?同样 1e21 的算力,几种配法摆一起:
  token/参数   参数量   token 数    损失
  -------------------------------------
        2 倍    91 亿     183 亿   2.407
       10 倍    41 亿     408 亿   2.348
       20 倍    29 亿     577 亿   2.335
       40 倍    20 亿     816 亿   2.329
      100 倍    13 亿    1291 亿   2.333
  最差配法比最优配法多 +0.078 的损失。
  损失表上只差零点零几,看着无所谓——但**损失是对数尺度的东西**,换算到下游任务的准确率,零点零几常常就是几十分。
  还有一层意思:算力不够的时候,钱花在参数上还是数据上,方向错了就是白烧。这条曲线回答的是**怎么分配**,不是「越大越好」。

第四列是最值得看的一列:26、33、42、53、59、74。 一路往上走,说明算力越大,越该把新增的预算往「数据」那边偏。 为什么?因为损失里两项的衰减速度不同(0.34 和 0.28)。参数那一项衰减得快,喂到一定程度就饱和了; 数据那一项衰减得慢,所以越往后越值得加数据。 第二张表更直接:同一个 1e21,2 倍配法损失 2.407,40 倍配法 2.329,差 0.078。 表格里最右那列「100 倍」反而比 40 倍略差(2.333),说明最优不是「数据越多越好」,是一个中间点。 必须交代:这条式子里的常数(1.69/406.4/410.7/0.34/0.28)是从公开论文的曲线上摘的近似值, 不是我这台机器上训练测出来的。所以这些数只能看趋势,不能当作「我的模型能到这个损失」。

30 秒实验

  1. 把 0.28 改成 0.24,重跑,看最优比值的涨幅从 26→74 变成多少。 指数差 0.04,结论差很远——这就是幂律拟合最脆弱的地方。
  2. 把下限 d < 1e8 改成 d < 1e10,看小算力那几行会怎么变。 这会让你明白「约束条件」本身就是结论的一部分。
  3. 算一下「2 倍配法」相当于浪费了多少钱:用同样 1e21 的算力, 损失却要 1e23 才能追回来——大约浪费了 100 倍的算力。

常见误区

  1. 「参数越多越强」。同算力下参数最多的那档(2 倍配法)是最差的。 参数和数据是一对,缺一个都不行。
  2. 「1 比 20 是铁律」。那是某组拟合参数下的结论。本文用另一组参数算出来是 26 到 74,随算力变。 记住做法,别记数字。
  3. 「GPT 的成功是算法突破」。 算法(Transformer)是必要条件,但同样重要的还有工程化训练和产品化交互,这两件跟论文无关。
自测三问(点开对答案) 1. 为什么算力越大,越该把预算往数据那边偏? —— 因为损失里参数项和数据项的衰减指数不同(0.34 对 0.28)。参数项衰减快、容易饱和; 数据项衰减慢、后劲足。算力越大,这个差异越明显。 2. 损失差 0.078 为什么算「大」? —— 损失是对数尺度的。 0.078 的差在下游任务上常常意味着几十分的准确率差距,或者相当于多花几十上百倍的算力才能追平。 3. 如果只有 100 万条数据,该怎么定参数量? —— 按缩放规律反推:数据是硬约束,D 定了之后算 N = C/(6D) 或按最优比值估。 更实际的做法是**先把数据的量级摸清楚,再定模型大小**,而不是反过来。

GPT 靠「猜下一个字」能写文章,但它一开始不会做数学题。 下一节讲怎么用强化学习把「会写字」推到「会推理」。

相关笔记