AI 工程基础体系 · 第 75/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

模型 Scaling Law:参数、数据、算力、损失与训练预算

模型 Scaling Law(缩放定律)研究的是:当模型参数量、训练数据量和训练算力改变时,模型损失、泛化能力和训练成本如何随之变化。

它不是“模型越大越好”的口号,而是一组用于回答以下问题的经验规律与理论近似:

  • 在固定训练预算下,应该增加参数,还是增加数据?
  • 一个模型训练到什么程度算“数据足够”?
  • 为什么更大的模型有时反而没有更好的验证损失?
  • 为什么训练损失继续下降,业务评测却不再提升?
  • 如何从小规模实验外推大规模训练结果?
  • 参数、数据、算力和部署成本之间如何形成同一个生产系统?

Scaling Law 通常描述的是统计趋势,而不是对某个具体模型、数据集或任务的严格保证。它依赖模型架构、优化器、数据分布、数据质量、训练目标、评测指标和硬件实现。工程上使用它时,必须把“可外推的规律”和“仅在当前实验范围内成立的拟合结果”区分开。


一、先建立四个基本量

1. 参数量:模型能表示多少可学习自由度

参数是模型训练过程中通过梯度下降更新的数值。对一个参数化模型:

fθ(x)f_\theta(x)

其中:

  • xx 是输入;
  • θ\theta 是全部参数;
  • fθf_\theta 是模型输出。

参数量记为:

N=θN = |\theta|

例如,一个线性层从 dind_{\text{in}} 维映射到 doutd_{\text{out}} 维,权重矩阵参数量为:

dindoutd_{\text{in}}d_{\text{out}}

偏置还会增加 doutd_{\text{out}} 个参数。

对于 Transformer,主要参数来自:

  1. Token embedding;
  2. 每层的自注意力投影矩阵;
  3. 每层的前馈网络;
  4. LayerNorm 或 RMSNorm 的缩放参数;
  5. 输出词表投影;
  6. 其他架构组件。

以一个常见的 decoder-only Transformer 为例,设:

  • 层数为 LL
  • 隐藏维度为 dd
  • 词表大小为 VV
  • 前馈层中间维度约为 4d4d

如果忽略偏置、归一化和部分实现差异:

  • 每层注意力投影约有 4d24d^2 个参数,分别对应 Q,K,V,OQ,K,V,O
  • 每层前馈网络约有 2d4d=8d22d\cdot 4d=8d^2 个参数;
  • 因此每层约为 12d212d^2
  • 词嵌入和输出层约为 VdVd2Vd2Vd,取决于是否权重绑定。

于是可以用近似式:

N12Ld2+VdN \approx 12Ld^2 + Vd

这不是所有 Transformer 的精确参数公式。采用 GQA、MoE、SwiGLU、权重共享、分组查询注意力或不同归一化方式后,常数会变化。但它解释了一个重要事实:在宽度和深度同时增加时,参数量大致按二次关系增长。

参数量不等于模型“记住的信息量”,也不等于推理时每次都会被完整使用:

  • Dense 模型的每个 token 通常都会经过大部分参数;
  • MoE 模型可能有很大的总参数量,但每个 token 只激活其中一部分专家;
  • 量化会改变存储精度,但不会改变逻辑参数数量;
  • LoRA 只训练少量增量参数,但推理时基础模型参数仍然参与计算。

因此报告“7B 模型”时,至少要说明它是总参数量、激活参数量,还是可训练参数量。


2. 数据量:不是文件大小,而是有效训练 token 数

语言模型通常以 token 为训练单位。记训练 token 数为:

DD

这里的 DD 应尽量表示实际参与损失计算的 token 数,而不是原始文件大小。

例如:

  • 1 GB JSONL 文件不等于固定数量的 token;
  • 中文、英文、代码和数字的 token 化长度不同;
  • 去重、过滤、截断、packing 和重复采样都会改变有效 token 数;
  • padding token 通常不应计入有效训练 token;
  • 经过权限过滤后,最终可合法使用的数据量可能减少。

一个训练样本通常是 token 序列:

x1,x2,,xTx_1,x_2,\ldots,x_T

自回归语言模型使用前缀预测下一个 token:

pθ(xtx<t)p_\theta(x_t\mid x_{<t})

所以长度为 TT 的序列通常产生约 T1T-1 个有效预测位置。若采用 packed sequence,将多个文档拼接到同一个上下文窗口中,还必须通过边界处理避免跨文档预测不符合训练目标。

数据量有三个容易混淆的概念:

  1. 原始数据量:采集到的文档、代码、对话等;
  2. 清洗后数据量:通过格式、语言、质量、重复和安全过滤后的数据;
  3. 训练暴露量:优化过程中实际被模型看到的 token 数。

如果同一数据集训练多个 epoch,那么:

Dexposure=Dunique×ED_{\text{exposure}} = D_{\text{unique}}\times E

其中 EE 是平均重复次数。Scaling Law 中的 DD 通常更接近训练暴露量,但数据重复会降低新增信息量,因此“重复 token”不能简单等同于“新的独立数据”。


3. 算力:完成训练所消耗的计算量

