第 15 讲:中训练/后训练(SFT 与 RLHF)

目录 · ← l14 · l16 →

第 15 讲:中训练/后训练(SFT 与 RLHF)

日期:5 月 18 日(周一,Spring 2026) | 讲师:Tatsu Hashimoto | 材料:lecture_15.pdf

概览

预训练把你带到 GPT-3;本讲讲通向 instructGPT 的路径:先在指令数据上做监督微调(SFT),再做 RLHF(基于人类反馈的强化学习,用 PPO 或 DPO)。内容包括指令数据的真实样貌(FLAN → Alpaca → OpenAssistant → Nemotron 智能体数据)、SFT 数据中”风格/长度/知识/安全”的微妙影响、从”模仿”转向”奖励优化”、成对反馈数据的采集,以及 RLHF 的两个主要陷阱:过度优化(overoptimization)与模式崩塌(mode collapse)。

核心概念与定义

  • G-V gap(生成-评价差距):”人们并不总是写出自己偏好的东西”——模仿(SFT)是在拟合 p*(y|x),但用户偏好的是一个需要优化的奖励,而不是一个需要模仿的分布。这是 RLHF 的根本动机。
  • SFT 数据谱系:FLAN(基准风格任务、言简意赅)→ Self-Instruct / Alpaca(LLM 生成的指令跟随数据;由 GPT-3.5/4 生成,52K 条)→ ShareGPT/Vicuna(真实人机对话)→ OpenAssistant(众包、细节丰富、知识密集)→ WizardLM → Tulu 3 → Nemotron(智能体式:工具调用、多轮、感知 AGENTS.md)。
    • 差异在哪:话多不多/长度、细节程度、工具使用、规模、安全。影响到什么:风格(人类与 GPT 裁判都表现出强烈的长度效应)、基准表现(多数不受风格影响)以及事实性。
  • 知识抽取与对齐:在模型不知道的”长尾知识”上微调会让它幻觉(Schulman 2023;Gekhman 等)——”即使 LM 的用例需要这些知识,你也可能不该在长尾知识上微调”。SFT 擅长抽取预训练已具备的行为,而非注入新行为;加入(事实上正确的)数据有时反而有害。
  • 安全 SFT:几千条样本就能教会拒绝行为(Llama 2);约 500 条安全样本 + 500 条 Alpaca 风格样本就能让模型遵循安全准则。安全数据 = 从用户处提取的场景。
  • 把 SFT 变回”预训练延续”:把指令数据混进预训练(mid-training / 两阶段训练),最后再做一轮很短的指令微调——这样能在不灾难性遗忘的前提下扩展指令调优规模(miniCPM、jetMoE;”这是很多 LLM 公司的常识,但没被写进文档”)。
  • RLHF 数据:成对反馈(chosen vs rejected)。来源:人类(众包——很难验证正确性、存在伦理问题、标注人群分布会改变模型行为)、专家标注(昂贵且在增长)、以及 LM 生成的反馈(GPT-4 的一致率接近人类标注者之间的一致率,系统级排序相关性近乎完美)——Zephyr(UltraFeedback)、Tulu 3、OLMo 都在用。此外还有自训练(Constitutional AI:批评 + 修改)。
    • 长度效应:RLHF 系统性地产生更长的回答(人类与 AI 反馈都会奖励长回答)——这是显著且常常不受欢迎的副作用。
  • PPO(Proximal Policy Optimization)——最初的 RLHF 算法(InstructGPT):
    • 谱系:策略梯度(方差太大:∇E[R] = E[R∇log p])→ TRPO(在当前策略附近线性化、设信任域)→ PPO(把重要性比裁剪到 ±ε)。
    • 在 LM 中:动作 = token;奖励稀疏且在序列末尾(序列级);需要一个价值模型 + 奖励模型;对参考策略有逐 token 的 KL 惩罚;用广义优势估计(GAE)——在 bandit 设定下 γ=λ=1 即可,即”reward-to-go 减去 value”。
    • 实践:外层 rollout 循环 + 内层优化循环;奖励塑形 = 末 token 奖励 + KL;cliprange 0.2;当新策略 logprob < 参考策略时裁剪 KL(稳定性)。
    • 代价:实现复杂、价值模型吃显存、需要额外调参。
  • DPO(Direct Preference Optimization)——”不用流泪的 RLHF”:
    • 思路:在非参数假设下(策略可以是任意分布),RLHF 目标的闭式最优解把奖励与策略联系起来:r(x,y) = β·log(π(y|x)/π_ref(y|x)) + β·log Z(x)。把这个”隐含奖励”代入偏好(Bradley-Terry / Stiennon)损失 → 得到直接作用于偏好对的监督损失,无需奖励模型、无需 rollout。
    • 解释:”对好东西加正梯度、对坏东西加负梯度”,幅度由隐含奖励模型的预测误差加权。
    • 变体:SimPO(不用参考模型)、长度归一化 DPO(Tulu 3)、IPO 等。
  • RLHF 的陷阱
    • 过度优化:越过某一点后继续优化奖励会损害真实质量——对人类偏好与有噪声的 LM 偏好都成立,但对无噪声的 LM 偏好不成立(那是在过拟合奖励模型)。
    • 模式崩塌 / 熵坍缩:RLHF 后的模型不再是合法的概率模型——默认失去校准性。
    • 高度情境依赖:”很多结果高度取决于实验设置的具体细节”——PPO 有时优于 DPO,有时相反。

