第 2 周 · Day 1:LLM 是什么,以及缩放律

Transformers and Large Language Models · Week 2 · Day 1。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

时长 7 小时:§1 LLM 的定义与 decoder-only(1h)· §2 Kaplan 缩放律(1.5h)· §3 Chinchilla 与计算最优(2h)· §4 过度训练(0.5h)· §5 涌现与度量(0.5h)· §A–§C(1.5h)

对应正课 Lecture 3 开头(LLM 的定义与架构)。学习计划把 GPT-3、Kaplan、Chinchilla 三篇列为本周必读,缩放律也是 Lecture 4”预训练”的理论底座,所以放在第一天。

配套代码 w2day1_checks.py(纯 numpy):幂律与外推、从噪声数据拟合指数、Chinchilla 参数化损失的解析最优、等算力 U 形曲线、Chinchilla vs Gopher、Kaplan vs Chinchilla 的配比、过度训练的代价、“涌现”的度量效应

§B 参考实现(code/ 目录):w2d1_scaling.py(Chinchilla 计算器、带不可约项的幂律拟合、在 mini-GPT 上做缩放扫描和等算力实验)。

今天的目标:能说清现代 LLM 为什么全是 decoder-only;能推出 Chinchilla 的最优配比公式,并用它解释 Chinchilla 为什么打败了 Gopher、Llama 3 为什么”违反”了它。


§0 这一周在做什么

第 1 周造出了模型。第 2 周回答两个问题:

  • Lecture 3:把这个模型做大、在海量文本上训练之后,它是什么、能怎么用?(Day 1–3:缩放律、MoE、解码与提示)
  • Lecture 4:怎么把它训出来、改造它?(Day 4–6:预训练与分布式、量化、SFT 与 LoRA)

今天是连接两者的一天:缩放律既解释了”为什么要做大”,也决定了”训练预算怎么花”。

今天要用到的旧结论

旧结论出处
三种架构;decoder-only 胜出的常见理由Week 1 Day 2 §4.3
精确参数量;训练 C≈6NDC\approx6ND,推理每 token 2N2NWeek 1 Day 2 §5.1–5.2
语言建模即压缩;loss 就是码长Week 0 Day 5 §1.4
最大似然 = 最小 KL;损失的下限是数据的熵Week 0 Day 5 §1.2

§1 LLM 是什么

1.1 定义

今天说”大语言模型”,几乎总是指:

  1. 一个 decoder-only 的 Transformer(Week 1 的现代版 mini-GPT,只是大得多);
  2. 用”预测下一个 token”在海量文本上预训练(万亿级 token);
  3. 参数量从十亿到万亿级。

之后的 SFT、偏好对齐、推理训练(Lecture 4–6)都在这个预训练模型上做。所有能力的底子来自预训练。

一条时间线:GPT-1(2018,117M,证明”预训练 + 微调”有效)→ GPT-2(2019,1.5B,零样本就能做很多任务)→ GPT-3(2020,175B,少样本上下文学习,Day 3 §3)→ Chinchilla(2022,重新校准”该训多大”,§3)→ Llama 系列(2023 起,开放权重,小模型、多数据,§4)。

1.2 为什么是 decoder-only:展开 Week 1 的四条理由

Week 1 Day 2 §4.3 列过四条。现在可以说得更具体:

一、监督信号的密度。 下一个 token 预测在每个位置都有损失。BERT 的 MLM 只在 15% 的位置上有(Week 1 Day 6 §4.2);T5 的跨度破坏目标也只预测被遮住的那部分。同样的数据,decoder-only 拿到的训练信号最多。

二、一个目标覆盖所有任务。 翻译、摘要、问答、写代码,都可以写成”给定前文,续写后文”。不需要为每类任务设计输出头。这让规模化变得简单:只有一种模型、一种损失、一种数据格式。

三、上下文学习随规模出现。 GPT-3 发现,足够大的 decoder-only 模型不需要微调,只要在提示里给几个例子就能做新任务(Day 3 §3)。这把”适配新任务”从训练时挪到了推理时。

四、推理结构简单。 只有一份 KV Cache(Week 1 Day 4),没有编码器-解码器之间的交叉注意力要管理。

