第 9 讲:规模定律 I —— 用小实验预测大模型

Language Modeling from Scratch · Lecture 09。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS336 Spring 2026 Lecture 9(Scaling laws - basics,Tatsunori Hashimoto 的幻灯片)。Spring 2025 的第 9 讲内容相近,有公开录像。 配套代码:code/lecture09/ 预计阅读时间:3–4 小时 硬件说明:普通电脑即可。配套代码包含两个真实的小型训练实验(02、06 号文件,各约半分钟到一分钟)。


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说出规模定律要解决的问题:为什么不能在大模型上直接调参,为什么要”在小模型上实验、再外推”。
  2. 在双对数坐标下识别和拟合幂律,说明不可约损失 EE 对拟合的影响。
  3. 用均值估计、非参数回归、长尾分布三个例子,解释”为什么会出现幂律”,以及为什么神经网络的指数远小于 1。
  4. 说出数据规模定律的几个应用:数据量、数据组成、重复数据(约 4 轮以内几乎和新数据一样好)。
  5. 说出用规模定律做”模型工程”的思路(架构、优化器、深宽比、批次大小),解释临界批量大小及其随损失的变化。
  6. 写出 Chinchilla 的损失公式 L=E+A/Nα+B/DβL = E + A/N^\alpha + B/D^\beta,推导计算最优的 NoptN_{\text{opt}}、DoptD_{\text{opt}},说出”约 20 token / 参数”的来历。
  7. 描述 Chinchilla 的三种方法(下包络、IsoFLOP、参数化拟合),以及 Kaplan 与 Chinchilla 结论不同的原因。
  8. 亲手完成一次”训练一组小模型 → 拟合 → 外推预测 → 验证”的 IsoFLOP 实验,并诚实地分析误差。
  9. 解释为什么今天的模型普遍”过度训练”(考虑推理成本后的最优)。

0.2 先修知识

知识点用在哪里最低要求
第 2 讲全文训练计算量 C≈6NDC \approx 6ND;交叉熵损失;学习率调度
第 7、8 讲第 5.4 节批次大小与并行的关系
对数全文log⁡(ab)=log⁡a+log⁡b\log(ab) = \log a + \log b,log⁡(xk)=klog⁡x\log(x^k) = k\log x
最小二乘拟合第 3、7 节知道”用直线拟合一组点”是什么意思

0.3 本讲地图

第1节 动机:给你一万块 GPU,训练多大的模型?
第2节 规模定律简史
第3节 幂律:是什么、为什么会出现
第4节 数据规模定律:数据量、数据组成、重复数据
第5节 用规模定律做模型工程:架构、优化器、深宽比、批次大小
第6节 数据 vs 模型:联合规模定律
第7节 Chinchilla:计算最优的模型大小(三种方法;与 Kaplan 的分歧)
第8节 实战:一个真实的小型 IsoFLOP 实验
第9节 训练最优 ≠ 实际最优:把推理算进去

1. 动机:给你一万块 GPU,训练多大的模型?

CS336 课件用这样一个场景开场:

朋友给了你一万块 B200、用一个月,请你训练一个最好的开源语言模型。你怎么做?

  • 组建基础设施团队,搭好分布式训练框架(作业 2,第 5–8 讲)✓
  • 准备好一份优秀的预训练数据集(作业 4,第 13–14 讲)✓
  • 训练一个大模型——**但是哪一个?**多宽、多深?多少个头?用哪种激活函数?学习率、批次大小多少?训练多少个 token?

可以”照抄”已有模型(cargo cult),但它们最初又是怎么定下来的?

旧的做法(代价高昂):直接在大模型上调超参数。一次训练就要几百万美元,根本没法试错。

新的做法(也许有点过于乐观):在小模型上调,再外推到大模型。这需要一种”简单、可预测的规律”,告诉我们模型的表现如何随规模变化——这就是规模定律(scaling laws)。

规模定律的神奇之处在于:损失随数据量、参数量、计算量的变化,往往可以用一条幂律非常准确地描述,而且能外推好几个数量级。


2. 规模定律简史

理论界早就在思考”规模”。统计学习理论给出过各种泛化误差的上界,例如在 kk 个假设中学习的误差 ∼log⁡k/n\sim \sqrt{\log k / n},光滑密度估计的误差 ∼n−β/(2β+1)\sim n^{-\beta/(2\beta+1)}……但这些都是上界,不是实际观察到的损失值。

最早的数据规模定律论文(1993):Cortes, Vapnik 等人在 NeurIPS 上研究了学习曲线的渐近值和收敛速度,用小数据上的学习曲线预测大数据上的表现——和今天的思路一模一样。

对数线性的数据规模(Banko & Brill 2001):在一个自然语言消歧任务上,数据量从百万词增加到十亿词,准确率随 log⁡(数据量)\log(\text{数据量}) 线性增长,而且”更多数据”比”更好的算法”重要。

幂律的函数形式(Kolachina et al. 2012):机器翻译的数据量与下游表现之间呈幂律关系。

第一个大规模神经网络的规模研究(Hestness et al. 2017,百度):在机器翻译、语言模型、语音识别、图像分类上,都观察到了可预测的幂律,并提出学习曲线的三段式形状(小数据区 → 幂律区 → 不可约误差区)。CS336 课件评价它”远远超前于时代”:它已经讨论了”涌现”、按计算量扩展、“速度就是准确率”等后来的热门话题。

Kaplan et al. 2020(OpenAI):系统地研究了 Transformer 语言模型的损失随参数量 NN、数据量 DD、计算量 CC 的幂律,以及架构、形状、批次大小的影响。它直接影响了 GPT-3 的设计。

Rosenfeld et al. 2020、Hoffmann et al. 2022(Chinchilla,DeepMind):提出数据和模型的联合规模定律,Chinchilla 修正了 Kaplan 关于”模型与数据怎么配比”的结论(第 7 节)。


3. 幂律:是什么、为什么会出现

3.1 幂律与双对数坐标