训练算力通常用 FLOPs 表示,即浮点运算次数。记总训练计算量为:

CC

对于一个 dense、自回归 Transformer,在忽略部分细节时,常见的一阶估计是:

Ctrain6NDC_{\text{train}}\approx 6ND

其中:

  • NN 是参数量;
  • DD 是训练 token 数;
  • 6 是前向和反向传播的近似常数。

这个公式的直觉如下:

  • 前向传播大致需要对每个参数执行一次乘加;
  • 反向传播通常需要约两倍于前向的计算量;
  • 合计约为每个参数、每个 token 的 6 次量级 FLOPs。

它不是硬件运行时间公式,也不是所有模型的精确 FLOP 计数。实际计算量还受到以下因素影响:

  • 序列长度;
  • 注意力实现;
  • 激活函数和门控结构;
  • MoE 的激活专家数;
  • 是否使用 checkpointing;
  • 是否计算 loss、评测或额外辅助目标;
  • padding 比例;
  • 通信与重计算。

Transformer 的注意力还存在序列长度相关项。对长度为 SS 的序列,注意力矩阵相关计算和显存访问通常带有 O(S2)O(S^2) 成分,而投影和前馈部分更接近 O(Sd2)O(Sd^2)。因此,在参数量相同、token 数相同的情况下,改变上下文长度和 batch 组织方式,实际 FLOPs、显存和吞吐也可能不同。

FLOPs 与墙钟时间的关系可粗略写为:

TwallCPeffectiveT_{\text{wall}} \approx \frac{C}{P_{\text{effective}}}

其中 PeffectiveP_{\text{effective}} 是有效硬件吞吐,而不是芯片标称峰值。有效吞吐受 kernel、通信、内存带宽、并行策略和故障重试影响,通常低于理论峰值。


4. 损失:模型对目标分布的不确定性

对语言模型,最常用的训练损失是交叉熵:

L=1Mi=1Mlogpθ(yixi)\mathcal{L} = -\frac{1}{M} \sum_{i=1}^{M} \log p_\theta(y_i\mid x_i)

其中:

  • MM 是有效预测位置数;
  • xix_i 是上下文;
  • yiy_i 是目标 token;
  • pθ(yixi)p_\theta(y_i\mid x_i) 是模型给真实 token 分配的概率。

如果模型给真实 token 的概率是 0.50.5,该位置损失为:

log0.50.693-\log 0.5\approx 0.693

如果概率是 0.90.9,损失为:

log0.90.105-\log 0.9\approx 0.105

因此,损失越低,表示模型平均给正确目标分配的概率越高。

语言模型中常用 perplexity(困惑度):

PPL=exp(L)\mathrm{PPL}=\exp(\mathcal{L})

它可以理解为模型在指数意义上的平均不确定性。例如:

  • L=1\mathcal{L}=1,PPL 约为 2.722.72
  • L=2\mathcal{L}=2,PPL 约为 7.397.39

但 PPL 只能在相同 tokenizer、相近数据分布和相同评测处理方式下比较。不同 tokenizer 会改变 token 切分数量,因此不同模型的 token-level PPL 不一定能直接比较。

损失也不是“正确率”的替代品。交叉熵会奖励概率校准:

  • 模型预测正确且置信度从 0.6 提升到 0.9,损失会明显下降;
  • 即使 top-1 预测结果没有改变,损失仍可能改善;
  • 业务任务的准确率、代码通过率、事实性和安全性可能与平均语言建模损失不完全同步。

二、损失为什么会随规模下降

理想情况下,模型学习的是数据分布 pdatap_{\text{data}}。如果模型分布为 pθp_\theta,交叉熵可以写成:

H(pdata,pθ)=H(pdata)+DKL(pdatapθ)H(p_{\text{data}},p_\theta) = H(p_{\text{data}}) + D_{\mathrm{KL}} \left( p_{\text{data}}\parallel p_\theta \right)

其中:

  • H(pdata)H(p_{\text{data}}) 是数据分布本身的熵;
  • DKLD_{\mathrm{KL}} 是真实分布与模型分布之间的 KL 散度;
  • KL 散度非负,且模型完全匹配真实分布时为 0。

这给出一个重要边界:

LH(pdata)\mathcal{L}\ge H(p_{\text{data}})

即使模型无限大、数据无限多、优化完全成功,也不能低于数据分布本身的不可约不确定性。真实语言包含歧义、随机性、未观察到的上下文和标注噪声,因此实际损失存在不可简单消除的部分,通常记为 LL_\infty

经验 Scaling Law 常写为:

L(N,D)L+ANα+BDβL(N,D) \approx L_\infty + A N^{-\alpha} + B D^{-\beta}

其中:

  • NN 是参数量;
  • DD 是训练 token 数;
  • LL_\infty 是不可约损失下界或拟合截距;
  • A,B>0A,B>0 是与数据和模型体系有关的常数;
  • α,β>0\alpha,\beta>0 是经验指数。

这个式子表达两种收益递减:

  • 增大参数量可以降低模型容量误差;
  • 增大数据量可以降低估计误差和过拟合风险;
  • 但二者都不是线性收益。