一个诚实的补充:这些理由都不是”证明”。有研究在控制变量的比较里发现,纯语言建模预训练后做零样本,因果 decoder 最好;但如果之后还要做多任务微调,encoder-decoder 可能更好(Wang et al. 2022)。行业收敛到 decoder-only,是”简单 + 能规模化 + 上下文学习”共同作用的结果,而不是某一条压倒性的定理。


§2 Kaplan 缩放律:损失随规模的幂律

2.1 发现

Kaplan et al.(2020)训练了跨越七个数量级的模型,发现测试损失(交叉熵,nats/token)与三个量都呈幂律关系:

L(N)=(NcN)αN,L(D)=(DcD)αD,L(Cmin⁡)=(CcCmin⁡)αCL(N)=\Big(\frac{N_c}{N}\Big)^{\alpha_N},\quad L(D)=\Big(\frac{D_c}{D}\Big)^{\alpha_D},\quad L(C_{\min})=\Big(\frac{C_c}{C_{\min}}\Big)^{\alpha_C}

NN 是非嵌入参数量,DD 是训练 token 数,CC 是训练算力。论文报告 αN≈0.076\alpha_N\approx0.076、αD≈0.095\alpha_D\approx0.095、αC≈0.050\alpha_C\approx0.050。前提是另外两个因素不成为瓶颈。

幂律在双对数坐标下是直线:log⁡L=αNlog⁡Nc−αNlog⁡N\log L=\alpha_N\log N_c-\alpha_N\log N。w2day1_checks.py 第 1 组:参数每乘 10,损失乘 10−0.076=0.8410^{-0.076}=0.84,每个数量级降约 16%。

直觉:指数很小,意味着收益递减得很厉害:想把损失降一半,参数要放大约 9000 倍(第 1 组)。但它极其稳定、可预测:Kaplan 的模型从不到一千到约 15 亿(非嵌入)参数,都落在同一条直线上。

2.2 为什么这很有用:用小模型预测大模型

缩放律的工程价值在于外推。第 2 组模拟了这件事:用 1M–100M 参数的 6 个”小模型”(带 1% 的噪声)拟合指数,外推到 10B(比最大的拟合点大 100 倍):

  • 拟合的 α\alpha 均值 0.0754(真值 0.076),标准差 0.0025
  • 外推误差中位数 1.47%,最大 3.30%(20 个种子)

这就是今天大模型训练的标准流程:先用小规模实验拟合缩放曲线,再决定花几千万美元的那次训练怎么配置。

2.3 局限

  • 不可约项:纯幂律 L→0L\to0 当 N→∞N\to\infty,但语言本身有熵(Week 0 Day 5 §1.2:最大似然的损失下限是数据的熵),损失不会降到 0。§3.2 的参数化形式补上了这一项 EE。
  • 损失 ≠ 能力:幂律描述的是平均交叉熵。下游任务的表现不一定平滑(§5)。
  • 只在”其他因素不是瓶颈”时成立:模型大了数据不够,或者数据多了模型太小,都会偏离直线。这恰好引出了下一个问题:固定预算下,模型和数据怎么分配?

§3 Chinchilla:算力该怎么分

3.1 问题与直觉:等算力曲线

你有固定的训练算力 CC。由 Week 1 Day 2 §5.2,C≈6NDC\approx6ND。可以训一个大模型、少喂数据,也可以训一个小模型、多喂数据。哪个更好?

直觉:两个极端都不好。模型太小,数据再多它也装不下;模型太大,每个参数见到的数据太少,没学充分。中间应该有个最优点。

Hoffmann et al.(2022)的方法 2 就是直接做实验:固定几个算力预算,每个预算下训练一串不同大小的模型,画出”损失 vs 模型大小”,找最低点。w2day1_checks.py 第 4 组用他们拟合的公式重现了这条等算力曲线(C=5.76×1023C=5.76\times10^{23},Chinchilla 论文给 Gopher 用的算力预算;按 6ND6ND 算 Gopher 本身是 5.04×10235.04\times10^{23},§3.3):

NN5B10B20B40B70B140B280B560B
损失1.9731.9471.9331.9311.9381.9551.9842.025

U 形。 Gopher 用这个算力训了 280B 参数,落在右侧上坡上。

3.2 推导:参数化损失与最优配比

Chinchilla 的方法 3 用一个参数化形式拟合全部实验:

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