幂律:

y=A x−α⟺log⁡y=log⁡A−αlog⁡xy = A\,x^{-\alpha}\qquad\Longleftrightarrow\qquad \log y = \log A - \alpha \log x

在”双对数坐标”(横轴 log⁡x\log x、纵轴 log⁡y\log y)下,幂律就是一条直线,斜率是 −α-\alpha。01_power_laws.py 演示 1:y=5x−0.3y = 5x^{-0.3},xx 每乘 10,log⁡10y\log_{10} y 就减少 0.3。

直观含义:数据量每翻 10 倍,误差就乘以一个固定的比例(这里是 10−0.3≈0.510^{-0.3} \approx 0.5)。没有”拐点”,也没有”学完了”的那一刻,只是越降越慢。

CS336 课件(Kaplan 的图)展示了语言模型的测试损失与数据量在双对数坐标下惊人地呈直线——这种关系被称为”无标度”(scale-free)或”幂律”。它不只对数据量成立,对参数量、计算量也成立,甚至在一些非标准的设置下也成立。

3.2 最简单的规模定律:均值估计

**为什么会是幂律?**CS336 课件的回答是:**估计误差天然地以多项式速度下降。**看一个最简单的例子:

输入 x1,…,xn∼N(μ,σ2)x_1, \dots, x_n \sim N(\mu, \sigma^2),用平均值 μ^=1n∑ixi\hat\mu = \frac{1}{n}\sum_i x_i 估计 μ\mu。误差是多少?

标准的结论:E[(μ^−μ)2]=σ2/n\mathbb{E}[(\hat\mu - \mu)^2] = \sigma^2/n。取对数:

log⁡(误差)=−log⁡n+2log⁡σ\log(\text{误差}) = -\log n + 2\log\sigma

这就是一个”规模定律”,斜率 −1-1。演示 2 实测拟合出的指数是 0.999。更一般地,任何 1/nα1/n^\alpha 的多项式速率都是一个规模定律。

3.3 一个谜:神经网络的指数为什么这么小?

用类似的论证可以证明:大多数”经典”模型(参数个数固定的回归等)的误差都以 1/n1/n 的速度下降,在双对数坐标下斜率是 −1-1。

可是 Hestness 等人发现,神经网络的斜率远没有这么陡:机器翻译、语音、语言模型的指数大约在 0.1 到 0.3 之间(Kaplan 的数据指数是 0.095)。为什么?

**一种解释:灵活的非参数学习,指数与维度有关。**CS336 课件的例子:在二维单位正方形里均匀采样 nn 个点,yi=f(xi)+y_i = f(x_i) + 噪声,要估计 ff。把空间切成边长 n−1/4n^{-1/4} 的小格子,每个格子里取平均。大约有 n\sqrt{n} 个格子,每个格子有 n\sqrt{n} 个样本,误差 ≈1/n\approx 1/\sqrt{n}。

推广到 dd 维:格子边长为 hh 时,偏差2∼h2^2 \sim h^2,方差 ∼1/(nhd)\sim 1/(n h^d),两者平衡时 h∼n−1/(d+2)h \sim n^{-1/(d+2)},误差 ∼n−2/(d+2)\sim n^{-2/(d+2)}。维度越高,斜率越平。(CS336 课件写成 n−1/dn^{-1/d},结论相同:斜率随维度变平。)

演示 3 的实测:

维度 dd拟合的指数理论 2/(d+2)2/(d+2)
10.6710.667
20.5020.500
40.3350.333

神经网络也能拟合几乎任意的函数。于是有人(Bahri et al. 2021)提出:规模定律的指数与数据的”内在维度”有关——图像、语言表面上维度很高,但真正变化的方向要少得多。CS336 课件的评价:这个理论很有启发性,但并不严密,因为内在维度本身很难准确估计。

3.4 另一种解释:长尾

语言有一个显著的特点:长尾。少数词、少数事实、少数语法现象非常常见,而绝大多数都很罕见——频率大致服从 Zipf 分布 pi∝i−ap_i \propto i^{-a}。

设想模型只能学会”见过足够多次”的东西。看过 nn 个样本后,“一次都没见过”的知识点的总概率(缺失质量)是多少?出现概率大于 1/n1/n 的知识点大多已经见过,这样的知识点约有 n1/an^{1/a} 个;剩下的缺失质量 ≈∑i>n1/ai−a∝n−(1−1/a)\approx \sum_{i > n^{1/a}} i^{-a} \propto n^{-(1-1/a)}。又是幂律,指数由尾巴的”胖瘦”决定。

演示 4 的实测:

Zipf 指数 aa拟合的指数理论 1−1/a1 - 1/a
1.50.3390.333
2.00.5000.500
3.00.6140.667

aa = 3 时略偏离理论值:尾巴很瘦时,nn 要非常大才进入渐近区域。这提醒我们,幂律通常只在一定范围内成立。

直觉:数据越多,见过的”稀有知识”越多;但知识的尾巴很长,永远有更稀有的东西没见过。于是误差一直在降,却越降越慢——这正是幂律的样子。(Hutter 2021、Michaud et al. 2023 的”量子化模型”就是沿着这个思路解释神经网络的规模定律。)

3.5 不可约损失

语言本身有不确定性:同一个上下文后面可以接很多种合理的词。所以损失有一个降不下去的下限 EE(不可约损失,大致是语言本身的熵)。真实的损失曲线是:

L(n)=E+A n−αL(n) = E + A\,n^{-\alpha}

只有”可约部分” L−EL - E 才是幂律。演示 5:真实曲线 L=1.7+10n−0.3L = 1.7 + 10n^{-0.3},直接在双对数坐标下拟合 LL,得到的指数是 0.044(错得离谱);先减去 EE 再拟合,得到 0.300(正确)。相邻两点之间的局部斜率越来越平,最后趋于 0。这就是 Hestness 所说的”不可约误差区”。

