LLM 面试备考
首页/LLM 核心

预训练与 Scaling Law Pretraining & Scaling Laws

所属:01-fundamentals / 01-llm-core
面试权重:★★
来源:通用领域知识;未做一手考证

一句话#

预训练是在海量语料上做下一 token 预测,把算力、参数量、数据量三者按 Scaling Law 的幂律关系配置,得到"会续写世界知识"的基座模型;Scaling Law 回答的核心问题是:给定一份算力预算,模型该多大、数据该多少。

为什么重要(面试角度)#

面试官问这题通常不是考推导,而是看两件事:

  1. 你有没有资源分配的直觉——给定预算,为什么不能只堆模型或者只堆数据。
  2. 你知不知道 Chinchilla 之后的行业共识已经偏离了"Chinchilla-optimal"——这一点是分水岭,很多人只能背出"20 tokens/parameter",却不知道现代模型普遍远超这个比例,也说不出原因。

此外这题连着数据工程(去重、过滤、配比)、训练稳定性(loss spike)与评测(perplexity vs BPB),都是实际做过预训练的人才有体感的地方。

核心内容#

训练目标#

标准的自回归下一 token 预测,交叉熵损失:

L=−1T∑t=1Tlog⁡pθ(xt∣x<t)\mathcal{L} = -\frac{1}{T}\sum_{t=1}^{T} \log p_\theta(x_t \mid x_{<t})

就是一个超大规模的分类任务(类别数 = 词表大小)。基座阶段不做任何 mask 之外的技巧,能力全靠数据规模与模型容量。这也是为什么"预训练是知识注入,post-training 是行为塑造"这个划分成立——SFT/RLHF 很难注入新知识,只能改变调用知识的方式。

算力估算:C ≈ 6ND#

  • 前向:每个参数每个 token 约 2 次浮点运算(一次乘一次加)→ 2ND2ND
  • 反向:约为前向的 2 倍 → 4ND4ND

所以训练总算力约 C≈6NDC \approx 6ND(NN 为参数量,DD 为训练 token 数)。注意这只是前向+反向的主项,不含注意力的 n2n^2 项、激活重计算与通信开销,真实预算通常是它的数倍。这条公式是后面所有"给定预算怎么配"推导的起点。

Kaplan → Chinchilla:一次重要的修正#

结论 实践含义
Kaplan 等(2020) 损失对参数量、数据量、算力都呈幂律;在固定算力下,模型规模的收益明显大于数据量(拟合出的指数更偏向 N) 倾向于训"大而欠训"的模型
Chinchilla(2022) 重新做了更系统的扫描后修正:模型与数据应当近似等比例放大,两条指数都接近 0.5 给定算力时 NN 与 DD 同步增长,衍生出"约 20 tokens / parameter"的经验法则

普遍流传的说法是:按 Chinchilla 的口径训练的小模型可以打败明显更大但欠训的模型(Chinchilla 规模与 Gopher 的对比是常被引用的例子)。具体指数、系数与对比数字请以原文为准,不同复现给出的值有差异。

除了最优配置,Chinchilla 还给出了一个重要的过训视角:当模型规模固定时,增加数据仍然能降损失,只是收益递减。这直接引出下面这点。

为什么现代模型普遍"过训"#

Chinchilla-optimal 是在给定训练算力下的最小损失配置。但真实决策要算的是总拥有成本:推理成本随参数量线性增长,而推理请求数通常是天文数字。

于是行业共识变成:用更多的数据训更小的模型,牺牲一部分训练效率换取远低得多的推理成本。公开报告中可以看到明显超过 20 tokens/parameter 的比例(例如 Llama 3 的 8B 模型在 15T token 量级上训练,比例远高于 Chinchilla 法则)。具体数字以各模型官方发布为准。

一句话总结这个反直觉点:Chinchilla 是"训练最优",业界要的是"推理最优"。

数据:预训练真正的护城河#

环节 做法 为什么重要
采集 Common Crawl 等网页语料 + 代码 + 书籍 + 论文 + 多语种 覆盖决定能力的上限
抽取 正文抽取、去模板、去导航栏 网页噪声占比极高
去重 精确去重 + 近似去重(如 MinHash/LSH) 重复数据会导致模型死记硬背、增加训练量、加剧评测污染
质量过滤 启发式规则 + 质量分类器 + 有害内容过滤 质量和数量同等重要,垃圾数据会拉低损失曲线的斜率
配比(mixing) 各领域采样权重,需要消融确定 配比错误会让某些能力系统性缺失(如代码、多语种)
课程 / 退火 训练末期提高高质量数据比例 常见的"提分"手段