例如,当参数项为:

ANαA N^{-\alpha}

把参数量扩大 kk 倍后,该项变为:

A(kN)α=kαANαA(kN)^{-\alpha} = k^{-\alpha}AN^{-\alpha}

如果 α=0.1\alpha=0.1,即使参数扩大 10 倍,误差项也只缩小为原来的:

100.10.79410^{-0.1}\approx 0.794

这就是为什么 Scaling Law 经常表现为直线:在 log-log 坐标中,幂函数:

y=axby=a x^{-b}

满足:

logy=logablogx\log y=\log a-b\log x

斜率是 b-b。但直线只说明某个实验区间内近似成立,不能保证无限外推。


三、参数规模与数据规模的关系

1. 固定参数量增加数据

NN 固定、DD 增加时,模型会看到更多样本,通常表现为:

  • 训练损失持续下降;
  • 验证损失下降,但边际收益递减;
  • 重复数据的新增收益小于高质量新数据;
  • 如果优化步数、学习率或 batch 设计不匹配,理论上的数据收益无法实现。

若数据远少于模型的学习需求,模型可能在训练集上快速拟合,验证损失却较高。这是数据受限状态。

但“大模型 + 少量数据”不必然失败。预训练模型进行领域适配时,模型的通用能力来自此前的数据,当前数据只承担分布迁移或行为调整。因此,必须区分:

  • 从随机初始化进行预训练;
  • 在已有模型上继续预训练;
  • 指令微调;
  • 偏好优化;
  • 检索增强。

相同的 N,DN,D 在不同训练阶段不具有相同含义。

2. 固定数据量增加参数

DD 固定、NN 增加时:

  • 小模型通常受容量限制,增大参数明显改善验证损失;
  • 当模型容量超过数据能支持的程度后,继续增大参数收益减小;
  • 若训练不足,大模型可能表现为欠训练,而不是“模型本身无效”。

在经典统计学习直觉中,模型太大可能过拟合;但深度网络常出现“过参数化后仍能泛化”的现象,原因包括优化偏置、数据结构、正则化、随机梯度和参数冗余。不能仅凭参数量判断是否过拟合,必须查看训练损失、验证损失、数据重复率和评测切分。

3. 参数和数据同时增加

现代大模型预训练中,常见目标不是单独增大 NNDD,而是同时调整二者:

L(N,D)L+ANα+BDβL(N,D) \approx L_\infty+A N^{-\alpha}+B D^{-\beta}

当模型变大但数据不变,数据项可能成为主导误差;当数据变多但模型不变,容量项可能成为主导误差。资源分配的核心就是判断哪一项更值得继续投入。


四、固定训练预算下如何分配参数和数据

设训练预算近似固定:

C=kNDC=kND

其中 kk 是由模型架构和训练实现决定的常数。于是:

D=CkND=\frac{C}{kN}

把它代入损失模型:

L(N)=L+ANα+B(CkN)βL(N) = L_\infty + A N^{-\alpha} + B\left(\frac{C}{kN}\right)^{-\beta}

整理得:

L(N)=L+ANα+B(kC)βNβL(N) = L_\infty + A N^{-\alpha} + B\left(\frac{k}{C}\right)^\beta N^\beta

这里出现了两个相反趋势:

  • NαN^{-\alpha}:模型越大,容量误差越小;
  • NβN^\beta:在固定算力下,模型越大,能使用的数据越少,数据误差越大。

令非恒定部分为:

g(N)=ANα+B(kC)βNβg(N)=A N^{-\alpha} + B\left(\frac{k}{C}\right)^\beta N^\beta

NN 求导:

g(N)=αANα1+βB(kC)βNβ1g'(N) = -\alpha A N^{-\alpha-1} + \beta B\left(\frac{k}{C}\right)^\beta N^{\beta-1}

令导数为 0:

αANα1=βB(kC)βNβ1\alpha A N^{-\alpha-1} = \beta B\left(\frac{k}{C}\right)^\beta N^{\beta-1}

两边乘以 NN

αANα=βB(kC)βNβ\alpha A N^{-\alpha} = \beta B\left(\frac{k}{C}\right)^\beta N^\beta

因此,在这个简化模型的最优点,参数误差项与数据误差项满足:

ANαBDβ=βα\frac{ A N^{-\alpha} }{ B D^{-\beta} } = \frac{\beta}{\alpha}

这不是“参数和数据必须相等”,而是两种误差贡献按照指数比例平衡。由此可以得到一般形式:

NCβα+βN^\star\propto C^{\frac{\beta}{\alpha+\beta}}

DCαα+βD^\star\propto C^{\frac{\alpha}{\alpha+\beta}}

如果 α\alphaβ\beta 相近,那么最优参数量和数据量都会随预算增长,但增长关系由经验指数决定。

这套推导说明了为什么不能只根据单个模型的验证损失决定下一个模型规模:需要至少观察多个 N,DN,D 组合,拟合两者的边际收益。


五、一个完整的预算算例

假设某类模型在实验区间内近似满足:

