假设你能用 64 张 H100 跑四五天,换算下来大约 $10^{22}$ 次浮点运算。这笔预算可以训一个 30 亿参数的模型、让它看很多数据,也可以训一个 300 亿参数的模型、只看一点数据。哪种 loss 更低?训练算力固定时,参数和数据大致应该同比例放大。按 Chinchilla 的拟合,每个参数约配 20 个 token,$10^{22}$ FLOPs 对应约 90 亿参数、1800 亿 token。这个比例是从小 run 拟合再外推出来的,只在数据、优化配方相近,而且数据大体只看一遍时成立;外推越远,越要把它当成一个区间,而不是一个点。
待审核草稿。 这一篇还没有经过站主审阅,事实、取舍和措辞都可能修改;引用前请回到文中链接的一手资料核对。
先把预算换成 FLOPs
dense Transformer 每处理 1 个训练 token,前向大约做 $2N$ 次浮点运算($N$ 是参数量,每个权重做一次乘加),反向大约是前向的两倍,合计约 $6N$。训练 $D$ 个 token,总量就是
$$ C\approx6ND. $$
这个式子来自 Kaplan 等(2020-01)§2.1。他们的 $N$ 不含 embedding 参数,也略去了随上下文长度增长的 attention 项(他们的模型满足 $d_{\rm model}\gg n_{\rm ctx}/12$,这一项占比小)。Chinchilla(Hoffmann 等,2022-03)把 embedding 也算进参数和 FLOPs,附录 F 逐项数了一遍,和 $6ND$ 的比值在 0.99 到 1.10 之间。两篇对 $N$ 的口径不同,后面会看到这一点很要紧。$6ND$ 在预训练流程里也出现过,那里讲的是它不包含什么。
预算本身来自硬件:
$$ C=n_{\rm GPU}\times P_{\rm peak}\times\mathrm{MFU}\times t. $$
教学假设:64 张 H100 SXM5,BF16 dense 峰值 989.4 TFLOPS,模型浮点利用率(MFU)取 40%(MFU 怎么算、为什么常常只有三四成,见性能:roofline 与 MFU)。每秒有效算力 $64\times989.4\times10^{12}\times0.4\approx2.53\times10^{16}$,$10^{22}$ FLOPs 要 $3.95\times10^{5}$ 秒,约 4.6 天;同样的预算换成 8 张卡要 36.6 天。
$C$ 定下来以后,$N\times D=C/6\approx1.67\times10^{21}$ 是一条双曲线:参数翻倍,能看的 token 就减半。问题变成在这条线上找 loss 最低的点。
Loss 随规模按幂律下降
Kaplan 等在 WebText2 上发现,只要不被另外两个因素卡住,测试 loss 对参数量、数据量和算力分别近似是幂律。比如数据充足、训到接近收敛时:
$$ L(N)=\left(\frac{N_c}{N}\right)^{\alpha_N},\qquad \alpha_N\approx0.076,\quad N_c\approx8.8\times10^{13}. $$
取对数后是一条直线:$\log L=\alpha_N(\log N_c-\log N)$。参数翻倍,loss 乘以 $2^{-0.076}\approx0.949$,约降 5%;参数乘 10,loss 乘以 0.839。论文也说明 $N_c$ 这类常数依赖词表(vocabulary)和 tokenization,没有绝对意义,能跨设置比较的主要是指数。
纯幂律会一直降到 0,可文本有去不掉的不确定性。Chinchilla 的第三种方法用了带常数项的形式:
$$ L(N,D)=E+\frac{A}{N^{\alpha}}+\frac{B}{D^{\beta}}. $$
$E$ 是理想模型也去不掉的 loss,第二项来自模型容量有限,第三项来自数据和优化步数有限。原文拟合值是 $E=1.69$、$A=406.4$、$B=410.7$、$\alpha=0.34$、$\beta=0.28$(附录 D.2)。在 $6ND=C$ 的约束下求最小,有闭式解 $N_{\rm opt}=G\,(C/6)^{a}$,其中 $a=\beta/(\alpha+\beta)$,$G=(\alpha A/\beta B)^{1/(\alpha+\beta)}$(式 4)。所以“参数该随算力涨多快”就是指数 $a$。
用几次小 run 手拟一条线
实际常用 Chinchilla 的第二种方法,叫 IsoFLOP:选几个小预算(Chinchilla 用了 9 个,从 $6\times10^{18}$ 到 $3\times10^{21}$ FLOPs),每个预算下训 5 到 10 个不同大小的模型(数据量由 $C/6N$ 决定,学习率(LR)衰减的长度对准各自的训练长度),画 loss 对 $\log N$ 的曲线,拟合一条抛物线取谷底,得到这个预算下的 $N_{\rm opt}$。然后在 log–log 坐标里对这些谷底拟一条直线。
下面 4 个谷底是编的教学数字,不是任何论文的测量:
| 预算 $C$(FLOPs) | 谷底 $N_{\rm opt}$ | $\log_{10}N_{\rm opt}$ | 对应 $D=C/6N$ | $D/N$ |
|---|---|---|---|---|
| $10^{18}$ | 9000 万 | 7.954 | 18.5 亿 | 20.6 |
| $10^{19}$ | 3 亿 | 8.477 | 55.6 亿 | 18.5 |
| $10^{20}$ | 9 亿 | 8.954 | 185 亿 | 20.6 |
| $10^{21}$ | 29 亿 | 9.462 | 575 亿 | 19.8 |
先手算斜率:取首尾两点,$(9.462-7.954)/(21-18)\approx0.503$。再用全部 4 个点做最小二乘:
import math
points = [(1e18, 9.0e7), (1e19, 3.0e8), (1e20, 9.0e8), (1e21, 2.9e9)] # 教学数字
xs = [math.log10(c) for c, _ in points]
ys = [math.log10(n) for _, n in points]
mean_x, mean_y = sum(xs) / len(xs), sum(ys) / len(ys)
slope = sum((x - mean_x) * (y - mean_y) for x, y in zip(xs, ys)) / sum((x - mean_x) ** 2 for x in xs)
intercept = mean_y - slope * mean_x
n_opt = 10 ** (slope * 22 + intercept) # 外推到 C = 1e22
print(round(slope, 3), round(intercept, 3), f"{n_opt:.2e}", round(1e22 / (6 * n_opt) / n_opt, 1))
# 0.5 -1.041 9.17e+09 19.8
得到 $a\approx0.500$、截距 $-1.041$,4 个残差都在 0.016 以内(教学数字本来就是照着 $a=0.5$ 编的)。外推到 $C=10^{22}$:$\log_{10}N=0.500\times22-1.041=9.96$,$N\approx92$ 亿,$D=C/6N\approx1820$ 亿,每个参数约 20 个 token,和开头的说法一致。
指数差一点,外推差多少
拟合出来的指数带误差。下表固定 $10^{21}$ 那个点(29 亿参数),只换指数,看外推到 10 倍和 1000 倍预算时的差别:
| 指数 $a$ | 来源 | $10^{22}$ 的 $N$ | $10^{24}$ 的 $N$ | $10^{24}$ 的 $D/N$ |
|---|---|---|---|---|
| 0.46 | Chinchilla 方法 3 | 84 亿 | 700 亿 | 34 |
| 0.50 | Chinchilla 方法 1 | 92 亿 | 920 亿 | 20 |
| 0.54 | 假设的偏差 | 101 亿 | 1210 亿 | 11 |
| 0.73 | Kaplan 等 | 156 亿 | 4490 亿 | 0.8 |
外推 10 倍时,0.46 和 0.54 只差 ±10% 左右;外推 1000 倍时,结果在 700 亿和 1210 亿之间,每参数 token 数从 34 变到 11。Kaplan 那一行只是示意:把它的指数接在别人的锚点上并不严谨,但能看出指数差 0.2 意味着什么。
Kaplan 和 Chinchilla 为什么不一样
Kaplan 等(2020)得到 $N_{\rm opt}\propto C^{0.73}$(按 critical batch size 校正后的算力):算力多 10 倍,参数该多 5 倍多,数据只多约 2 倍。Chinchilla(2022)三种方法给出 0.46 到 0.50。按前者,GPT-3 那一代用 1750 亿参数只看 3000 亿 token 说得通;按后者,同样的算力该换成更小、看更多数据的模型。Chinchilla 用 Gopher 的预算($5.76\times10^{23}$ FLOPs)训了 700 亿参数、1.4T token 的模型,在他们的评测里超过了 2800 亿参数的 Gopher,MMLU 67.5%,比 Gopher 高 7 个多点(论文自报)。
分歧从哪来,有三份分析:
| 原因 | 谁指出 | 机制 |
|---|---|---|
| 学习率 schedule 没对准训练长度;模型偏小 | Chinchilla §2、附录 B | Kaplan 所有 run 用同一个固定步数、衰减到 0 的 cosine,中途截取的 loss 偏高,低估了“少看数据”的效果;Chinchilla 发现 cosine 周期比实际训练长 25% 以上,loss 明显变差。Kaplan 的 run 大多明显更小,不少不到 1 亿参数 |
| 只数非 embedding 参数,又在小规模上拟合 | Pearce 和 Song(2024-06,TMLR) | 小模型里 embedding 占比大;按 Kaplan 的条件模拟一遍 Chinchilla 的研究,得到接近 0.73 的偏差指数 |
| 最后一层的计算、warmup 长度、随规模调的优化器 | Porian 等(2024-06,NeurIPS 2024) | 在 OpenWebText2 上先按 Kaplan 的设置复现出 0.864(Kaplan 按未校正算力拟合的是 0.88);把最后一层的 FLOPs 算进去,降到 0.699;warmup 按模型大小缩短,0.603;cosine 对准训练长度,0.574(变化不大);最后按模型大小调 batch size、学习率和 AdamW 的 $\beta_2$,并改用常数学习率,得到 0.518 |
Porian 等还有一个和 Chinchilla 假设不同的发现:最后那一步用的是常数学习率,不做衰减也得到了 Chinchilla 的指数,所以仔细的学习率衰减不是这条定律成立的必要条件。他们也发现 batch 小(128 条序列及以下)时,$\beta_2=0.95$ 表现不好,把 0.99 和 0.999 加进扫描后才改善。
Chinchilla 附录 D.4 在 $10^{21}$ FLOPs 上直接比了一次:按 Kaplan 的公式该训 46.8 亿参数,按方法 1 该训 28.6 亿;他们训了 47.4 亿和 28.0 亿两个模型,后者最终的训练 loss 更低。
“每个参数 20 个 token”从哪来
Chinchilla 表 3 按方法 1 列出算力最优的训练量:4 亿参数配 80 亿 token,10 亿配 202 亿,100 亿配 2051 亿,670 亿配 1.5T。除一下都在 20 上下,这就是“20 tokens/parameter”的出处。Chinchilla 本身 700 亿参数、1.4T token,正好是 20。
这个数带着条件:
- 数据只看一遍左右。 数据是 MassiveText。附录 C 在 C4 和 GitHub 代码上重做 IsoFLOP,指数仍接近 0.5;作者的说法是,只要不超过一个 epoch,结论和数据集无关。
- 口径。 $N$ 含 embedding,token 按他们的 SentencePiece tokenizer 计。换一个 tokenizer,同样的文本 token 数不同,比例也跟着变。
- 配方。 cosine 衰减 10 倍,周期对准训练长度;用的是平滑后的训练 loss。
- 拟合方法。 方法 3(参数化拟合)给出更小的模型,在 Gopher 预算下是 400 亿参数,而不是 670 亿。Besiroglu 等(2024-04)从论文图中重建数据,重拟方法 3,得到 $E=1.82$、$A=482$、$B=2085$、$\alpha=0.348$、$\beta=0.366$,隐含约 20 tokens/parameter,与方法 1、2 一致;他们还指出原文的置信区间窄得不合理,要那么窄大约需要 60 万次实验,而原文大概不到 500 次。
- 数据质量。 DeepSeek LLM(2024-01)在三份数据上拟合,指数 $a$ 分别是 0.450(早期自有数据)、0.524(当前自有数据)和 0.578(OpenWebText2)。他们的解读是数据质量越高,新增算力越该分给模型。
最优点附近有多平
下面把 Besiroglu 等的重拟式 $L=1.82+482/N^{0.348}+2085/D^{0.366}$ 当作教学曲面:它拟合的是从 Chinchilla 论文图里重建的数据,只描述那套数据和配方;表里的数是我们在这条曲面上算出来的,不是任何人的实测。看 $C=10^{22}$ 时偏离最优大小的代价:
| 模型大小 / 最优 | 参数 | $D/N$ | loss 比最优高 | 达到最优 loss 需要的算力 |
|---|---|---|---|---|
| 0.25 | 23 亿 | 326 | 0.040 | 4.5 倍 |
| 0.5 | 45 亿 | 82 | 0.010 | 1.26 倍 |
| 1 | 90 亿 | 20 | 0 | 1 倍 |
| 2 | 181 亿 | 5 | 0.010 | 1.15 倍 |
| 4 | 362 亿 | 1.3 | 0.041 | 1.59 倍 |
在最优大小的一半到两倍之间,loss 只差约 0.01,多花 15% 到 26% 的算力就能追平。Kaplan 等(图 12)给过类似的结论:0.6 到 2.2 倍最优大小的模型,多花约 20% 算力即可。Llama 3 报告(2024-07)也观察到,预算越大,IsoFLOP 曲线在谷底附近越平,所以旗舰模型的表现对参数和数据怎么分不太敏感。“20”应当读成一个区间的中心。
小模型拟合能信多少
拟合在拟合范围附近内插是可靠的;越往外推,下面几件事越要紧:
- 曲线会弯。 Chinchilla 附录 E 发现算力–loss 前沿有轻微的弯曲,分别用前、中、后三分之一的点拟合,外推结果不同;作者认为更大预算下的最优模型可能比直线外推的还小。
- 定律总会失效。 Kaplan 等 §6.3 自己算出一个矛盾点:按 $L(C_{\min})$ 外推,在约 $10^{4}$ PF-days、$10^{12}$ 参数附近会低于数据增长所允许的 loss;他们也说明这个位置对指数非常敏感,可能差一个数量级。
- 噪声会传到指数上。 每个谷底来自一条抛物线,每条抛物线来自几个 run。Kaplan 等估计换随机种子,loss 大约差 0.02。
- loss 不等于能力。 能平滑外推的是 loss。下游准确率可能看起来突然跳升,而这种“涌现”有一部分来自指标本身是阶跃的(Schaeffer 等,2023-04)。
公开的成功记录都是实验室自报。GPT-4 技术报告(2023-03)说,用最多只有 GPT-4 万分之一算力的模型拟合 $L(C)=aC^b+c$,在训练刚开始时就准确预测了最终 loss;用最多千分之一算力的模型预测了 HumanEval 一个子集的通过率;同一节也承认有些能力仍难预测。DeepSeek LLM 说小实验准确预测了 1000 倍算力的 7B 和 67B 的 bits-per-byte。Llama 3 用两步法(算力到正确答案的负对数似然,再到准确率)跨四个数量级外推 ARC Challenge,结果略微低估了 405B 的最终表现。
| 想做的事 | 怎么做 | 观察什么 | 不能据此得出 |
|---|---|---|---|
| 定 $N$ 和 $D$ | 3–5 个预算的 IsoFLOP,每个预算 5–10 个大小,schedule 对准训练长度 | 谷底是否清楚、log–log 是否直、残差多大 | 外推 1000 倍后的点就是最优 |
| 估外推误差 | 对谷底做 bootstrap,或去掉最小、最大预算重拟 | 指数和预测值的区间 | 区间窄就说明定律对 |
| 预测大 run 的 loss | 拟合 $L(C)=E+A\,C^{-\gamma}$,开训后对照前几个 checkpoint | 实际曲线是否落在区间内 | loss 对上了,下游分数也会对上 |
| 换数据或 tokenizer | 在新配方上至少重做一组 IsoFLOP | 指数和常数变了多少 | 沿用论文里的 20 |
接着读:为什么现在的模型都训练得比 Chinchilla 久,看把推理成本和数据上限算进来以后,最优点往哪里移。
本页术语 1
- 词表 vocabulary
- 模型能输出的所有 token 的集合