本文是《算法工程师的数学:读公式不卡壳的最小集》系列的第 8 篇(共八篇)。上一篇:导数、梯度与链式法则——softmax 的梯度与策略梯度

“我们的模型在 HumanEval 上比基线高 3 个点。”这句话是不是一个结论?这一篇给出判断它的工具:置信区间显著性。它们来自第四篇的两条性质——样本均值的标准差是 \(\sigma / \sqrt{n}\)、大量独立量之和近似高斯——加上一个数字 1.96。然后讲另一件”从一组数字里找规律”的事:拟合。scaling law 那些漂亮的曲线是怎么从几十个实验点拟出来的、为什么画在双对数坐标上、以及 Chinchilla 的”每个参数配 20 个 token”是怎么算出来的。

全篇的核心问题是:

HumanEval 上差 3 个点算不算提升?scaling law 的曲线是怎么拟出来的、\(D/N \approx 20\) 从哪来?

一、总览

1. 两件事

推断:从一个样本回答"真实值在哪、差异是不是噪声"
      标准误 = σ/√n  →  95% 区间 = 估计 ± 1.96 × 标准误  →  两个区间分得开吗?

拟合:从一组 (x, y) 点回答"y 和 x 是什么关系"
      最小二乘  →  幂律取对数变直线  →  L(N, D) = E + A/N^α + B/D^β  →  约束极值给出最优 N, D

2. 本文的章节安排

主题 内容
样本均值与标准误 从一个样本估真实值、估计有多准、中心极限定理
置信区间 1.96 从哪来、benchmark 的实际数字、两个模型怎么比、配对检验
假设检验与 p 值 含义、不是什么、多种子实验怎么报
最小二乘拟合 直线拟合、幂律与双对数坐标、非线性拟合
scaling law 算例 Chinchilla 的公式、代两组数字、约束极值与 \(D/N\)、拟合结果的不确定性
自测 五道题
系列总结  

二、样本均值与标准误

1. 从样本估真实值

评测集有 \(n\) 道题,模型答对了 \(k\) 道,正确率 \(\hat p = k / n\)。这个 \(\hat p\) 是估计值:如果换另外 \(n\) 道同类的题,结果会不一样。我们关心的是真实正确率 \(p\)——模型在”所有这类题”上的正确率——\(\hat p\) 只是它的一个带噪声的观测。

2. 标准误

第四篇算过:每道题对错是一次伯努利试验(方差 \(p(1 - p)\)),\(n\) 道题的平均 \(\hat p\) 的方差是 \(p(1 - p) / n\)。它的平方根叫 \(\hat p\) 的标准误(standard error):

\[\text{SE}(\hat p) = \sqrt{\frac{\hat p (1 - \hat p)}{n}}\]

(真实的 \(p\) 不知道,用 \(\hat p\) 代。)标准误是”估计值围绕真实值抖动的典型幅度”。它随 \(\sqrt{n}\) 缩小:题数翻四倍,标准误减半。

3. 中心极限定理

\(\hat p\) 是 \(n\) 个独立 0/1 之和除以 \(n\)。中心极限定理(第四篇)说:\(n\) 大时它近似高斯,均值 \(p\)、标准差 \(\text{SE}\)。于是高斯的那条性质可用——95% 的概率落在均值 \(\pm 1.96\) 个标准差内。

三、置信区间

1. 定义与 1.96

95% 置信区间

\[\hat p \pm 1.96 \times \text{SE}(\hat p)\]

读法:真实的 \(p\) 有 95% 的把握在这个范围里(严格说:按这个方法反复构造区间,95% 的区间会盖住真实值)。1.96 来自标准正态分布——\(P(-1.96 < Z < 1.96) = 0.95\)。想要 99% 就换 2.58,90% 换 1.64。

2. 常用 benchmark 的实际数字

Benchmark \(n\) 假设 \(\hat p\) 标准误 95% 区间半宽 两个模型独立比较时的显著差异
HumanEval 164 0.80 3.1% ±6.1% 约 8.7 个点
GSM8K 1319 0.90 0.8% ±1.6% 约 2.3 个点
MMLU 14042 0.70 0.4% ±0.8% 约 1.1 个点

算一行给你看(HumanEval):\(\text{SE} = \sqrt{0.8 \times 0.2 / 164} = \sqrt{0.000976} = 0.031\);区间半宽 \(1.96 \times 0.031 = 0.061\)。所以”HumanEval 80.0%”的真实含义是”真实正确率在 74% 到 86% 之间”。