L(N,D)=1.50+0.40N0.10+0.60D0.20L(N,D) = 1.50 + 0.40N^{-0.10} + 0.60D^{-0.20}

为了避免把实际参数量和 token 数的小数幂混在一起,令:

  • NN 的单位为“十亿参数”;
  • DD 的单位为“十亿 token”。

假设训练预算满足:

ND=100ND=100

也就是模型参数量与训练 token 数的乘积固定为 100(单位为十亿乘十亿)。

于是:

D=100ND=\frac{100}{N}

代入损失:

L(N)=1.50+0.40N0.10+0.60(100N)0.20L(N) = 1.50 + 0.40N^{-0.10} + 0.60\left(\frac{100}{N}\right)^{-0.20}

比较三个方案。

方案 A:1B 参数,100B token

N=1,D=100N=1,\quad D=100

参数项:

0.40×10.10=0.400.40\times 1^{-0.10}=0.40

数据项:

0.60×1000.200.60×0.3980.2390.60\times100^{-0.20} \approx 0.60\times0.398 \approx0.239

所以:

LA1.50+0.40+0.239=2.139L_A\approx1.50+0.40+0.239=2.139

方案 B:10B 参数,10B token

参数项:

0.40×100.100.40×0.7940.3180.40\times10^{-0.10} \approx0.40\times0.794 \approx0.318

数据项:

0.60×100.200.60×0.6310.3790.60\times10^{-0.20} \approx0.60\times0.631 \approx0.379

所以:

LB1.50+0.318+0.379=2.197L_B\approx1.50+0.318+0.379=2.197

方案 C:100B 参数,1B token

参数项:

0.40×1000.100.40×0.6310.2520.40\times100^{-0.10} \approx0.40\times0.631 \approx0.252

数据项:

0.60×10.20=0.600.60\times1^{-0.20}=0.60

所以:

LC1.50+0.252+0.60=2.352L_C\approx1.50+0.252+0.60=2.352

在这个人为设定的缩放函数中,方案 A 的预测损失最低,因为数据项的指数和系数使得“极少数据的大模型”受到明显的数据限制。

但这个例子不能推出“1B 模型总是优于 100B 模型”。它只说明:

  1. 固定训练计算量时,大模型会消耗更多预算;
  2. 大模型如果没有相应的数据量,可能处于欠训练状态;
  3. 最优比例取决于拟合出的 α,β,A,B\alpha,\beta,A,B
  4. 真实任务还要加入通信、显存、优化稳定性、推理成本和业务评测。

如果把模型总参数量扩大 100 倍,却只把训练 token 减少 100 倍,模型的知识覆盖和泛化能力可能不如一个参数较小但训练充分的模型。


六、Kaplan Scaling Law 与 Chinchilla 结论

早期关于语言模型 Scaling Law 的研究显示,在一定范围内,验证损失可以分别近似为参数量、数据量和计算量的幂函数。实践中常引用 Kaplan 等人的工作来说明:

  • 模型规模增大通常带来可预测的损失下降;
  • 数据规模、模型规模和计算量存在可拟合关系;
  • 大模型训练需要足够优化步数和数据。

后来 Hoffmann 等人的 Chinchilla 研究重新讨论了固定计算预算下的参数与数据分配,结论之一是:当时很多大型语言模型参数很多、训练 token 相对不足,属于计算最优意义上的欠训练。增加训练数据、适当减少参数量,可能在相同训练算力下取得更低损失。

这两个方向并不矛盾:

  • Kaplan 风格规律强调损失随规模变化的可预测性;
  • Chinchilla 风格分析强调在固定预算下重新分配参数和数据;
  • 两者的具体指数和最优比例依赖实验设置;
  • 后续模型架构、数据质量、训练目标和上下文长度变化后,不能机械套用某个固定 token/parameter 比例。

“每个参数需要多少 token”只能作为初始规划依据,而不是自然常数。更可靠的方法是用目标模型家族的预实验拟合自己的 scaling curve。


七、训练 token、优化步数和 batch size 的区别

训练 token 数 DD 不是优化步数 SS

如果每个优化步平均处理 BB 个有效 token,则:

DS×BD\approx S\times B

其中 BB 是全局 batch 的有效 token 数,包括数据并行副本和梯度累积后的总量。

例如:

  • 8 张 GPU;
  • 每张 GPU 每步处理 2048 个 token;
  • 梯度累积 4 次后更新一次参数。

则一次优化更新的有效 token 数约为:

B=8×2048×4=65536B=8\times2048\times4=65536

如果计划训练 10,000 次 optimizer update:

D65536×10000=655,360,000D\approx65536\times10000 =655{,}360{,}000

约为 0.656B token。

但 batch size 改变后,训练动力学不一定保持不变:

  • 大 batch 降低梯度噪声;
  • 学习率通常需要相应调整;
  • warmup、权重衰减和梯度裁剪的有效行为可能变化;
  • 在相同 token 数下,不同 update 次数可能得到不同结果;
  • 通信和显存效率也会变化。

因此,单纯比较 DD 仍不够,还要记录:

  • optimizer update 数;
  • global batch token 数;
  • 学习率和调度;
  • 参数更新次数;
  • 数据顺序和重复策略;
  • 是否使用梯度累积。

