第 9 讲:扩展律基础(Scaling Laws — Basics)
第 9 讲:扩展律基础(Scaling Laws — Basics)
日期:4 月 27 日(周一,Spring 2026) | 讲师:Tatsu Hashimoto | 材料:lecture_09.pdf | 截止:作业 2 到期
概览
如果你拿到 10000 张 B200 用一个月,到底该训哪个模型? 本讲引入扩展律(scaling laws)——把损失与数据量、模型规模、算力联系起来的简单、可预测的幂律规则——从而可以在小模型上调参并外推到大规模。内容包括:历史脉络(从 1993 年的样本复杂度研究到 Hestness 2017)、为什么会出现幂律的理论(估计误差、内在维度)、经典的 Kaplan 与 Chinchilla 结果(含著名的 N 与 D 之争及其分歧原因)、critical batch size、muP,以及实用的”扩展律设计流程”。
核心概念与定义
- 扩展律:把某种资源(数据量 n、参数量 N、算力 C)映射到损失/误差的简洁公式,例如
Loss ≈ C·n^(−α)。在对数-对数坐标下呈直线:”无标度(scale-free)”或幂律行为。- 类比:就像衡量”多修几条车道能让通勤快多少”——存在干净的幂律趋势(车道翻倍带来固定比例的提速),于是你可以用 2/4/8 车道的实测结果预测 16 车道的效果。
- 为什么是幂律?(理论):估计误差多项式衰减。玩具例子:用 n 个 i.i.d. 样本估计均值,E[(μ̂−μ)²] = σ²/n——这就是斜率 −1 的扩展律。d 维非参数回归的误差约 n^(−1/d):斜率依赖维度。因此扩展律指数与数据的(内在)维度相关——这是活跃研究领域(Bahri 2021),但内在维度的估计方法并不可靠。
- 经验事实:损失与数据量在 log-log 下呈线性,跨语言模型/机器翻译/语音都成立;数据构成影响截距(偏移)而非斜率(distribution-shift 扩展律,Hashimoto 2021)——说明数据多样性很重要。观测到的斜率与经典 1/n 预测不同——一个”谜团”。
- 数据重复(repetition):重复使用有限数据会降低其价值;有效数据量 D’ < 唯一 token 数——因此数据选择应当随规模自适应。
- 用扩展律做模型工程:架构选择(大规模下 Transformer 优于 LSTM)、优化器(Adam vs SGD)、深度/宽度、batch size、学习率——都可以从小模型实验得出。重要警示:下游任务的扩展性通常比预训练损失更难预测。
- Critical batch size(临界 batch size):出现收益递减之前的最小 batch;做法是拟合 S_min/E_min 曲线(约为朴素最优步数/样本数的 2 倍;据称与”梯度协方差迹 / 梯度范数平方”的比例有关)。目标损失越小,临界 batch 越大。
- muP(maximal update parametrization,最大更新参数化):宽度感知的初始化 + 学习率缩放,使最优超参数能跨模型规模迁移(细节见第 11 讲)。
- N 与 D 之争:给定算力 C = 6ND,该训更大的模型(N)还是更多 token(D)?
- Kaplan 等 2020:N_opt ∝ C^0.73,D_opt ∝ C^0.27——每参数 token 数随算力下降(模型更大、数据相对更少)。
- Chinchilla(Hoffmann 等 2022):N_opt ∝ C^0.5,D_opt ∝ C^0.5——算力最优约为 D = 20N(70B 参数应对应约 1.4T token)。
- 分歧原因:Kaplan 的计数问题(是否剔除最后一层、小预算下 warmup 过高)、非嵌入参数 vs 全参数的取舍、小规模非线性。一项”数据取证”式再分析(Besiroglu 等 2024)发现 Chinchilla 的方法 3 本身也有缺陷,恢复原始数据重新拟合后与它的方法 1/2 一致。
- Chinchilla 的三种拟合方法:(1) 取所有训练曲线的最小值(下包络);(2) IsoFLOPs(固定算力 C_i、扫模型规模、取最小损失;⟨C_i, N_opt⟩ 构成幂律);(3) 在”规模×数据”网格上做联合最小二乘拟合。
- 训练最优 ≠ 部署最优:Chinchilla 优化的是训练算力,但真实算力开销主要在推理上——所以模型越来越被”过度训练(over-trained)”:GPT-3:2 token/参数,Chinchilla:20,LLaMA-65B:22,Llama 2 70B:29,Mistral 7B:110,Llama 3 70B:215。模型被用得越多,越值得为前期成本多训。
- 扩展律设计流程:(1) 先训练几个小模型;(2) 建立扩展律(例如 Adam vs SGD);(3) 依据扩展律的预测选择超参数——“大模型上超参数的影响可以在训练之前就被预测出来!”
- IsoFLOPs 无处不在:该方法可迁移到扩散模型、MoE(稀疏度扩展律)等。
代码示例:IsoFLOPs 扩展律拟合(作业 3 的核心)
代码(Python):
import numpy as np
# 数据:对每个算力预算 C_i,训练不同规模的模型 N_ij
#(token 数 D_ij = C_i / (6 * N_ij)),记录最终损失 L_ij。
# runs = [(C_i, N_ij, L_ij), ...]
def isoflop_optima(runs):
optima = [] # (C_i, N_opt(C_i), D_opt(C_i))
for C_i in sorted(set(r for r, _, _ in runs)):
subset = [(n, l) for r, n, l in runs if r == C_i]
N_opt, L_min = min(subset, key=lambda nl: nl[1]) # 该 isoflop 曲线上的最小损失
D_opt = C_i / (6 * N_opt) # 6ND 法则
optima.append((C_i, N_opt, D_opt))
return optima
def fit_power_law(xs, ys):
# log y = log a + b log x -> 在对数空间做线性回归
logx, logy = np.log(np.array(xs, dtype=float)), np.log(np.array(ys, dtype=float))
b, loga = np.polyfit(logx, logy, 1)
return np.exp(loga), b
# 例:拟合 N_opt = a * C^b 与 D_opt = c * C^d
optima = isoflop_optima(runs)
a, b = fit_power_law([o[0] for o in optima], [o[1] for o in optima])
c, d = fit_power_law([o[0] for o in optima], [o[2] for o in optima])
# 对大预算 C_target 做预测:
N_target = a * C_target ** b
D_target = c * C_target ** d
代码做了什么: 对每个固定 FLOPs 预算,找出损失最小的模型规模(即 IsoFLOPs 最优点),用 C = 6ND 反推 token 数,然后在对数空间拟合 N_opt(C) 与 D_opt(C) 两条幂律,并外推到大预算。
实现深挖:
- 为什么要在 isoflop 曲线上取最小值:固定算力时,过小的模型拟合不了数据、过大的模型来不及走足够多步——损失曲线是凸的,其最小值就是该预算下的算力最优配置。
- 为什么在对数空间回归:幂律在对数空间是直线;
np.polyfit(logx, logy, 1)的斜率就是指数。注意:对数空间拟合对”小损失点”的加权与线性空间不同,这是一个已知的微妙点。 - 为什么 C = 6ND 是基础:第 2 讲的 6ND 法则把 (N, D) 换算成算力——这是所有扩展律计算的支柱。
与作业的联系:作业 3 就是 这件事:你拿到一个训练 API(超参数 → 验证损失),用 12 个 B200 小时的预算拟合扩展律,然后提交对 48 B200 小时运行的算力最优超参数预测与最终损失预测。报告必须写清你的 IsoFLOPs(或联合拟合)方法;排行榜按你预测模型的实测损失评分。讲义的”Chinchilla 方法 2 = IsoFLOPs”是推荐起点;作业也允许 Kaplan 风格或 muP 思路。
代码示例:critical batch size(概念)
代码(Python):
# 对某个目标损失,扫 batch size;记录达到目标所需的步数 S 与样本数 E。
# 理论(McCandlish 等):曲线大致满足
# S(B) = S_min * (1 + B_crit / B) # 步数随 batch 变化
# E(B) = S(B) * B # 消耗的样本数
# 拟合 S_min 与 B_crit;选使步数与样本数平衡的 B*。
def fit_critical_batch(B_sweep, S_measured):
# 解 S_min、B_crit:S(B) = S_min * (1 + B_crit / B)
#(对 1/B 与 S 做最小二乘)
import numpy as np
invB = np.array([1.0 / b for b in B_sweep])
S = np.array(S_measured, dtype=float)
S_min, S_min_Bcrit = np.polyfit(invB, S, 1) # S = S_min + (S_min*B_crit) * (1/B)
B_crit = S_min_Bcrit / S_min
return S_min, B_crit
代码做了什么: 把”batch size → 达标步数”曲线拟合成直线,从而提取临界 batch size B_crit——超过它之后,加大 batch 的收益迅速递减(大致是步数/遍历次数最优点的 2 倍)。
实现深挖:
- 为什么会有收益递减:超过 B_crit 后,batch 翻倍并不能让达标步数减半,等于浪费样本。目标损失越低,临界 batch 越大。
- 为什么它对作业 1/3 重要:batch size 是一阶训练超参数;扩展性分析(DeepSeek、StepFun,见第 11 讲)都建立在”拟合最优 batch 随规模变化”之上。
与作业的联系:作业 1 的训练循环必须支持可配置 batch(以及梯度累积);作业 3 的 API 把 batch size 作为输入超参数——你构建的扩展律拟合应当把 batch/LR 当作可调旋钮,正如本讲的临界 batch 分析所暗示的。
关键要点
- 损失对数据/模型/算力在 log-log 下呈现干净的幂律——足以”小规模调参、大规模外推”(”扩展即预测”)。
- 理论解释:估计误差多项式衰减(均值估计斜率 −1;d 维非参数回归斜率 −1/d),把扩展指数与数据维度联系起来——但语言模型观测到的斜率仍是一个部分未解之谜。
- 算力最优训练(Chinchilla)约等于每参数 20 个 token;但部署现实(推理算力占主导)推动模型重度过度训练(多到每参数 200+ token)。
- IsoFLOPs 是主力方法:固定算力、扫规模、取最小、拟合幂律——可迁移到 MoE、扩散模型,以及你的作业 3。
- 超参数选择(优化器、深度、架构、batch)都能从小模型扩展律预测出来,再花大算力——这正是全课效率思维的体现。
常见陷阱
- 盲目外推:扩展律本质是下界;脱离拟合区间(例如数据重复、不同架构)就会”失效”。
- 参数计数口径不一致:含/不含 embedding 参数、是否剔除最后一层——这些差异曾让 Kaplan 与 Chinchilla 相差巨大。要明确 N 的定义。
- 把训练最优当成部署最优:Chinchilla 的 20 token/参数针对训练算力;若推理占主导,就要过度训练。
- 在对数空间草率拟合:log 空间最小二乘对各点的权重并不均匀;两种拟合都报出来并检查残差。
- 忽略 batch/LR 的联合调参:在固定 batch 下拟合的扩展律未必可迁移;batch 与 LR 都对规模敏感。
- 把下游指标等同于预训练损失:能力型指标(MMLU 等)的扩展性远不如损失可预测——切勿过度宣称。
复习题
- 问: Kaplan 与 Chinchilla 为什么在最优 N/D 比例上分歧?实践启示是什么?
- 答: Kaplan 得到 N_opt ∝ C^0.73(每参数 token 数随算力下降);Chinchilla 得到 N_opt ∝ C^0.5、约 20 token/参数。分歧来源:参数计数口径(非嵌入 vs 全参数、最后一层)、小预算下 warmup 过高、拟合中的小规模非线性(外加方法 3 本身有缺陷)。实践启示:现代实践相对 Kaplan、常常也相对 Chinchilla 更加”过度训练”,因为推理算力占主导。
- 问: 用四步说清 IsoFLOPs 的流程。
- 答: (1) 选定一组算力预算 C_i;(2) 对每个预算训练若干规模 N_ij 的模型,token 数 D_ij = C_i/6N_ij;(3) 每个预算取损失最小的规模,得到 (C_i, N_opt);(4) 在对数空间拟合 N_opt ∝ C^a、D_opt ∝ C^b 并外推到目标预算。
- 问: 为什么某模型的扩展律斜率可能与经典的 1/n 不同?
- 答: 经典参数化估计给出 1/n(斜率 −1);d 维非参数学习给出 n^(−1/d),斜率反映数据的内在维度——神经网络语言模型呈现的斜率两者都不完全符合,这正是促使内在维度理论(Bahri 2021)出现的”谜团”。
