跳转至

五十九:预训练过程、评估与继续预训练

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484846&idx=1&sn=e4b760606feb756217f26400e4e627a1&chksm=f01eb6d7c7693fc1609637dfd99316cc82991b1ff6cf5522a0c199618564d233031eb4d0d938#rd

1. 学习范围

本日主题覆盖预训练的后半部分:整体过程、评估和继续预训练,重点是继续预训练。 本日覆盖: - 预训练工程流程。

  • 模型初始化、tokenizer、数据流、batch 和 sequence packing。

  • 优化器、学习率、warmup/cooldown、梯度裁剪和混合精度。

  • 分布式训练方式与稳定性监控。

  • 预训练评估:loss、perplexity、benchmark、污染检测和回归测试。

  • Scaling law 的基本直觉和实验用途。

  • 继续预训练的定义、适用场景、数据配方、学习率 re-warmup 和防遗忘。

  • 继续预训练与 SFT、RAG、领域微调的区别。

2. 预训练过程总览

一个实际预训练流程可以简化为:

1. 确定模型架构、tokenizer、上下文长度和训练预算
2. 构建预训练数据配方
3. 清洗、去重、tokenize、pack、shard
4. 配置分布式训练
5. 选择 optimizer、learning rate schedule 和 batch size
6. 启动训练并持续监控 loss、吞吐和稳定性
7. 周期性 checkpoint 和评估
8. 发现问题后回滚、修复数据或调整超参
9. 训练结束后做完整 benchmark 和安全评估
预训练不是只调用一个训练脚本,而是模型、数据、系统和评估共同闭环。

3. 模型与 tokenizer 决策

训练开始前要固定若干关键配置: - 模型架构,例如 decoder-only Transformer。

  • 参数规模和层数、hidden size、attention heads、FFN size。

  • 位置编码方式(实际上也属于模型架构的一部分),例如 RoPE。

  • 上下文长度(与数据构造切分相关)。

  • tokenizer 词表和特殊 token。

  • 是否使用 GQA/MQA、SwiGLU、RMSNorm 等结构(还是模型架构的一环)。

Tokenizer 一旦确定,后续很难更换。关于Tokenizer的一些方法可以看我之前的:Tokenizer和Transformers 库基础知识:Tokenizer上下文长度也会影响数据 packing、显存、训练吞吐和长上下文能力。

4. Batch、sequence length 与 tokens

预训练通常按训练的 token 数衡量进度,而不是按 epoch。 关键概念:

global_batch_tokens = micro_batch_size * sequence_length * data_parallel_size * gradient_accumulation_steps
全局 batch 太小,梯度噪声大,吞吐低;太大,泛化和优化可能受影响,也需要调整学习率。 Sequence length 越长,attention 计算和显存压力越大,但能训练长程依赖。

5. 优化器与学习率

LLM 预训练常用 AdamW 或其分布式变体。 常见学习率 schedule: - Warmup:训练初期逐渐升高学习率,避免刚开始不稳定。

img

  • Cosine decay:训练中后期逐渐降低学习率。

img

  • Cooldown:最后阶段更平滑地降低学习率,提升收敛。

-

-

-

-

lr↑max_lr |    /\       |   /  \       |  /    \       | /       \min_lr |           \────  ← Cooldown冷却段(极平缓缓慢下降)       └──────────────────→ epoch     warmup  cosine衰减  cooldown精细收敛

学习率过大容易 loss spike、NaN 或发散。学习率过小会训练慢、欠拟合。

6. Mixed Precision 与数值稳定

大模型训练通常使用 bf16 或 fp16 混合精度。 bf16 动态范围更大,稳定性通常优于 fp16。详细见十八:训推不一致 BF16 与 FP16 的差异 小节。 常见稳定性手段: - gradient clipping。

  • loss scaling,主要针对 fp16。

  • 检查 NaN/Inf。

  • 监控 gradient norm、activation norm 和 parameter norm。

  • 对异常 checkpoint 做回滚。

数值问题不会总是立即崩溃,有时表现为 loss 缓慢异常或能力退化。

7. 分布式训练

预训练通常需要多维并行: - Data Parallelism:不同 GPU 处理不同 batch。

  • Tensor Parallelism:把单层矩阵计算切分到多个 GPU。

  • Pipeline Parallelism:把不同层切分到不同 GPU。

  • ZeRO/FSDP:切分 optimizer state、gradient 和参数,降低显存。

  • Sequence Parallelism:在序列维度上进一步切分部分计算。