当训练数据无限且每步都能有效学习时,token 数是重要主变量;在实际训练中,优化器状态和更新频率会使“相同 token 数”不等于“相同训练过程”。


八、训练损失、验证损失和业务指标

1. 训练损失下降不代表泛化能力无限提升

训练损失是在优化数据上的平均损失,验证损失是在未参与参数更新的数据上的平均损失。

常见状态包括:

训练损失 验证损失 可能原因
下降 下降 正常学习
下降 先降后升 过拟合、数据泄漏边界、分布差异
下降很慢 下降很慢 优化困难、学习率不合适、模型或数据管道问题
下降 基本不变 训练集与验证集分布不同,或指标已进入平台期
不下降 不下降 梯度、标签、token shift、数值稳定性或数据读取故障

如果验证集与训练集有近重复内容,验证损失会虚低;如果验证集来自真实用户分布而训练集是清洗后的高质量语料,验证损失又可能偏高。数据切分必须按文档、用户、时间或来源进行合理隔离,不能只随机切 token。

2. 语言模型损失与能力出现“脱钩”

生成式 AI 的业务指标可能包括:

  • 代码编译或测试通过率;
  • 指令遵循;
  • 工具调用成功率;
  • 事实性;
  • 安全拒答准确率;
  • 检索问答的引用正确率;
  • 延迟、吞吐和单位成本。

这些指标不一定随预训练交叉熵等比例变化。例如:

  • 语言建模损失改善可能主要来自常见文本,而不是稀有代码语法;
  • 指令微调可能改变行为分布,但不显著改变通用验证集 PPL;
  • 安全评测可能需要专门的攻击集,不能由平均损失推断;
  • RAG 系统的最终答案质量同时受检索召回、权限过滤和生成模型影响。

因此,Scaling Law 需要至少分成三层:

  1. 训练目标层:如 token-level cross entropy;
  2. 能力评测层:如代码、数学、知识和推理任务;
  3. 生产指标层:如成功率、延迟、成本、权限违规率和故障恢复时间。

九、数据质量会改变 Scaling Law

把数据量 DD 当作唯一数据变量是一个有用但不完整的近似。更接近实际的表达可以是:

LL+ANα+BDeffβ+EnoiseL \approx L_\infty + A N^{-\alpha} + B D_{\text{eff}}^{-\beta} + E_{\text{noise}}

其中 DeffD_{\text{eff}} 是有效数据量,而不是原始 token 数。

可以用一个粗略的质量权重表示:

Deff=i=1DqiD_{\text{eff}}=\sum_{i=1}^{D}q_i

其中每个 token 或文档的 qiq_i 表示其有效信息贡献。实际系统不会真的为每个 token 精确计算 qiq_i,但这个形式有助于理解:

  • 重复页面的 qiq_i 可能很低;
  • 高质量代码、数学推导或领域文档的 qiq_i 可能较高;
  • 错误标签、乱码和模板垃圾可能引入负面影响;
  • 过度过滤又可能损失长尾知识;
  • 数据的合法授权和隐私合规不等于其训练质量,但它们决定数据能否进入生产流程。

数据质量还可能造成“损失下降但能力下降”。例如,若清洗规则错误地删除了大量低频符号,模型在通用文本验证集上可能变好,但代码、表格或数学任务会退化。

生产数据管道至少要记录:

  • 数据来源和授权状态;
  • 文档级唯一 ID;
  • 抓取或生成时间;
  • 清洗版本;
  • 去重哈希;
  • 语言、领域和质量标签;
  • 是否含个人信息、机密信息或受限内容;
  • 进入训练集、验证集和测试集的版本。

这些元数据不是附属信息。没有它们,就无法解释某次 Scaling Law 变化是模型规模造成的,还是数据配比和过滤规则造成的。


十、为什么小规模实验可以外推,但也容易失效

Scaling Law 常用于小模型实验外推大模型结果。典型做法是固定一套架构和数据处理流程,训练多个规模点:

(Ni,Di,Ci,Li)(N_i,D_i,C_i,L_i)

然后拟合:

Li=L+ANiα+BDiβL_i=L_\infty+A N_i^{-\alpha}+B D_i^{-\beta}

或者在固定 NN、固定 DD 或固定 CC 的切片上拟合幂律。

外推成立需要若干条件:

  1. 架构家族相同:层结构、激活函数、注意力形式不能随规模完全改变;
  2. 数据分布相同:小实验和大训练不能使用完全不同的数据质量;
  3. 优化过程相似:学习率、batch、训练稳定性和收敛状态可比;
  4. 没有跨越明显相变:例如从无法拟合某类模式到突然学会;
  5. 硬件和并行策略没有引入新的瓶颈
  6. 评测集和指标稳定

外推常见失败原因包括:

  • 小模型处于优化不足,大模型处于数据不足;
  • 小规模时通信开销可忽略,大规模时通信成为瓶颈;
  • 序列长度随规模变化,导致 FLOP 关系改变;
  • 大模型使用了不同 tokenizer、数据配比或 MoE 路由;
  • 训练数据出现污染或评测泄漏;
  • 业务能力存在阈值效应,平均损失的平滑曲线无法预测离散任务表现;
  • 大规模训练发生数值溢出、梯度异常或故障重启。

