规模的价格
过去几年 AI 最大的那条新闻,可以压成一句话:同样的结构,做大就变强。这一章把这句话放到秤上称。OpenAI 当年一口气公开了四个尺寸的 GPT-2,结构一模一样,只是层数和宽度不同。把同一篇它们都没见过的文章交给这四台模型,你会看到两件看似矛盾的事:整体的进步慢得惊人,而某些具体的本事却像是突然冒出来的。
GPT-2 最小的版本有 1.24 亿个参数,最大的 XL 版有 15.6 亿,是它的 12.5 倍。第 4 章那篇维基百科文章,小版本要 1.01 比特/字符。
问:XL 版读同一篇文章,大约要多少比特/字符?
答案在本章末尾。
四个尺寸,同一篇文章
四台 GPT-2 的结构完全相同:同样的分词器、同样的「注意力 + MLP」层,只是层数和每层的宽度(向量有多少维)不同。用第 4 章的那把尺子量同一篇文章:
| 模型 | 参数 | 层数 | 宽度 | 比特/字符 | 比特/token |
|---|---|---|---|---|---|
| GPT-2 small | 1.24 亿 | 12 | 768 | 1.015 | 4.85 |
| GPT-2 medium | 3.55 亿 | 24 | 1024 | 0.943 | 4.51 |
| GPT-2 large | 7.74 亿 | 36 | 1280 | 0.916 | 4.38 |
| GPT-2 XL | 15.58 亿 | 48 | 1600 | 0.899 | 4.30 |
参数涨了 12.5 倍,比特/字符只降了 11.4%。如果你是按「参数」付钱的,这笔买卖看起来很亏。
可是把这四个点画在对数坐标上——横轴是参数的对数,纵轴是比特数的对数——它们几乎落在一条直线上:
这条直线的斜率是 −0.042。翻译成人话:(不算嵌入表的)参数每翻一倍,每个 token 的比特数降 2.9%——不多,但每一次翻倍都稳稳地降这么多。这种「在对数坐标上是直线」的关系叫幂律。
这是一条幂律,而幂律的意思是「越来越贵」
2020 年,OpenAI 的 Jared Kaplan 等人用几十个不同尺寸的模型做了这件事的完整版:损失和参数量、数据量、算力之间,都是幂律,而且横跨了七个数量级都没有弯。2022 年,DeepMind 的「Chinchilla」论文重新拟合了一遍,给出一个至今被引用最多的公式:
损失(N, D) = 1.69 + 406.4 / N^0.34 + 410.7 / D^0.28
↑ ↑ ↑
文本本身的熵 参数不够造成的 数据不够造成的
(降不下去)
(N 是参数个数,D 是训练的 token 数,损失的单位是 nat。)这条公式里最重要的是第一项:1.69 是降不下去的——那是文字本身的不可预测性,就像第 4 章说的,「谁做的、什么时候、多少人用」这种真正的新信息,再好的模型也得付钱。能降的只有后两项。
按这条公式算,每多花 10 倍算力(并且最优地分配给参数和数据),那「能降的部分」就只剩原来的 七成:
| 训练算力(浮点运算次数) | 最优分配下的损失 | 其中能降的部分 |
|---|---|---|
| 10²¹ | 2.329 | 0.639 |
| 10²² | 2.139 | 0.449 |
| 10²³ | 2.005 | 0.315 |
| 10²⁴ | 1.911 | 0.221 |
| 10²⁵ | 1.845 | 0.155 |
这就是「规模的价格」:每往下走同样的一截,要付的钱乘以十。它解释了为什么前沿模型的训练预算一代比一代贵出一个数量级,也解释了为什么这条路能一直走——因为幂律没有在任何地方突然变平,多花的钱总能换回一点。
平滑的曲线,突然的能力
如果只看平均比特数,规模的回报平淡得近乎无聊。可是换一个角度——看一道具体的题——画面完全不同:
| 题目(看下一个 token) | small | medium | large | XL |
|---|---|---|---|---|
The chemical symbol for gold is → ␣Au | 0.0075% 第 1066 名 | 0.043% 第 310 名 | 25.72% 第 1 名 | 95.77% 第 1 名 |
The capital of France is the city of → ␣Paris | 11.08% 第 2 名 | 26.02% 第 2 名 | 54.20% 第 1 名 | 82.45% 第 1 名 |
「金的元素符号」这道题,小模型和中模型都完全不会——Au 排在一千多名、三百多名,等于没有;到了 large 突然跳到第一,到了 XL 是 95.77%。如果你只用「答对没有」来评判,这就是一个在 7.74 亿参数处突然出现的能力。
可它其实一直在涨:0.0075% → 0.043% → 25.72%,每一步都是几十倍、几百倍的增长,只是前两步还没够到「第一名」这条线。一道题的「会」与「不会」,是一个阈值;而底下推着它跨过阈值的那个量,是平滑的。2023 年斯坦福的一篇论文(《Are Emergent Abilities of Large Language Models a Mirage?》)系统地论证了这一点:很多被报道为「涌现」的能力,换一个连续的指标去量,突然性就消失了。这件事至今仍有争论——有些能力在连续指标下也确实陡峭——但这一章的四台 GPT-2 给了一个干净的例子。
但单道题不是单调的
别把上面那张表读成「越大越会」。换两道题:
| 题目 | small | medium | large | XL |
|---|---|---|---|---|
Michael Jordan plays the sport of → ␣basketball | 13.53% | 88.32% | 58.65% | 78.96% |
The capital of France is → ␣Paris | 3.22% | 17.40% | 7.21% | 8.63% |
medium 比 large 更确定 Jordan 打篮球;「The capital of France is」后面,XL 给 Paris 的概率还不如 medium。看看 XL 的完整候选表:
它仍然最想写 ␣the,Paris 排第三。大了 12.5 倍,它依然是一台续写机,不是一台问答机——第 1 章那张表的形状,规模没有改变。平均下来的损失是平滑地降的,具体到每一道题,则是一团噪声。评价一个模型时只看一两个提示词,结论基本不可信。
规模没给的东西
最后一个对照:第 7 章那首 Python 之禅,四台模型谁都没背下来。给前两行,它们各自编了一个第三行:
small The only difference is that the implicit is better than the explicit. medium The more you use it, the more you'll learn. large The best way to learn is to do. XL The best is better than the best. 原文 ⟪Simple is better than complex.⟫
编得一个比一个像「格言」,可没有一个是对的。参数多了,它对「格言长什么样」学得更像了;但一段在训练数据里出现得不够多的原文,模型再大也不会凭空背出来。规模买来的是对规律的更好拟合,不是对每一份数据的记忆。
同一篇文章,两个尺寸(再加 large 和 XL 就是本章那张表;XL 要下载 6.4 GB,内存要够):
import math, torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("gpt2")
text = open("chatgpt-2026-10-21.txt").read()
ids = tok(text).input_ids
au = tok.encode(" Au")[0]
for name in ["gpt2", "gpt2-medium"]: # 再加上 "gpt2-large"、"gpt2-xl" 就是正文那张表(xl 要下载 6.4 GB)
model = AutoModelForCausalLM.from_pretrained(name).eval()
n = sum(p.numel() for p in model.parameters())
bits, start = 0.0, 0
with torch.no_grad():
while True:
seg = ids[start:start + 1024]
logp = torch.log_softmax(model(torch.tensor([seg])).logits[0, :-1], -1)
bits += (-logp[range(len(seg) - 1), seg[1:]] / math.log(2))[0 if start == 0 else 511:].sum().item()
if start + 1024 >= len(ids):
break
start += 512
q = tok("The chemical symbol for gold is", return_tensors="pt").input_ids
p = torch.softmax(model(q).logits[0, -1], -1)
print(f"{name:12} {n / 1e6:5.0f}M 参数 {bits / len(text):.3f} 比特/字符 "
f"P(' Au') = {p[au]:.2%}(第 {(p > p[au]).sum().item() + 1} 名)")
本机输出:
gpt2 124M 参数 1.015 比特/字符 P(' Au') = 0.01%(第 1066 名)
gpt2-medium 355M 参数 0.943 比特/字符 P(' Au') = 0.04%(第 310 名)
pip install torch transformers && python 08.py
Colab 的免费实例跑 small 到 large 没问题;XL 需要较大内存的运行时。
- 大模型公司用幂律做预算。先训一串小模型,把损失画在对数坐标上,延长那条直线,就能在花几千万美元之前,相当准地预测大模型训完的损失。
- 「每个参数配多少训练数据」变了好几次。Chinchilla 本身是 700 亿参数、1.4 万亿 token,约每个参数 20 个 token,这个比例后来被叫做「Chinchilla 最优」。但那是「训练算力最省」的比例;如果模型要被成千上万人反复使用,推理的成本更重要,于是今天的小模型普遍「过度训练」——Meta 的 Llama 3 8B 用了超过 15 万亿个 token,每个参数近两千个。
- 评测榜上的分数跳变,很多是「答对没有」这种阈值指标的跳变。看一个模型是否真的进步,比起看它从 0 分到 60 分,更该看它在连续指标(比如正确答案的概率)上的变化。
「模型大 10 倍,就聪明 10 倍。」
在平均损失上,大 12.5 倍只换来 11.4% 的下降;按 Chinchilla 的公式,算力多 10 倍,能降的那部分损失只少三成。回报是递减的,而且递减得很有规律。
但反过来的直觉——「既然只好一成,那做大没意义」——也是错的。具体到一道题,那一成的平均进步可能意味着 Au 从第 1066 名跳到第 1 名。规模的回报,在平均值上是平滑的、递减的;在单项能力上,是阈值式的、看起来突然的。两种看法讲的是同一组数字。
正确答案是 C:XL 是 0.899 比特/字符,比 small(1.015)低 11.4%。
参数每翻一倍,每个 token 的比特数约降 2.9%。
《意外》第 5 章证明「万能压缩器不存在」,第 2 章讲熵——Chinchilla 公式里那个降不下去的 1.69,就是英文文本的熵在模型眼里的估计值。《撞墙》讲的「越接近满负荷,每一点余量越贵」,和这一章「越接近熵,每一点损失越贵」是同一种曲线性格。
这一章的一句话
同样的结构做大就变强,但价格是幂律:平均损失随规模平滑地、递减地下降,每降同样一截要多付十倍;而具体的一道题,会在平滑的进步推过某个阈值时,看起来「突然学会」。
卷 II 讲完了「它是怎么长出来的」。下一卷打开它,一层一层看里面长出了什么。第一站是注意力——GPT-2 第 4 层的第 11 个头,在一篇它没见过的文章里,平均把 99.4% 的注意力放在「上一个 token」身上;而中间几层的很多头,会把一半左右的注意力倒在第一个 token 上,那个 token 什么也不是。