第 11 讲:扩展律案例与细节(Scaling — Case Study and Details)
第 11 讲:扩展律案例与细节(Scaling — Case Study and Details)
日期:5 月 4 日(周一,Spring 2026) | 讲师:Tatsu Hashimoto | 材料:lecture_11.pdf | 截止:作业 3 到期
概览
本讲把理论落到实践:拆解公开且细节充分的扩展配方——MiniCPM(用 muP + WSD 学习率 + Chinchilla 分析训出小而强模型)与 DeepSeek(用小规模实验拟合 batch/LR、用 IsoFLOPs 定模型规模);此外还有 StepFun 关于 LR/batch 扩展的大规模实证研究、优化器扩展(含 Muon),以及 muP 的深入剖析——它是什么、如何推导、对什么鲁棒、对什么不鲁棒。
核心概念与定义
- 实践中的扩展:2022 年后很少有模型公开扩展细节;MiniCPM 与 DeepSeek 是两个难得的、有严谨公开分析的例外。
- MiniCPM 配方(2024):1–2.5B 模型,打败大多数 2B 并追平不少 7B 模型。
- 用 muP 稳定扩展:
scale_emb=12, scale_depth=1.4, init_std=0.1, lr=0.01——有了 muP,最优学习率在不同宽度下大致恒定。 - 固定长宽比(aspect ratio),整体放大规模(最大实验模型与实际模型差距约 5 倍)。
- 最优 batch:用 3 个规模(9m/30m/170m)画损失 vs (batch, 数据量);最优 batch 随损失下降呈多项式增长(Kaplan 2020 式分析)。
- WSD 学习率(warmup–stable–decay):让 Chinchilla 分析变便宜——可以在 stable 阶段末尾重启一个新 token 预算的训练,而不必从头再训。这把拟合扩展律的 O(n²) 成本降到可承受范围。
- 用 Chinchilla 方法 1(下包络)与方法 3(联合拟合),得到很高的数据:模型比例。
- 用 muP 稳定扩展:
- WSD(warmup-stable-decay)学习率调度:把调度拆为预热、稳定、衰减三段;损失主要在衰减段快速下降(约占训练的 10%)。效果与 cosine 相当,却支持重启。
- DeepSeek 配方(2024):不用 muP——直接从小规模实验估计最优 batch/LR(保留”接近最优”、与最小损失相差 0.25% 以内的运行);WSD 式学习率(两次各 10% 的衰减);用 Chinchilla 方法 2(直接的 IsoFLOPs)定模型规模;拟合出的扩展模型能准确预测最终模型的损失。
- 近期配方(细节更少):Qwen(LR/batch 拟合)、Kimi K2(MoE 稀疏度扩展律)、Hunyuan(MoE 的 IsoFLOPs——最优数据:激活参数比 96:1)、LLaMA 3(IsoFLOPs,39:1,算力到下游指标的扩展)、MiniMax-01(架构扩展 + Chinchilla 方法 1)。
- StepFun 扩展律研究:纯实证地在多个规模上网格搜索 (LR, batch):
- 损失对 batch/LR 是凸的——最优点能干净地识别。
- 扩展趋势:batch 主要取决于数据量;固定 M 时最优 LR 随 D 增大而上升(但换成 WSD 后这一结论较脆弱)。
- 可推广到 MoE 与其他数据集(有前提)。
- 优化器扩展的问题:(1) 不同优化器需要不同超参数,可能还有不同的最优扩展规则;(2) 显著的规模依赖性——”永远要检查相对于算力与 Chinchilla 比例的扩展性——它们常是性能对比中的主要混淆因素”;(3) 建立扩展性本身并不容易——看起来漂亮的扩展曲线可能突然爆炸(AdamC + sqrt-batch LR 缩放的例子)。
- Muon:面向矩阵值参数的优化器,用 Newton–Schultz 迭代近似正交化更新:B_t = UΣVᵀ → UVᵀ。在大规模上有效(nanoGPT speedrun、Kimi K2);收益难以精确度量。
- muP(maximum update parametrization)深入:
- 两条断言:随宽度 n_l 增大,(A1) 初始化时激活保持 Θ(1);(A2) 走一步梯度后激活的变化量为 Θ(1)。
- 推导梗概:对深层线性网络 h_l = W_l h_{l−1},W ~ N(0, σ²I),取 σ = Θ(1/√n_{l−1}·min(1, n_l/n_{l−1})) 可使 ‖h_l‖² = Θ(n_l)。对更新量,ΔW_l = −η∇{h_l}ℓ·h{l−1}ᵀ(秩一外积);要求 Δℓ = O(1) 就给出 SGD 下的 η = Θ(n_l/n_{l−1}),以及 Adam 下的相应缩放(ΔW·√n_{l−1} = Θ(η_l),对 Adam 即约 1/√n_{l−1})。
- 标准参数化(SP)vs muP:SP 用 init 1/√n_{l−1}、LR Θ(1);muP 同时调整 init 与 LR(Adam 下 LR 还要乘以 n_{l−1} 的相应因子),使最优 LR 具备宽度不变性。
- muP 对什么鲁棒:SwiGLU/squared-ReLU 激活、大/小 batch、zero-attention 初始化、部分异类优化器(Lion)——大体都还行。
- 什么会破坏 muP:RMSNorm 的可学习增益(理论前提被破坏,但去掉增益几乎不损性能)、基于梯度符号的异类优化器、以及强 weight decay(0.1)——”也许这是唯一显著的 muP 失效情形”。
- 结论:muP 总体有用——SP 明显更不稳定;muP 的参数化/初始化更容易调。
代码示例:WSD 学习率调度(让扩展律分析变便宜)
代码(Python):
def lr_schedule(step, total_steps, warmup_steps, max_lr, decay_frac=0.1):
# 阶段 1:预热(线性)
if step < warmup_steps:
return max_lr * (step + 1) / warmup_steps
# 阶段 2:稳定(常数)
decay_start = int(total_steps * (1 - decay_frac))
if step < decay_start:
return max_lr
# 阶段 3:衰减(例如 cosine 或线性衰减到 max_lr 的 10%)
t = (step - decay_start) / max(total_steps - decay_start, 1)
return max_lr * (0.1 + 0.9 * 0.5 * (1 + math.cos(math.pi * t)))
# Chinchilla 分析的关键技巧:从稳定阶段重启。
# 若某次 200B token 的训练在 step S 结束稳定阶段,
# 你可以(用新的衰减)继续到 400B、800B……而不必从头重训。
代码做了什么: 实现三段式 WSD 调度,并突出其”可重启”性质——稳定阶段允许把一次运行分叉成多个 token 预算,成本很低。
实现深挖:
- 为什么 WSD 能媲美 cosine:经验上损失下降主要集中在衰减阶段;稳定阶段让模型保持”随时可衰减”的状态。DeepSeek 用两次各 10% 的衰减,MiniCPM 用一次衰减。
- 为什么这对扩展律至关重要:Chinchilla 联合拟合需要很多 (N, D) 点上的损失,过去每个点都要从头训练一次。WSD 重启把一次运行变成多个数据点——把成本从 O(n²) 降到 O(n)。这正是作业 3 那 12 个 B200 小时预算逼迫你必须利用的经济学。
与作业的联系:作业 3 的训练 API 未必暴露 WSD,但其方法论——在有限运行预算下拟合扩展律、外推到 48 B200 小时——与 MiniCPM/DeepSeek 完全一致。你的报告应当像这些论文一样,写清搜索空间探索策略(IsoFLOPs、联合拟合,还是带 muP 假设)。
代码示例:muP 风格的初始化与学习率缩放(概念)
代码(Python):
import math
def init_and_lr_scale(fan_in, fan_out, scheme="muP"):
if scheme == "SP": # 标准参数化
init_std = 1.0 / math.sqrt(fan_in)
lr_scale = 1.0
else: # muP(简化版)
# init:Theta(1/sqrt(fan_in) * min(1, fan_out/fan_in))
init_std = (1.0 / math.sqrt(fan_in)) * min(1.0, fan_out / fan_in)
lr_scale = fan_out / fan_in # SGD 情形;Adam 用 lr * fan_in 的相应形式
return init_std, lr_scale
代码做了什么: 对比标准参数化(init 1/√fan_in、LR 1)与 muP(init 1/√fan_in·min(1, fan_out/fan_in)、LR fan_out/fan_in)——这两处改动让最优超参数具备宽度不变性。
实现深挖:
- 为什么 init 这样设:让激活保持 Θ(1),与宽度无关——由矩阵集中不等式推出(‖W_l‖ → σ·(√n_{l−1} + √n_l))。
- 为什么 LR 这样设:让每一步的更新量保持 Θ(1)(条件 A2):由 ΔW = −η·梯度外积、要求 Δℓ = O(1),得到 η ∝ n_l/n_{l−1}(SGD);而 Adam 的逐坐标归一化会改变 LR 缩放(约 1/√n_{l−1} 的形式)。
- 为什么有用:超参数跨规模迁移是小规模扩展实验(作业 3!)可信的前提。讲义的 miniCPM 数值(scale_emb=12、scale_depth=1.4)就是实用旋钮取值。
与作业的联系:作业 3 的 handout 明确允许在扩展方法论中引入 muP 思路(G. Yang 等);作业 1 的初始化(handout 中”某个缩放因子”)至少应当具备宽度感知。若你要在多个规模上训练模型,muP 就是”LR 可迁移”与”LR 必须重调”之间的差别。
关键要点
- 两个公开配方:MiniCPM(muP + WSD + Chinchilla 1&3)与 DeepSeek(小规模 LR/batch 拟合 + IsoFLOPs + WSD)——两者都准确预测了最终模型的损失。
- WSD 学习率是关键的使能技巧:效果媲美 cosine,而”可重启”性质让 Chinchilla 式拟合变得可负担(n 次 vs n² 次训练)。
- LR 与 batch 对规模敏感:每个规模上损失对 (LR, batch) 是凸的,但最优点随算力/数据移动——务必对照 Chinchilla 比例检查扩展性,它常是优化器/架构对比中的主要混淆因素。
- muP 通过宽度感知的 init + LR 缩放使最优 LR 大致与宽度无关;它对很多现代组件鲁棒,但会被 RMSNorm 增益与强 weight decay 破坏。
- 近期大厂(Qwen、Kimi K2、Hunyuan、LLaMA 3、MiniMax)都做某种形式的 IsoFLOPs/扩展分析——这个领域已把扩展律当成标准设计工具。
常见陷阱
- O(n²) 的扩展律拟合:每个 (N, D) 点都从头训练是负担不起的;要用 WSD 重启 / 稳定阶段分叉。
- 不用 muP 却信任 LR 迁移:朴素宽度缩放会移动最优 LR;要么用 muP,要么像 DeepSeek 一样直接拟合。
- 混淆训练最优与推理最优:回顾第 9 讲——部署算力主要是推理,所以要过度训练(每参数 token 数 ≫ 20)。
- 忘记 batch 的扩展:超过临界 batch 后收益递减;batch 要与 LR 联合扫描。
- 过度套用 muP 结论:RMSNorm 增益与强 weight decay 会破坏迁移——要验证而不是假定。
- 拟合出漂亮曲线却突然爆炸:好看的扩展拟合可能掩盖不稳定(AdamC 的例子);至少在一个更大规模上做验证。
复习题
- 问: WSD 调度如何让 Chinchilla 式分析更便宜?
- 答: cosine 调度需要为每个 (N, D) 点从头训练一次。WSD 的稳定阶段允许把一次运行分叉:用不同的衰减时机/token 预算继续训练,从而从一次预训练中得到多个损失点——把成本从点数的平方级降到接近线性。
- 问: muP 的两条断言与由此确定的旋钮是什么?
- 答: (A1) 初始化时激活保持 Θ(1);(A2) 一步梯度后激活变化为 Θ(1)。这确定初始化尺度 σ = Θ(1/√fan_in·min(1, fan_out/fan_in)) 与 LR 尺度(SGD 为 fan_out/fan_in;Adam 的基础 LR 相应按 √fan_in 缩放)。
- 问: DeepSeek 没用 muP 却也成功了,为什么?
- 答: 它不去”假设”LR 可迁移,而是实测:跑大量小规模模型,保留”接近最优”(与最小损失相差 0.25% 以内)的运行,直接拟合 LR/batch 的扩展关系,再用 IsoFLOPs 定模型规模。实证得到的扩展关系可以替代基于参数化的迁移——代价是要多花一些小规模算力。