因此,拟合曲线时应保留验证集,检查残差,而不是只看拟合 R2R^2。如果误差随规模系统性偏向一侧,说明函数形式或实验控制变量可能不对。

下面的 Python 示例演示如何在对数空间拟合简单幂律。它使用合成数据,不代表任何真实模型比例。

import numpy as np

# 合成实验数据:
# N: 参数量,单位为十亿参数
# D: 训练量,单位为十亿 token
# loss: 验证损失
N = np.array([0.5, 1, 2, 4, 8, 16], dtype=float)
D = np.array([10, 20, 40, 80, 160, 320], dtype=float)
loss = np.array([2.90, 2.73, 2.59, 2.48, 2.39, 2.32], dtype=float)

# 仅拟合 loss - L_inf = A * N^(-alpha)
# 这里必须假设 L_inf;真实实验通常需要联合非线性拟合,
# 并用独立实验检查外推是否可靠。
L_inf = 2.0
y = np.log(loss - L_inf)
x = np.log(N)

slope, intercept = np.polyfit(x, y, deg=1)
alpha = -slope
A = np.exp(intercept)

print(f"alpha={alpha:.4f}, A={A:.4f}")
print("N=32B 时预测 loss=", L_inf + A * 32 ** (-alpha))

预期输出会打印一个正的 alpha 和对 N=32N=32 的预测损失。这个示例的关键限制是:L_inf 被人为固定,而且数据同时改变了 NNDD,所以它不能识别“纯参数效应”。若要估计 α\alpha,应在多个不同数据规模下保持 DD 近似固定,或者直接拟合包含 N,DN,D 的联合模型。


十一、从训练预算到真实成本

训练预算不只有 FLOPs。生产系统至少包含以下成本:

Total Cost=Training+Evaluation+Storage+Network+Operations+Risk\text{Total Cost} = \text{Training} + \text{Evaluation} + \text{Storage} + \text{Network} + \text{Operations} + \text{Risk}

1. 训练成本

若云实例价格为 pp,使用 GG 张 GPU,墙钟时间为 TT,则粗略成本为:

Costtrain=pGT\text{Cost}_{\text{train}} = pGT

而:

T6NDGPeffective+Tcommunication+TrecoveryT \approx \frac{6ND}{G P_{\text{effective}}} + T_{\text{communication}} + T_{\text{recovery}}

当 GPU 数量增加时,理想情况下第一项按 1/G1/G 缩短,但通信、同步和故障恢复会使实际收益递减。

2. 评测成本

如果每个 checkpoint 都运行完整评测,评测计算可能成为显著成本。尤其是:

  • 长上下文评测;
  • 多次采样的生成评测;
  • 工具调用和浏览器环境;
  • 人工偏好评测;
  • 安全红队测试。

不能只把训练 FLOPs 作为总预算,否则可能得到一个训练损失更低、但无法完成生产验收的模型。

3. 推理成本

训练时的最优模型不一定是生产时的最优模型。推理成本通常受以下因素影响:

  • 每 token 激活的参数量;
  • 上下文长度;
  • KV cache 大小;
  • batch 和并发;
  • 量化精度;
  • 目标延迟;
  • 服务可用性;
  • 输出 token 数。

一个参数很多但训练充分的模型,可能在训练预算上更优;但若在线请求量很大,较小模型、蒸馏模型或路由模型可能有更低的总拥有成本。

4. 权限和风险成本

训练数据、checkpoint、日志和评测样本都可能包含敏感信息。系统必须明确:

  • 谁可以读取原始训练数据;
  • 谁可以下载 checkpoint;
  • 谁可以启动高成本训练任务;
  • 谁可以修改数据过滤配置;
  • 谁可以访问用户提示词和生成结果;
  • 哪些评测样本不得写入公开日志。

权限错误会改变实际可用数据量,也会产生合规和安全成本。Scaling Law 不能证明一个模型“值得上线”,因为上线还需要满足数据授权、隐私、模型发布权限和审计要求。


十二、训练系统中的状态、数据流和故障路径

一个可复现的训练实验不应只有一个最终 loss 数字。其最小状态可以表示为:

数据版本
  -> 清洗与去重
  -> tokenizer 版本
  -> 数据切分与采样权重
  -> 模型配置
  -> 优化器与学习率配置
  -> checkpoint
  -> 训练日志
  -> 验证损失与能力评测
  -> 成本、权限和发布决策

训练过程中的状态包括:

  • 当前 optimizer update;
  • 已处理 token 数;
  • 当前 epoch 或数据游标;
  • 模型权重;
  • 优化器状态;
  • 学习率调度状态;
  • 随机数状态;
  • 混合精度 scaler;
  • 数据采样器状态;
  • checkpoint 元数据。

如果只保存模型权重而不保存优化器和数据游标,恢复训练后可能出现:

  • 学习率调度跳变;
  • Adam 一阶、二阶动量丢失;
  • 数据重复或跳过;
  • 随机性改变;
  • 相同 token 预算下训练轨迹不同。