实际拟合时,要么事先知道 EE,要么把 EE 作为一个参数一起拟合(第 7 节的方法 3)。后者很容易出问题,本讲会反复看到。


4. 数据规模定律

4.1 数据量

数据规模定律:一个把数据集大小 nn 映射到误差的简单公式。CS336 课件总结:误差与数据量在双对数坐标下呈显著的线性关系,而且跨领域、跨模型都成立。理论上可以用”类似泛化界”的方式理解(第 3 节的均值估计);在应用上,它指导数据的收集和整理。

02_data_scaling.py 在玩具任务上做了一个真实的实验。

玩具任务(toy_task.py):输入是 32 维随机向量(相当于”上下文”),一个固定的”老师”函数给出 64 个 token 上的概率分布,训练数据的”下一个 token”从这个分布中随机采样。老师由 512 个特征组成,第 kk 个特征的重要性是 1/k1/k(长尾)。学生是一个两层 MLP,用交叉熵训练。测试损失 = 老师分布的熵(不可约损失 EE = 1.718)+ 学生还没学到的部分。数据可以无限生成。

两种模型大小下,可约损失随训练数据量的变化:

数据量宽度 8(840 个参数)宽度 256(24,896 个参数)
1 万2.2830.864
4 万1.4240.243
16 万0.4370.086
64 万0.1950.043
256 万0.1440.024
  • 两条曲线开头都下降得很快(数据少时训练步数也少,模型还没训练充分);
  • 宽度 8 的小模型:局部斜率从 0.85 一路降到 0.22,损失越来越接近被模型容量”卡住”的地板;
  • 宽度 256 的大模型:最后的局部斜率仍有 0.42。

结论:损失同时受数据量和参数量的限制。只看一个变量时,另一个变量带来的”地板”会让曲线变平。这引出了第 6 节的联合规模定律。

4.2 数据组成:影响截距,不影响斜率

相关的问题:数据的组成(来自哪些领域、各占多少)怎样影响表现?Hashimoto 2021 的发现(CS336 课件):数据组成主要影响截距(偏移),不影响斜率。在双对数坐标下,用不同数据训练、在同一个目标上测试,得到的是一组平行的直线。

这类”分布偏移”的规模定律说明了收集多样化数据的重要性。但 CS336 课件也提醒,用规模定律选择数据配比在实践中很难:一个自然的想法是为每种配比建立数据规模定律,但在实证评估中,简单地”选小规模上最好的数据集”往往就够了。

4.3 重复数据

现实中高质量的数据是有限的。把同一批数据重复训练多轮(epoch),价值会打多少折扣?

Muennighoff et al. 2023(“Scaling Data-Constrained Language Models”)提出”有效数据量”:

D′=UD+UD RD∗(1−e−RD/RD∗)D' = U_D + U_D\,R_D^*\left(1 - e^{-R_D/R_D^*}\right)

其中 UDU_D 是唯一数据量,RDR_D 是重复的次数(轮数 − 1),RD∗≈15.4R_D^* \approx 15.4 是拟合出的常数。含义:第 1 轮是全新数据;之后每多重复一轮,价值按指数衰减;无限重复的总价值上限约为 16 倍唯一数据。他们发现:重复约 4 轮以内,几乎和全新数据一样好。

02_data_scaling.py 演示 2 在玩具任务上验证:4 万条唯一数据重复多轮,与同样多的全新数据对比(宽度 256):

轮数全新数据重复数据等效全新数据量 / UMuennighoff 公式
10.2430.2451.01.0
20.1350.1441.92.0
40.0860.1053.03.7
80.0580.1013.16.6
160.0430.1451.910.6
320.0340.265< 114.3

趋势相同:重复 2 轮几乎和新数据一样好,之后收益越来越小。但我们的玩具衰减得更快,而且重复太多轮后损失反而上升(过拟合:这个学生相对于 4 万条数据来说很大,又没有正则化)。具体在第几轮开始不划算,取决于模型、数据和正则化,不能照搬。

CS336 课件还提醒两点:

  1. 规模定律如果被盲目套用,可能会”失效”——例如在数据无限重复的情况下;
  2. 规模定律描述的是某种做法的表现,并不是上限——换一种做法,也许能做得更好。

数据选择应该随规模调整(Goyal et al. 2024):既然重复数据的价值会衰减,最优的数据过滤策略就依赖于计算量——算力小时,只用最高质量的一小部分数据;算力大时,高质量数据会被重复太多次,不如放宽过滤标准,纳入更多”次优质”的新数据。


5. 用规模定律做模型工程

规模定律不只能回答”多少数据”。CS336 课件的核心动机是:怎样高效地设计巨大的语言模型?

  • LSTM 还是 Transformer?Adam 还是 SGD?
  • 把模型训练得更久,还是把模型做得更大?
  • 多收集数据,还是多买 GPU?

规模定律提供了一个简单的流程来回答这些问题。下面以 Kaplan 的论文为主线。

5.1 架构:Transformer vs LSTM

暴力的做法:花几千万美元训练一个”LSTM 版的 GPT-3”。规模定律的做法:在一系列较小的规模上分别训练 Transformer 和 LSTM,画出损失随参数量的两条直线,看它们的关系。Kaplan 发现 Transformer 的直线整体在 LSTM 下方,而且在长上下文的后部位置优势更明显——LSTM 的差距是一个”常数倍”的效率差,不会随着规模消失。

Tay et al. 2022 用同样的方法比较了许多架构(各种注意力变体、MLP-Mixer、卷积……),发现很多在小规模上看起来不错的架构,扩展后不如标准 Transformer。

5.2 优化器:Adam vs SGD

Hestness et al. 2017 比较了 Adam 与 SGD 的规模曲线(在循环网络上):两条直线基本平行,Adam 的偏移更低。这样的比较在小规模上就能做,结论可以外推。

5.3 深度与宽度