被广泛使用的公开数据集(PG-19、The Pile、C4、RefinedWeb、FineWeb、Dolma 等)在去重与过滤策略上差异很大,这也是为什么"同样的参数量"训出来的模型差别可以很大。

数据受限(data-constrained)怎么办#

高质量数据不够用时,可选路径:

  • 重复使用数据:研究报告的常见结论是少量重复(数个 epoch 以内)与等量新数据的损失接近,超出后收益迅速衰减。具体阈值随数据集与模型规模变化,引用前请核对原文。
  • 提高质量而非数量:过滤、去重、抽取(把"网页"变成"文档")通常比额外多训几个 epoch 更划算。
  • 合成数据:用强模型生成(如改写、问答、推理链),但要防模型自噬(model collapse)——纯合成数据训出来的模型分布会收窄,通常需要与真实数据混合。
  • 换目标:多 token 预测、数据增强、更长的上下文训练。

涌现能力:一个有争议的概念#

有一派工作报告某些能力在模型规模跨过某个阈值后才"突然出现";另一派认为这主要是评测指标造成的假象——当指标是"精确匹配"这类不连续的度量时,曲线看起来是阶跃;换成连续的 log-likelihood 度量就变成平滑上升。两方都有实验支撑,目前没有定论。面试时正确的姿态是:陈述现象、说明争议、指出指标选择会影响结论。

超参与稳定性#

  • 学习率:大模型的稳定学习率反而更小;有经验规律(如 lr∝1/N\text{lr} \propto 1/\sqrt{N} 一类的启发式),但更可靠的做法是用 muP(Maximal Update Parametrization) 之类的参数化,让小模型的调参结果可迁移到大模型,避免在大模型上做昂贵扫描。
  • warmup + cosine/linear 衰减:几乎标配,warmup 长度和最终学习率比是关键超参。
  • loss spike:大模型训练常见且致命。常见缓解手段包括降低学习率、回滚到 checkpoint 并跳过数据、梯度裁剪、以及改进归一化与注意力数值稳定性(如 QK-Norm、embedding 层的归一化、logits soft-cap 等)。这些都是工程细节,但直接决定一次预训练能不能跑完。
  • batch size:临界 batch size 以下增大 batch 能降梯度噪声,超过之后收益递减;大 batch 通常需要相应提高学习率。

评测与阶段划分#

  • 损失:per-token 交叉熵(nats)便于同 tokenizer 内比较;跨 tokenizer 要转成 bits-per-byte(BPB),否则不可比。
  • 阶段划分:主体预训练 → mid-training / 退火(高质量数据、提高特定领域配比)→ 长上下文阶段(用长文档继续训练并扩展位置编码)→ post-training。
  • 验证损失 vs 下游评测:验证损失是平滑的、可外推的;下游 benchmark 噪声大、易饱和、且存在数据污染风险。两者要一起看,不能只看 benchmark 涨。

常见面试问法#

Q:Scaling Law 是什么? A:模型损失随参数量 NN、数据量 DD、算力 CC 呈幂律下降的经验规律(形式上可写成 NN、DD 的负幂项之和)。它的用处是:用中小规模的一系列训练去拟合幂律,再外推预测大模型的损失,从而在花大钱之前决定资源配置。Kaplan 与 Chinchilla 是两代口径,后者的核心结论是 NN 与 DD 近似等比例增长。

Q:给定算力预算怎么配模型和数据? A:按 Chinchilla 口径,NN 和 DD 大致同步增长,经验法则是约 20 tokens/parameter。但这是训练最优;如果考虑推理成本,通常会把模型做小、数据加多("过训"),因为推理是长期经常性支出。同时还要受数据存量约束:高质量数据不够时,只能靠重复、过滤提升质量或合成数据。

Q:为什么现在模型都"过训"了? A:Chinchilla 优化的是给定训练算力下的损失;企业实际优化的是总成本,而推理成本 ∝ 参数量 × 请求量,长期远大于训练成本。因此用小模型 + 更多数据换取更低的推理成本是划算的,代价是训练算力效率降低。

Q:预训练数据怎么处理? A:抽取正文 → 精确与近似去重(MinHash/LSH)→ 启发式与模型式质量过滤 → 有害内容过滤 → 领域配比混合 → 训练末期做高质量数据退火。去重特别关键,重复数据既浪费算力又会加剧记忆与评测污染。