可以用下面的状态图理解一次训练故障:

stateDiagram-v2
    [*] --> Prepared: 数据与配置校验
    Prepared --> Running: 启动训练
    Running --> Checkpointed: 定期保存
    Running --> Failed: OOM/通信/数值异常
    Failed --> Recovering: 读取最近完整 checkpoint
    Recovering --> Running: 恢复权重、优化器和数据状态
    Recovering --> Aborted: checkpoint 损坏或版本不兼容
    Checkpointed --> Running: 继续训练
    Running --> Evaluating: 达到评测间隔
    Evaluating --> Running: 评测完成
    Evaluating --> Released: 通过验收
    Evaluating --> Aborted: 指标或权限不通过

关键路径是:

  1. 数据和配置先固定版本;
  2. 训练按有效 token 计数;
  3. checkpoint 同时保存模型、优化器和进度状态;
  4. 故障后从最近一致状态恢复;
  5. 评测不仅看 loss,还检查能力、成本和权限;
  6. 只有通过生产验收才进入发布状态。

如果训练中出现 NaN,不能只重启任务。应检查:

  • 输入是否含非法数值;
  • loss mask 是否错误;
  • 学习率是否过大;
  • 梯度范数是否爆炸;
  • 混合精度是否溢出;
  • checkpoint 是否已被污染;
  • 某一批数据是否触发异常长度或异常 token。

十三、用 Transformer 结构理解算力瓶颈

Transformer 的核心是自注意力。原始论文中的注意力计算形式为:

Attention(Q,K,V)=softmax(QKdk)V\mathrm{Attention}(Q,K,V) = \mathrm{softmax} \left( \frac{QK^\top}{\sqrt{d_k}} \right)V

其中:

  • QQ 是 query;
  • KK 是 key;
  • VV 是 value;
  • dkd_k 是 key 的维度。

对于长度为 SS 的序列:

  • QKQK^\top 形成约 S×SS\times S 的注意力分数矩阵;
  • 其计算和存储与 S2S^2 有关;
  • 当上下文长度增加时,注意力部分可能成为主要瓶颈。

这解释了两个工程边界:

  1. 只用 N,DN,D 估算训练 FLOPs,可能低估长上下文成本;
  2. 只比较参数量,可能忽略不同注意力实现的显存和吞吐差异。

Hugging Face Transformers 等框架通常把模型配置、tokenizer、训练器和 checkpoint 生命周期分开管理。具体字段、类和参数会随版本变化,不能把某个版本的配置名当作跨框架规范。无论使用何种框架,实验记录都应明确:

  • 模型配置;
  • tokenizer 和词表;
  • 最大序列长度;
  • padding 和 truncation 策略;
  • loss mask;
  • batch 与梯度累积;
  • checkpoint 格式;
  • 评测脚本版本。

尤其要验证 labels 与输入 token 的位移关系。自回归训练中,位置 tt 的输出应预测目标 xt+1x_{t+1}。如果数据管道错误地让模型直接看到目标 token,训练损失会异常低,生产生成却明显失败。


十四、常见误解与反例

误解一:参数越多,能力必然越强

反例是一个超大模型只训练了很少 token。它可能具有很强的表示容量,却没有充分学习语言、代码或领域分布。另一个较小但训练充分的模型,可能取得更低的验证损失和更好的单位成本。

正确表述应是:在架构、数据、优化和预算条件相近时,扩大参数通常带来可预测的收益,但收益递减,并且需要匹配的数据和训练计算。

误解二:训练数据越多,数据质量就不重要

如果大量数据来自重复网页、模板垃圾或错误标签,新增 token 的有效信息很少,甚至会改变数据分布,使模型在目标领域退化。

反例是:加入数倍低质量数据后,训练 token 数增加,但领域验证损失和事实性下降。此时问题不是 Scaling Law 失效,而是 DD 不再能代表有效信息量。

误解三:训练损失最低的模型一定最适合上线

一个模型可能在预训练验证集上损失最低,却有:

  • 更高推理延迟;
  • 更高 GPU 成本;
  • 更差的指令遵循;
  • 更高的幻觉率;
  • 更严重的数据泄漏;
  • 不满足发布权限要求。

生产选择应优化约束下的综合目标,而不是单一 loss:

minmodelbusiness risk\min_{\text{model}} \quad \text{business risk}

满足:

qualityqmin\text{quality}\ge q_{\min}

latencytmax\text{latency}\le t_{\max}

cost/requestcmax\text{cost/request}\le c_{\max}

privacy and license constraints\text{privacy and license constraints}

误解四:loss 曲线是直线,所以可以无限外推

幂律通常只在有限区间内近似成立。外推到更大规模时,可能遇到:

  • 数据耗尽;
  • 训练不稳定;
  • 架构瓶颈;
  • 通信瓶颈;
  • 评测分布变化;
  • 新能力的离散阈值;
  • 不同 tokenizer 或上下文长度。

