CS336 · 从零构建语言模型
Lecture 15 · 对齐 I:SFT 与 RLHF
源文件:lecture-15.md
Lecture 15 · 对齐 I:SFT 与 RLHF
CS336: Language Modeling from Scratch · Stanford · Spring 2025
📅 May 20 · 💻 不可执行讲义(PDF) · 讲者 Tatsunori Hashimoto
承上启下
上一讲(Lecture 14 · 数据 II):
- 预训练数据需要过滤、去重、质量控制,数据流水线决定了 base model 的底座能力。
- 到此为止,我们得到的是一个「互联网文本压缩器」——它知道很多,但并不知道该如何当一个助手。
本讲(对齐 I):
- 预训练得到的是 GPT-3 式 base model,不是好用的助手;要变成 InstructGPT / ChatGPT,还需要指令遵循(instruction following)、安全控制、人类偏好优化。
- 讲后训练(post-training)的三块基石:SFT、RLHF 数据、以及 PPO / DPO 两条偏好优化路线,并盘点 RLHF 的常见坑。
- 下一讲 Lecture 16 · 对齐 II:RLVR 会把「有噪声的人类偏好」换成「可验证的正确性」,继续这条主线。
摘要
SFT 让模型模仿「应该怎么回答」,RLHF/DPO 让模型优化「人更喜欢哪个回答」。但对齐数据充满风格、长度、标注者偏见和事实性问题;算法也会带来 reward overoptimization、mode collapse、过度拒绝等副作用。
1. 为什么预训练不够?
预训练的目标是最大化互联网文本的似然,即标准的下一 token 预测:
$$\max_\theta\ \sum_{t}\log p_\theta(x_t \mid x_{ 其中$x_{ 用户想要的却是另一回事: 互联网文本天然无法提供这种行为分布,因为其中充满了没有答案的问题、错误答案、有害内容、混乱的风格和大量非助手式文本。经典例子:让 GPT-3 base model「向六岁小孩解释登月」,它会续写出更多「向六岁小孩解释 X」的排比句——因为在互联网上,这类句子经常成串出现。 提示 预训练解决的是「知识与能力从哪来」,对齐解决的是「这些能力以什么行为方式表达出来」。base model 像一个读过全互联网、但没有任何职业训练的人:让它「像个助手」不是往里灌新知识,而是把它已有的能力约束到一个特定的行为分布上。这也是为什么后训练的数据量(几万到几百万条)远小于预训练(数万亿 token)却能彻底改变模型行为。 SFT(Supervised Fine-Tuning,监督微调)在指令-回答对(instruction-response pairs)上继续做最大似然,但只对回答部分计算损失(prompt 部分被 mask 掉): $$\mathcal{L}_{\mathrm{SFT}}(\theta) = -\,\mathbb{E}_{(x,y)\sim\mathcal{D}}\left[\sum_{t=1}^{|y|}\log \pi_\theta\!\left(y_t \mid x,\, y_{ 其中$x$是指令(含对话历史),$y$是示范回答,$\pi_\theta$是模型。形式上这就是预训练的交叉熵,区别只在数据分布:从「互联网文本」换成「理想助手行为的示范」。 单轮数据示例: 多轮对话则用 chat template 序列化成带角色标记的 token 流(如 这些来源代表了三条获取路径:人类手写(贵而稀少)、任务模板化(便宜但格式僵硬)、强模型蒸馏(便宜且流畅,但继承教师模型的偏见与错误)。现代开源配方(如 Tulu)通常混合三者并做仔细的配比消融。 SFT 最擅长的事情,本质上都是「行为塑形」: SFT 不擅长的事情,本质上都是「注入新东西」: 注意 在模型不知道的尾部知识上做 fine-tuning,可能反而增加幻觉(hallucination)。机制:SFT 强迫模型对它内部不掌握的事实输出流畅、自信的答案,模型学到的不是这些事实本身,而是「即使不确定也要编一个像样的答案」这个行为模式(Gekhman et al. 2024)。知识存储(预训练的事)与表达控制(SFT 的事)是两回事,混淆二者是后训练里最常见的误解之一。 说明 LIMA(Zhou et al. 2023)只用约 1000 条精心挑选的示范就得到不错的对话模型,据此提出「表面对齐假说」:对齐主要是学一个风格与格式的子分布,能力几乎全部来自预训练。这个假说在「聊天体验」维度上大体成立,但后来的实践(数学、代码、安全)表明:想要稳健的能力提升与安全边界,数据量和数据质量仍然重要——「1000 条就够」不能推广到所有目标。 不同指令数据集之间的差异,远不止「质量高低」,还包括一整套隐性的风格变量:是否用 bullet points、回答长短、是否引用来源、解释详略、遇到边界问题是否保守拒绝、语气是否像客服。模型会把这些变量全部学走——所以「换一个 SFT 数据集」经常表现为「模型性格大变」。 其中长度是影响最系统性的变量: AlpacaEval 后来推出 length-controlled 版本,用回归把长度因素从 win rate 中剥离,就是对这个问题的直接回应。 一个重要的实验事实:只需几百条安全示范混入 SFT 数据,就能显著改变模型的拒绝行为(Bianchi et al. 2023)。这既是好消息(安全调优便宜),也是坏消息(安全行为是一层薄薄的表面行为,容易被后续微调抹掉)。 但安全数据要在两类错误之间走钢丝: 提示 安全调优本质上是在教一个决策边界,而 SFT 只能提供边界两侧的样本点。样本少时模型只能学到粗糙的表面特征(如「出现 kill、weapon 等词就拒绝」),于是把善意请求也拒了。要把边界画细,要么堆更多覆盖边界附近的对比样本,要么靠 RLHF 阶段用偏好信号继续打磨。 讲义提到一种越来越常见的做法,把「预训练→SFT」的两段式改为三段: 这样做的因果链条是:SFT 数据量太小(万级到百万级样本),如果模型在进入 SFT 之前从未见过指令/对话格式的分布,SFT 就要同时承担「教格式」和「教行为」两件事,容易学不稳;把指令格式的数据提前少量注入中期训练,等于让模型先「见过世面」,SFT 阶段只需做行为微调。MiniCPM、OLMo 2 等公开配方都在退火阶段混入指令数据;工业界模型普遍采用类似 recipe,但公开细节通常不完整。 说明 Midtraining 与 Lecture 14 · 数据 II 讲的数据课程(curriculum)是同一思想的延续:数据分布的调度本身就是训练算法的一部分。「什么数据在什么阶段出现」与「用什么损失函数」同样重要。 SFT 是模仿学习(imitation learning):拟合示范分布$p^*(y \mid x)$,模型的上限就是示范者的平均水平。但「人类偏好」并不等于「人类示范」,有四个结构性原因: 于是 RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)把目标从「模仿」换成「优化」: $$\max_\theta\ \mathbb{E}_{x\sim\mathcal{D},\, y\sim\pi_\theta(\cdot\mid x)}\left[r(x,y)\right]$$ 其中$r(x,y)$是对回答质量的打分,来自人类偏好或模型偏好。注意与 SFT 的根本区别:期望是对模型自己生成的$y$取的——模型从「学别人的答案」变成「为自己的答案负责」。 提示 SFT 的天花板是「示范者有多好」,RLHF 的天花板是「评价者能分辨多好」。因为判别比生成容易,后者的天花板更高——这是整个偏好优化路线的根本动机。代价是:你优化的不再是「真实的好」,而是「评价信号认为的好」,一切评价信号的缺陷(噪声、偏见、可被钻空子)都会被优化过程放大,这正是第 9 节所有坑的共同根源。 标准的成对反馈(pairwise feedback)格式: 数据来源包括:众包标注者、专家标注、模型生成偏好(AI feedback / RLAIF)、Constitutional AI 式的自我批改、以及产品中的用户真实反馈(点赞/重新生成)。 但每一条来源都不是「干净的人类真理」: 注意 RLHF 数据不是「人类偏好」的无偏样本,而是某个标注流程、标注人群、标注界面共同作用的产物。换一批标注者、换一个界面布局(比如两个回答并排 vs 上下排列)都可能系统性改变偏好分布。把 reward model 当成「人类价值的测量仪」是危险的——它只是这套流程的拟合器。 InstructGPT(Ouyang et al. 2022)确立的三步流程: 偏好数据是「A 比 B 好」的比较,不是绝对分数。把它变成标量 reward 的标准做法是 Bradley-Terry 模型:假设人类偏好$y_w$(chosen)胜过$y_l$(rejected)的概率由二者「潜在分数」之差决定: $$P(y_w \succ y_l \mid x) = \sigma\!\left(r_\phi(x, y_w) - r_\phi(x, y_l)\right)$$ 其中$\sigma(z)=1/(1+e^{-z})$是 sigmoid 函数,$r_\phi$通常是把语言模型最后一层换成标量输出头。训练目标是偏好数据上的负对数似然: $$\mathcal{L}_{\mathrm{RM}}(\phi) = -\,\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\left[\log\sigma\!\left(r_\phi(x,y_w) - r_\phi(x,y_l)\right)\right]$$ 注意这个损失只依赖分数差:$r_\phi$整体平移一个常数不改变任何偏好概率,所以 reward 的绝对数值没有意义,只有同一 prompt 下的相对比较有意义——这一点会在 Lecture 17 · 对齐 III:RL 实战 的 baseline 讨论中再次出现。 $$\max_\theta\ \mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi_\theta(\cdot\mid x)}\left[r_\phi(x,y)\right] - \beta\,\mathbb{D}_{\mathrm{KL}}\!\left[\pi_\theta(\cdot\mid x)\,\|\,\pi_{\mathrm{ref}}(\cdot\mid x)\right]$$ 符号:$\pi_\theta$是被优化的 policy,$\pi_{\mathrm{ref}}$是参考模型(通常为 SFT 模型的冻结副本),$\beta>0$控制 KL 惩罚强度。KL 项的作用有二:一是防止 policy 跑到$r_\phi$训练分布之外的区域(那里 reward 分数不可信);二是保留参考模型的通用语言能力。实现上 KL 惩罚通常按 token 折算进 reward,再交给 PPO。 PPO(Proximal Policy Optimization)本身做的事情:on-policy 采样回答→reward model 打分→用 clip objective 限制每步更新幅度以保持稳定。算法细节(概率比、clip、advantage)留到 Lecture 16 · 对齐 II:RLVR 和 Lecture 17 · 对齐 III:RL 实战 展开;这条路线与 CS221 中的策略梯度方法(Lecture 9 · 函数逼近与策略梯度(未找到对应页面))一脉相承。 PPO 路线强但昂贵,每一条缺点都有明确来源: DPO(Direct Preference Optimization,直接偏好优化)的出发点:能不能不训练 reward model、不做 on-policy RL,直接用偏好对训练 policy? 关键观察:7.2 的 KL 正则化目标有闭式最优解: $$\pi^*(y \mid x) = \frac{1}{Z(x)}\,\pi_{\mathrm{ref}}(y \mid x)\,\exp\!\left(\frac{r(x,y)}{\beta}\right)$$ 其中$Z(x)=\sum_y \pi_{\mathrm{ref}}(y\mid x)\exp(r(x,y)/\beta)$是配分函数(对所有可能回答求和,不可计算)。把这个式子反解出 reward: $$r(x,y) = \beta\log\frac{\pi^*(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} + \beta\log Z(x)$$ 也就是说:任何 policy 都隐式定义了一个 reward——它相对参考模型抬高了哪些回答的概率。把这个隐式 reward 代入 Bradley-Terry 的偏好概率,$\beta\log Z(x)$在做差时恰好消掉(因为$y_w, y_l$共享同一个 prompt),得到只含 policy 的损失: $$\mathcal{L}_{\mathrm{DPO}}(\theta) = -\,\mathbb{E}_{(x,y_w,y_l)}\left[\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)} - \beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\right)\right]$$ 符号:$y_w$/$y_l$是偏好对中被选中/被拒绝的回答,$\beta$与 RLHF 目标中的 KL 系数同源,控制偏离参考模型的容忍度。直觉:把 chosen 的 logprob 相对参考模型往上推、rejected 往下压,推压的幅度由「隐式 reward 排序错得多严重」加权——对 DPO 损失求梯度可见权重正是$\sigma(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w))$,模型排序错得越离谱的样本,更新越大。 伪代码形式(与上式一一对应): 提示 DPO 的聪明之处在于换了求解顺序:RLHF 是「先从偏好学 reward,再用 RL 从 reward 学 policy」两步;DPO 注意到这两步之间存在解析的一一对应(在 KL 正则下),于是把两步压成一步——「你的语言模型偷偷是个 reward model」。代价是:它拟合的是离线偏好数据集上的排序,而不是在模型自己当前的生成分布上探索,因此偏好数据与模型生成分布的错配(distribution shift)不会像 on-policy RL 那样被自动纠正。 优点: 缺点: Gao et al.(2023)的经典实验:用一个大模型当「金标准 reward」(代替昂贵的真人评估),训练小 reward model 当代理(proxy),然后对着 proxy 一直优化。结果呈现系统性规律:随着 policy 偏离初始模型越来越远(横轴用$\sqrt{\mathrm{KL}(\pi\,\|\,\pi_{\mathrm{ref}})}$衡量),proxy reward 单调上升,而 gold reward 先升后降。 机制:reward model 只是偏好数据的拟合器,在训练分布附近可信,之外只是外推。RL 优化恰恰专门把 policy 推向 reward 高估的区域——优化压力越大,policy 越集中在 proxy 的误差上。这就是 Goodhart 定律的模型版:「当测量成为目标,它就不再是好测量」。 RLHF 会系统性地改变模型作为概率模型的性质。最大似然训练的 base model 是校准的(calibrated):它对下一 token 的概率估计接近真实频率。而 RLHF 的目标是最大化 reward,最优解趋向确定性策略——把概率质量集中到少数高 reward 回答上。后果: 注意 这不是 bug 而是目标函数的必然结果:最大化期望 reward 与保持分布多样性天然冲突。KL 正则是在这两者之间买一个折中,而不是同时得到两者。 偏好数据和 LLM judge 都偏爱长回答(3.1 节),RLHF/DPO 会把这个偏差放大成显式的优化方向:模型学会写更长→judge win rate 上升→benchmark 数字变好→但用户拿到的是注水回答。诊断手段:对比 length-controlled 指标;缓解手段:偏好数据配平长度、reward 中加长度惩罚、评估时做长度回归控制。 安全调优的张力在 RLHF 阶段同样存在:往安全方向推,模型容易学会「宁可错拒一千」——因为拒绝永远是安全的,而回答有风险。结果是正常请求被拒(XSTest 类评测专门测这个)、有用性下降。根本困难在于 policy 边界本身就模糊且随语境变化,而偏好数据只能稀疏地覆盖边界。 关键要点: SFT 是行为抽取,不是万能知识注入 对齐数据里风格变量很强 RLHF 数据很难干净 PPO 强但复杂 DPO 简洁但不是银弹 RLHF 会改变概率模型性质 下一讲预告(Lecture 16 · 对齐 II:RLVR): RLHF 的 reward model 容易被过优化,根源在于奖励信号本身有噪声、可被钻空子。下一讲转向 verifiable rewards:数学、代码等可自动判分的任务中,RL 可以直接优化正确性,典型路线包括 PPO → GRPO 的简化,以及 DeepSeek-R1、Kimi K1.5、Qwen3 的完整 recipe。 题目 SFT 的损失强迫模型对示范答案输出高概率。若答案涉及模型内部并不掌握的事实,梯度无法「造出」知识,只能让模型学会「面对此类问题时自信地生成流畅答案」这一行为模式。泛化到其他未知问题时,这个模式就表现为幻觉。核心:知识在预训练中存储,SFT 只能控制表达行为。 题目 $P(y_w\succ y_l\mid x)=\sigma(r_\phi(x,y_w)-r_\phi(x,y_l))$,损失为$-\log\sigma(r_\phi(x,y_w)-r_\phi(x,y_l))$。因为偏好概率只依赖分数差,对$r_\phi$整体加任意常数(甚至每个 prompt 加不同常数)损失不变,所以只有同一 prompt 下的相对分数可比。这也预示了 RL 阶段用「组内相对 reward」做 baseline 的合理性。 题目 隐式 reward$r(x,y)=\beta\log\frac{\pi(y|x)}{\pi_{\mathrm{ref}}(y|x)}+\beta\log Z(x)$中,$Z(x)$只依赖 prompt 不依赖回答。代入 Bradley-Terry 时计算的是同一$x$下两个回答的 reward 差,$\beta\log Z(x)$作为公共项相消。条件:偏好对必须共享同一 prompt,且 Bradley-Terry 形式只依赖分数差。 题目 Reward model 是偏好数据的拟合器,只在训练分布附近可信;RL 优化专门把 policy 推向 reward 估值最高的区域,而这些区域往往正是 RM 外推失误、系统性高估的地方,于是 proxy reward 持续上升而真实质量先升后降。KL 惩罚只约束偏离参考模型的总量,不约束偏离的方向——policy 仍会把有限的 KL 预算全部花在 RM 的误差方向上。 题目 SFT 在示范数据分布上做最大似然(模仿别人写的答案);PPO-RLHF 在模型自己当前的生成分布上最大化 reward(在线探索,为自己的答案负责);DPO 在离线偏好数据分布上拟合隐式 reward 的排序(形式是分类损失,效果近似 KL 正则的 RLHF,但没有在线探索)。
2. SFT:监督微调
2.1 目标与数据格式
{
"instruction": "解释什么是 monopsony",
"response": "Monopsony 指市场中只有一个买方..."
}
<|user|>...<|assistant|>...),损失只落在 assistant 的 token 上:[
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}
]
2.2 常见数据源
数据集
特点
FLAN
把大量 NLP 任务模板化为指令,偏任务格式
Alpaca
Self-Instruct 风格:用强模型合成指令数据
OpenAssistant
志愿者众包的人类对话,多样但风格复杂
Anthropic HH
helpful/harmless 偏好对话与安全数据
Tulu / UltraFeedback
混合人类与模型生成的数据配方
2.3 SFT 的作用边界
3. SFT 数据里的隐性变量
3.1 风格和长度
3.2 安全数据
graph LR
SAFE["安全拒绝数据"] --> GOOD["减少有害输出"]
SAFE --> BAD["增加 over-refusal"]
4. Midtraining / Two-Phase Training
5. 从模仿到优化:为什么需要 RLHF?
6. RLHF 数据:偏好不是干净标签
{
"prompt": "...",
"chosen": "更好的回答",
"rejected": "较差的回答"
}
7. PPO:原始 RLHF 路线
7.1 Reward Model 与 Bradley-Terry 模型
7.2 RLHF 优化目标
7.3 代价
8. DPO:RLHF without tears
8.1 推导:隐式 reward
loss = -logsigmoid(
beta * (
logπ(chosen) - logπ(rejected)
- logπ_ref(chosen) + logπ_ref(rejected)
)
)
8.2 优缺点
9. RLHF 的坑
9.1 Reward Overoptimization
9.2 Mode Collapse / Entropy Loss
9.3 Length Bias
9.4 Safety vs Helpfulness
总结
mindmap
root((SFT 与 RLHF))
SFT
instruction data
imitation
style
safety tuning
Data
FLAN
Alpaca
OpenAssistant
HH
UltraFeedback
RLHF
preference pairs
Bradley-Terry RM
PPO
KL penalty
DPO
implicit reward
no reward model
pairwise objective
ref model
Risks
length bias
overoptimization
mode collapse
over-refusal
- 最适合教格式、风格和已有能力的表达;在模型不会的知识上硬教会助长幻觉。
- 长度、bullet、引用、语气都会影响偏好;长度是最系统性的偏差。
- 偏好是标注流程、人群、界面的产物,不是「人类真理」的无偏采样。
- 四个模型副本、在线 rollout、一堆超参;reward model 由 Bradley-Terry 从偏好对训练而来。
- 利用 KL 正则目标的闭式解把两步压成一步;省掉 reward model 和 rollout,但失去在线探索。
- overoptimization 源于对代理指标的优化压力;mode collapse 与 calibration 退化是最大化 reward 的必然副作用。
复习自测
参考资料