卷 II · 长出来CH 08深度 8/20

规模的价格

过去几年 AI 最大的那条新闻,可以压成一句话:同样的结构,做大就变强。这一章把这句话放到秤上称。OpenAI 当年一口气公开了四个尺寸的 GPT-2,结构一模一样,只是层数和宽度不同。把同一篇它们都没见过的文章交给这四台模型,你会看到两件看似矛盾的事:整体的进步慢得惊人,而某些具体的本事却像是突然冒出来的。

12.5 倍参数每字符只降 11.4%Au:第 1066 名 → 第 1
◉ 这一章在 GPT-2 的哪一段

▷ 先猜一下

GPT-2 最小的版本有 1.24 亿个参数,最大的 XL 版有 15.6 亿,是它的 12.5 倍。第 4 章那篇维基百科文章,小版本要 1.01 比特/字符。

问:XL 版读同一篇文章,大约要多少比特/字符?

A 0.1 左右。参数多了一个数量级,比特数也该少一个数量级 B 0.5 左右。砍掉一半 C 0.9 左右。只好一成多 D 还是 1.01 左右。文章是新的,它没见过,大了也没用

答案在本章末尾。

四个尺寸,同一篇文章

四台 GPT-2 的结构完全相同:同样的分词器、同样的「注意力 + MLP」层,只是层数和每层的宽度(向量有多少维)不同。用第 4 章的那把尺子量同一篇文章:

模型参数层数宽度比特/字符比特/token
GPT-2 small1.24 亿127681.0154.85
GPT-2 medium3.55 亿2410240.9434.51
GPT-2 large7.74 亿3612800.9164.38
GPT-2 XL15.58 亿4816000.8994.30

参数涨了 12.5 倍,比特/字符只降了 11.4%。如果你是按「参数」付钱的,这笔买卖看起来很亏。

可是把这四个点画在对数坐标上——横轴是参数的对数,纵轴是比特数的对数——它们几乎落在一条直线上:

四个尺寸的 GPT-2:比特/token 对不算嵌入的参数量(两轴都是对数) 4.2 4.4 4.6 4.8 5 small medium large XL 参数(对数) 比特/token

这条直线的斜率是 −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.3290.639
10²²2.1390.449
10²³2.0050.315
10²⁴1.9110.221
10²⁵1.8450.155

这就是「规模的价格」:每往下走同样的一截,要付的钱乘以十。它解释了为什么前沿模型的训练预算一代比一代贵出一个数量级,也解释了为什么这条路能一直走——因为幂律没有在任何地方突然变平,多花的钱总能换回一点。

平滑的曲线,突然的能力

如果只看平均比特数,规模的回报平淡得近乎无聊。可是换一个角度——看一道具体的题——画面完全不同:

题目(看下一个 token)smallmediumlargeXL
The chemical symbol for gold is → ␣Au0.0075%
第 1066 名
0.043%
第 310 名
25.72%
第 1 名
95.77%
第 1 名
The capital of France is the city of → ␣Paris11.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 给了一个干净的例子。

但单道题不是单调的

别把上面那张表读成「越大越会」。换两道题:

题目smallmediumlargeXL
Michael Jordan plays the sport of → ␣basketball13.53%88.32%58.65%78.96%
The capital of France is → ␣Paris3.22%17.40%7.21%8.63%

medium 比 large 更确定 Jordan 打篮球;「The capital of France is」后面,XL 给 Paris 的概率还不如 medium。看看 XL 的完整候选表:

大 12.5 倍的 GPT-2 XL,读同一句 The capital of France is The ␣capital ␣of ␣France ␣is 下一个 token 概率 意外 ' the' 10.12% 3.30 比特 ' a' 9.90% 3.34 比特 ' Paris' 8.63% 3.53 比特 ' in' 2.49% 5.33 比特 ' one' 2.35% 5.41 比特 ' also' 2.34% 5.42 比特 熵 7.72 比特 · 对照第 1 章 small:the 8.46%,Paris 3.22%

它仍然最想写 ␣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%。

A 「少一个数量级」——这个直觉默认了线性回报。事实上文字本身有一个降不下去的底(Chinchilla 公式里的 1.69),而离底越近,每一步越贵。 B 「砍掉一半」——同样高估了。要把损失里「能降的部分」砍掉一半,按 Chinchilla 的公式大约要多花一百倍的算力。 D 「没见过,大了也没用」——低估了「学会规律」的价值。文章确实是新的,但英文的语法、维基百科的行文、「developed by」后面该接公司名这些规律都不新,大模型掌握得更好,所以照样省了一成多。

这一章的一句话

同样的结构做大就变强,但价格是幂律:平均损失随规模平滑地、递减地下降,每降同样一截要多付十倍;而具体的一道题,会在平滑的进步推过某个阈值时,看起来「突然学会」。

卷 II 讲完了「它是怎么长出来的」。下一卷打开它,一层一层看里面长出了什么。第一站是注意力——GPT-2 第 4 层的第 11 个头,在一篇它没见过的文章里,平均把 99.4% 的注意力放在「上一个 token」身上;而中间几层的很多头,会把一半左右的注意力倒在第一个 token 上,那个 token 什么也不是。