Kaplan 的发现(CS336 课件):

  • 1 层和 2 层之间差别巨大;但层数再多,在参数量一定时收益递减(参数少于约 10710^7 时);
  • 深宽比(宽度 / 层数)在很大范围内变化,损失只差几个百分点——形状不太重要,总参数量才重要;
  • 但不是所有参数都一样:嵌入层的参数和其他参数的行为不同。Kaplan 因此只统计”非嵌入参数”,才得到了干净的幂律。(这个选择后来被证明是 Kaplan 与 Chinchilla 结论不同的重要原因,第 7.4 节。)
  • 类似地,MoE 模型的”参数”价值也不同:激活的参数和总参数要分开看。

5.4 批次大小:临界批量

批次大小在超过某一点后收益迅速递减。临界批量大小(critical batch size)大致是”再增大就开始浪费”的那个点。更精确的定义(McCandlish et al. 2018,CS336 课件):

固定一个目标损失,扫描不同的批次大小 BB,记录达到目标所需的步数 SS 和样本数 E=B⋅SE = B \cdot S。它们近似满足:

(SSmin⁡−1)(EEmin⁡−1)=1⟺S(B)=Smin⁡(1+BcritB),Bcrit=Emin⁡Smin⁡\left(\frac{S}{S_{\min}} - 1\right)\left(\frac{E}{E_{\min}} - 1\right) = 1 \qquad\Longleftrightarrow\qquad S(B) = S_{\min}\left(1 + \frac{B_{\text{crit}}}{B}\right),\quad B_{\text{crit}} = \frac{E_{\min}}{S_{\min}}
  • B≪BcritB \ll B_{\text{crit}}:批次翻倍、步数减半,样本总数(计算量)几乎不变——“免费”的加速;
  • B≫BcritB \gg B_{\text{crit}}:步数几乎不再减少,样本数却线性增加——浪费计算;
  • B=BcritB = B_{\text{crit}}:步数是最少步数的 2 倍、样本数是最少样本数的 2 倍,两边平衡。

McCandlish et al. 认为 BcritB_{\text{crit}} 接近梯度噪声尺度 Bnoise=tr(HΣ)/(G⊤HG)B_{\text{noise}} = \mathrm{tr}(H\Sigma) / (G^\top H G):梯度噪声的方差与梯度信号之比。批次小于它时,噪声主导,加大批次很有用;大于它时,信号已经足够准了。

03_critical_batch_size.py 在一个带噪声的线性回归上用 SGD 实测(每个批次大小都选各自最好的学习率):

目标(初始超额损失的)Smin⁡S_{\min}BcritB_{\text{crit}}达标点的 BnoiseB_{\text{noise}}
5%24.9 步2223
1%51.5 步40456
0.3%63.2 步119362

实测步数与 Smin⁡(1+Bcrit/B)S_{\min}(1 + B_{\text{crit}}/B) 的拟合曲线大体吻合。两个结论:

  1. 目标损失越低,临界批量越大(22 → 40 → 119)。训练后期,梯度信号越来越弱,噪声相对越来越强,需要更大的批次来平均。CS336 课件:“损失目标越小,批次越大。“Kaplan 在语言模型上发现 BcritB_{\text{crit}} 随损失降低按幂律增长(Bcrit≈B∗/L1/αBB_{\text{crit}} \approx B_*/L^{1/\alpha_B},B∗≈2×108B_* \approx 2\times10^8 个 token,αB≈0.21\alpha_B \approx 0.21)。这就是大模型训练常常逐步加大批次的原因(例如 Llama 3 从 400 万 token 逐步加到 1600 万 token)。
  2. 梯度噪声尺度在 5% 的目标下与 BcritB_{\text{crit}} 几乎相等;目标更低时,趋势相同但数值大好几倍。它只是在”达标的那一个点”上测的,而 BcritB_{\text{crit}} 反映的是整段训练。它是一个有用的估计,不是精确的答案。

这与第 7、8 讲直接相关:数据并行、流水线并行都希望批次大,但全局批次超过临界批量之后就是浪费。

5.5 学习率:随规模变化

如果只是简单地把模型变大,最优学习率会随规模变化(通常越大的模型,最优学习率越小)。于是在小模型上调好的学习率不能直接用在大模型上。解决办法是”感知规模”的初始化和学习率缩放,例如 μP(最大更新参数化,Yang et al. 2022)。这是第 11 讲的主题。

5.6 注意:下游任务不一定可预测

到目前为止,规模定律描述的都是损失(困惑度),它非常平滑、可预测。但 CS336 课件提醒:下游任务的表现往往没有这么可预测——有的任务随规模平稳提升,有的长时间停在随机水平、然后突然跃升(“涌现”),有的甚至随规模变差。用损失的规模定律预测具体的下游能力要格外小心(第 12 讲”评估”)。

5.7 基于规模定律的设计流程

CS336 课件的总结:超参数(优化器、深度、架构)对大模型的影响,可以在训练之前就预测出来:

  1. 训练几个较小的模型;
  2. 建立规模定律(例如 Adam 与 SGD 各一条);
  3. 根据规模定律的预测,选择最优的超参数。

6. 数据 vs 模型:联合规模定律

一个重要的问题:**应该要更多的数据,还是更大的模型?**显然,在小模型上用大量数据是浪费的(第 4.1 节的宽度 8 模型)。联合规模定律同时描述两者:

  • Rosenfeld et al. 2020:误差=n−α+m−β+C\text{误差} = n^{-\alpha} + m^{-\beta} + C(nn:数据量,mm:模型大小);
  • Kaplan et al. 2020:误差=[m−α+n−1]β\text{误差} = \left[m^{-\alpha} + n^{-1}\right]^{\beta}(写法略有不同)。

它们对”模型 - 数据”联合误差的拟合出奇地好。Rosenfeld 在小数据、小模型上拟合出指数,就能预测其余配置的误差。有了这样的公式,就可以结合成本来优化:给定预算,数据和模型各花多少?


7. Chinchilla:计算最优的模型大小

7.1 问题