3. 两个模型怎么比

独立比较:两个模型各有自己的估计与标准误,差值 \(\hat p_1 - \hat p_2\) 的标准误是 \(\sqrt{\text{SE}_1^2 + \text{SE}_2^2}\)(独立量之差的方差相加);两者都约 3.1% 时是 \(3.1\% \times \sqrt{2} = 4.4\%\),显著差异要 \(1.96 \times 4.4\% \approx 8.7\) 个点。表里最后一列就是这么算的。

结论直接而残酷:HumanEval 上差 3 个点在噪声范围内;GSM8K 上差 2 个点勉强;只有 MMLU 这种规模才能分辨 1 个点。

配对比较:两个模型如果在同一套题上评,可以逐题比较——看有多少题是”A 对 B 错”、多少是”A 错 B 对”(两个都对或都错的题不提供信息)。这叫配对检验(McNemar 检验是一种),比独立比较灵敏:两个模型答错的题高度重叠时,它们的差异主要来自少数几道”分歧题”,噪声比独立估计小。但结论的量级不变——164 道题分辨不出 3 个点,配对也分辨不出 1 个点。

4. 为什么读论文要保持怀疑

上表是 L5 评测系列与横切”实验方法论”里”差异多大才算显著”的数学来源,也是读论文时对”提升 1.5 个点”保持怀疑的依据:如果 benchmark 只有几百题、论文没报区间或多次运行的方差,那个 1.5 个点大概率是噪声。同一套工具还用在别处:多个随机种子的结果报均值与标准差;A/B 测试的显著性;scaling law 拟合参数的置信区间(第六章)。

四、假设检验与 p 值

1. 含义

假设检验把问题反过来问:”如果两个模型其实一样好(零假设),观察到这么大的差异有多大可能?”这个概率叫 p 值。p 值很小(惯例 < 0.05)说明”一样好”的假设与观测不符,拒绝它,宣布差异显著

它与置信区间是一回事的两种说法:差值的 95% 置信区间不包含 0 \(\Leftrightarrow\) p < 0.05。

2. 不是什么

三个常见误读:

  • p 值不是“零假设为真的概率”,而是”零假设为真时看到这种数据的概率”——条件反了(第四篇的贝叶斯公式说过两者不同);
  • p < 0.05 不是“效果大”,只是”差异不像噪声”;MMLU 上 1.1 个点可以显著,但意义要另论;
  • 不显著不是“没有差异”,只是”这么少的题分辨不出来”。

3. 多种子实验

训练本身有随机性(初始化、数据顺序、dropout),同一个配方跑两次结果不同。报一个数字是不够的:跑 3–5 个种子,报均值 ± 标准差,两个配方的差异要大于各自标准差的量级才可信。这是横切”实验方法论”的核心规则之一,数学根源就是本章。

五、最小二乘拟合

1. 直线拟合

有一组点 \((x_i, y_i)\),想找一条直线 \(y = a x + b\) 尽量穿过它们。”尽量”的标准是最小二乘:让所有点到直线的竖直距离的平方和最小,

\[\min_{a, b} \sum_i (y_i - a x_i - b)^2\]

对 \(a, b\) 求导令为零(第七篇的工具),得到闭式解——任何统计库一行代码。平方和让大偏差被重罚、小偏差几乎不计,与第二篇的 \(L_2\) 范数是同一个偏好。

2. 幂律与双对数坐标

scaling law 的形式是幂律 \(y = c\, x^{-\alpha}\):loss 随参数量按某个负指数下降。两边取对数:

\[\log y = \log c - \alpha \log x\]

——在双对数坐标上是一条直线,斜率是 \(-\alpha\)。这是为什么 scaling law 的图横纵轴都是对数刻度:幂律在那里是直线,直线可以用上一节的最小二乘拟合,斜率就是指数。看到一张双对数图上的直线,读它的斜率就读出了”规模翻十倍 loss 降多少”:斜率 \(-0.07\) 意味着参数量 ×10,loss ×\(10^{-0.07} = 0.85\)。

3. 非线性拟合

\(L(N, D) = E + A/N^\alpha + B/D^\beta\) 有五个未知常数,且不能整体取对数变成直线(有常数项 \(E\))。这类问题用非线性最小二乘:从一个初始猜测出发,用梯度法迭代地调五个常数让残差平方和最小——就是第七篇的梯度下降用在”拟合”上。Chinchilla 实际用的是 Huber loss(对离群点不那么敏感的平方和变体)和 L-BFGS 优化器,细节不重要,重要的是:拟合就是最小化一个 loss,与训练模型是同一件事