三项各有含义:EE 是数据本身的熵(无限大模型、无限数据也降不下去的部分);A/NαA/N^\alpha 是”模型不够大”造成的额外损失;B/DβB/D^\beta 是”训练不够充分”造成的额外损失。论文的拟合值:E=1.69E=1.69、A=406.4A=406.4、B=410.7B=410.7、α=0.34\alpha=0.34、β=0.28\beta=0.28。

求最优。 约束 6ND=C6ND=C,把 D=C/(6N)D=C/(6N) 代进去,变成单变量问题:

L(N)=E+AN−α+B(C6)−βNβL(N)=E+AN^{-\alpha}+B\Big(\frac C6\Big)^{-\beta}N^{\beta}

对 NN 求导令其为零:

−αAN−α−1+βB(C6)−βNβ−1=0⇒Nα+β=αAβB(C6)β-\alpha AN^{-\alpha-1}+\beta B\Big(\frac C6\Big)^{-\beta}N^{\beta-1}=0\quad\Rightarrow\quad N^{\alpha+\beta}=\frac{\alpha A}{\beta B}\Big(\frac C6\Big)^{\beta}

 N∗=G(C6)βα+β,D∗=G−1(C6)αα+β,G=(αAβB)1α+β \boxed{\ N^*=G\Big(\frac C6\Big)^{\frac{\beta}{\alpha+\beta}},\qquad D^*=G^{-1}\Big(\frac C6\Big)^{\frac{\alpha}{\alpha+\beta}},\qquad G=\Big(\frac{\alpha A}{\beta B}\Big)^{\frac1{\alpha+\beta}}\ }

读这个结果:最优参数量和最优数据量都是算力的幂,指数分别是 βα+β\frac{\beta}{\alpha+\beta} 和 αα+β\frac{\alpha}{\alpha+\beta},两者之和为 1。α≈β\alpha\approx\beta 时两个指数都接近 0.5:算力翻倍,参数和数据各放大 2\sqrt2 倍。这是 Chinchilla 的核心结论。三种方法给出的参数指数分别约 0.50、0.49、0.46(论文报告值;用方法 3 的四舍五入常数算出来是 0.452,第 3 组)。

意义:谁的指数大,谁的收益递减得慢,就该多给它资源。α\alpha 和 β\beta 差不多,所以两者该同比例放大。

3.3 Chinchilla 打败 Gopher

DeepMind 用和 Gopher 相近的算力训练了 Chinchilla:参数小 4 倍,数据多 4.7 倍。第 5 组:

模型NNDDD/ND/N算力参数化损失预测
Gopher280B300B1.15.04×10235.04\times10^{23}1.993
Chinchilla70B1.4T20.05.88×10235.88\times10^{23}1.937

论文报告 Chinchilla 在绝大多数下游任务上超过了 Gopher。而且推理成本只有 Gopher 的 1/4(每 token 2N2N FLOPs)。

“每个参数约 20 个 token” 这条流传最广的经验法则,就来自这里。

3.4 为什么 Kaplan 当年得出了不同的结论

Kaplan 的配比是 N∝C0.73N\propto C^{0.73}、D∝C0.27D\propto C^{0.27}:算力增加时,大部分应该花在更大的模型上。第 6 组对比了算力放大 100 倍时的分配:

参数数据
Kaplan×28.8×3.5
Chinchilla×10.0×10.0

这个差别塑造了一个时代:GPT-3(175B 参数只训了 300B token)、Gopher(280B / 300B)都是按 Kaplan 的思路配置的,严重训练不足。

Chinchilla 论文指出了一个主要原因:Kaplan 的实验对所有模型用了同样长度的学习率调度,没有按每次实际训练的步数调整余弦衰减。训练步数少于调度长度的模型,学习率还没降下来就停了,损失被高估;这种偏差对”大模型 + 少数据”的配置最有利,于是结论偏向了大模型。一个超参设置上的细节,改变了整个领域的方向。

3.5 一个需要知道的修正

用方法 3 的原始拟合值算出来的最优点,与方法 1、2 并不一致。第 3 组:它给出的最优模型偏小、D/ND/N 远高于 20(102210^{22} FLOPs 时约 63,Gopher 算力时约 93),而且随算力变化。Epoch AI 的复现(Besiroglu et al. 2024)重新拟合了论文的数据,认为原始的方法 3 拟合有问题;用他们修正后的常数(E=1.82E=1.82、α=0.348\alpha=0.348、β=0.366\beta=0.366),D/ND/N 回到 17–21 之间(第 3 组),与方法 1、2 及 Chinchilla 本身的配比一致。