训练计算量 C≈6NDC \approx 6ND。给定 CC,NN 和 DD 此消彼长:模型大一倍,只能少训练一半的 token。问题:NN 取多大,最终损失最低?

Kaplan 的答案:Nopt∝C0.73N_{\text{opt}} \propto C^{0.73},Dopt∝C0.27D_{\text{opt}} \propto C^{0.27}。算力增加时,主要把模型做大,数据只增加一点——每参数的 token 数随算力增加而减少。GPT-3(1750 亿参数、3000 亿 token,每参数约 2 个 token)就是按这个思路设计的。

Chinchilla(Hoffmann et al. 2022)认为 Kaplan 的拟合差得很远,并给出了新的答案:Nopt∝C0.5N_{\text{opt}} \propto C^{0.5},Dopt∝C0.5D_{\text{opt}} \propto C^{0.5}——模型和数据应该同比例增长。

7.2 损失公式与最优配比

Chinchilla 的参数化形式:

L(N,D)=E+ANα+BDβL(N, D) = E + \frac{A}{N^\alpha} + \frac{B}{D^\beta}

三项分别是:不可约损失、模型太小带来的损失、数据太少带来的损失。在约束 6ND=C6ND = C 下最小化(代入 D=C/6ND = C/6N 求导,或用拉格朗日乘子):

Nopt=G(C6)a,Dopt=G−1(C6)b,a=βα+β,  b=αα+β,  G=(αAβB)1α+βN_{\text{opt}} = G\left(\frac{C}{6}\right)^{a},\quad D_{\text{opt}} = G^{-1}\left(\frac{C}{6}\right)^{b},\quad a = \frac{\beta}{\alpha+\beta},\; b = \frac{\alpha}{\alpha+\beta},\; G = \left(\frac{\alpha A}{\beta B}\right)^{\frac{1}{\alpha+\beta}}

当 α≈β\alpha \approx \beta 时,a≈b≈0.5a \approx b \approx 0.5。Besiroglu et al. 2024 重新拟合的参数是 EE = 1.8172,AA = 482.01,BB = 2085.43,α\alpha = 0.3478,β\beta = 0.3658,对应 aa = 0.513。代入 Chinchilla 的预算 C=5.76×1023C = 5.76\times10^{23}(与 2800 亿参数的 Gopher 相同),最优约为 720 亿参数、每参数约 18 个 token——这就是”Chinchilla 70B 用 1.4 万亿 token 训练,每参数约 20 个 token”的由来。同样的计算量,Chinchilla 70B 比 Gopher 280B 好得多。

7.3 三种方法

Chinchilla 用三种方法拟合,结论(除方法 3 外)基本一致。04_chinchilla_three_methods.py 在一个”已知答案”的合成世界里演示了它们:真实损失取上面的 Besiroglu 参数,每次”实验”的结果加上 0.5% 的噪声。

方法 1:训练曲线的下包络。训练一批不同大小的模型,把每个模型的整条训练曲线画在”计算量 - 损失”图上。对每个计算量,取所有曲线中最低的点,它对应的模型大小就是这个计算量下的最优。这些最低点形成一个幂律。(注意:曲线上的每个点,都应该是”学习率调度与训练长度匹配”的结果。)

方法 2:IsoFLOP。选几个固定的计算预算(Chinchilla 用了 6e18 到 3e21 的 9 个),对每个预算训练不同大小的模型(DD 随之变化)。”log⁡N\log N - 损失”的曲线是一个山谷,用抛物线拟合找到谷底。谷底连起来形成一个幂律。CS336 课件:“这类方法很容易执行,结果通常也很干净。“扩散模型(Gulrajani et al. 2023)、MoE(Abnar et al. 2025)等后续研究都用了 IsoFLOP。

方法 3:参数化拟合。在”模型大小 × 数据量”的网格上训练一批模型,直接用最小二乘(Chinchilla 用的是对数空间里的 Huber 损失 + L-BFGS)拟合 L(N,D)L(N,D) 的五个参数,再用 7.2 节的公式求最优。

合成世界里的结果(真实答案 Nopt∝C0.513N_{\text{opt}} \propto C^{0.513}):

方法拟合的指数 aa
1:下包络0.482
2:IsoFLOP(81 次实验)0.510
3:参数化拟合0.512(EE=1.825,α\alpha=0.349,β\beta=0.366)

用 102110^{21} 以下的实验外推到 102610^{26},预测的最优模型大小与真实值相差约 5%。在”世界真的服从这个公式、噪声又不大”的理想情况下,三种方法都很好用。

7.4 为什么 Kaplan 和 Chinchilla 差这么多?

两篇论文都拟合了联合规模定律,为什么结论差这么多?CS336 课件列出了后来研究找到的解释:

解释 1(Porian et al. 2024 等):

  • Kaplan 计算量时没有算最后一层(输出层)的开销;
  • 在很小的计算预算下,预热(warmup)太长了;
  • Kaplan 对不同训练长度用同一个余弦调度周期,短训练的模型没有把学习率降下来,损失偏高(学习率衰减本身也许不关键,只要批次和学习率调得合适)。

解释 2(Pearce & Song 2024):“非嵌入参数 vs 总参数”的选择,加上小规模下的一点非线性。

05_kaplan_vs_chinchilla.py 复现了解释 2:在一个”本来是 Chinchilla 式”的世界里(损失按总参数计算),对 GPT-2 式的模型家族(词表 50257,层数 = 宽度 / 64),分别用两种方式计数,拟合 Nopt∝CaN_{\text{opt}} \propto C^a:

计算预算范围Kaplan 式计数(非嵌入参数)Chinchilla 式计数(总参数)最优模型中嵌入参数的占比
101510^{15} ~ 101810^{18}0.930.4999% → 40%
101810^{18} ~ 102110^{21}0.600.5140% → 4%
101510^{15} ~ 102110^{21}0.800.5099% → 4%
102210^{22} ~ 102510^{25}0.520.512% → 0%