Q:训练中出现 loss spike 怎么办? A:先确认不是数据/数值问题。处理顺序常见为:从 spike 之前的 checkpoint 重启并跳过该批数据、降低学习率、加强梯度裁剪;结构层面可考虑改进归一化、加 QK-Norm、对 logits 做 soft-cap、用更稳定的初始化与参数化。根因往往是大 batch 下某个异常样本与不稳定的注意力数值共同触发,需要逐项排查而不是只调一个旋钮。

易错点#

  • ❌ 只会背"20 tokens/parameter",不知道它只是 Chinchilla 的训练最优,也不知道业界普遍远超这个比例及原因。
  • ❌ 说"数据越多越好"或"模型越大越好",不谈边际收益递减与数据存量约束。
  • ❌ 把 Scaling Law 当成物理定律。它是经验拟合,在分布的边界(数据耗尽、架构变化、训练目标变化)会失效。
  • ❌ 忽略 C≈6NDC \approx 6ND 是主项近似,直接拿它当真实算力预算。
  • ❌ 用不同 tokenizer 的 per-token loss 比较模型,而不换 BPB。
  • ❌ 把 benchmark 分数等同于能力,不看污染与噪声。
  • ❌ 断言"涌现能力一定存在"或"一定是假象"——这仍在争议中,正确做法是说明指标依赖。
  • ❌ 认为预训练能靠 post-training 补——预训练决定知识上限,SFT/RLHF 主要改变行为与调用方式。

自测#

1. 给定算力预算 C,Chinchilla 口径下 N 和 D 大致怎么分配?这个结论在实际决策中会被什么因素推翻?

答案

Chinchilla 的结论是 NN 与 DD 近似等比例增长(约为 20 tokens/parameter)。被推翻的现实因素是推理成本:推理开销 ∝ 参数量 × 请求量,长期远大于训练开销,所以实践中会故意选更小的模型、喂更多数据("过训"),例如公开报告中 8B 级模型在 15T token 量级上训练。另一个现实约束是高质量数据存量,数据不够时只能重复、过滤提纯或使用合成数据。

2. 为什么 C ≈ 6ND?这个估计漏掉了什么?

答案

前向每个参数每个 token 约 2 次浮点运算(乘加各算一次),得 2ND2ND;反向需要计算对权重和输入的梯度,约为前向的 2 倍,得 4ND4ND;合计约 6ND6ND(这里 FLOPs 按乘加算 2 次计)。漏掉的部分包括:注意力的 n2n^2 项(长序列时不可忽略)、激活重计算(gradient checkpointing)带来的额外前向、通信开销(张量/流水/专家并行)、以及低效的 kernel 实现带来的额外时间。

3. 团队要做一次预训练,怎么用 Scaling Law 降低风险?

答案

先在多个小规模配置(不同 NN、DD)上做一系列训练,用这些点拟合幂律,外推出目标规模的损失,据此选定 NN/DD 配比与数据量;再用 muP 一类参数化把小模型上搜到的最优学习率迁移到大模型,避免在大模型上做昂贵扫描。同时要用小规模跑通数据管线、验证 loss 曲线斜率、提前发现 loss spike 与数值稳定性问题。必须认识到外推在架构或数据分布改变时会失效,因此要留安全边际。

4. "涌现能力"存在吗?面试时怎么回答这个问题?

答案

应该说明这是有争议的。一派工作报告某些能力在规模跨过阈值后突然出现;另一派认为这主要是评测指标不连续造成的假象——用精确匹配这类 0/1 指标时曲线呈阶跃,换成 log-likelihood 等连续指标后变为平滑上升。两方都有实验支撑。稳妥回答是:能力确实随规模提升,但"突变"是否是本质属性还是度量假象尚无定论,指标选择会直接影响结论。

5. 你为什么不能拿两个不同模型的 per-token loss 或 perplexity 直接比大小?

答案

因为 tokenizer 不同,同一个语料被切成不同数量的 token,per-token loss 的分母不可比;词表大的模型每个 token 平均携带更多信息,per-token loss 天然更高但也天然更容易。要使用与切分无关的度量,例如 bits-per-byte(BPB):把每个 token 的负对数似然按其覆盖的字节数折算后除以总字节数。跨 tokenizer 比较 loss 与 perplexity 时必须做这个转换。