教训:缩放律的定性结论(参数和数据同比例放大)很稳健,具体常数则要谨慎使用。今天的 w2d1_scaling.py --calc 两组常数都给。


§4 超越 Chinchilla:过度训练

4.1 Chinchilla 最优只对”训练”最优

Chinchilla 回答的问题是:给定训练算力,怎样得到最低的损失。 但模型训完之后要部署,被调用成千上万亿次。推理成本每 token 2N2N,与训练用了多少数据无关。

如果推理量足够大,宁可多花训练算力,也要一个更小的模型。 这就是 Llama 系列的思路。

4.2 Llama 3 8B:每个参数 1875 个 token

w2day1_checks.py 第 7 组(用 Epoch 修正常数):

  • Llama 3 8B 训了 15T token,D/N=1875D/N=1875,训练算力 7.2×10237.2\times10^{23}。
  • 同样算力下的”最优”模型约 81B 参数、1.5T token。
  • 预测损失:8B 为 2.022,81B 最优为 1.968,只差 0.054。
  • 推理成本:8B 只有 81B 的 1/10。

继续加数据,8B 的损失仍在缓慢下降:0.16T token(Chinchilla 配比)时 2.157,1T 时 2.076,15T 时 2.022,60T 时 2.010。收益递减,但一直有。

4.3 数据用完了怎么办

过度训练需要海量数据,而高质量文本是有限的。Muennighoff et al.(2023)研究了数据受限时的缩放:同一份数据重复训练约 4 个 epoch,效果几乎和同样多的全新数据一样;更多轮次后收益迅速下降。这也是为什么 Lecture 4 会花大量篇幅讲数据清洗与合成(Day 4 §1):当数据成为瓶颈,数据质量就是新的缩放维度。


§5 涌现,以及度量的陷阱

Wei et al.(2022)报告了一些”涌现能力”:小模型完全不会,过了某个规模突然会了(比如多位数算术)。这常被用来论证”规模会带来质变”。

Schaeffer et al.(2023)提出了另一种解释:很多涌现来自评估指标的非线性。 w2day1_checks.py 第 8 组构造了一个例子:逐 token 准确率 pp 随 log⁡N\log N 平滑上升(0.05 → 0.95),但如果任务要求 kk 个 token 全对,整题准确率是 pkp^k:

log⁡10N\log_{10}N8.09.010.011.012.0
逐 token0.1420.3540.6460.8580.953
5 个 token 全对0.0000.0060.1120.4650.784
10 个 token 全对0.0000.0000.0130.2170.615

同一个平滑提升的能力,用”整题全对”来量,看起来像在 101010^{10} 附近突然出现。

怎么看待这件事:它不否认规模带来新能力,但提醒你看到”突变”时先问度量是什么。这对 Lecture 8 的评估设计很重要:选指标时要知道它会怎样放大或掩盖变化。


§A 工具:数参数、估算力

A.1 不下载权重就数参数

from transformers import AutoConfig, AutoModelForCausalLM
from accelerate import init_empty_weights
cfg = AutoConfig.from_pretrained("meta-llama/Llama-3.1-8B")        # 只下载几 KB 的 config.json
with init_empty_weights():                                         # 参数放在 meta 设备上,不占内存
    model = AutoModelForCausalLM.from_config(cfg)
print(sum(p.numel() for p in model.parameters()))
  • init_empty_weights 与 Week 1 Day 2 用过的 torch.device("meta") 是同一个原理。
  • 绑定的权重只数一次:parameters() 默认去重。自己按 state_dict() 数会把绑定的矩阵数两遍。
  • 一些受限模型(如 Llama)要先在 Hugging Face 上同意协议,from_pretrained 才能下载 config。

A.2 估算 FLOPs

  • 公式估算:训练 6ND6ND,推理每 token 2N2N(Week 1 Day 2 §5.2),再加注意力的 TT 相关项。这是规划实验时最常用的。
  • 实测:torch.utils.flop_counter.FlopCounterMode 可以统计一次前向 / 反向实际执行的 FLOPs,用来核对公式:
from torch.utils.flop_counter import FlopCounterMode
with FlopCounterMode(display=False) as fc:
    model(x).sum().backward()