在 Kaplan 做实验的计算量范围里,只数非嵌入参数,同一组最优模型就被拟合出了接近 0.73 的指数。原因是:小模型里嵌入层占了总参数的大部分;模型变大时嵌入的占比迅速下降,“非嵌入参数”比”总参数”增长得快得多。到了大规模,两种计数方式几乎没有区别。

启示:规模定律的结论对”怎么数参数、怎么数计算量、怎么设学习率”这些看似无关紧要的细节非常敏感。

7.5 一个插曲:Chinchilla 方法 3 的错误

Chinchilla 原论文中,方法 1、2 给出的指数约 0.50,方法 3 给出 0.46。而且原文方法 3 的参数(EE=1.69,AA=406.4,BB=410.7,α\alpha=0.34,β\beta=0.28)算出的最优配比,在 5.76×10235.76\times10^{23} 的预算下是 320 亿参数、每参数约 93 个 token,与”约 20”明显不一致(04_chinchilla_three_methods.py 的最后一部分)。

Besiroglu et al. 2024 做了一次”数据考古”:从论文的图中复原出原始数据点,重新拟合,发现原文的拟合很可能有问题。重新拟合的结果(本讲一直在用的参数)与方法 1、2 一致。

启示:参数化拟合很灵活,但也最容易出错。要检查拟合是否收敛、参数的置信区间有多宽,并用其他方法交叉验证。第 8 节的真实实验会再次看到这一点。


8. 实战:一个真实的小型 IsoFLOP 实验

06_isoflop_experiment.py 在玩具任务上完整地走一遍规模定律的工作流程。这也是 CS336 作业 3 的核心流程。

8.1 第 1 步:训练 IsoFLOP 曲线

3 个计算预算(3×1093\times10^9、101010^{10}、3×10103\times10^{10} 次浮点运算),每个预算训练 6 个不同宽度的学生(D=C/6ND = C/6N)。可约损失(测试损失 − EE):

预算各模型(参数量 : 可约损失)抛物线谷底
3×1093\times10^9452 : 0.330 · 840 : 0.200 · 1616 : 0.179 · 3168 : 0.179 · 6272 : 0.257 · 12480 : 0.350NoptN_{\text{opt}} ≈ 1786,0.174
101010^{10}840 : 0.150 · 1616 : 0.089 · 3168 : 0.075 · 6272 : 0.088 · 12480 : 0.112 · 24896 : 0.156NoptN_{\text{opt}} ≈ 3884,0.074
3×10103\times10^{10}1616 : 0.064 · 3168 : 0.047 · 6272 : 0.048 · 12480 : 0.058 · 24896 : 0.075 · 49728 : 0.101NoptN_{\text{opt}} ≈ 4935,0.046

每一行都是一个山谷:模型太小,学不会;模型太大,数据不够。预算越大,谷底越往右移(最优模型越大),也越低。这就是规模定律的全部直觉。

8.2 第 2 步:拟合

  • 方法 2:Nopt∝C0.44N_{\text{opt}} \propto C^{0.44}(与 Chinchilla 的约 0.5 接近);最优可约损失 ∝C−0.58\propto C^{-0.58}。
  • 方法 3(把 EE 固定为已知的真实值 1.718):α\alpha = 1.109,β\beta = 0.841。
  • 方法 3(EE 也一起拟合):EE = 1.579——比真实的不可约损失还低!

注意:玩具任务的”每参数多少个样本”(这里是一两百个)与语言模型的 20 完全不同。具体的常数取决于任务,只有”怎么做”是通用的。

8.3 第 3 步:预测,然后验证

预测计算量大 3.3 倍(101110^{11})时的情况,然后真的训练三个模型来验证:

宽度参数量实测可约损失方法 3(EE 固定)预测方法 3(EE 拟合)预测
323,1680.03570.04120.0009
646,2720.03100.0267−0.0220
12812,4800.03560.0257−0.0266
  • 方法 2 预测最优规模约 9,182,实测谷底约 6,314(相差 45%);预测的最优可约损失 0.0215,实测 0.0310,过于乐观。原因之一:最小的预算下训练步数太少,损失处在”掉得比规律快”的阶段,混进拟合后让幂律的斜率偏陡。这正是第 7.4 节说的小规模实验的难点。
  • 方法 3(EE 固定):三个验证点的相对误差是 +16%、−14%、−28%。量级对了,但谷底的位置偏右。
  • 方法 3(EE 拟合):外推出负的可约损失,完全不能用。真实世界里 EE 是未知的——这就是方法 3”最灵活也最脆弱”的原因。
  • **好消息:谷底很平。**按方法 2 预测的规模(9,182)训练,可约损失约 0.0323,只比实测最优(0.0310)高 4%。所以即使外推不完美,规模定律也足以帮我们”大致选对”模型大小——这是它最实际的用途。

**【边界】**所有模型用同一个学习率和批次大小(没有逐个调参),每个配置只训练一次(没有平均多个随机种子)。真实的规模定律研究会对这些做更仔细的处理,第 11 讲会讲超参数怎么随规模变化。


9. 训练最优 ≠ 实际最优:把推理算进去

Chinchilla 回答的是”训练计算量固定时,怎样得到最好的模型”。但 CS336 课件指出:**实际部署中,大部分计算花在推理上。**模型会被使用的次数越多,就越值得多花一些前期成本,训练一个更小的模型——也就是”过度训练”(over-training)。

公开模型的每参数 token 数(07_inference_aware_scaling.py 演示 1):

模型参数训练 token每参数 token
GPT-3(2020)175B0.3T2
Chinchilla(2022)70B1.4T20
LLaMA 65B(2023)65B1.4T22
Llama 2 70B(2023)70B2T29
Llama 3 70B(2024)70B15T214
Llama 3 8B(2024)8B15T1875

(CS336 课件还列出了 Mistral 7B,约 110 token / 参数。)