代码示例:DPO 损失(作业 5 可选补充部分的核心)

代码(Python):

import torch
import torch.nn.functional as F

def dpo_loss(log_pi_w, log_pi_l, log_ref_w, log_ref_l, beta=0.1):
    """DPO:在偏好对上使用隐含奖励的 Bradley-Terry 损失。
    log_pi_w/l:chosen/rejected 在当前策略下的对数概率。
    log_ref_w/l:同一序列在冻结参考策略下的对数概率。
    """
    log_ratio_w = log_pi_w - log_ref_w          # chosen 的隐含奖励
    log_ratio_l = log_pi_l - log_ref_l          # rejected 的隐含奖励
    logits = beta * (log_ratio_w - log_ratio_l) # Bradley-Terry logit
    return -F.logsigmoid(logits).mean()          # 最大化 P(chosen > rejected)

代码做了什么: 实现 DPO 目标:损失为 −log σ(β·(r_w − r_l)),其中奖励由策略与参考策略的对数比”隐含”给出——一个作用于偏好对的简单二分类损失。

实现深挖:

  • 为什么不需要奖励模型:DPO 把奖励重参数化为 β·log(π/π_ref)(外加一个在成对差分中抵消的配分常数),于是”奖励模型”就是策略本身。这正是讲义里的非参数最优技巧:先把 RLHF 的约束优化求出闭式解,再把隐含奖励代入偏好损失。
  • 为什么有 β:它是 KL 正则强度;β 越大越靠近参考策略。它也缩放梯度:更新是”对 chosen 加正、对 rejected 加负”,并按隐含奖励错得有多离谱来加权。
  • 为什么冻结参考模型:π_ref 锚住更新;若去掉它(SimPO),就需要其他归一化(如长度归一化)来避免奖励被”薅”。

与作业的联系:作业 5 的可选补充部分(在 Llama 3.1 8B 上做 SFT + DPO,数据用 Anthropic HH 偏好对)实现的就是这个损失。必修的作业 5(GRPO/RLVR)是它的同策略(on-policy)表亲——讲义中 PPO→DPO 的对比解释了课程为何为必修部分选择 GRPO(无需价值模型、无需奖励模型、奖励可验证)。

代码示例:PPO 风格的裁剪代理目标(概念)

代码(Python):

def ppo_loss(log_pi_new, log_pi_old, advantages, clip_eps=0.2):
    ratio = torch.exp(log_pi_new - log_pi_old)      # 重要性比
    unclipped = ratio * advantages
    clipped = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps) * advantages
    return -torch.min(unclipped, clipped).mean()    # 悲观下界