实际诊断时,应至少做三件事:

  1. 在不同规模上保留独立验证实验;
  2. 查看 log-log 残差而不是只看拟合曲线;
  3. 对数据配比、优化器和评测集做版本锁定。

误解五:GPU 峰值 FLOPs 等于可用训练算力

峰值 FLOPs 是硬件理论上限。真实训练还受:

  • 内存带宽;
  • kernel 融合;
  • 张量并行通信;
  • 数据加载;
  • checkpoint I/O;
  • 故障恢复;
  • GPU 利用率波动。

影响。规划预算时应使用实测有效吞吐,并把恢复时间和评测时间纳入总预算。


十五、如何设计一次有解释力的 Scaling 实验

一次最低限度可解释的实验,应同时改变和记录多个规模点,而不是只训练一个“大模型”。

第一步:固定数据和评测协议

固定:

  • tokenizer;
  • 文档去重规则;
  • 训练、验证和测试切分;
  • 数据混合权重;
  • 最大序列长度;
  • loss mask;
  • 评测脚本和随机种子范围。

否则模型变化与数据管道变化无法区分。

第二步:选择多个参数规模

例如选择:

N{0.1B,0.3B,1B,3B}N\in\{0.1B,0.3B,1B,3B\}

具体规模不是规范,关键是覆盖足够宽的区间,并尽量保持:

  • 每层结构相同;
  • 宽度和深度的扩展规则稳定;
  • 词表和 tokenizer 一致;
  • 训练代码相同。

第三步:选择多个数据预算

对于每个 NN,设置多个 DD,例如:

D{10B,30B,100B}D\in\{10B,30B,100B\}

这样可以区分参数受限和数据受限,而不是把所有实验都放在同一条 NDND 曲线上。

第四步:记录真实 token 和真实计算量

不要用“训练了多少天”代替 token 计数。至少记录:

model_parameters
effective_training_tokens
optimizer_updates
global_batch_tokens
sequence_length
observed_training_time
measured_tokens_per_second
estimated_or_profiled_flops
checkpoint_restarts
validation_loss
task_metrics

第五步:同时评测三类指标

  • 训练目标:验证交叉熵、PPL;
  • 能力指标:知识、代码、数学、长上下文、安全;
  • 系统指标:吞吐、延迟、显存、成本和故障率。

第六步:拟合并验证

先用实验数据拟合参数和数据指数,再用没有参与拟合的规模点进行验证。如果模型预测在小范围内很好、跨一个规模点就明显偏离,应缩小外推范围或引入新的变量,而不是强行继续外推。


十六、训练预算的实际决策框架

可以把一次模型训练决策写成以下约束问题:

选择 N,D,S,architecture,data mixture使得 Lval 足够低Mcapability 达到目标CtrainCbudgetCinferenceCserving权限、隐私和许可证约束成立\begin{aligned} \text{选择 } &N,D,S,\text{architecture},\text{data mixture}\\ \text{使得 }& L_{\text{val}}\text{ 足够低}\\ & M_{\text{capability}}\text{ 达到目标}\\ & C_{\text{train}}\le C_{\text{budget}}\\ & C_{\text{inference}}\le C_{\text{serving}}\\ & \text{权限、隐私和许可证约束成立} \end{aligned}

其中:

  • NN 决定容量和推理参数规模;
  • DD 决定训练暴露量和知识覆盖;
  • SS 决定更新次数;
  • 架构决定每 token 的实际计算和显存开销;
  • 数据混合决定不同领域能力的权重;
  • 训练预算决定可行区域,而不是直接决定唯一答案。

一个可执行的决策顺序是:

  1. 先定义生产目标,而不是先决定参数量;
  2. 估算推理并发、延迟和显存约束;
  3. 用小规模实验估计 N,DN,D 的边际收益;
  4. 在固定预算下比较参数优先、数据优先和均衡方案;
  5. 对高风险数据进行授权、隐私和质量审查;
  6. 将训练、评测、存储、恢复和部署成本一起核算;
  7. 通过独立评测确认 Scaling Law 的预测没有掩盖业务退化。

十七、结论

模型 Scaling Law 的核心不是一个固定的“参数与 token 比例”,而是一个受条件约束的经验模型:

L(N,D)L+ANα+BDβL(N,D) \approx L_\infty + A N^{-\alpha} + B D^{-\beta}

在训练计算量近似为:

C6NDC\approx6ND

时,增大参数会减少容量误差,但会压缩可使用的数据量;增大数据会改善估计和泛化,但在模型容量不足时收益会递减。固定预算下的合理选择,取决于两类误差的边际收益,而不是模型大小本身。

真正可靠的 Scaling 实验必须同时控制:

  • Transformer 架构;
  • tokenizer 和数据处理;
  • 有效 token 数;
  • optimizer update 与 batch;
  • 验证集和业务评测;
  • 实测吞吐与故障恢复;
  • 数据权限、隐私和发布成本。

因此,参数、数据、算力、损失与训练预算应被视为同一生产系统中的相互约束变量。Scaling Law 可以帮助工程师减少盲目试错、规划训练规模和估算收益,但最终模型是否值得训练和上线,必须由损失、能力、系统成本和治理约束共同决定。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。