选择并行策略的目标是让模型放得下、吞吐足够高、通信开销可控,并且 checkpoint 和故障恢复可管理。详细见二十一:分布式训练:DDP、DP 与 FSDP。

8. 数据流与吞吐

GPU 训练吞吐不仅取决于模型,也取决于数据读取。 数据系统要保证: - tokenized shard 能高效读取。

  • shuffle 足够随机。

  • worker 不重复消费同一数据。

  • checkpoint 恢复后数据顺序可复现。

  • IO 不让 GPU 空转。

实际训练中,GPU 利用率下降经常不是模型问题,而是数据管道或网络存储问题。

9. 训练稳定性监控

需要持续监控: - training loss。

  • validation loss。

  • learning rate。

  • gradient norm。

  • activation norm。

  • loss scale。

  • tokens/sec。

  • GPU utilization。

  • memory usage。

  • all-reduce 或通信耗时。

  • dataloader wait time。

Loss spike 不一定必须停止,但如果伴随 NaN、梯度异常或验证集恶化,需要回滚并定位原因。

10. Checkpoint 策略

Checkpoint 不是只为了最终模型保存。 它用于: - 故障恢复。

  • 回滚异常训练。

  • 中间评估。

  • 选择最佳 checkpoint。

  • 支持继续预训练或分支实验。

完整 checkpoint 通常包括模型参数、optimizer state、scheduler state、随机数状态和数据迭代位置。只保存模型参数无法无缝恢复训练。

11. 预训练评估总览

预训练评估可以分为三层。 第一层是训练内部指标,例如 train loss、validation loss、perplexity(困惑度) 和吞吐。 第二层是通用能力 benchmark,例如知识、常识、数学、代码、阅读理解、多语言和安全。 第三层是产品或领域任务评估,例如内部 QA、工具调用、文档理解、客服准确率。 只看训练 loss 不够,因为 loss 下降不保证所有下游能力提升。

12. Loss 与 Perplexity

Validation loss 是最基础的预训练评估指标。 如果 loss 用自然对数,则:

perplexity = exp(loss)
Perplexity 可以理解为模型在每个位置平均“困惑”的候选数。越低通常越好,但跨 tokenizer、跨数据集比较要谨慎。

13. Benchmark 评估

常见 benchmark 类别: - 常识与知识问答。

  • 阅读理解。

  • 数学推理。

  • 代码生成。

  • 多语言理解。

  • 长上下文。

  • 安全和偏见。

  • 指令遵循。

Base model 的 benchmark 需要特别注意 prompt 格式。没有经过 SFT 的模型可能不稳定地遵循指令,因此需要合理的 zero-shot、few-shot 或 continuation-style 评测。

14. 数据污染检测

评估前必须考虑 contamination。 如果训练集包含 benchmark 原题或答案,模型高分可能只是记忆。 污染检测方法: - exact match。

  • n-gram overlap。

  • MinHash/SimHash 近重复检索。

  • embedding similarity。

  • 时间切分。

  • 私有 holdout。

  • 人工审核可疑样例。

污染风险越高,benchmark 可信度越低。

15. 回归评估

每次改变数据配方、学习率、checkpoint 或继续预训练策略,都需要回归评估。 回归评估关注: - 新目标能力是否提升。

  • 原有通用能力是否下降。

  • 安全性是否下降。

  • 多语言能力是否偏移。

  • 长上下文或格式能力是否异常。

这在继续预训练中特别重要。

16. Scaling Law 的直觉

Scaling law 描述模型 loss 与参数量、数据量、计算量之间的经验关系。 常见直觉: - 增大模型、数据和计算通常会降低 loss。

  • 收益通常呈幂律递减。

  • 固定计算预算下,参数量和 token 数存在较优配比。

  • 小规模实验可以帮助预测大规模训练表现。

Scaling law 不能替代最终实验,但能降低盲目试错成本,帮助我们提前确定一些较为合适的参数选取。

17. Scaling Law 在工程中的用途

它常用于: - 选择模型大小。

  • 估计需要多少训练 token。

  • 比较数据配方。

  • 预测训练到某个 token 数时的 loss。

  • 决定是否继续训练还有收益。

  • 规划计算预算。

大型模型训练前通常会做小模型、小数据或短程训练,用于拟合 scaling trend。

18. 继续预训练定义

继续预训练是从已有模型 checkpoint 出发,继续使用语言建模目标在新数据或特定数据混合上训练。 它也常被称为 continual pretraining、continued pretraining 或 domain-adaptive pretraining。 它的目标不是教模型对话格式,而是改变或补充 base distribution。