六、scaling law 算例

1. Chinchilla 的公式

Chinchilla(Hoffmann 等 2022)拟合的形式是

\[L(N, D) = E + \frac{A}{N^\alpha} + \frac{B}{D^\beta}\]

\(N\) 是参数量,\(D\) 是训练 token 数。三项各有含义:\(E\) 是不可约的损失——数据本身的熵(第六篇第三章),模型再大数据再多也降不到它以下;\(A/N^\alpha\) 是模型太小带来的损失,随 \(N\) 幂律下降;\(B/D^\beta\) 是数据太少带来的损失,随 \(D\) 幂律下降。论文用几百组 \((N, D, L)\) 的实验点拟出:

\[E = 1.69, \quad A = 406.4, \quad B = 410.7, \quad \alpha = 0.34, \quad \beta = 0.28\]

2. 代两组数字

\(N = 8\text{B}\):

A / N^α  = 406.4 / (8×10⁹)^0.34   = 406.4 / 2326  = 0.175
D = 160 B(Chinchilla 最优的 20 倍):  B / D^β = 410.7 / (1.6×10¹¹)^0.28 = 410.7 / 1372 = 0.299
  L ≈ 1.69 + 0.175 + 0.299 = 2.16
D = 15 T(Llama-3 的实际用量):       B / D^β = 410.7 / (1.5×10¹³)^0.28 = 410.7 / 4886 = 0.084
  L ≈ 1.69 + 0.175 + 0.084 = 1.95

多花 94 倍的训练数据(160B → 15T)换 0.21 nat。值不值?取决于推理成本:一个 8B 模型每次推理比”同样 loss 但更大的模型”便宜得多,如果模型要被调用几万亿次,训练时多花的算力很快回本。这就是 Llama-3 选择”过训练”(训练远超 Chinchilla 最优的 token 数)的算术,L4 预训练系列的第二篇展开。注意这组常数拟合自 Chinchilla 自己的数据与分词器,对其他模型只有量级上的参考价值——上面两个数字是”用公式做算术”,不是 Llama-3 真实的 loss。

3. 约束极值:算力固定时 \(N\) 与 \(D\) 怎么配

训练算力约为 \(C \approx 6ND\)(第一篇:前向 \(2N\),反向 \(4N\),乘 \(D\) 个 token)。问:算力 \(C\) 固定,\(N\) 和 \(D\) 怎么分配让 \(L\) 最小?这是第七篇第七章的带约束极值,用拉格朗日乘子:

\[\mathcal{L}(N, D, \lambda) = E + \frac{A}{N^\alpha} + \frac{B}{D^\beta} - \lambda\,(6ND - C)\]

对 \(N\)、\(D\) 求导令为零,两式相除消去 \(\lambda\),得到最优点的条件

\[\alpha \frac{A}{N^\alpha} = \beta \frac{B}{D^\beta}\]

——”模型太小的损失”与”数据太少的损失”按 \(\alpha : \beta\) 的比例平衡。代入 \(C = 6ND\) 解出

\[N_{\text{opt}} \propto C^{\,\beta / (\alpha + \beta)} = C^{\,0.45}, \qquad D_{\text{opt}} \propto C^{\,\alpha / (\alpha + \beta)} = C^{\,0.55}\]

算力翻倍时参数量和数据量应该差不多同步增长(指数都接近 0.5)——这是 Chinchilla 的核心结论,推翻了之前”算力主要该花在更大的模型上”的做法。\(D / N \approx 20\) 是他们在实验规模(几亿到几百亿参数)上用另外两种更直接的方法(固定 \(N\) 扫 \(D\) 看最优点;固定算力扫 \(N\) 看最优点)得到的经验比例,70B 参数对应 1.4T token。

4. 拟合结果的不确定性

一个诚实的注脚:如果把上面那组常数直接代进第 3 节的条件 \(\alpha A / N^\alpha = \beta B / D^\beta\) 解 \(D/N\),得到的比例远大于 20——参数式拟合(论文的第三种方法)与前两种实验方法的结论并不完全一致,后来的复现工作指出这组常数的估计有偏、且给出的置信区间很宽。这恰好是本章的教训:拟合出来的常数是估计值,有标准误;用它们外推到实验范围之外(比如从几百亿参数外推到几千亿)时,不确定性会被放大。读 scaling law 的论文,看指数的置信区间、看拟合点的范围,与看 benchmark 的置信区间是同一种习惯。

