从 PPO 到 GRPO — 每一步对齐算法的完整数学推导
面试必备:RLHF、DPO、GRPO 的推导过程和工程实现细节
对齐训练总览
三阶段管道:SFT → RM → RLHF
现代 LLM 对齐的标准管道包含三个不同的阶段,每个阶段对应不同的目标和数据要求。这个流程首次在 OpenAI 的 InstructGPT 论文中系统化,后来成为业界标准。
为什么需要多个阶段?直接用 RL 优化很困难:
- 奖励信号稀疏,只在序列末尾获得
- 策略空间巨大(每个 token 选择)
- 样本低效,需要大量与环境交互
- SFT 预热使策略不会漂移太远
奖励模型 (RM) 推导
从 Bradley-Terry 到损失函数
奖励模型的核心思想很简单:学习一个函数 r(x, y) 能预测人类对 (prompt, response) 对的偏好。给定两个候选响应,RM 应该给更好的响应更高的分数。
给定两个响应 y_w(好)和 y_l(差),人类选择 y_w 的概率由其潜在分数差决定。
L = ∏_i P(y_w^i ≻ y_l^i | x_i) = ∏_i σ(r(x_i, y_w^i) - r(x_i, y_l^i))
log L = ∑_i log σ(r(x_i, y_w^i) - r(x_i, y_l^i))
L_RM = -E_{(x,y_w,y_l)~D}[log σ(r_θ(x,y_w) - r_θ(x,y_l))]
= E[log(1 + exp(-(r_θ(x,y_w) - r_θ(x,y_l))))]
- 过度拟合长度:RM 学会简单地偏好更长的响应(因为长响应往往评分更高)。对策:对响应长度进行 normalize 或在损失中加正则化。
- 奖励黑客:策略学会生成看起来好但实际上毫无价值的文本(如重复"高分词")。需要定期监控生成样本。
- 分布偏移:RM 在 SFT 分布上训练,但 RLHF 策略会生成分布外的样本。解决方案:在 RLHF 中加入 KL 惩罚。
PPO 完整推导
从 RL 目标到梯度更新
PPO (Proximal Policy Optimization) 是现代 RLHF 的主力算法。它通过引入一个"信任区域"约束,使训练稳定且高效。
- 梯度裁剪防止参数更新过大
- 多纪元更新同一批样本(样本效率高)
- 自适应学习率和熵正则化(防止策略崩溃)
第一步:RL 目标函数
第二步:重要性采样和比率
第三步:PPO 裁剪目标
第四步:值函数和优势估计
δ_t = r(x,y_t) + γ V(s_{t+1}) - V(s_t) GAE(λ 通常设为 0.95,γ=0.99)
其中 R 是来自 RM 的完整序列奖励 LLM 对齐的简化形式
第五步:完整训练循环
第六步:内存分析
- 值函数可以与策略共享骨干,减小额外开销
- π_ref 可以定期加载(不总是在显存中)
- 梯度累积和激活重计算减少峰值内存
- 使用 LoRA 等参数高效微调方法
DPO 推导
从奖励模型到直接策略优化
DPO (Direct Preference Optimization) 的关键洞察:我们可以跳过显式的奖励模型训练,直接从比较标注中学习最优策略。
第一步:最优策略的闭式解
第二步:反演奖励函数
π*(y|x) / π_ref(y|x) = exp(r*(x,y) / β) / Z(x)
注意 log Z(x) 与 y 无关,所以在比较两个响应时抵消
第三步:Bradley-Terry 与最优策略的连接
= β log[π*(y_w|x) / π_ref(y_w|x)] - β log[π*(y_l|x) / π_ref(y_l|x)]
= β log[(π*(y_w|x) / π_ref(y_w|x)) / (π*(y_l|x) / π_ref(y_l|x))] log Z(x) 项抵消
第四步:DPO 损失函数
[log σ(β log[π_θ(y_w|x) / π_ref(y_w|x)] - β log[π_θ(y_l|x) / π_ref(y_l|x)])] DPO 目标函数
y_l_logratios = β log[π_θ(y_l|x) / π_ref(y_l|x)] 策略对数比率
第五步:计算梯度和优势
其中 Δ_logratios = y_w_logratios - y_l_logratios
这可以通过标准的反向传播计算
第六步:DPO 优势
第七步:DPO 的问题与改进
- IPO - 添加正则化项避免过拟合
- ORPO - 联合 SFT + DPO 损失,一个阶段完成
- KTO - 只需二分类标签(好/差),不需对
GRPO (DeepSeek)
无奖励模型、无值函数的 PPO
GRPO (Group Relative Policy Optimization) 是 DeepSeek 提出的方法,结合了 PPO 的优点和 DPO 的简洁性。核心想法:用一个提示集合内的相对奖励,而不是绝对奖励。
第一步:组内采样
- 不需要值函数模型(V 函数)
- 不需要额外的奖励模型(直接用 RM 计算 r_i)
- 利用同组内的相对比较自然地估计优势
第二步:组内优势计算
- A_i > 0:响应 i 比该提示的平均好
- A_i < 0:响应 i 比该提示的平均差
- Normalization:使优势量纲无关,稳定梯度
第三步:PPO 目标
第四步:完整算法
第五步:内存优势分析
第六步:进阶:Process Reward Model
- Outcome RM:只在完整响应末尾给一个分数
- Process RM:在每个推理步骤给分(中间步骤奖励)
- 梯度信号更密集(每步一个奖励)
- 能捕捉推理链中的错误步骤
- 特别有用于数学、代码生成等有明确中间步骤的任务
ORPO / KTO / IPO
DPO 的变体和改进
DPO 发布后,社区快速迭代了多个改进版本,针对不同的场景和问题。
ORPO: Odds Ratio Preference Optimization
L_preference = -E[log σ(β · logit_ratio)] ORPO 目标
KTO: Kahneman-Tversky Optimization
IPO: Identity Preference Optimization
Constitutional AI (CAI)
用 AI 反馈代替人类反馈
Constitutional AI 是 Anthropic 提出的一个不同的对齐范式:用 AI 本身生成偏好标签,而不是依赖人类标注。
第一步:宪法 (Constitution)
- "避免非法活动的建议"
- "提供事实准确的信息"
- "尊重人权和个人隐私"
- "支持包容和平等"
第二步:AI 批评 (AI Critique)
第三步:修订 (Revision)
CAI 的优缺点
方法对比与选择
RLHF vs DPO vs GRPO vs ORPO vs KTO
在五种主流方法之间做选择时,需要权衡内存、时间、数据格式和性能。
| 维度 | RLHF (PPO) | DPO | GRPO | ORPO | KTO |
|---|---|---|---|---|---|
| 模型数 | 4 (π, π_ref, r, V) | 2 (π, π_ref) | 3 (π, π_ref, r) | 2 (π, π_ref) | 2 (π, π_ref) |
| GPU 内存 | 77GB (70B) | 28GB | 51GB | 28GB | 28GB |
| 数据格式 | 成对 (x,y_w,y_l) | 成对 | 成对 | 混合 SFT + 成对 | 二分类 (x,y,label) |
| 标注成本 | 高 (成对) | 高 | 高 | 中等 (混合) | 低 (-60%) |
| 训练时长 | 4~6 周 | 1~3 周 | 2~4 周 | 1~2 周 | 1~3 周 |
| 性能* | SOTA | ~95% PPO | ~98% PPO | ~93% PPO | ~90% PPO |
| 稳定性 | 高 (梯度裁剪) | 中 (过拟合风险) | 高 | 中 | 中 |
| 工程复杂度 | 高 (4 个模型) | 低 | 中 | 中 (损失混合) | 低 |
| 最佳场景 | 大资源、顶级性能需求 | 内存受限、快速迭代 | 平衡方案 | 时间紧张 | 标注预算有限 |
决策树:选择哪个方法?
40~100GB:GRPO 或 DPO
>100GB:RLHF (PPO) 最优
仅好/坏标签:KTO
混合:ORPO
2~4 周:GRPO
>4 周:RLHF (微调较少,但更稳定)
成本优先:KTO > ORPO > DPO > GRPO > RLHF
- 初创 / 资源有限:从 DPO 开始(简单、快速)。如果成本还是太高,改用 KTO。
- 中型团队:GRPO 是最佳平衡,80% 的 PPO 性能,30% 的内存。
- 大型实验室:投资 RLHF。虽然慢、复杂、贵,但性能最好。
- 快速迭代:ORPO 一步到位,减少 SFT → RLHF 的次数。
对齐方法面试题
10+ 常见题目和答题要点
为什么需要对齐?直接用 SFT 预训练模型不行吗?
核心答点:
- SFT 学的是"模仿",包括网络上的所有行为(虚假、有害、低效率)
- 对齐是"指导",额外奖励有用、诚实、安全的行为
- SFT 本身能力可能较弱,对齐能激发潜在能力(特别是推理、数学)
- 举例:Alpaca vs GPT-4,同样 7B 参数,但对齐后的 Alpaca 更实用
奖励模型为什么要用 Bradley-Terry 模型而不是其他?
核心答点:
- Bradley-Terry 来自心理学,建模了人的偏好选择行为
- P(y_w ≻ y_l) = σ(Δr) 形式简洁,对应分类交叉熵损失
- 任意两个响应的偏好可以由其潜在得分差决定,符合传递性
- Sigmoidal 函数在高置信度时自然饱和,对噪声鲁棒
PPO 为什么要裁剪(clip)梯度比率,而不是直接用重要性采样比率?
核心答点:
- 直接用 r_t · A_t 导致梯度爆炸:如果新策略对某个好动作的概率增加 10 倍(r_t=10),梯度也会 10 倍放大
- PPO clip min(r_t, 1±ε) · A_t 限制了参数更新的大小,建立"信任区域"
- 这样既能快速学习好动作,又能防止过度调整导致 KL 发散
- 相比 Trust Region Policy Optimization (TRPO) 更简洁,不需要复杂的二阶优化
DPO 相比 PPO 有什么优缺点?
核心答点 - 优点:
- 模型数少(2 vs 4),内存 60% 降低
- 不需要 RM 或 V 函数,直接从比较学习
- 样本效率高,一条数据可多个 epoch 重复使用
- 训练时间快 2~3 倍
核心答点 - 缺点:
- 容易过拟合训练数据中的成对偏好,泛化性弱
- 没有显式的奖励上界,策略可能学会"作弊"(奖励黑客)
- 不能很好地与 SFT 损失混合(π_ref 失效)
- 在强标注噪声下性能下降显著
GRPO 中的"组内优势"与值函数优势有什么本质区别?
核心答点:
- 值函数:V(x) 预测该提示的全局期望回报,无偏但需要额外训练
- 组内优势:用组内 G 个样本的相对排序和标准差估计,有偏但更稳定
- 组内优势自然解决了奖励尺度问题(通过 std 归一化)
- 组内优势方差小,但可能遗漏全局信息。权衡:不需要额外模型,但信号质量略差
- GRPO 的 G 个响应提供了额外的对比信息,弥补了信号丢失
KTO 只用二分类标签,为什么不如成对标注?
核心答点:
- 信息量:配对标注直接给出偏好强度(y_w 相对 y_l 有多好),而二分类只有 0/1
- 样本利用:同样标注成本,成对数据能构造 C(G,2) 个对,而二分类是线性的
- KTO 的优势:标注成本低 60%,这可能弥补信息损失(如果用更多数据)
- Trade-off:更便宜的标注 vs 信息量略少,需要根据标注预算和质量选择
Constitutional AI 为什么能用 AI 批评代替人类标注?这可靠吗?
核心答点:
- 可行性:强 LLM(如 Claude/GPT-4)能准确判断响应是否违反宪法原则
- 扩展性:一旦定义了宪法,可以廉价生成海量标注,无人类瓶颈
- 可控性:修改宪法直接改变模型行为,比依赖人类标注的偏好更可预测
- 风险:AI 批评会继承强 LLM 的偏见和 blindspots。如果宪法定义不当,可能强化有害行为
- 成本:调用强模型的推理成本很高,通常只在大公司可行
设计对齐训练的数据管道时,有哪些常见陷阱?
核心答点:
- 分布偏移:RM 在 SFT 分布上训练,RLHF 会生成分布外样本。需要定期重新标注和重训 RM。
- 标注不一致:不同标注者偏好差异大(κ~0.4~0.6)。解决:多标注者投票或模型初筛。
- 奖励黑客:模型学会取巧(生成重复、虚假等)。监控:定期人工审查生成样本。
- 长度偏差:RM 倾向给更长响应评高分。解决:长度归一化或显式约束。
- 数据泄露:RM 训练数据和 RLHF 采样可能重叠。应该用分离的验证集评估。
在有限资源下,你如何决定是用 RLHF、DPO 还是其他方法?
核心答点:
- 首先评估约束:GPU 内存、标注预算、时间限制
- 内存 <40GB?DPO 或 KTO。40-100GB?GRPO。>100GB?RLHF。
- 标注有成对数据?DPO。只有好/差标签?KTO。时间急?ORPO。
- 原型阶段:快速尝试 DPO(最简单)。生产阶段:根据性能需求升级。
- 数据有噪声?RLHF 稳定性好(梯度裁剪)。数据干净?DPO 可能更好。
RLHF 中的 KL 惩罚系数 β 如何选择?太大或太小会怎样?
核心答点:
- β 的作用:权衡对齐性能和保持原始能力。β · KL(π_θ || π_ref)
- β 太小(如 0.01):模型与 π_ref 差异大,可能遗忘基础能力。优点是对齐效果强。
- β 太大(如 1.0):π_θ 贴近 π_ref,对齐信号弱,模型学不到新行为。
- 推荐范围:0.05~0.3。对于 13B 模型,0.1 是常用起点。
- 动态调整:监控 KL_div。如果 > 阈值(如 30),降低学习率。如果 < 目标,可增加 β。
DPO 和 RLHF 都需要参考模型 π_ref。能否使用已部署的模型版本作为 π_ref?
核心答点:
- 原则上可以,但有风险。π_ref 应该是"合理的初始值",不应该是目标。
- 如果 π_ref 太弱(如早期版本),KL 惩罚可能太弱,无法有效约束。
- 如果 π_ref 太强(如已部署模型),新模型难以改进。
- 最佳实践:π_ref = SFT 模型,而不是已部署版本。这样 RLHF 有明确的改进空间。
- 版本管理:跟踪 π_ref 的代码和权重版本,确保可复现。
在工程实现中,如何高效计算 KL 散度 KL(π_θ || π_ref)?
核心答点:
- 精确计算需要对所有词汇求和,太贵。通常用采样近似:
- 采样 y 来自 π_θ,估计:KL ≈ E[log π_θ(y) - log π_ref(y)]
- 或更简单:只在训练集上计算(使用已生成的样本),不需要额外采样。
- 实现细节:并行计算 π_θ(y) 和 π_ref(y) 的 log prob,减少开销。
- 监控:每 N 个 step 计算一次,作为 TensorBoard 指标追踪训练过程。
深度解析来自 OpenAI InstructGPT、DeepSeek R1、Anthropic 等一线实验的综合总结。
更新时间:2026年3月 | 返回对齐主页