实验课:在我们自己的小模型上拟一条缩放律
这是一堂实验课:第三层交互,真数据。前四课用的是别人公开的实验点;这一课换成我们自己从 0 训练的 minillm,在同一台机器上跑出来的真实日志。
本课的问题:缩放律那几条结论,在我们这个小得多的尺度上还成立吗?尤其是——我们的语料只有 501,615 个训练 token。
实验是怎么设计的
对应 04-实践项目/MILESTONES.md 的「C8 规模(scaling law)」(项目文件的章号与课程不同:课程的 C6 规模 = 项目的 C8)。遵守项目的全局约定:
- 只改一项:模型大小实验只改
n_layer/n_embd,数据、种子、评估窗口与基线相同; - 同一把尺子:val loss 在整段验证集的 228 个固定窗口上算,所有 run 可直接比较;
- 噪声底线:同种子在 MPS 上重跑两次,val loss 相差约 0.003;C14 实验课用 5 次重跑定的噪声底线是标准差 0.0066、极差 0.016,两个 run 相差小于 3σ ≈ 0.020 时不下结论,以 C14 为准;
- 算力口径:6 · N(含 embedding)· D(实际喂过的 token,含重复)。基线是 6 × 3,688,704 × 3,276,800 = 7.25e+13 FLOPs,比 Chinchilla 最小的预算 6e+18 小约 5 个数量级。
整条流水线不动,只改它的尺寸:
- 解决了loss 随参数、数据、算力按幂律下降:参数翻倍,loss 乘以 0.9487(Kaplan 式 1.1)。幂律的多领域实证首见 Hestness 2017。卡在纯幂律没有底,直线外推偏乐观:Llama 3 的数据只用 ≤3×10²⁰ 的预算外推 10²²,预测 0.6574,真实 0.6931。
- 解决了给出 N ∝ C0.73:预算 ×10,模型 ×5.37、数据只 ×1.86。卡在Gopher 280B 只训 300B token;同预算的 Chinchilla 70B 训 1.4T,MMLU 60.0% → 67.6%。
- 解决了每个预算扫一遍模型大小,loss 呈 U 形,谷底连成前沿:N ∝ C≈0.5,约 20 token/参数。页内用 Chinchilla 的真实点拟得 a = 0.511,外推到 5.76×10²³ 得 67.1B / 1.43T。卡在只算训练的账。模型要服务 10T 个 token 时,按训练最优做的模型总算力 2.02×10²⁴,换成同样 loss 的 34.1B 小模型只要 1.44×10²⁴。
- 解决了Kaplan 偏大的主因找到了:只数非 embedding 参数 + 规模小(Pearce & Song);末层计算、warmup、按规模调优化器(Porian)。卡在Chinchilla 自己的拟合系数也有错:正文取整后的系数在 5.76×10²³ 隐含 92.6 token/参数,Besiroglu 重拟合是 18.4;抛物线法本身也有偏差(Llama 3 数据上相当于 6.5% 的预算配错)。
- 解决了把推理的 2N FLOPs/token 算进总账,最优模型变小、数据变多:Llama 3 8B 1,875 token/参数,Qwen3-0.6B 60,000。卡在小模型上调好的超参搬不过去:按 DeepSeek LLM 的式子,10¹⁷ FLOPs 的最优学习率是 67B 那一档的 7.5 倍。
- 解决了最优学习率、batch 写成 C 的幂律:DeepSeek LLM 7B 预测 η = 4.25e-4,实际用 4.2e-4。卡在换结构、换优化器,最优点就挪:Qwen3.8 报告里旧配方末了 loss 高 7.8e-3、下游平均低 4.14 分(自报);多数团队不公开系数。
- 解决了缩放不止一条轴:数据从哪来(C7)、测试时多想一会儿(C12)都进了预算。卡在高质量数据会先用完:我们项目只有 50 万 token 语料,val 在第 300 步(约 4.9 个 epoch)最低 4.7713,之后一路升到 6.9065(实验课)。
一、只改模型大小:幂律还在不在?
第 1 课的问题缩到我们的尺度:数据固定、步数固定,模型从小到大,最佳 val loss 是否在 log-log 图上排成直线?
看三件事(数据导出之后):① 点是否排成直线,R² 多少;② 最大的一两档是否开始变平甚至上翘——语料只有约 50 万 token,大模型很快就「喂不饱」;③ 指数本身不要和 Kaplan 的 0.076 比大小(数据、分词、训练长度都不同,第 1 课误解二),要看的是形状。
二、固定算力扫一小片网格:谷底在哪?
第 2 课的 IsoFLOP 剖面缩成 3 个预算 × 至少 4 个模型大小。和 Chinchilla 最大的不同:我们的点会把同一份语料重复喂很多遍(红圈 = 超过 4 遍)。
看三件事:① 每个预算的抛物线开口是否向上、谷底落在扫描范围之内还是边上(落在边上就说明范围没扫够);② 表里「谷底 N」和「按 20× 估的 N」差多少、往哪边偏;③ 重复超过 4 遍的点在不在谷底附近——在的话,这个谷底就混进了「数据重复」的影响(Muennighoff 2023)。
三、数据受限:多训会怎样?
第 3 课说过训练的上限是「有多少新数据」。这是项目里已经跑过的真实日志(runs/c6_overfit_1500steps):与基线完全相同,只把步数从 400 拉到 1,500。
读图(c06-scaling.json › overfit,与 04-实践项目 README 的记录一致):val loss 在第 300 步最低 4.7713,之后一路升到 6.9065;训练集上的 loss 降到 0.704。基线的 400 步正是按这条曲线定的。换算成 epoch:300 步 × 8,192 token ÷ 501,615 ≈ 4.9 遍——和 Muennighoff 2023「4 遍以内和新数据差不多」的经验大致对得上,但只是一次观察,不是验证。
四、学习率要不要随宽度调?
第 4 课的问题:在标准参数化下,不同宽度的最优学习率会不会漂移?
五、把结论对回前四课
| 课 | 那一课的结论 | 在我们的尺度上 |
|---|---|---|
| 第 1 课 | loss 随规模按幂律下降,但有压不掉的底 | 看「一」的直线度与大模型端 |
| 第 2 课 | 固定算力时 loss 对模型大小是 U 形,谷底约 20 token/参数(Chinchilla 设置) | 看「二」的谷底与 20× 估算的差 |
| 第 3 课 | 为推理可以过训练,上限是新数据的量 | 「三」:约 5 个 epoch 之后就在背书 |
| 第 4 课 | 最优学习率随规模变 | 看「四」的最优列是否移动 |
证据等级:这一课的所有结论都只属于「实验验证」 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条只在 3.7M 参数左右、50 万 token 繁体古白话语料、MPS 单机、单种子这个条件下成立;差值小于 C14 的噪声底线(同配置 5 次重跑极差 0.016,3σ ≈ 0.020)的对比不下结论。 出处待补 ,而且是在一个比公开缩放实验小 5 个数量级、数据会被反复重复的条件下。它能告诉你「规律在小尺度上长什么样」,不能用来反驳或证实前四课引用的大规模结论。
六、为项目拍板
你要拍板的三件事
- 要不要把模型做大?按 20 token/参数,501,615 个 token 只配得上约 25,081 个参数的模型;基线 3,688,704 个参数按 20× 需要约 74M token,我们不到 1%。理由要引用「一」和「三」的曲线。
- 固定算力,花在更大的模型还是更多的步数上?引用「二」的谷底。
- 学习率要不要随宽度调?引用「四」;如果漂移明显,记下来,C8 的 μP 会回来解决它。
验收标准(全部可测):
- 至少 5 个规模点,给出拟合指数与 R²(「一」);
- 指出 val 最低点所在的步数与 epoch(「三」);
- 小网格 IsoFLOP 的谷底 N 与 20× 估算对比,并解释差异来自哪里(「二」);
- 解释曲线在大模型端变平或上翘的原因(数据受限)。
🔍 自己复现这个实验
在 04-实践项目/ 下:模型大小实验用 python3.12 -m minillm.train —run-name c6_size_d128 —set model.n_embd=128 这类命令逐档跑(只改一项),跑完 python3.12 -m minillm.export;脚本 experiments/c6_scaling.py 负责把所有 run 汇总成 知识平台/src/data/project/c06-scaling.json,格式见 C6 设计卡末尾的「项目实验数据约定」。同一台机器上不要并行跑多个训练,吞吐会互相干扰。
一句话
在 3.7M 参数、50 万 token 的尺度上,缩放律的形状照样可以测,但先撞上的是数据墙:模型再大、训得再久,新数据不够就只是在背书。
下一个缺口
我们的语料只有 50 万 token,前沿模型要 15T 以上。数据从哪来、怎么洗、怎么配? → C7 数据:从哪来、怎么洗、怎么配