七、自测

  1. 一个 500 题的评测,模型正确率 60%,95% 置信区间是多少?
  2. 上题里两个独立模型分别得 60% 和 65%,差异显著吗?
  3. 同一套 500 题,A 对 B 错的有 40 题、A 错 B 对的有 15 题,其余两者一致:这个差异比第 2 题的独立比较更可信还是更不可信?为什么?
  4. 双对数图上一条斜率 \(-0.1\) 的直线:参数量翻 100 倍,loss 变成原来的多少?
  5. 用 Chinchilla 的公式:\(N = 70\text{B}\)、\(D = 1.4\text{T}\) 时三项各是多少、\(L\) 是多少?(\(70 \times 10^9\) 的 0.34 次方约 4855,\(1.4 \times 10^{12}\) 的 0.28 次方约 2510。)

答案要点:(1)\(\text{SE} = \sqrt{0.6 \times 0.4 / 500} = 2.2\%\),区间 \(60\% \pm 4.3\%\)。(2)差值 5 个点,差值的 SE \(\approx \sqrt{2.2^2 + 2.1^2} = 3.0\%\),\(1.96 \times 3.0 = 5.9\) 个点——不显著(勉强)。(3)更可信:分歧题 55 道里 40 : 15 的偏向,在”两者一样好”(应为 27.5 : 27.5)的假设下概率很小;配对检验只看分歧题,噪声更小。(4)\(100^{-0.1} = 10^{-0.2} = 0.63\)。(5)\(A/N^\alpha = 0.084\),\(B/D^\beta = 0.164\),\(L \approx 1.69 + 0.084 + 0.164 = 1.94\)。

八、系列总结

这是《算法工程师的数学》的最后一篇。八篇走完,回头看那四个分支各留下了什么:

线性代数   形状规则 [m,k]×[k,n]→[m,n] · 成本 2mnk · 一个 token 过模型 ≈ 2N FLOPs
           内积 = 长度 × 长度 × cos θ · 范数的三个身份 · 余弦只比方向
           正交保内积 → RoPE 只看 n−m · SVD = 旋转·拉伸·旋转 → 低秩近似 → LoRA 0.52%

概率       分布非负和为 1 · p(a,b) = p(a|b)p(b) · 贝叶斯翻转条件
           链式法则 → 语言模型 = Π p(x_t | x_<t) 的参数化 → next-token · 逐 token 生成 · KV cache
           独立和的方差相加 → 初始化 1/√d · 扩散一步到位 · attention 除 √d_k
           MLE 三步 → 每 token 负对数似然 = 交叉熵 · 初始 loss = ln V · softmax · 温度改变分布

信息论     H(p,q) = H(p) + KL · one-hot 时交叉熵 = −log q · loss 降不到数据的熵以下
           KL 不对称:forward 覆盖、reverse 收窄 → RLHF 的 KL 项让模型变保守
           Bradley-Terry → 奖励模型 = 逻辑回归 · KL 约束闭式解 → 反解奖励 → DPO
           总变差 → 投机解码接受率 · 互信息 → 对比学习

微积分     梯度与参数同形、指向增长最快方向 · 链式法则 → 反向传播
与优化     softmax + CE 的梯度 = p − y · 期望的梯度 → 策略梯度 → baseline 不改期望 → PPO / GRPO
           θ ← θ − η∇L · 噪声 ∝ 1/B · warmup · 拉格朗日乘子

统计推断   SE = σ/√n · 95% = ±1.96 SE · HumanEval 分辨不出 3 个点 · 配对更灵敏 · p 值不是什么
           最小二乘 · 幂律在双对数上是直线 · L = E + A/N^α + B/D^β · N, D 同步增长 · 拟合常数有标准误

总纲里那八个公式,现在每一个都能对到某一篇的某一节。回去把那张表过一遍:每个符号知道是什么、每一步等号知道为什么、能说出它在算什么——八个都行,L0 就够了,可以进入 L1《算法工程师的工具箱》;卡在哪一个,回到对应的那一篇。

这一层是整张地图的地基。它不难,但没有它,后面每一层的公式都只能靠背。有了它,后面的每一层都只是把这八篇的东西再用一次

本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/statistical-inference-and-fitting-scaling-laws.html)的前提下,欢迎各种形式的转载、翻译或商业引用。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×