把推理算进去(Sardana & Frankle 2023 的思路):固定目标损失,最小化 训练(6ND6ND)+ 推理(每个 token 约 2N2N,第 10 讲)的总计算量。以”训练预算 102410^{24} 下 Chinchilla 最优模型的损失”为目标(该模型 96B 参数、1.7T token):

一生中的推理量(token)最优参数量训练 token每参数 token总计算比 Chinchilla 最优模型省
0(只算训练)96B1.7T181.0×10241.0\times10^{24}0%
101210^{12}79B2.1T271.2×10241.2\times10^{24}2%
101310^{13}48B4.3T902.2×10242.2\times10^{24}24%
101410^{14}29B14.5T4978.4×10248.4\times10^{24}59%
101510^{15}21B63.2T30085.0×10255.0\times10^{25}74%

推理量越大,最优模型越小、训练得越久。据 CS336 第 10 讲引用的数据,OpenAI 每天处理约 8.6 万亿 token,101510^{15} 只相当于它约 4 个月的量。所以今天的开源模型普遍”过度训练”:训练时”不划算”,部署时却便宜得多、能跑在更小的硬件上。

**【边界】**这里假设 Chinchilla 公式在每参数上千个 token 时依然成立,这是外推。Gadre et al. 2024 发现,在一定程度的过度训练下(每参数几百个 token),损失依然可以用规模定律预测。另外,数据是否够用(第 13、14 讲)是另一个现实的限制。


10. 本讲小结

  1. 动机:不能在大模型上试错,要在小模型上找规律、再外推。
  2. 幂律:L=E+An−αL = E + A n^{-\alpha},只有可约部分在双对数坐标下是直线。拟合时必须处理不可约损失 EE。
  3. 为什么是幂律:估计误差天然按多项式速度下降(均值估计:−1-1);灵活的非参数学习的指数依赖于维度(−2/(d+2)-2/(d+2));长尾的数据让”没学到的部分”按幂律减少。
  4. 数据规模定律:数据组成主要影响截距;重复数据约 4 轮以内接近新数据,之后价值迅速衰减;数据选择应随规模调整。
  5. 模型工程:用规模定律比较架构、优化器、形状;深宽比影响不大,嵌入参数要单独看;目标损失越低,临界批量越大。
  6. Chinchilla:L=E+A/Nα+B/DβL = E + A/N^\alpha + B/D^\beta,Nopt∝C0.5N_{\text{opt}} \propto C^{0.5},约 20 token / 参数。三种方法:下包络、IsoFLOP、参数化拟合(最脆弱)。
  7. Kaplan vs Chinchilla:非嵌入参数的计数、小规模、学习率调度等细节,足以把 0.5 变成 0.73。
  8. 真实实验:外推有误差(小预算的实验偏离规律、EE 难以拟合),但 IsoFLOP 的谷底很平,“大致选对”已经足够有用。
  9. 过度训练:考虑推理成本后,最优模型更小、训练更久。

11. 与作业 3 的关系

作业 3(规模定律)的典型形式(以往年版本为例,具体数字以当年的作业说明为准):

  • 你可以通过一个”训练 API”查询:给定模型配置(层数、宽度、学习率、批次大小等)和训练计算量,返回最终损失;
  • 但查询是有预算的(例如一共只能花 2×10182\times10^{18} FLOPs 的”实验费”);
  • 目标:预测 101910^{19} FLOPs 预算下的最优模型大小、超参数,以及能达到的损失。

这正是本讲第 7、8 节的流程:设计 IsoFLOP 实验(选哪些预算、哪些模型大小,才能在有限预算下拟合得最准)→ 拟合 → 外推。06_isoflop_experiment.py 的经验可以直接用上:

  • 小预算的点要小心(训练步数太少会偏离规律);
  • 谷底附近要多放几个点(抛物线拟合才准);
  • 参数化拟合要检查 EE 是否合理;
  • 预测时给出一个范围,而不是一个点。

12. 练习

练习 1(读幂律):某个规模定律是 L−E=8 D−0.28L - E = 8\,D^{-0.28}。数据量从 101010^{10} 增加到 101110^{11},可约损失变成原来的几倍?要让可约损失减半,数据要增加多少倍?

参考答案

10−0.28≈0.52510^{-0.28} \approx 0.525,约变成原来的 52%。减半需要 DD 增加 21/0.28≈11.92^{1/0.28} \approx 11.9 倍。幂律的”残酷”之处:每减半一次,都要付出同样倍数的代价。

练习 2(不可约损失):你测得三个点:D=108,109,1010D = 10^8, 10^9, 10^{10} 时,损失分别是 3.0、2.5、2.25。假设 L=E+AD−αL = E + A D^{-\alpha},求 EE 和 α\alpha。

参考答案

相邻两点的差:0.5 和 0.25。AD−αA D^{-\alpha} 每乘 10 倍 DD 就乘以 10−α10^{-\alpha},所以 10−α=0.25/0.5=0.510^{-\alpha} = 0.25/0.5 = 0.5,α=log⁡102≈0.301\alpha = \log_{10} 2 \approx 0.301。D=1010D = 10^{10} 时可约部分 = 0.25×0.5/(1−0.5)=0.250.25 \times 0.5/(1-0.5) = 0.25(等比数列求和:以后每次再减少一半,总共还能减少 0.25),所以 E=2.25−0.25=2.0E = 2.25 - 0.25 = 2.0。

练习 3(Chinchilla 最优):用本讲的 Besiroglu 参数,(a) 算出 C=1023C = 10^{23} 时的 NoptN_{\text{opt}} 和 DoptD_{\text{opt}};(b) 如果用这个预算训练一个 1750 亿参数的模型,损失会比最优高多少?

参考答案

