系列 《算法工程师的数学:读公式不卡壳的最小集》 第 8 / 9 篇
“我们的模型在 HumanEval 上比基线高 3 个点。”这句话是不是一个结论?这一篇给出判断它的工具:置信区间与显著性。它们来自第四篇的两条性质——样本均值的标准差是 \(\sigma / \sqrt{n}\)、大量独立量之和近似高斯——加上一个数字 1.96。然后讲另一件”从一组数字里找规律”的事:拟合。scaling law 那些漂亮的曲线是怎么从几十个实验点拟出来的、为什么画在双对数坐标上、以及 Chinchilla 的”每个参数配 20 个 token”是怎么算出来的。
这一篇的每个概念都用模拟来看:统计里”标准误”、”95%”、”p 值”这些词说的都是”如果把同一件事重复做一万次会怎样”——那就真的重复一万次,画出来。全部数字与图由 math-for-ai/08_inference_and_fitting.py 生成;第四章的多种子实验是实跑的 20 次训练(08_multi_seed.py);第六章的幂律拟合用的是 labs 里 7 个真实训练的小模型的 loss。
全篇的核心问题是:
HumanEval 上差 3 个点算不算提升?1 scaling law 的曲线是怎么拟出来的、\(D/N \approx 20\) 从哪来?2
一、总览
1. 两件事
| 问题 | 工具链 | 章 | |
|---|---|---|---|
| 推断 | 从一个样本回答”真实值在哪、差异是不是噪声” | 标准误 \(= \sqrt{p(1-p)/n}\) → 95% 区间 = 估计 ± 1.96 × 标准误 → 两个区间分得开吗 / 配对检验 / p 值 → 多种子实验 | 二、三、四 |
| 拟合 | 从一组 \((x, y)\) 点回答”\(y\) 和 \(x\) 是什么关系” | 最小二乘 → 幂律取对数变直线 → 拟合常数的置信区间与外推 → \(L(N, D) = E + A/N^\alpha + B/D^\beta\) → 约束极值给出最优 \(N, D\) | 五、六 |
2. 本文的章节安排
| 章 | 主题 | 内容 |
|---|---|---|
| 二 | 样本均值与标准误 | 抽样噪声长什么样(同一个模型评 1000 次)、标准误、中心极限定理(画出来) |
| 三 | 置信区间 | 100 个区间里 95 个盖住真值、1.96 从哪来、benchmark 的实际数字、两个模型怎么比(独立 vs 配对的模拟) |
| 四 | 假设检验与 p 值 |
|
| 五 | 最小二乘拟合 | 5 个点手算直线、残差、幂律与双对数坐标、非线性拟合 |
| 六 | scaling law 算例 | 7 个真实小模型的幂律拟合与 bootstrap 区间、外推的风险;Chinchilla 的公式、代两组数字、等 loss 线与等算力线相切、\(D/N\) |
| 七 | 案例:论文说提升了 1.5 个点,信不信 | 一张检查表 |
| 八 | 本文小结 | |
| 九 | 自测 | 七道题 |
二、样本均值与标准误
1. 从样本估真实值
评测集有 \(n\) 道题,模型答对了 \(k\) 道,正确率 \(\hat p = k / n\)。这个 \(\hat p\) 是估计值:如果换另外 \(n\) 道同类的题,结果会不一样。我们关心的是真实正确率 \(p\)——模型在”所有这类题”上的正确率——\(\hat p\) 只是它的一个带噪声的观测。
“会不一样”到什么程度?直接模拟:假设一个模型的真实正确率是 80%,给它出 164 道题(HumanEval 的题数)评一次,记下正确率;再换 164 道题评一次……评 1000 次(noise 段):
同一个模型、同样的真实水平 80%,在 HumanEval 上一次评测能落在 0.70 到 0.89 之间。评出 0.85 和评出 0.75 的可能是同一个模型。这就是抽样噪声——本章的全部内容是给这团散布一个数字。
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\) 代。)标准误就是上图那团散布的标准差——”估计值围绕真实值抖动的典型幅度”。模拟与公式对得上:
| \(n\) | 1000 次评测的正确率标准差(模拟) | \(\sqrt{0.8 \times 0.2 / n}\)(公式) | 最低 – 最高 |
|---|---|---|---|
| 164 | 0.0310 | 0.0312 | 0.701 – 0.890 |
| 1319 | 0.0108 | 0.0110 | 0.766 – 0.836 |
| 14042 | 0.0035 | 0.0034 | 0.789 – 0.810 |
它随 \(\sqrt{n}\) 缩小:题数翻四倍,标准误减半;从 164 到 14042 题数翻了 86 倍,标准误缩了 9 倍。
3. 中心极限定理
\(\hat p\) 是 \(n\) 个独立 0/1 之和除以 \(n\)。中心极限定理(第四篇)说:\(n\) 大时它近似高斯,均值 \(p\)、标准差 \(\text{SE}\)。把 \(n\) 从 1 加到 100 画出来(clt 段):
\(n = 1\) 时平均值只能是 0 或 1;\(n = 3\) 时是 0、1/3、2/3、1 四种;\(n = 10\) 时已经有钟形的轮廓;\(n = 100\) 时与高斯曲线几乎重合。不管每道题的对错是多么”非高斯”的 0/1,很多道题的平均一定近似高斯——这就是中心极限定理,于是高斯的那条性质可用:95% 的概率落在均值 \(\pm 1.96\) 个标准差内。
三、置信区间
1. 定义与 1.96
95% 置信区间是
\[\hat p \pm 1.96 \times \text{SE}(\hat p)\]读法:真实的 \(p\) 有 95% 的把握在这个范围里。严格的说法要小心一点——真实值 \(p\) 是一个固定的数,不会”有 95% 的概率在哪”;抖动的是区间。正确的读法是:按这个方法反复构造区间,95% 的区间会盖住真实值。模拟 100 次(ci 段):
100 根线里 94 根盖住了 0.8,6 根(红色)没有——与”95%”相符。注意红线不是”算错了”,它们是正常的 5%:任何一次评测的区间都可能是那 5% 之一,你不知道自己拿到的是哪一种。
1.96 来自标准正态分布——右图中间 95% 面积的边界:\(P(-1.96 < Z < 1.96) = 0.95\),两侧各留 2.5%。想要 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\) 个点。表里最后一列就是这么算的。
模拟看一遍(compare 段):模型 A 真实正确率 80%、模型 B 77%——A 确实比 B 好 3 个点。各自在 164 道题上评一次、相减,重复 5000 次:
观测到的差平均 0.029(对,真实差就是 0.03),但标准差 0.046——24% 的次数 B 反而看起来更高,只有 10% 的次数能”显著地”判出 A 更好。结论直接而残酷:HumanEval 上差 3 个点在噪声范围内;GSM8K 上差 2 个点勉强;只有 MMLU 这种规模才能分辨 1 个点。
配对比较:两个模型如果在同一套题上评,可以逐题比较——看有多少题是”A 对 B 错”、多少是”A 错 B 对”(两个都对或都错的题不提供信息)。这叫配对检验(McNemar 检验是一种),比独立比较灵敏:两个模型答错的题高度重叠时,它们的差异主要来自少数几道”分歧题”,噪声比独立估计小。上图右边模拟了四种重叠程度:错题几乎不重叠时(\(\rho = 0\),平均 55 道分歧题)配对与独立一样只有 9% 能判出;错题高度重叠时(\(\rho = 0.95\),平均 13 道分歧题)升到 26%。所以”164 题分辨不出 3 个点”是独立比较的结论,配对时要看分歧计数,不能一概而论;配对能分辨多细,边界是分歧题数,不是总题数。
McNemar 的算法很简单:分歧题里 A 独对 \(n_{10}\) 道、B 独对 \(n_{01}\) 道,若两者一样好,这两个数应该差不多,\(z = (n_{10} - n_{01}) / \sqrt{n_{10} + n_{01}}\) 超过 1.96 才显著。A 独对 12、B 独对 7:\(z = 5 / \sqrt{19} = 1.15\),不显著;A 独对 5、B 独对 0:精确双侧 \(p = 2 \times 0.5^5 = 0.0625\),接近显著。
4. 为什么读论文要保持怀疑
上表是 L5 评测系列与横切”实验方法论”里”差异多大才算显著”的数学来源,也是读论文时对”提升 1.5 个点”保持怀疑的依据:如果 benchmark 只有几百题、论文没报区间或多次运行的方差,那个 1.5 个点大概率是噪声。同一套工具还用在别处:多个随机种子的结果报均值与标准差;A/B 测试的显著性;scaling law 拟合参数的置信区间(第六章)。
四、假设检验与 p 值
1. 含义
假设检验把问题反过来问:”如果两个模型其实一样好(零假设),观察到这么大的差异有多大可能?”这个概率叫 p 值。p 值很小(惯例 < 0.05)说明”一样好”的假设与观测不符,拒绝它,宣布差异显著。
p 值可以不用任何公式直接算出来——置换检验(pvalue 段):拿一次真实的配对评测(A 对 142 题 = 0.866,B 对 138 题 = 0.841,差 0.024),如果两个模型真的一样好,那么每道题上”谁对谁错”的标签是可以互换的。随机交换每道题两个模型的答案,重新算差值,做 10,000 次:
实际观测到的 0.024 落在这个分布的中间——两侧比它更极端的占 53.6%。p = 0.54:两个模型一样好时,这么大的差每两次就出现一次,什么都说明不了。如果观测到的差落在分布的尾巴上(比如 0.08,比它更极端的只占 1%),p = 0.01,才能说”不像噪声”。
它与置信区间是一回事的两种说法:差值的 95% 置信区间不包含 0 \(\Leftrightarrow\) p < 0.05(同一种检验、同一种区间构造下)。注意这里说的是差值的区间——”两个模型各自的区间重叠”不能推出差异不显著:两个区间半宽各 3 个点、中心差 5 个点,看起来重叠,差值的半宽却只有 \(3\sqrt{2} \approx 4.2\),差异是显著的。
2. 不是什么
三个常见误读,各配一个数字:
- p 值不是“零假设为真的概率”,而是”零假设为真时看到这种数据的概率”——条件反了(第四篇的贝叶斯公式说过两者不同)。上面 p = 0.54 不是说”两个模型有 54% 的概率一样好”,而是”若一样好,有 54% 的概率看到 ≥ 0.024 的差”。
- p < 0.05 不是“效果大”,只是”差异不像噪声”。MMLU 上 1.1 个点可以显著(题多,噪声小),但 1.1 个点的意义要另论。
- 不显著不是“没有差异”,只是”这么少的题分辨不出来”。上面模拟里 A 确实比 B 好 3 个点,164 题上 90% 的次数都”不显著”。
3. 多种子实验:实跑 20 次训练
训练本身有随机性(初始化、数据顺序、dropout),同一个配方跑两次结果不同。报一个数字是不够的:跑 3–5 个种子,报均值 ± 标准差。多大的差算差?用一个实跑的例子(08_multi_seed.py):在莎士比亚字符数据上训一个 0.1M 参数的小 GPT 400 步,四个配方各 5 个种子:
| 配方 | 改动 | val loss(5 种子均值 ± 标准差) | 与 A 的差 | 差值的标准误 | \(t\) | p(Welch t 检验) | 结论 |
|---|---|---|---|---|---|---|---|
| A | 基线:lr \(10^{-3}\),wd 0.01 | 2.3370 ± 0.0027 | — | ||||
| B | weight decay 0.01 → 0.1 | 2.3454 ± 0.0025 | +0.0084 | 0.0016 | 5.1 | 0.001 | 显著变差 |
| C | lr +2% | 2.3308 ± 0.0055 | −0.0062 | 0.0028 | 2.3 | 0.066 | 分不出来 |
| D | lr +20% | 2.3050 ± 0.0139 | −0.0320 | 0.0063 | 5.1 | 0.006 | 显著变好 |
三个读法:
- 种子噪声有多大:同一配方 5 个种子的 val loss 标准差 0.003–0.014,D 的最好与最差种子差 0.03。所以两个配方各跑一个种子相差 0.01,什么都说明不了。
- 差值的标准误:\(\sqrt{s_A^2 / 5 + s_B^2 / 5}\),与 \(t\) = 差值 / 标准误。\(t\) 到 5 是”差 5 个标准误”,噪声几乎不可能造出来;\(t = 2.3\) 在边界上。C 的 +2% 学习率:5 种子均值好了 0.006,但如果 A、C 各只跑一个种子再相减,25 种组合里有 8% 的组合符号是反的——这就是单种子对比会得出相反结论的例子。
- 多少种子够:看差值的标准误相对差值有多大——要它降到差值的一半以下。C 要判出来大概需要 20 个种子;D 用 3 个种子就够了。
这是横切”实验方法论”的核心规则之一,数学根源就是本章。
五、最小二乘拟合
1. 直线拟合
有一组点 \((x_i, y_i)\),想找一条直线 \(y = a x + b\) 尽量穿过它们。”尽量”的标准是最小二乘:让所有点到直线的竖直距离(残差)的平方和最小,
\[\min_{a, b} \sum_i (y_i - a x_i - b)^2\]对 \(a, b\) 求导令为零(上一篇的工具),得到闭式解:
\[a = \frac{\sum_i (x_i - \bar x)(y_i - \bar y)}{\sum_i (x_i - \bar x)^2}, \qquad b = \bar y - a \bar x\]用 5 个点手算一遍(lsq 段):\(x = (1, 2, 3, 4, 5)\),\(y = (2.5, 3.6, 6.4, 7.5, 10.4)\)。\(\bar x = 3\),\(\bar y = 6.08\);\(\sum (x - \bar x)(y - \bar y) = 19.70\),\(\sum (x - \bar x)^2 = 10\);所以 \(a = 1.97\),\(b = 6.08 - 1.97 \times 3 = 0.17\)。numpy.polyfit 给出同样的 \((1.97, 0.17)\)。
红色竖线是残差,平方和 0.939——换任何别的直线平方和都更大(图中虚线 2.38)。平方和让大偏差被重罚、小偏差几乎不计,与第二篇的 \(L_2\) 范数是同一个偏好。任何统计库一行代码,但要知道它在做什么:拟合就是最小化一个 loss(残差平方和),与训练模型是同一件事,只是参数只有两个、有闭式解。
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\)。
左图的六个点和右图的六个点是同一组数据。左边只能看出”越来越平”,右边一眼看出它们在一条直线上,斜率 \(-0.3\) 就是指数 \(\alpha\)——这也是判断”这组数据是不是幂律”的最简单办法:画到双对数坐标上,直不直。
3. 非线性拟合
\(L(N, D) = E + A/N^\alpha + B/D^\beta\) 有五个未知常数,且不能整体取对数变成直线(有常数项 \(E\))。这类问题用非线性最小二乘:从一个初始猜测出发,用梯度法迭代地调五个常数让残差平方和最小——就是上一篇的梯度下降用在”拟合”上。Chinchilla 实际用的是 Huber loss(对离群点不那么敏感的平方和变体)和 L-BFGS 优化器,细节不重要,重要的是:拟合就是最小化一个 loss,与训练模型是同一件事。
六、scaling law 算例
1. 先拟一条自己的:7 个真实小模型
labs 的 scaling_law_fit.py 在 CPU 上训了 7 个尺寸的字符级 Transformer(非 embedding 参数 14K 到 889K,每个训 10.2M token),记下 final loss。用前 6 个点在双对数坐标上拟直线、外推第 7 个(powerlaw 段):
| 结果 | |
|---|---|
| 双对数直线斜率 | \(-0.104\),即 \(\alpha = 0.104\):参数 ×10,loss ×\(10^{-0.104} = 0.79\) |
| \(\alpha\) 的 95% 区间(bootstrap 5000 次) | [0.101, 0.107]——很窄 |
| 外推到第 7 个模型(\(N\) = 889K,实测 1.3415) | 直线预测 1.296,95% 区间 [1.286, 1.305]——实测值在区间外,误差 −0.045 |
| 带不可约项的三参数拟合 \(E + A/N^\alpha\) | \(E = 0.62\),\(\alpha = 0.166\);外推第 7 点 1.317,误差 −0.025 |
两个教训比数字本身重要。第一,区间窄不等于对。 bootstrap 的区间只回答”如果噪声重来一遍,拟出的直线会抖多少”——6 个点几乎在一条直线上,抖得很少,区间就很窄。但第 7 个点还是落在了区间外:误差不来自噪声,来自公式的形式——loss 不会无限下降(数据本身有熵,第六篇),纯幂律没有这一项,往大模型外推必然越来越乐观。加上 \(E\) 项后外推误差减半。第二,外推越远越不可信。 就算形式对,再往外 ×10 时区间也在张开(右图),而真实工作里 scaling law 要从几亿参数外推到几千亿——三个数量级。读 scaling law 的论文,看指数的置信区间、看拟合点的范围、看有没有留出验证点,与看 benchmark 的置信区间是同一种习惯。
2. 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\]3. 代两组数字
\(N = 8\text{B}\) 时 \(A / N^\alpha = 406.4 / (8 \times 10^9)^{0.34} = 406.4 / 2326 = 0.175\),两种数据量:
| \(D\) | \(B / D^\beta\) | \(L = 1.69 + 0.175 + B/D^\beta\) |
|---|---|---|
| 160B(Chinchilla 最优的 20 倍) | \(410.7 / (1.6 \times 10^{11})^{0.28} = 410.7 / 1372 = 0.299\) | 2.16 |
| 15T(Llama-3 的实际用量) | \(410.7 / (1.5 \times 10^{13})^{0.28} = 410.7 / 4886 = 0.084\) | 1.95 |
多花 94 倍的训练数据(160B → 15T)换 0.21 nat。值不值?取决于推理成本:一个 8B 模型每次推理比”同样 loss 但更大的模型”便宜得多,如果模型要被调用几万亿次,训练时多花的算力很快回本。这就是 Llama-3 选择”过训练”(训练远超 Chinchilla 最优的 token 数)的算术,L4 预训练系列的第三篇展开。注意这组常数拟合自 Chinchilla 自己的数据与分词器,对其他模型只有量级上的参考价值——上面两个数字是”用公式做算术”,不是 Llama-3 真实的 loss。
4. 约束极值:算力固定时 \(N\) 与 \(D\) 怎么配
训练算力约为 \(C \approx 6ND\)(第一篇:前向 \(2N\),反向 \(4N\),乘 \(D\) 个 token)。问:算力 \(C\) 固定,\(N\) 和 \(D\) 怎么分配让 \(L\) 最小?先看图(chinchilla 段):
灰线是 \(L\) 相等的点(等 loss 线),彩线是算力相等的点(\(6ND = C\),双对数坐标上是斜率 −1 的直线)。沿一条等算力线走——参数多一点、数据少一点,或反过来——loss 先降后升,最低点是它与等 loss 线相切的地方,与上一篇拉格朗日乘子那张图是同一个几何。这是上一篇第七章的带约束极值:
\[\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。
5. 拟合结果的不确定性
一个诚实的注脚:图上三个相切点的 \(D/N\) 分别是 51、77、124——如果把那组常数直接代进上面的条件解 \(D/N\),得到的比例远大于 20。参数式拟合(论文的第三种方法)与前两种实验方法的结论并不完全一致,后来的复现工作(Besiroglu 等 2024)指出这组常数的估计有偏、且给出的置信区间很宽。这恰好是第 1 节的教训在真实论文里的样子:拟合出来的常数是估计值,有标准误,还依赖公式形式;用它们外推到实验范围之外时,不确定性会被放大。
七、案例:论文说提升了 1.5 个点,信不信
把本文的工具排成一张检查表。读到”我们的方法在 X 上比基线高 1.5 个点”时按顺序问:
| 问 | 怎么算 | 例 |
|---|---|---|
| 1. benchmark 有多少题? | 标准误 \(\approx \sqrt{p(1-p)/n}\) | 164 题、\(p \approx 0.8\):3.1 个点;1.5 个点连半个标准误都不到 |
| 2. 是独立比较还是配对? | 独立:差值 SE = \(\sqrt{2} \times\) 单个 SE;配对:看分歧题数 | 独立比较 164 题上要差 8.7 个点才显著 |
| 3. 报了区间 / 标准差 / 多次运行吗? | 没报就按第 1 问自己算 | 大多数论文表格没有 |
| 4. 采样设置固定了吗? | 温度、top-p、few-shot 数、prompt 格式不同就是不同的分布(第五篇) | “greedy” 与 “temperature 0.6” 的分数不能直接比 |
| 5. 是一次训练的结果还是多种子? | 训练随机性的标准差可能与提升同量级(第四章第 3 节) | 单种子 +2% 学习率的对比有 8% 的概率符号是反的 |
| 6. 在多少个 benchmark 上比? | 20 个 benchmark 里总有一个碰巧显著(多重比较) | 只报最好的那个是常见操作 |
| 7. 如果是 scaling 曲线,拟合点的范围?外推了几个数量级? | 第六章第 1 节 | 6 个点、外推一档就偏了 0.045 |
七问下来,”HumanEval 上 +1.5 个点、单次运行、没报区间”基本可以当作没有结论;”MMLU 上 +1.5 个点、5 个种子均值、报了标准差 0.3”则值得认真对待。这不是苛刻——是把”噪声有多大”算出来之后的正常反应。
八、本文小结
- 抽样噪声:真实 80% 的模型在 164 题上一次评测能落在 0.70–0.89;标准误 \(\sqrt{p(1-p)/n}\) 就是这团散布的标准差(模拟 0.031,公式 0.031),随 \(\sqrt n\) 缩小。中心极限定理:很多个 0/1 的平均近似高斯,\(n = 100\) 时已与钟形重合。
- 95% 置信区间 = 估计 ± 1.96 × SE;正确读法是”反复构造,95% 的区间盖住真值”(模拟 100 个,94 个盖住)。1.96 是标准正态中间 95% 的边界。
- 两个模型怎么比:独立比较时差值 SE 是 \(\sqrt 2\) 倍——真差 3 个点,164 题上 24% 的次数看起来反而是 B 更好;配对比较看分歧题数,错题重叠越多越灵敏(9% → 26%)。
- p 值是”零假设为真时看到这种数据的概率”,置换检验能直接算(打乱标签 10000 次);不是”零假设为真的概率”,不是”效果大”,不显著不是”没差异”。
- 多种子:实跑 20 次训练,同配方种子标准差 0.003–0.014;+20% 学习率 \(t = 5\) 显著,+2% 学习率 \(t = 2.3\) 分不出来、单种子对比 8% 会反向。看差值的标准误相对差值的大小决定要几个种子。
- 最小二乘:残差平方和最小,\(a = \sum(x - \bar x)(y - \bar y) / \sum(x - \bar x)^2\),5 个点手算 =
polyfit;幂律在双对数坐标上是直线,斜率是指数。 - scaling law 拟合:7 个真实小模型,\(\alpha = 0.104\),bootstrap 区间很窄但第 7 点落在区间外——误差来自公式形式(缺 \(E\) 项)不是噪声;外推越远越不可信。Chinchilla \(L = E + A/N^\alpha + B/D^\beta\),等 loss 线与等算力线相切给出最优 \(N, D \propto C^{0.5}\);\(D/N \approx 20\) 是实验值,参数式拟合给出的比例更大且区间很宽。
- 读一个”提升”:题数 → 独立还是配对 → 有没有区间 → 采样设置 → 单种子还是多种子 → 多重比较 → 外推范围。
九、自测
-
一个 500 题的评测,模型正确率 60%,95% 置信区间是多少?
答案
\(\text{SE} = \sqrt{0.6 \times 0.4 / 500} = 2.2\%\),区间 \(60\% \pm 4.3\%\)。
-
上题里两个独立模型分别得 60% 和 65%,差异显著吗?
答案
差值 5 个点,差值的 SE \(\approx \sqrt{2.2^2 + 2.1^2} = 3.0\%\),\(1.96 \times 3.0 = 5.9\) 个点——不显著(勉强)。
-
同一套 500 题,A 对 B 错的有 40 题、A 错 B 对的有 15 题,其余两者一致:这个差异比第 2 题的独立比较更可信还是更不可信?为什么?
答案
更可信:分歧题 55 道里 40 : 15 的偏向,\(z = 25 / \sqrt{55} = 3.4\),在”两者一样好”(应为 27.5 : 27.5)的假设下概率很小;配对检验只看分歧题,噪声更小。
-
一个同事说:”我把置信区间算出来了,真实正确率有 95% 的概率在 74% 到 86% 之间。”这句话哪里不严谨?
答案
真实正确率是一个固定的数,不是随机的;随机的是区间。严格说法是”按这个方法反复构造区间,95% 的区间会盖住真实值”——他手里这一个区间要么盖住了要么没有,只是不知道是哪种。日常交流里第一种说法通常无害,但要知道它的严格含义,否则容易滑向第四章第 2 节里”p 值是零假设为真的概率”那类条件反了的误读。
-
双对数图上一条斜率 \(-0.1\) 的直线:参数量翻 100 倍,loss 变成原来的多少?如果作者只用 3 个数量级内的点拟出这条线,再往外推 2 个数量级,你会担心什么?
答案
\(100^{-0.1} = 10^{-0.2} = 0.63\)。担心两件事:噪声导致的斜率误差在外推时被放大(bootstrap 区间张开);更重要的是公式形式——纯幂律没有不可约项 \(E\),loss 不会无限下降,外推必然偏乐观(第六章第 1 节第 7 个点的例子)。
-
用 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。)
答案
\(A/N^\alpha = 0.084\),\(B/D^\beta = 0.164\),\(L \approx 1.69 + 0.084 + 0.164 = 1.94\)。
-
你改了一个超参,跑了一个种子,val loss 从 2.337 降到 2.331。要不要把它写进配方?
答案
不要(还)。第四章的实跑里同配方种子间的标准差就有 0.003–0.014,0.006 的差在噪声范围内;+2% 学习率的例子正好是这个量级,5 个种子的 \(t = 2.3\)、p = 0.07,单种子对比有 8% 的概率符号反过来。至少各跑 3–5 个种子,看差值相对差值标准误有多大。
配套代码:math-for-ai/08_inference_and_fitting.py(抽样噪声、CLT、置信区间、独立 vs 配对、置换检验、最小二乘、幂律 bootstrap、Chinchilla 等高线)与 08_multi_seed.py(20 次实跑训练);输出在 expected/。
-
分辨不出。164 题、准确率约 50% 时,标准误 \(\sqrt{0.5 \times 0.5 / 164} \approx 3.9\) 个点,95% 区间约 \(\pm 7.7\) 个点——3 个点在噪声里;模拟里真差 3 个点的两个模型,24% 的次数看起来是差的那个更高。配对比较(同一批题两个模型各自对错)比独立比较灵敏得多,是正确的做法。详见第二至四章。 ↩
-
把 \((N, D, L)\) 的实验点代入 \(L = E + A/N^\alpha + B/D^\beta\),在双对数坐标上幂律是直线,最小二乘拟出五个常数。\(D/N \approx 20\):固定算力 \(C = 6ND\),用拉格朗日乘子对 \(L\) 求极值——几何上是等 loss 线与等算力线相切——得到 \(N^*, D^*\) 都随 \(C\) 的约 0.5 次幂增长,比值由 \(A, B, \alpha, \beta\) 决定——Chinchilla 用实验方法得到约 20;拟合常数有标准误、依赖公式形式,所以 20 是一个区间不是常数。详见第五章、第六章。 ↩
系列 《算法工程师的数学:读公式不卡壳的最小集》 第 8 / 9 篇
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/statistical-inference-and-fitting-scaling-laws.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。