扩展律与算力分配
技术栈里第一个难以回头的选择,是训练运行本身。为了得到一个基座模型,团队通常先选定架构和数据配比,准备好训练集群,再通过持续数周的训练来最小化下一词元损失。本章沿着这项投入,从事前估算走到实际执行:先看什么目标让它可以被度量,再看 扩展律(scaling law) 怎样决定规模,最后看优化器、调度、批大小和稳定性手段怎样避免训练预算被浪费。它也解释规模选定的答案为什么会变:从 Kaplan 时代偏向参数的配方,到 Chinchilla 式的数据分配,再到推断感知的过度训练。
下面通篇会反复出现四个量,先用朴素的话把它们定下来会省事不少。参数(parameter)是模型内部一个可调的数,在训练中被设定;模型规模指的就是这种数有多少个,通常以十亿计。词元(token)是一小段文本,大致是一个短词或一个词片,模型靠读入一长串词元来学习。损失(loss)是一个单一的数,衡量模型把下一个词元预测得有多差,并在它读到的全部文本上取平均:越低越好,把它压下去正是整次训练的目的。算力(compute)是这次训练耗费的全部算术量,以 FLOPs(浮点运算次数)计;对一个 transformer 而言,它接近参数量乘以训练词元数再乘以六。有了这四个量,本章要回答的问题就好说了:用一笔固定的算力预算,让最终损失尽可能低,并在投入之前大致知道这个损失会是多少。
无法收回的投入
一次预训练会占用集群数周,预算一旦使用就很难收回。开始之前,参数量、词元预算,以及主导这场优化的那些设置(学习率调度和批大小,两者都在本章后面定义),都得先定下来,而且只能依赖小规模实验来决定,因为在全规模上逐项试错根本负担不起。后面的所有讨论,都是在集群真正启动之前回答同一个问题:怎样使用一笔固定的算力预算,让最终损失尽可能低,又怎样在投入之前就把答案估出来。
这笔开销之所以能在动手前估出来,是因为损失有一个可预测的形状,而这个形状又来自模型被训练的方式。模型被训练去预测一条文本流里的下一个词元,一次只预测一个,每次预测都以它前面的词元为条件,这就是下一词元预测(next-token prediction):从形式上说,它是对一条词元流做极大似然,在移位序列上配合因果掩码算交叉熵(cross-entropy)。于是文本里每个位置都成了它自己的训练样本,正确答案不过是真正紧随其后的那个词元,语料本身就无偿地、且以极大的规模充当它的监督信号。它产出的损失就是这些预测的平均惊异度,以每词元多少 nats 或 bits 计,正是扩展律要预测的那个量,而困惑度(perplexity)只是它的指数。这次训练真正换来的,是这个单一标量的降低。接下来分两步:先估算它,再把每一美元换来的损失压到最低。
一条可外推的律
主导其余一切的决策是规模选定:怎样在参数和词元之间分配预算。它之所以可解,是因为不论哪一边增长,损失都以一种规整的方式下降,也就是一条幂律。所谓幂律,是指输入每乘以一个固定倍数,损失就降到原来的一个固定比例,这恰好是在双对数坐标里画出来呈一条直线的那种关系。在一组小规模、负担得起的训练上拟合出的扩展律,正是去拟合这条直线,再读出它对那次只负担得起做一次的大规模训练会走到哪里 (Kaplan et al. 2020)。实际拟合的函数形式,是在两个幂律项之外再加一个不可约的下界 ,也就是再怎么扩展规模都消不掉的那部分损失 (Rosenfeld et al. 2020; Hoffmann et al. 2022):
其中 是参数量, 是用于预训练的训练词元(training tokens)总数。两个指数 与 决定损失随模型和数据增长而下降的快慢,指数越大,规模回报越陡,而 与 是缩放常数;这四个量都从廉价训练里拟合得来。有了它们,就能为计划使用的预算读出计算最优(compute-optimal)的 与 ,也就是预测损失最低的那组参数量与词元数。还有一点要点明:这里说的训练词元不是词表项,而是分词后实际读入模型的词元实例,同一段文本如果重复训练两轮,就计两次。
这条律的价值正在于外推:几次廉价训练,就能为那次只做一次的训练预判损失。因为损失是一条幂律,那几次廉价训练会落在对数-对数坐标的一条直线上,而这条直线能预测远在右侧那次昂贵训练的损失,正如 图 5.1 所勾画的。这里的算力是总开销,接近 ,所以同一条直线既可以对参数来读,也可以对词元,或对整笔预算来读。
同样的逻辑也延伸到模型的其余调节旋钮,也就是损失公式没点名的那些超参数:诸如学习率(每次更新迈出的步子有多大)和初始化(参数起始时取的那些随机值)。这些通常在每个模型规模上都得重调一遍。最大更新参数化(muP)让它们也能迁移:对网络的宽度(每一层里并排放着多少个参数)做参数化,使最优学习率和初始化在不同模型规模上保持稳定,先在一个小型代理上调好,再用于全规模训练,省掉全额成本的扫描 (Yang et al. 2022)。这样一来,规模选定和超参数,都成了可以在小规模训练上决定、再带到大规模训练里的东西。
为何偏偏是幂律
本节属于可选的理论。它解释损失为什么会下降得如此平滑,跳过它也不会丢掉本章的实用主线。这条律是一条经验规律,而非定理,追问它从何而来,能划定它该被信任到什么程度。两条推导从不同的起点抵达同一结论。一条从数据读出斜率:不妨把数据想成一些落在一张弯曲曲面(即流形)上的点,这张曲面实际拥有的相互独立的方向数,就是它的内蕴维数 ;若模型在一个内蕴维数为 的流形上对目标做插值,损失大致按 缩放,于是数据相互独立的方向越多(数据流形维数越高),扩大规模的回报就越慢 (Sharma and Kaplan 2020)。另一条从技能读出斜率:若能力可分解为一些离散单元,按使用频率递减的顺序被学到,而这些频率本身服从幂律,那么按序学习便从严格离散的获取中产出一条平滑的幂律损失 (Michaud et al. 2023)。一个建立在自然数据上的渗流论证,把两者还原为同一模型的两种区制 (Brill 2024)。这些都尚无定论,但它们共同的推论很具体:斜率是数据的属性,而非架构的属性。
这种离散视角也接上了本书稍后会回到的一场争论。如果技能是分离散步骤获得的,整体的损失曲线可以保持平滑,而个别能力却会突然开启;这样一来,扩展看上去是渐进的,还是出现一次陡然的「涌现」跃迁,就在很大程度上取决于怎么度量。学到的技能是离散的,这一点 第 54 章 讲得很具体:它们是可以从训练好的模型中分离、复原出来的特征;而涌现这个问题,第 3 章 留作开放。
先 Kaplan,后 Chinchilla
规模选定法则本身有一段历史,而搞错它是本章最昂贵的错误。Kaplan 等(2020)确立了损失服从平滑幂律,并据自己的拟合,建议把较大的预算大部分分给参数 (Kaplan et al. 2020)。Hoffmann 等(2022),也就是 Chinchilla 论文,纠正了这一点:参数和词元应当一同扩展,在计算最优点约为每个参数配二十个训练词元,而 Kaplan 时代的配方,一直在数据上系统性地训练不足 (Hoffmann et al. 2022)。一个 Chinchilla 最优的模型,比上一代预期的更小,使用的训练词元更多。
两支严谨的团队竟会有分歧,这本身就值得玩味,而这道分歧后来发现大多是一个计数口径的选择。模型的一部分参数落在它的嵌入里,嵌入是一张查找表,把每个词元映射成一个向量,词表里每有一个条目就占一行;其余参数则是真正做计算的那些层。Kaplan 只计入非嵌入参数,而在小规模下,嵌入参数在总量中所占的比例足以把最优分配往参数一侧拉偏;改为计入总参数并放大规模,指数便收敛到 Chinchilla 那种大致等比的分配 (Pearce and Song 2024)。这道分歧从来不是自然本身含糊,而是曲线究竟以哪个量为横轴。
同一笔由 固定的算力预算,在每种配方下会得到很不一样的分配。图 5.2 对比了同一笔预算的三种分法:Kaplan 把它大多分给参数,Chinchilla 在约每参数二十个词元处让参数和词元相互平衡,而推断感知的过度训练则刻意缩小模型、把其余算力都投进词元,让每个被服务的词元更便宜。
配方并没有止步于 Chinchilla。Chinchilla 假定总能给模型喂进更多新鲜文本,但高质量的独特文本供给是有限的,一次大规模训练就可能把它耗尽。一旦如此,接棒的便是数据受限的扩展:把同一段文本反复读,价值会递减,过了几轮(在数据上完整走几遍)之后,加参数胜过加重复 (Muennighoff et al. 2023)。更晚的工作打磨的是惩罚项而非调度:它添了一个显式的过拟合项,所谓过拟合,是指模型开始死记训练文本,而不是学到能泛化的规律。这一项随容量与独特数据之比增长,于是更大的模型更快耗尽重复词元的价值,而强权重衰减(一股持续把参数往小处拉、从而抑制死记的力)能买回其中一部分 (Lovelace et al. 2026)。幂律这副视角也不止于预训练损失。同一套「用廉价训练预判」的逻辑,如今也在为测试时算力(第 30 章)、降低精度(第 34 章)与蒸馏(第 29 章)定规模,每一者都是各自预算下的一条曲线,于是把扩展只读作一次预训练决策,会低估这个领域多么频繁地下这类注。配方的前沿仍在移动。
自己动手试一试
这条律足够具体,可以直接运行。下面的代码顺着一笔固定的算力预算,在参数和词元的取舍之间走一遍,找出损失触底的地方。改一改指数再运行(点 Run,或按 Ctrl/Cmd+Enter),看计算最优的分配点怎么移动。
import numpy as np, matplotlib.pyplot as plt
# 玩具扩展律 L(N, D) = E + A/N^a + B/D^b。改一改指数。
E, A, B, a, b = 1.7, 400.0, 410.0, 0.34, 0.28
loss = lambda N, D: E + A / N**a + B / D**b
C = 1e19 # 固定算力预算,约等于 6 * N * D
N = np.logspace(8, 11, 300) # 候选参数量
D = C / (6 * N) # 该预算下允许的词元数
plt.figure(figsize=(5, 3))
plt.plot(N, loss(N, D))
plt.xscale("log"); plt.xlabel("参数量 N"); plt.ylabel("损失")
plt.tight_layout(); plt.show()
best = N[np.argmin(loss(N, D))]
print(f"计算最优:N ~ {best:.2e} 参数,D ~ {C/(6*best):.2e} 词元")
这条拟合有多可信
这个玩具把已发表曲线往往掩盖的一点摆在了明处:外推的可信度不会超过拟合本身,而拟合是脆弱的。一次后来的复现从同样的数据重新推导 Chinchilla 的参数化估计,发现它与论文自身另外两种方法并不一致,其置信区间窄到需要数十万次训练才能支撑,而实际只跑了数百次 (Besiroglu et al. 2024)。它对从原始图中重建出来的数据点也拟合得很差。要点在于脆弱:拟合一条曲线时那些寻常的选择,足以改变它外推到的位置,而它们都不会在最终读出的幂律上留下痕迹。这并不意味着这条律没用,它仍是手头最好的预测,也确实被例行地拿来下注;但正因如此,扩展律才成了一件测量仪器,带着标题数字略去的误差棒。只要这个领域还在读一条曲线来定夺一个高代价的问题,同样的告诫就会再次出现:从 第 48 章 里的基准分数,到 第 72 章 里的能力预测。
计算最优的词元与参数之比并未定论,Chinchilla 也不是终局。推断感知的扩展主张:如果一个模型将服务海量词元,正确的做法是刻意把一个更小的模型训练到远超 Chinchilla 最优点,因为训练只付一次,推断会持续发生。前沿模型如今正是出于这个原因,才训练到远超二十比一的比值。Kaplan 与 Chinchilla 两种拟合怎么调和、过度训练到底能划算到什么程度,都还是活跃的问题。任何单一比值,都该当作取决于预算与部署的选择,而不是一个常数。
这是第一次看到下层约束影响上层。真正为「应当过度训练一个更小模型」提供依据的,是 第 31 章 中的服务成本,而不是训练预算。一个看似纯属预训练经济学的决策,实际上是由模型一生要解码多少词元来定的。
配方的其余部分
一旦扩展律定下 与 ,问题就从估算训练转为执行训练。扩展律不会告诉人该怎样把参数一步步走到那个损失,而这部分选择是一组平衡,每个都有一个拐点。
第一个是优化器:把每一批的梯度,也就是能让损失下降的那个方向,转成对参数的一次具体更新的算法。AdamW 优化器(AdamW) 是默认,带解耦的权重衰减和两个矩估计(即逐参数保存的两个滑动平均,追踪梯度近来的均值与离散程度),后者的状态是占主导的内存项,这也是 第 10 章 要把它跨设备分片的原因 (Loshchilov and Hutter 2019)。二阶和带预条件的优化器,Shampoo 以及更新的 Muon,靠曲率信息来调节更新,瞄准更好的每 FLOP 损失 (Jordan et al. 2024)。Muon 此后先用 5.7T 词元训出 16B 的 MoE 模型 Moonlight (Liu et al. 2025),随后又训出总参数约一万亿的 Kimi K2 (Kimi Team 2025),因此尽管默认仍是 AdamW,它已经算得上经过前沿验证的选项。驱动优化器的学习率调度分三段:矩估计还冷时的线性预热、一个稳定的高位阶段,再加一段衰减。余弦衰减到一个小下限,是被充分理解的默认选择,但它会在训练一开始就把词元预算锁死。预热-稳定-衰减调度(WSD) 则在一个平台期保持恒定学习率,到选择停止时才衰减,于是一个平台期检查点能派生出许多次衰减,扩展实验也变得可组合 (Hu et al. 2024)。它用一点小的损失代价,换来继续训练、分叉衰减和构造清晰扩展阶梯的能力。单次已知预算的训练就选余弦,预算不确定时选平台期调度。
第二个平衡是批大小。更大的批换来数据并行和更短的实际耗时,但越过临界批大小之后,就会浪费算力、换不来损失下降;批太小则让加速器空闲,还要为每个有用词元多付通信开销 (McCandlish et al. 2018)。图 5.4 勾画了这个拐点:批还小的时候,每步的进展几乎线性上升,一旦越过临界大小就趋于平缓。临界批大小在训练过程中会增长,所以最优批是一条调度,而不是一个常数。
而 muP 把这个回路又接回了规模选定。在一个小型代理上调好学习率和初始化、再以全宽度迁移,正是这一做法,让最大那次训练不至于把损失停在更高的位置,而这种损失差距本来根本无从察觉 (Yang et al. 2022)。
让训练稳定完成
计划只有在训练稳定完成时才有意义。因此,数周训练除了扩展律,还需要一小套运维工具。其中几样技巧会探到 transformer 的内部,那些细节在 第 8 章 里讲;这里只需知道,每一样都防着一次长训练可能炸掉的某种具体方式。z-loss 正则(z-loss) 是对对数配分函数施加的辅助惩罚,让模型的原始输出分数,也就是随后会被转成下一词元概率的 logits,不致越漂越大 (Chowdhery et al. 2022)。查询-键归一化(QK-norm) 在注意力机制里把两个内部向量,也就是查询和键,在它们相乘(做点积)之前先做归一化,给注意力 logit 的增长封顶。深度缩放的初始化在设定参数的起始值时把模型的深度考虑进去,而充当最后一道安全网的全局范数梯度裁剪(gradient clipping) 则给任何单次更新的幅度设上限。损失尖峰恢复是一套流程,而不是一个超参数:先从梯度范数和损失遥测里检测到尖峰,再回到近期检查点,降低学习率,跳过或重排触发它的那些数据批,并继续训练 (DeepSeek-AI 2024)。图 5.5 勾画了这个回路。
几种失效模式值得逐一点名,因为它们各在不同时刻出现。发散到 NaN 会在早期把损失送向无穷,通常源于学习率过高、预热过短,或来自 第 10 章 的某个精度交互,用预热和裁剪来预防最为廉价。损失尖峰出现在训练中途,若没有恢复方案,会浪费数日算力。规模与词元选错是其中最昂贵的,因为它就是整次训练;而全宽度下未调好的学习率,会让损失停在更高的位置,又因为没有 muP 给出基线,这份损失差距永远看不见。
延伸阅读
- Kaplan et al., “Scaling Laws for Neural Language Models,” 2020. arXiv:2001.08361确立了语言模型损失随模型规模、数据集规模与算力呈幂律下降,并指出计算最优的训练应训练很大的模型、只用相对较少的数据,并在收敛前就停止。
- Hoffmann et al., “Training Compute-Optimal Large Language Models” (Chinchilla), 2022. arXiv:2203.15556指出模型规模与训练词元应当等比扩展(约每参数 20 个词元),因此多数大模型严重训练不足;在同等算力下,70B 的 Chinchilla 胜过 Gopher、GPT-3 等大得多的模型。
- Yang et al., “Tensor Programs V: Tuning Large Neural Networks via Zero-Shot Hyperparameter Transfer” (muP), 2022. arXiv:2203.03466提出一种宽度参数化(muP),使在小模型上调好的最优超参数可零样本迁移到大得多的模型上,省去全规模的超参数扫描。
- Loshchilov & Hutter, “Decoupled Weight Decay Regularization” (AdamW), 2019. arXiv:1711.05101指出对 Adam 而言 L2 正则化与权重衰减并不等价,并提出将权重衰减从梯度更新中解耦(AdamW),从而改善泛化。
- McCandlish et al., “An Empirical Model of Large-Batch Training” (critical batch size), 2018. arXiv:1812.06162提出用梯度噪声尺度来预测临界批大小,超过该值后增大批大小不再减少训练步数,只是浪费算力。
- Muennighoff et al., “Scaling Data-Constrained Language Models,” 2023. arXiv:2305.16264研究数据受限下的训练,发现重复数据至多约四轮几乎与新数据等效,并据此提出一条刻画重复词元与多余参数价值递减的扩展律。
- Hu et al., “MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies” (warmup-stable-decay 调度), 2024. arXiv:2404.06395提出可与 7B-13B 大模型匹敌的小模型(1.2B/2.4B),借助模型风洞式扩展实验,以及支持持续训练的 Warmup-Stable-Decay 学习率调度。
- Chowdhery et al., “PaLM: Scaling Language Modeling with Pathways” (z-loss, 大规模稳定性), 2022. arXiv:2204.02311用 Pathways 系统在 6144 块 TPU v4 上训练 540B 参数的稠密 Transformer(PaLM),以研究规模如何在众多任务上提升少样本性能。
- Jordan et al., “Muon: An Optimizer for Hidden Layers in Neural Networks,” 2024. kellerjordan.github.io提出 Muon,一种通过正交化基于动量的更新来优化隐藏层的优化器,在 NanoGPT 与 CIFAR-10 上创下训练速度纪录。
- Liu et al., “Muon is Scalable for LLM Training,” 2025. arXiv:2502.16982通过加入权重衰减并调整每参数的更新尺度,使 Muon 优化器可扩展到大型 LLM,达到约为 AdamW 两倍的算力效率;并用 5.7T 词元训练出 16B 的 MoE 模型 Moonlight。
- Kimi Team, “Kimi K2: Open Agentic Intelligence” (Muon(MuonClip 形态)用到万亿参数规模), 2025. arXiv:2507.20534Kimi K2 是总参数 1T、激活 32B 的 MoE 模型,用 MuonClip(在 Muon 上加 QK-clip 抑制注意力 logit 爆炸)在 15.5T 词元上预训练,全程没有损失尖峰。
- DeepSeek-AI, “DeepSeek-V3 Technical Report” (万亿词元稳定性与损失尖峰实践), 2024. arXiv:2412.19437介绍 DeepSeek-V3,一个 671B 参数、每词元激活 37B 的混合专家模型,用 14.8T 词元训练,采用无辅助损失的负载均衡与多词元预测,以低成本比肩闭源模型。
- Rosenfeld et al., “A Constructive Prediction of the Generalization Error Across Scales,” 2020. arXiv:1909.12673提出泛化误差的参数化包络形式,即随模型规模与数据规模的幂律再加一个不可约下界,在视觉与语言上拟合,早于其在语言模型上的专门化。
- Besiroglu et al., “Chinchilla Scaling: A Replication Attempt,” 2024. arXiv:2404.10102复现 Chinchilla 的参数化拟合,发现其第三种估计与论文自身前两种方法不一致,且其置信区间窄到需要数十万次实验才能成立,而实际只跑了数百次。
- Pearce & Song, “Reconciling Kaplan and Chinchilla Scaling Laws,” 2024. arXiv:2406.12907将 Kaplan 与 Chinchilla 的分歧主要归因于 Kaplan 在小规模下计入的是非嵌入参数而非总参数;一旦计入嵌入参数并放大规模,最优指数便收敛到 Chinchilla 的估计。
- Lovelace et al., “Prescriptive Scaling Laws for Data Constrained Training,” 2026. arXiv:2605.01640在数据受限的扩展律中加入一个显式的过拟合惩罚项,发现更大的模型在重复数据上过拟合得更快,而强权重衰减能大幅降低该惩罚。
- Sharma & Kaplan, “A Neural Scaling Law from the Dimension of the Data Manifold,” 2020. arXiv:2004.10802从数据流形的内蕴维数推导出扩展指数,预言损失随幂律下降,其速率由数据实际占据的维数决定。
- Michaud et al., “The Quantization Model of Neural Scaling,” 2023. arXiv:2303.13506提出技能是离散的量子,按使用频率递减的顺序被学到;当这些频率服从幂律时,按序学习便产生平滑的幂律损失,并把涌现重新解释为量子逐个开启。
- Brill, “Neural Scaling Laws Rooted in the Data Distribution,” 2024. arXiv:2412.07942用自然数据上的渗流理论从第一性原理同时推导出扩展的离散量子图景与数据流形图景,将两种解释统一为渗流阈值两侧的不同区制。
评论
登录后评论