print(fc.get_total_flops())
  • MFU(模型 FLOPs 利用率)= 实际吞吐 × 6N6N ÷ 硬件峰值。大规模训练的 MFU 常在 40%–60%,小模型、小 batch 会低得多(Week 1 Day 3 §4.2)。

A.3 读别人的缩放实验

  • NN 是否包含嵌入参数? Kaplan 用非嵌入参数,Chinchilla 用总参数。小模型上差别很大(GPT-2 small 的嵌入占 31%,Week 1 Day 2 §6.4)。
  • 损失是什么单位? nats/token 还是 bits/byte?不同分词器的 per-token 损失不可比(Week 0 Day 5 §1.3)。
  • 学习率调度是否按每次训练的长度调整? §3.4 的教训。

§B 实操

  1. 跑通 w2day1_checks.py,8 组结论都看懂。第 3、4 组放在一起看:U 形曲线的最低点,就是解析公式给出的 N∗N^*。
  2. 推导(1h,纸笔):(a) 从 L(N,D)L(N,D) 和 C=6NDC=6ND 推出 N∗N^* 与 D∗D^*;(b) 证明两个指数之和为 1;(c) 用经验法则 D=20ND=20N,算出 102110^{21}、102310^{23}、102510^{25} FLOPs 下的最优 NN。
  3. 计算器(0.5h):python code/w2d1_scaling.py --calc --flops 1e23,比较两组常数与 D=20ND=20N 法则的差别。
  4. 亲手测一条缩放曲线(3h,边跑边读论文):--sweep --small 训练 6 个不同大小的 mini-GPT(固定 token 数),拟合 L=E+aN−αL=E+aN^{-\alpha}。再跑 --isoflop --small,看能不能在字符级数据上复现 U 形。写下你的 α\alpha,以及最大的几个模型是否开始过拟合(Tiny Shakespeare 只有 1M 字符,数据会先成为瓶颈)。
  5. 数参数(0.5h):用 §A.1 的方法数出 Llama 3.1 8B、Qwen2.5-7B 的参数量,再按 §3.2 算它们的 D/ND/N(训练 token 数查模型卡)。

参考实现:code/w2d1_scaling.py(--selftest 和 --calc 只需 numpy,已实际运行通过;--sweep 和 --isoflop 需要 torch)。


§C 自测

动机与直觉层

  1. 今天说的”LLM”具体指什么?它的能力主要来自哪个阶段?
  2. decoder-only 胜出的四条理由是什么?为什么说它们不是”证明”?
  3. 缩放律为什么有工程价值?它有哪些局限?
  4. 固定算力下,为什么模型太大、太小都不好?
  5. 为什么 Llama 3 要”违反” Chinchilla 配比?它换来了什么、付出了什么?
  6. “涌现能力”的度量解释是什么?它否定了规模的作用吗?

推导与估算层

  1. 从 L(N,D)=E+A/Nα+B/DβL(N,D)=E+A/N^\alpha+B/D^\beta 和 C=6NDC=6ND 推出 N∗N^* 与 D∗D^*。
  2. 为什么 α≈β\alpha\approx\beta 时”参数和数据应同比例放大”?
  3. 用 D=20ND=20N 估算:102410^{24} FLOPs 该训多大的模型、多少 token?
  4. Kaplan 和 Chinchilla 的结论为什么不同?
  5. Chinchilla 和 Gopher 的算力、参数、数据、推理成本各是多少?

工程层

  1. 怎样不下载权重就数出一个 HF 模型的参数量?绑定权重会不会数重?
  2. 读缩放实验时要注意哪三个口径问题?
  3. MFU 怎么算?

出关标准

  • 能说出 LLM 的定义和 decoder-only 胜出的理由,并知道它们的局限
  • 能写出 Kaplan 的幂律形式,解释小指数的含义,说出缩放律的工程用途
  • 能推出 Chinchilla 的 N∗N^*、D∗D^*,并说清”同比例放大”的来由
  • 能用 Chinchilla vs Gopher 的数字说明计算最优配比
  • 能解释 Kaplan 与 Chinchilla 差异的原因,以及方法 3 常数的修正
  • 能讲清过度训练的动机与代价
  • 能用度量效应解释”涌现”
  • 在 mini-GPT 上完成一次缩放扫描并拟合出指数

疑问清单

← 返回课程目录