# LM 版本:对参考策略的逐 token KL 惩罚 + 末 token 奖励
# advantages = (reward - value) 或(GRPO 中)组内归一化奖励

代码做了什么: 计算 PPO 的裁剪目标:取未裁剪与裁剪后代理目标的较小值,从而防止策略在一次更新中跑得太远。

实现深挖:

  • 为什么要裁剪:当新策略偏离旧策略时重要性比会爆炸;裁剪到 [1−ε, 1+ε] 给更新设了上界——把 TRPO 的信任域落到实处。
  • 为什么 LM 场景仍需要它:奖励稀疏且在序列级;对参考策略的逐 token KL 惩罚是防止漂移的主要手段,而 γ=λ=1 的 GAE 在 bandit 设定下退化为”奖励减价值”。
  • 为什么课程更偏好 GRPO(下一讲):PPO 的价值模型吃显存且难调;在可验证奖励(数学题)下,用组内归一化优势可以完全去掉价值模型。

与作业的联系:作业 5 的必修部分使用 GRPO(去掉价值函数的 PPO 变体)——这段 PPO 背景是作业要求你理解的基线,而作业的”策略梯度估计器变体”任务(重要性权重裁剪)正是该目标的直接推广。

关键要点

  1. 模仿(SFT)抽取预训练行为;优化(RLHF)对准偏好——G-V gap 说明”示范”不等于”偏好”。
  2. SFT 数据的质量以微妙方式胜过数量:风格/长度驱动偏好判断,长尾知识一旦微调就会引发幻觉,而少量恰当的安全/指令数据就能带来很大改变。
  3. RLHF = 带 KL 控制的奖励优化:PPO(价值模型 + 裁剪)是经典但难调的做法;DPO 用非参数隐含奖励技巧去掉了奖励模型。
  4. 成对反馈是通用货币:人类有噪声、标注人群分布会改变行为,LM 裁判出人意料地好(接近人类一致率)——但所有反馈都偏爱长回答。
  5. 警惕过度优化(过拟合奖励)与模式崩塌(不再是校准好的分布)。

常见陷阱

  • 在长尾知识上做 SFT:微调模型不知道的事实会诱发幻觉;SFT 应以抽取为主,而非注入。
  • 忽视长度偏差:人类与 LLM 裁判都奖励更长的回答——要做长度归一化或去偏(包括 DPO 的变体)。
  • RLHF 中省掉 KL 控制:没有参考策略惩罚,模型会漂移并崩塌。
  • 过拟合奖励:”越过某点后优化奖励就会过拟合”——要在留出评测上监控真实质量并早停。
  • 信任有噪声的标注者:众包的正确性难以验证;带清单的专家/LM 反馈更可靠。
  • 跳过中训练直接后训练:忘记两阶段配方会导致通用能力灾难性遗忘。

复习题

  1. 问: 为什么 DPO 既不需要奖励模型也不需要 rollout?是什么假设让它成立?
    • 答: 非参数假设(最优策略可以是任意分布)让带 KL 正则的 RLHF 目标有闭式解,从而 r(x,y) = β·log(π/π_ref) + 常数。把这个隐含奖励代入 Bradley-Terry 偏好损失后,RLHF 就变成一个作用于偏好对的监督分类损失。
  2. 问: 什么是 G-V gap?为什么它使 RLHF 优于纯 SFT?
    • 答: 人们未必写出自己偏好的内容(生成 ≠ 评价)。SFT 拟合的是示范回答的分布;RLHF 最大化反映真实偏好的奖励——即使数据相同,两个目标也不同。
  3. 问: RLHF 的两个主要失效模式是什么?实践者如何缓解?
    • 答: (1) 过度优化——奖励继续上升而真实质量下降;通过 KL 正则、留出评测、早停来缓解。(2) 模式崩塌/熵坍缩——模型不再是校准好的分布;通过熵奖励/KL 约束、长度归一化来缓解。