本页章节
TRAINING ENGINEERING / OPTIMIZATION
优化与稳定性:梯度怎样变成更新
梯度回答损失对参数的局部敏感度,优化器还要结合历史状态、学习率和正则决定实际位移。把这几步拆开,才能解释为什么梯度很大却没走远,或当前梯度为零,参数仍在变化。
AdamW 的每个状态在做什么?
m 是梯度的指数移动平均;v 对平方梯度做指数移动平均,估计未中心化的二阶矩,用于调整各参数的更新尺度。偏差校正补偿零初始化的早期收缩;ε 避免分母过小,也可能影响极小梯度的行为。最后一项是与梯度自适应缩放解耦的权重衰减。
因此更新未必与当前 −g 同向:历史动量可能还在推旧方向。全局 η、batch、损失尺度、ε、初始化与模型结构仍需要一起调节。把 L2 项直接加到 loss 后进入 Adam 的矩估计,通常不等于解耦权重衰减。
| 量 | 要观察什么 | 解释时的条件 |
|---|---|---|
| gradient norm | 裁剪前/后、unscale 前/后、全局或逐层、有效 token 归一化口径。 | 结合训练阶段和 loss 归一化方式判断梯度大小。 |
| update norm | 实际 θafter−θbefore,包含优化器与衰减;与参数范数的比例。 | 相同学习率不意味着所有层走相同比例;零初始化张量的相对比值无意义。 |
| m / v 状态 | 是否恢复、极端值是否长期残留、不同参数组的配置。 | 复现下一步更新,还需相同的矩状态、学习率和 step。 |
| 验证指标 | 相同数据版本、长度和采样协议下的趋势及方差。 | 随机 minibatch loss 会波动;泛化表现应在固定验证分布上检查。 |
把同一串梯度交给不同优化器
外部输入梯度序列让每一步都可核算。观察变号、尖峰以及归零后,历史状态怎样影响 θ。
单参数更新账本
人为指定梯度,无模型训练曲线| t / g | m / v | 梯度驱动位移 | 衰减位移 | θafter |
|---|
θ₀=1,m₀=v₀=0;AdamW β₂=0.99、ε=10⁻⁸。Momentum 用 bₜ=β₁bₜ₋₁+gₜ(无 dampening/Nesterov)。为比较位移,三种模式均显式加入相同解耦衰减;这不等同所有库中 SGD 的 weight_decay 实现。改配置会从 θ₀ 重算当前步数,未把人为梯度当作 loss 导数轨迹。
为什么训练开始前就要关心数值尺度?
打破对称,保持可传播尺度
相同单元若完全对称初始化可能收到相同更新。随机权重需要结合 fan-in/out 与激活设置尺度,避免层层放大或衰减。某些残差分支的零初始化是有意设计,初始化应按各模块的结构分别选择。
残差也会累积方差
pre-norm 给残差主干短路径,但不保证任意深度或学习率稳定。残差缩放、输出投影初始化、Q/K 范数和 logits 动态范围都应随配方检查。
Warmup 是过渡阶段
学习率从小到大,让早期参数、激活和优化器状态逐步适应。标签和 mask 的正确性仍需单独检查;时长应明确以更新步、样本还是 token 计。
小模型调参怎样迁移
μP 按参数类别和宽度缩放初始化/学习率等,让某些超参数更可跨宽度迁移。不同参数类别采用不同的缩放规则;跨深度、数据、序列长度或 optimizer 时,先做坐标/尺度检查和中间规模验证。
看到不稳定,先把可能原因分开
| 现象 | 优先证据 | 可区分原因的实验 |
|---|---|---|
| 突然 loss spike | 该 batch 的来源、长度、有效标签、per-token loss、logit/grad 范数。 | 固定 checkpoint 回放 spike batch 与普通 batch,检查数据异常或数值溢出,根据回放结果再决定是否调整 LR。 |
| loss 正常,参数不动 | 参数是否在 optimizer 内、实际 Δθ、scaler 是否跳步、学习率、冻结和 detach。 | 对一个应可训练张量记录前后差;确认是零梯度、未更新、舍入还是跳步。 |
| 恢复后走势改变 | 权重、m/v、step、scheduler、scaler、RNG、数据游标。 | 对比不中断基线与恢复分支的相同后续样本;同时比较参数变化和优化器状态。 |
| 裁剪长期触发 | 全局/逐层梯度分布、阈值和 loss 缩放口径。 | 先确认归一化;裁剪可能掩盖异常,阈值效果需要结合训练趋势验证。 |
梯度裁剪约束聚合梯度的大小;参数范数约束和 AdamW 衰减作用于参数,三者的作用位置不同。FP16 loss scaling 场景通常先完成有效 batch 累积、unscale、检查/同步有效梯度,再裁剪与 optimizer step;BF16 通常不需传统 loss scaling,但仍可能有溢出或舍入问题。若更新因非有限值被跳过,调度器和计数应遵守所用框架的跳步语义。
增大 batch 通常减少单次梯度的抽样噪声,却不意味着按比例放大学习率永远成立。训练 token 相同也可能有不同更新次数;warmup/decay 用 step 还是 token 计都会改变轨迹。是否值得改 batch,需要同预算验证,同时比较验证质量、更新次数和计算成本。
Muon 怎样利用更新矩阵的结构?
AdamW 用逐元素历史矩调整更新尺度;Muon 对选定矩阵的梯度动量作近似正交化,再配合更新尺度和权重衰减。要理解这种差别,可以先看一个满秩方阵的精确极分解方向,再回到实际算法。
同一个 2×2 矩阵的三种方向
已知 SVD · 全部归一到相同 Frobenius 范数M=R(30°)·diag(σ₁,1)·R(20°)ᵀ,旋转保持不变。逐元素一列使用首步、零历史 AdamW 梯度项 M/(|M|+10⁻⁸),未计衰减。
| 位置 | 原始 M | M 归一方向 | 逐元素方向 | 极分解方向 |
|---|
每个方向都除以自身 Frobenius 范数,显示数值未乘下降方向的负号。极分解原始 Q 的奇异值为 1;归一显示后为 1/√2。本例只比较方向,不代表训练速度或长期优化轨迹。
矩阵方向与坐标尺度
改变 σ₁/σ₂ 会改变原始更新在不同奇异方向的强度。保持 U/V 不变时精确 Q 不变;逐元素缩放依赖坐标中的元素值,通常得到另一方向。
尺度仍需匹配
不同形状的矩阵正交化后,每元素更新 RMS 不同。学习率、矩阵形状、权重衰减与更新缩放一起影响实际位移;把方向归一只是本例的比较约定。
参数组需要分别指定
报告和实现常把适用的隐藏层矩阵交给 Muon,其他参数由 AdamW 等方式更新。向量、embedding、输出头、共享权重与张量 reshape 的处理需查看具体版本。
分布式结构也有影响
任意把矩阵切成几块后分别正交化,通常不同于整矩阵处理。检查分片维度、通信、重组、精度和状态恢复,再比较端到端成本。
《Muon is Scalable for LLM Training》(2025)报告了权重衰减、更新尺度与分布式实现的实验。其效率结论依赖模型、数据、预算与调参协议;评估替换时同时看质量曲线、step time、显存、通信和数值稳定性。
矩阵优化器:按头处理与大表更新,分别改变了什么?
V4.1-Flash 报告第 2.5 节将 Query/Key 矩阵按 head 处理,并为 Engram 表、token embedding 与预测头采用动量加 Sinkhorn 均衡。分组方式、参数类型与缩放规则都是算法的一部分,不能只保留“正交化”或“归一化”两个名称。
同一个 4×2 矩阵,整矩阵与两个 head 的方向不同
固定 M=[[4,0],[0,1],[1,0],[0,2]],前两行和后两行分别视作两个 head。由于列正交且非零,可以精确计算 Q=M(MᵀM)⁻¹ᐟ²;逐头时分别计算两个 2×2 子矩阵。下表将两种最终方向都归一到单位 Frobenius 范数。
| 行 | 原始 M | 整矩阵归一方向 | 逐头归一方向 |
|---|---|---|---|
| 0 | 4.000000 / 0.000000 | 0.685994 / 0.000000 | 0.500000 / 0.000000 |
| 1 | 0.000000 / 1.000000 | 0.000000 / 0.316228 | 0.000000 / 0.500000 |
| 2 | 1.000000 / 0.000000 | 0.171499 / 0.000000 | 0.500000 / 0.000000 |
| 3 | 0.000000 / 2.000000 | 0.000000 / 0.632456 | 0.000000 / 0.500000 |
方向余弦为 0.903088,因此区别不只是总步长。脚本核对完整矩阵和每个 head 的 QᵀQ=I;这里的精确极分解与显示归一化不是有限 Newton–Schulz、完整 Muon 或作者的更新缩放,也不证明哪种方向质量更好。
此处 Sinkhorn 均衡的是有符号更新的 L2 尺度
本例 W=[[1,−0.5],[0.2,0.8],[−0.3,0.4],[0.7,−0.1]],当前梯度和上步动量在下表给出;β=0.9、ε=0.001、τ=0.1、K=3、η=0.02、γ=0.7,全是教学输入,不声称是厂商默认值。屏蔽条件为行范数 ≤τ×平均行范数。
| 行 | 当前梯度 | 上步动量 | 更新 Δ | 更新后 W |
|---|---|---|---|---|
| 0 | 0.200000 / −0.100000 | 0.100000 / −0.200000 | 0.754398 / −1.194174 | 0.989438 / −0.483282 |
| 1 | 0.000000 / 0.000000 | 0.080000 / 0.040000 | 1.252967 / 0.651996 | 0.182458 / 0.790872 |
| 2 | −0.050000 / 0.300000 | −0.100000 / 0.050000 | −0.940168 / 1.054138 | −0.286838 / 0.385242 |
| 3 | 0.000000 / 0.000000 | 0.000000 / 0.000000 | 0.000000 / 0.000000 | 0.700000 / −0.100000 |
第 1 行当前梯度为零,历史动量仍让参数发生更新;第 3 行梯度与动量都为零,才保持不变。稀疏读取、当前梯度的支持集、实际更新范围和状态内存是四个需要分别记录的对象。
三次归一化后的行/列范数,并不会同时精确为 1
| 步骤 | 归一化轴 | 四行 L2 范数 | 两列 L2 范数 |
|---|---|---|---|
| 1 | 行 | 0.995405 / 0.986385 / 0.992539 / 0.000000 | 1.238278 / 1.189784 |
| 2 | 列 | 0.826188 / 0.802523 / 0.818583 / 0.000000 | 0.999193 / 0.999160 |
| 3 | 行 | 0.998791 / 0.998755 / 0.998780 / 0.000000 | 1.229422 / 1.217037 |
这是乘 √n 之前的 U;ε 和屏蔽行保留在计算中,最终一轮又改变列范数。这里允许负值与矩形矩阵,目标是更新尺度;mHC 则约束非负残差矩阵的行列和,其二范数结论不能移用到本表。脚本另核对全零输入、奇数步数与屏蔽边界。
一手依据为 DeepSeek-V4.1-Flash v1(2026-09-17)第 2.5 节、算法 1。报告区分 Muon、逐头处理、L2 均衡更新和 AdamW 参数组;本站只核验给定小矩阵的方向与一次更新,没有重跑模型训练、复现大表分片或迁移作者的效果结论。
WSD 与 checkpoint 平均:训练终点怎样读出来?
Warmup–Stable–Decay(WSD)把学习率分成升温、稳定与衰减三段。稳定阶段的单个 checkpoint 可能波动;除直接评估它,还可以按明确窗口与系数平均相邻权重,再独立评估平均结果。学习率日程决定训练轨迹,参数平均决定另一份读出工件,两者分别保存。
同一条二维更新轨迹,保留有利与不利的结果
固定初值 [1,−0.6],每步使用下式梯度;扰动 ξ 在 [0.6,−0.8] 与 [−0.6,0.8] 间交替。诊断函数 F 只用于这组二次函数例子的比较,不是语言模型验证分数。
在计算结果前就固定读出步 8 与 12,各取包含当前步的最近四份参数;除了等权平均,再检查从旧到新 1:2:3:4 的教学系数。不按结果挑窗口,也不把这组系数称为作者的 decay emulation。
| 读出阶段 | 方案 | 参数 [θ₁,θ₂] | 诊断 F |
|---|---|---|---|
| 稳定末 · step 8 | 末次参数 | 0.256808 / −0.133339 | 0.068534 |
| 稳定末 · step 8 | 窗口等权平均 | 0.274072 / −0.000206 | 0.037558 |
| 稳定末 · step 8 | 窗口 1:2:3:4 | 0.257250 / −0.026769 | 0.034522 |
| 衰减末 · step 12 | 末次参数 | 0.135381 / −0.000113 | 0.009164 |
| 衰减末 · step 12 | 窗口等权平均 | 0.140412 / 0.010888 | 0.010095 |
| 衰减末 · step 12 | 窗口 1:2:3:4 | 0.139595 / 0.003082 | 0.009762 |
本例稳定末的两种平均都有更低的 F,衰减末则是末次参数更低。这里没有得到“平均总优于最新 checkpoint”的结论。真实实验应预先规定选择集与预算,保留所有窗口结果,避免反复用独立测试挑模型。
为什么不能把参数平均直接叫成集成或原轨迹恢复?
取 fθ(x)=(θx)²、x=1,参数 −1 与 1 都输出 1;先平均参数得到 0,输出却为 0,而两个输出的平均仍为 1。这个反例说明两项操作不能普遍互换,不否定相邻训练 checkpoint 的用途。
想从平均权重继续训练,还要指定学习率步号、优化器状态、随机状态和数据游标。它是新定义的起点;仅有平均参数不能证明恢复了某条原始训练轨迹。本地脚本也比较同一平均参数在“接第 9 步”和“重启第 1 步”下的下一次更新。
来源版本差异:1,000 步与 2,000 步分别记录
Nemotron 3 Super 报告第 2.4–2.5 节使用 WSD,并研究稳定期的权重平均读出。该报告还指出,较长的实际衰减阶段可以追平或超过平均读出;本站不将其特定实验的收益或预算估计外推成通用保证。
| 一手材料 | 记载的保存间隔 | 按 3072×8192 位置/步换算 |
|---|---|---|
| Super 报告 · 页首 2026-04-03 | 1,000 步 | 25,165,824,000 |
| 官方配方 · commit 99a7e45 | 2,000 步 | 50,331,648,000 |
两项分别对应约 25B 与 50B 的名义 token 槽位;平均窗口仍需按实际 checkpoint 的 step/token 坐标选取,并声明端点与系数归一化。仅凭这两份材料无法确定保存间隔差异的原因,本节保留双方原始口径,不把任一数值写成唯一已核实的运行日志。
来源:Super 报告第 2.4–2.5 节、图 11;固定官方配方的 Hyperparameters / Checkpoint Merging。本节只运行公开的教学输入与公式核对,未重跑厂商预训练或平均实验。
适用范围与一手资料
标量、极分解和 WSD 均为给定输入。逐头例使用正交列矩阵的精确极分解;L2 均衡例重算给定超参数、动量、屏蔽与一次更新,不复现厂商配置或质量。与 mHC 行列和约束分别说明;WSD 仍不实现作者 minus-sqrt 配方。
公式与机制的原始依据 · 7 项
- PyTorch · AdamW动量状态、独立权重衰减与更新
- PyTorch · Automatic Mixed Precision examples梯度累积、unscale、裁剪与 scaler 更新顺序
- Tensor Programs V: Tuning Large Neural Networks via Zero-Shot Hyperparameter Transfer (2022)μP 参数化与跨宽度超参数迁移的条件和实验
- Muon is Scalable for LLM Training (2025)矩阵动量正交化、Newton–Schulz、更新尺度、衰减和分布式实现
- NVIDIA · Nemotron 3 Super report (PDF 2026-04-03)第 2.2 节的精度,以及 2.4–2.5 节的 WSD/平均读出;报告保存间隔 1000 步,与固定配方 2000 步并列,不推测原因或重跑厂商训练
- NVIDIA · Nemotron 3 Super pretraining / 99a7e45固定官方配方中的逐层精度名单与未发布数据范围;NVFP4、BF16、MXFP8 分工不等于全部状态都以 4 bit 保存
- DeepSeek-V4.1-Flash (2026-09-17, v1)CED、CSA2、FP4 KV;另核对分模态 bias、Single-Pass、Engram、逐头 Muon、有符号 L2 更新及 §2.4.3 DSpark 的训练阶段和梯度边界。来源机制、教学数值与作者实测分别记录