19. 继续预训练适用场景

继续预训练适合: - 领域适配,例如医疗、法律、金融、代码、安全。

  • 语言适配,例如增强低资源语言能力。

  • 新知识注入,例如更新到近期资料。

  • 数据配方修正,例如增加数学或代码比例。

  • 长上下文适配,与位置编码和 sequence length 扩展结合。

  • 从通用 base model 发展领域 base model。

如果只需要少量事实查询,RAG 可能更合适。如果只需要改变回答格式,SFT 可能更合适。

20. 继续预训练与 SFT 的区别

继续预训练仍使用 next-token prediction,数据通常是领域原始文本或混合语料。 SFT 使用指令-回答数据,目标是让模型按指令完成任务。 继续预训练更偏“补充模型底层分布和知识”,SFT 更偏“改变交互行为和任务格式”。 二者经常串联使用:

base model -> continued pretraining -> domain SFT -> preference alignment

21. 继续预训练的数据配方

继续预训练不应只把领域数据堆进去。 常见配方:

domain data: 40% - 80%
general replay data: 20% - 60%
code/math/multilingual data: 按目标保留
Replay 数据用于保留通用能力,降低 catastrophic forgetting。 领域数据质量比数量更重要。低质量领域文本会快速污染模型风格和事实。

22. Catastrophic Forgetting

Catastrophic forgetting 指模型在新领域训练后,原有通用能力显著下降。 常见原因: - 继续预训练数据过窄。

  • 学习率过大。

  • 训练 token 过多。

  • 缺少通用 replay。

  • 领域文本风格极端。

缓解方法: - 混入通用数据。

  • 降低学习率。

  • 减少训练步数。

  • 使用更平滑的 schedule。

  • 做通用 benchmark 回归。

23. Re-warmup 与学习率重启

继续预训练常常不是简单沿用原预训练末尾的学习率。 当数据分布、batch size、sequence length 或训练目标发生变化时,通常需要重新设计学习率 schedule。 Re-warmup 的直觉是:从较小学习率开始,让模型逐步适应新数据分布,避免突然大步更新破坏已有能力。 但 re-warmup 不是越大越好。峰值学习率过高会造成遗忘或发散,过低则领域适配不足。

24. 继续预训练的 checkpoint 选择

继续预训练要选择合适起点。 可能选择: - 通用 base model。

  • 已对齐模型之前的 base checkpoint。

  • 中间 checkpoint。

  • 已扩展上下文的 checkpoint。

通常不建议在强 RLHF 对齐后的聊天模型上直接做大规模继续预训练,因为可能破坏对齐行为。更常见做法是在 base 或 SFT 前后的合适位置进行。

25. 继续预训练评估

继续预训练必须同时看目标能力和回归风险。 评估集合应包含: - 领域 validation loss。

  • 通用 validation loss。

  • 领域 benchmark。

  • 通用 benchmark。

  • 多语言/代码/数学等关键能力。

  • 安全评估。

  • 下游 SFT 后的最终任务指标。

如果领域能力提升但通用能力大幅下降,需要调整数据混合和学习率。

26. 继续预训练常见失败模式

常见失败包括: - 领域 loss 下降但下游任务不提升。

  • 通用能力遗忘。

  • 模型输出风格变窄。

  • 学习率过大导致 loss spike。

  • 训练数据污染评测集。

  • 领域数据中错误事实被模型吸收。

  • 继续预训练后 SFT 难度增加。

因此继续预训练需要小规模试训、分阶段评估和严格数据治理。

27. 实用决策:CPT、SFT 还是 RAG

如果目标是更新少量事实、需要可追溯来源,优先 RAG。 如果目标是让模型按业务格式回答,优先 SFT。 如果目标是让模型掌握大量领域语言、术语、文档结构和基础分布,考虑继续预训练。 如果目标是领域助手,常见组合是:

CPT 学领域分布 -> SFT 学任务行为 -> RAG 提供最新事实 -> preference alignment 控制风格和安全

28. 面试紧凑总结

预训练过程是模型配置、数据管道、分布式系统、优化器和评估体系的联合工程。 预训练评估不能只看 loss,还要看下游 benchmark、污染控制和能力回归。 继续预训练是在已有 checkpoint 上继续做语言建模,适合领域、语言、新知识和数据配方适配。 继续预训练最重要的风险是遗忘、过拟合领域分布、学习率不稳和评测污染。工程上通常用通用 replay、较小学习率、re-warmup、分桶评估和 checkpoint 回滚控制风险。

            预览时标签不可点




































<div class="