训练与对齐
三阶段训练流程
| 阶段 | 数据 | 目标 | 产出 |
|---|---|---|---|
| 预训练 Pre-training | 数万亿 token 的无标注网页、书籍、代码 | 下一个 token 预测(交叉熵损失) | Base 模型:会续写,不会对话 |
| 监督微调 SFT | 几万到几十万条高质量「指令-回答」对 | 同样是 next token 预测,但只对回答部分算损失 | Instruct 模型:会听指令 |
| 偏好对齐 RLHF / DPO | 人类对多个回答的排序偏好 | 最大化人类偏好 | Chat 模型:有用、无害、诚实 |
为什么 SFT 之后还需要 RLHF? SFT 是模仿学习 —— 让模型模仿标注员写的「正确答案」。但它有两个局限:
- 只告诉模型「什么是好的」,没告诉它「什么是不好的」,缺少负向信号
- 对于「哪个回答更好」这类难以写出唯一标准答案的问题(如文风、安全边界、拒答的分寸),标注一个答案不如给出排序。人类判别比生成容易得多,RLHF 正是利用了这个不对称性
RLHF 的三步
-
训练奖励模型(RM) —— 收集同一个 prompt 的多个回答,让人标注排序。用 Bradley-Terry 损失训练一个打分模型:
loss = -log σ( r(x, y_win) - r(x, y_lose) )RM 通常从 SFT 模型初始化,把最后的语言模型头换成一个输出标量分数的头。
-
用 PPO 优化策略模型 —— 把 LLM 当作策略(policy),生成回答,RM 给分,用 PPO 更新。目标函数里有一个关键项:
objective = E[ r(x,y) - β · KL( π(y|x) ‖ π_SFT(y|x) ) ]KL 惩罚项不可省 —— 它约束新策略不要偏离 SFT 模型太远。否则模型会奖励劫持(reward hacking):找到 RM 的漏洞输出高分但人类看来是乱码的文本,因为 RM 只是人类偏好的不完美代理。
-
迭代 —— 用新模型生成的回答再标注,更新 RM,循环。
PPO 的工程复杂度是它的最大问题:需要同时在显存里放四个模型 —— policy(训练中)、reference(算 KL)、reward model、critic(估值函数)。超参敏感、训练不稳定。
DPO:绕过奖励模型
Direct Preference Optimization 的洞察:RLHF 的最优策略有闭式解,可以把「训 RM + 跑 PPO」两步合并成一个直接在偏好数据上做的分类损失:
loss = -log σ( β·log(π(y_w|x)/π_ref(y_w|x)) - β·log(π(y_l|x)/π_ref(y_l|x)) )
直观理解:提高偏好回答的相对概率,降低非偏好回答的相对概率,相对的基准是参考模型。
- 优点:只需两个模型(policy + reference),无需 RM 和 critic,训练稳定、实现简单,效果常常与 PPO 相当
- 缺点:是离线方法,只能用固定的偏好数据集,不能像 PPO 那样在线采样探索;对数据分布更敏感
其他变体:KTO(只需「好/坏」二元标注,不需要成对比较)、IPO、SimPO(去掉参考模型)、GRPO(DeepSeek 用于推理模型,对同一 prompt 采样一组回答、用组内相对得分代替 critic,大幅省显存,是 R1 推理能力的关键)。
Scaling Law
Kaplan et al. (2020) 发现模型性能(损失)与参数量 N、数据量 D、计算量 C 呈幂律关系,且在很大范围内可预测。这是「堆规模有用」的理论依据。
Chinchilla (2022) 的修正更重要:在给定计算预算下,最优配比是参数量与数据量按同比例增长,经验值约为 20 token / 参数。此前的模型(如 175B 的 GPT-3 只训了 300B token)都是严重训练不足的 —— 同样算力下,用更小的模型喂更多数据效果更好。Chinchilla 70B 全面超过 Gopher 280B 就是证明。
现实中的偏离:实际部署要考虑推理成本。模型一旦发布会被调用数十亿次,所以业界倾向于训练远超 Chinchilla 最优 token 数的小模型(LLaMA-3 8B 训了 15T token,约 1875 token/参数)—— 用更多训练算力换更低的长期推理成本。
数据相关考点
数据质量 > 数据数量 —— 去重(MinHash / 精确去重)、质量过滤(分类器打分、困惑度过滤)、去除个人信息和有害内容。LIMA 论文显示 1000 条精心挑选的 SFT 数据就能达到不错的对齐效果,说明预训练阶段已经学到了几乎所有知识和能力,对齐只是激发出来。这个「表层对齐假说」是高频追问。
数据污染 —— 评测集泄漏进训练数据会导致分数虚高。检测方法包括 n-gram 重叠检查、看模型能否逐字复现测试样本。
灾难性遗忘 —— 在新领域微调后,原有能力下降。缓解:混入通用数据(通常 5~20%)、用更小的学习率、用 LoRA 等参数高效方法减少对原权重的扰动。
分布式训练
| 并行方式 | 切分什么 | 通信代价 |
|---|---|---|
| 数据并行 DP | 每卡放完整模型,切分数据批次 | 梯度 AllReduce |
| 张量并行 TP | 把单层的矩阵按行/列切到多卡 | 每层都要通信,必须在单机内 NVLink |
| 流水线并行 PP | 按层切,不同卡放不同层 | 层间传激活值,有气泡(bubble)开销 |
| ZeRO | 把优化器状态、梯度、参数依次分片到各卡 | 用通信换显存,ZeRO-3 可训练超大模型 |
显存占用的构成(fp16 混合精度 + Adam):参数 2 字节 + 梯度 2 字节 + Adam 的一阶二阶动量各 4 字节 + fp32 参数副本 4 字节 ≈ 每参数 16 字节。所以 7B 模型全量微调需要约 112GB 显存,远超单卡 —— 这正是 LoRA 存在的理由。