(a) aa = 0.3658/0.7136 = 0.5126,G=(0.3478×482.01/(0.3658×2085.43))1/0.7136≈0.1196G = (0.3478 \times 482.01 / (0.3658 \times 2085.43))^{1/0.7136} \approx 0.1196。C/6≈1.667×1022C/6 \approx 1.667\times10^{22},Nopt≈0.1196×(1.667×1022)0.5126≈2.9×1010N_{\text{opt}} \approx 0.1196 \times (1.667\times10^{22})^{0.5126} \approx 2.9\times10^{10}(约 290 亿),Dopt=C/(6N)≈5.7×1011D_{\text{opt}} = C/(6N) \approx 5.7\times10^{11},约 19 token / 参数,最优损失约 2.032。(b) NN = 1.75e11 时 DD = 9.5e10,损失约 2.077,比最优高约 0.045(可以用 07_inference_aware_scaling.py 里的 loss 函数验证)。关键是理解:大模型数据不够时,数据项 B/DβB/D^\beta 变大,超过了模型项减小的部分。

练习 4(临界批量):某个任务 Smin⁡S_{\min} = 10,000 步,BcritB_{\text{crit}} = 2,000 个序列。(a) 用 BB = 500、2000、8000 训练,各需要多少步、多少样本?(b) 如果你有 1024 块 GPU、每块每步最多处理 4 个序列,用满所有 GPU 值得吗?

参考答案

(a) S=Smin⁡(1+Bcrit/B)S = S_{\min}(1 + B_{\text{crit}}/B):B=500 → 50,000 步、2500 万样本;B=2000 → 20,000 步、4000 万样本;B=8000 → 12,500 步、1 亿样本。(b) 用满时 BB = 4096,约 14,900 步、约 6100 万样本。和 BB = 2000 相比,步数(时间)减少约 25%,计算量增加约 53%。是否值得取决于你更缺时间还是更缺算力。

练习 5(重复数据):用 Muennighoff 的公式(R∗R^* = 15.4),你有 5000 亿 token 的唯一数据。训练 2 万亿 token(4 轮)的有效数据量是多少?训练 10 万亿 token(20 轮)呢?

参考答案

4 轮:D′=U(1+15.4(1−e−3/15.4))≈3.73UD' = U(1 + 15.4(1 - e^{-3/15.4})) \approx 3.73U ≈ 1.87 万亿(几乎不打折)。20 轮:D′=U(1+15.4(1−e−19/15.4))≈11.9UD' = U(1 + 15.4(1 - e^{-19/15.4})) \approx 11.9U ≈ 5.96 万亿,远少于 10 万亿,价值打了约 4 折。

练习 6(Kaplan vs Chinchilla):用自己的话解释,为什么”只数非嵌入参数”会让小规模实验拟合出更大的 NoptN_{\text{opt}} 指数?

参考答案

同一组最优模型,从小到大,嵌入参数占总参数的比例从很高降到很低。所以它们的非嵌入参数增长得比总参数快得多——横轴不变(计算量),纵轴换成增长更快的量,拟合出的斜率自然更大。Kaplan 的计算量也不算嵌入部分,进一步放大了这个效应。

练习 7(过度训练):你要为一个预计一生会生成 101410^{14} 个 token 的产品训练模型。根据第 9 节的表,你会训练多大的模型、用多少数据?如果手上只有 5 万亿 token 的数据呢?

参考答案

表中的最优是 29B 参数、14.5T token。如果只有 5T token(假设不重复),就不能那样过度训练:要么接受更大的模型(例如接近 101310^{13} 那一行的 48B、4.3T),要么重复数据(第 4.3 节:3 轮以内损失不大)。数据约束会把最优解推回”更大的模型”方向。

练习 8(动手): (a) 在 06_isoflop_experiment.py 中,为每个配置平均 2 个随机种子(运行时间翻倍),预测误差会变小吗? (b) 把 FIT_BUDGETS 中最小的预算去掉、加入 6×10106\times10^{10},重新做预测和验证。 (c) 在 04_chinchilla_three_methods.py 中把噪声加到 2%,看看哪种方法最先崩溃。


13. 延伸阅读

  • CS336 Spring 2026 Lecture 9(stanford-cs336/lectures 中的 lecture_09.pdf)。
  • Kaplan et al.,Scaling Laws for Neural Language Models(2020)。
  • Hoffmann et al.,Training Compute-Optimal Large Language Models(2022,Chinchilla)。
  • Besiroglu et al.,Chinchilla Scaling: A Replication Attempt(2024)。
  • Pearce & Song,Reconciling Kaplan and Chinchilla Scaling Laws(2024);Porian et al.,Resolving Discrepancies in Compute-Optimal Scaling of Language Models(2024)。
  • Hestness et al.,Deep Learning Scaling is Predictable, Empirically(2017)。
  • Rosenfeld et al.,A Constructive Prediction of the Generalization Error Across Scales(2020)。
  • McCandlish et al.,An Empirical Model of Large-Batch Training(2018)。
  • Muennighoff et al.,Scaling Data-Constrained Language Models(2023)。
  • Bahri et al.,Explaining Neural Scaling Laws(2021);Michaud et al.,The Quantization Model of Neural Scaling(2023)。
  • Sardana & Frankle,Beyond Chinchilla-Optimal: Accounting for Inference in Language Model Scaling Laws(2023)。

14. 下一讲预告

规模定律告诉我们:训练完的模型会被使用很多次,推理的成本可能远超训练。那么推理到底贵在哪里?

下一讲(推理)会回答:

  • 生成文本为什么这么慢?为什么说预填充是计算受限的、解码是内存受限的?
  • KV 缓存是什么、有多大?GQA、MLA、滑动窗口怎样把它变小?
  • 量化、剪枝与蒸馏怎样让模型更便宜?
  • 推测解码怎样在”输出分布完全不变”的前提下加速生成?
  • 连续批处理和 PagedAttention 怎样应对”请求随时到来、长度各不相同”的真实负载?

之后的第 11 讲(规模定律 II)会继续本讲的话题:学习率、批次大小怎样随规模变化,μP 怎样让小模型上调好的超参数直接用在大模型上。

下一讲之前,建议你:跑通 code/lecture09/ 下的 7 个脚本,完成练习 1、2、3、5,并尝试练习 8(b)。

← 返回课程目录