4.6 偏好对齐前沿
在上一节中,我们详细讲解了 DPO(Direct Preference Optimization)——它跳过奖励模型,直接用偏好对数据优化策略,将 RLHF 的三阶段流程压缩为两阶段,在工业实践中迅速取代了 PPO。然而 DPO 并非终点:它仍然依赖参考模型、仍然需要成对标注数据,且在推理增强等场景下显得力不从心。自 2023 年 DPO 问世以来,偏好对齐领域进入了快速创新期,大量新方法涌现,从不同维度突破 DPO 的局限。本节作为第 4 章的最后一节,将带领读者纵览这些前沿方法。
如果把偏好对齐比作"不断改进教学方法",那么这一节的每个方法都对应一次教学理念的革新:
- RLHF/PPO 是传统课堂——老师(人类标注者)出题打分,学生(模型)反复练习,但需要专门的助教(Critic 网络)评估学习状态,开销巨大。
- DPO 取消了助教,直接用好坏对比来指导学生——省了一个岗位,但对比仍需成对。
- KTO 进一步放宽——不再需要对比,老师只需说"这个好"或"这个不好",学生就能改进。
- ORPO 把基础课和复习课合二为一——一步到位,不再分阶段。
- SimPO 彻底扔掉参考答案——学生自己评估自己的平均水平,更轻量。
- GRPO 则是分组考试法——同一道题让全班同学各做一遍,用班级平均分当基准,不需要助教也能知道谁好谁差。
这些"教学改进"各有侧重,下面逐一展开。
4.6.1 对齐方法演进全景
理解前沿方法之前,先回顾整个对齐方法的演进脉络。下图按时间线展示了关键里程碑:
对齐方法演进时间线
═══════════════════════════════════════════════════════════════
2022 RLHF (InstructGPT / ChatGPT)
三阶段:SFT → Reward Model → PPO
需要维护 4 个模型(Actor + Critic + RM + Ref)
2023 DPO (Rafailov et al.)
跳过 Reward Model,直接优化偏好
需要参考模型 + 成对数据
2024 爆发年:
├── KTO 只需单标签(好/坏),无需成对
├── ORPO SFT + 对齐一步完成,无需参考模型
├── SimPO 无参考模型 + 长度归一化
├── GRPO 砍掉 Critic,组内相对优势(DeepSeek)
├── RLOO REINFORCE Leave-One-Out
└── R-DPO 长度正则化 DPO
2025 趋势:
规则化奖励(RLVR)+ GRPO → 推理能力增强
代表:DeepSeek-R1
═══════════════════════════════════════════════════════════════这些方法的创新方向可以归纳为三条主线:
| 创新主线 | 代表方法 | 核心改变 |
|---|---|---|
| 减少模型数量 | DPO→SimPO→ORPO | 从 4 模型 → 2 模型 → 1 模型 |
| 放宽数据要求 | DPO→KTO | 从成对偏好 → 单标签好/坏 |
| 简化 RL 流程 | PPO→GRPO | 砍掉 Critic,用组内统计替代 |
4.6.2 GRPO:砍掉 Critic 的强化学习
GRPO(Group Relative Policy Optimization,组相对策略优化) 由 DeepSeek 团队在 DeepSeekMath 论文中提出,并在 DeepSeek-R1 的训练中大放异彩。它的核心思想是:用组内采样的相对奖励替代 Critic 网络,将 RLHF 的显存占用和实现复杂度降低一个数量级。
PPO 的"四模型之痛"
在标准 RLHF-PPO 中,你需要同时维护 4 个模型:
PPO 的四模型架构
┌──────────────────────────────────────────────┐
│ 1. Actor(策略网络)—— 正在训练的模型 │
│ 2. Critic(价值网络)—— 估计状态价值 │
│ 3. Reward Model(奖励模型)—— 给回答打分 │
│ 4. Reference Model(参考模型)—— 防止偏离 │
└──────────────────────────────────────────────┘痛点在于:
- 显存爆炸:4 个大模型同时驻留 GPU,70B 参数模型训练需要数百 GB 显存
- Critic 训练困难:语言生成的状态空间几乎无限,Critic 要准确估计每个 token 位置的未来累积奖励极其困难,训练不稳定
- 实现复杂:Actor-Critic 架构、GAE 计算、重要性采样修正,工程调试成本高
GRPO 的核心洞见
GRPO 的洞见可以用一句话概括:对于生成任务,与其费劲训练一个 Critic 去预测未来价值,不如对同一个问题采样多个答案,用它们之间的相对好坏来定义"优势"。
用教学的类比来说:与其请一个助教(Critic)去预测每个学生在每个知识点上的未来成绩,不如让全班同学做同一套卷子,用班级平均分当基准——高于平均的说明做得好,低于平均的说明做得差。
GRPO 的核心三步:
GRPO 流程
┌──────────────────────────────────────────────┐
│ │
│ 第 1 步:组采样(Group Sampling) │
│ 对同一个问题 q,从旧策略采样 G 个输出 │
│ {o₁, o₂, ..., o_G} ~ π_old(·|q) │
│ G 通常取 4~16 │
│ │
│ 第 2 步:奖励打分(Reward) │
│ 用奖励模型(或规则)给每个输出打分 │
│ R = {r₁, r₂, ..., r_G} │
│ │
│ 第 3 步:相对优势计算(Relative Advantage) │
│ 不依赖 Critic,直接用组内统计量: │
│ │
│ rᵢ - mean(R) │
│ Aᵢ = ───────────── │
│ std(R) │
│ │
│ 直觉: │
│ • 高于组内平均 → 优势为正 → 增加概率 │
│ • 低于组内平均 → 优势为负 → 降低概率 │
│ • 标准差归一化 → 自动适应不同问题的奖励尺度 │
│ │
└──────────────────────────────────────────────┘GRPO 损失函数
L_GRPO = E[ min(ρᵢ · Âᵢ, clip(ρᵢ, 1-ε, 1+ε) · Âᵢ) ] - β · KL(π_θ || π_ref)
其中:
ρᵢ = π_θ(oᵢ|q) / π_old(oᵢ|q) ← 重要性采样比率(与 PPO 相同)
Âᵢ = (rᵢ - mean(R)) / std(R) ← 组内相对优势(替代 Critic)
ε ← clip 范围(通常 0.2)
β ← KL 正则化系数(防止偏离参考模型太远)与 PPO 相比,GRPO 保留了 clip 机制和 KL 正则化,但用组内统计量完全替代了 Critic 网络。这意味着:Actor、Reward Model、Reference Model 仍在,但 Critic 被砍掉了。
GRPO 在 DeepSeek-R1 中的实战
DeepSeek-R1 使用 GRPO 进行强化学习训练,其奖励设计极具针对性——完全规则化,无需神经 Reward Model:
| 奖励类型 | 说明 | 示例 |
|---|---|---|
| 准确性奖励 | 答案是否正确 | 数学题答案匹配、代码通过测试 |
| 格式奖励 | 输出是否遵循格式 | <think>...</think><answer>...</answer> |
| 语言一致性 | 是否使用正确语言 | 中文提问用中文回答 |
这种"规则即奖励"的范式被称为 RLVR(Reinforcement Learning with Verifiable Rewards),在数学、代码等有客观标准的任务上效果显著。DeepSeek-R1 的后训练仅需约 147K H800 GPU 小时,比同级别推理模型低一个数量级。
GRPO 代码实现
下面用 PyTorch 展示 GRPO 的核心逻辑,逐行注释:
import torch
def grpo_loss(
policy_logps, # 当前模型对每个输出的对数概率 [G]
old_logps, # 旧策略对每个输出的对数概率 [G]
ref_logps, # 参考模型对每个输出的对数概率 [G]
rewards, # 每个输出的奖励分数 [G]
clip_epsilon=0.2, # PPO 风格的裁剪范围
beta=0.001, # KL 正则化系数
):
"""
GRPO 损失函数
- 砍掉 Critic,用组内相对奖励替代优势函数
- 保留 PPO 的 clip 机制和 KL 正则化
"""
# ---- 第 1 步:计算重要性采样比率 ----
# ρ = π_θ(o|q) / π_old(o|q),衡量新旧策略的概率变化
ratios = torch.exp(policy_logps - old_logps) # [G]
# ---- 第 2 步:计算组内相对优势(替代 Critic)----
# 用组内均值和标准差归一化奖励,得到相对优势
mean_r = rewards.mean() # 组内平均奖励
std_r = rewards.std() + 1e-8 # 组内标准差(加 eps 防除零)
advantages = (rewards - mean_r) / std_r # 相对优势 [G],和为零
# ---- 第 3 步:PPO 风格的裁剪目标 ----
# 标准 PPO 损失:min(ρ·A, clip(ρ)·A)
surrogate1 = ratios * advantages # 未裁剪的代理目标
surrogate2 = torch.clamp( # 裁剪后的代理目标
ratios, 1 - clip_epsilon, 1 + clip_epsilon
) * advantages
policy_loss = -torch.min(surrogate1, surrogate2).mean() # 取负号因为要最小化
# ---- 第 4 步:KL 正则化(直接加到损失中)----
# KL(π_θ || π_ref) = E[log(π_θ/π_ref)]
kl_penalty = (policy_logps - ref_logps).mean() # 近似 KL 散度
# ---- 第 5 步:总损失 ----
total_loss = policy_loss + beta * kl_penalty # 策略损失 + KL 正则
return total_loss
# ========== 演示:GRPO 一次更新示例 ==========
torch.manual_seed(42)
G = 8 # 组大小:每个问题采样 8 个回答
# 模拟数据(实际中由模型前向传播得到)
policy_logps = torch.randn(G) * 0.5 - 2.0 # 当前策略的对数概率
old_logps = policy_logps.clone() # 初始时 old = policy
ref_logps = torch.randn(G) * 0.5 - 2.0 # 参考模型的对数概率
rewards = torch.tensor([1, 0, 1, 0, 1, 0, 0, 1], dtype=torch.float) # 规则奖励
loss = grpo_loss(policy_logps, old_logps, ref_logps, rewards)
print(f"GRPO loss: {loss.item():.4f}")
# 输出示例: GRPO loss: 0.5612这段代码展示了 GRPO 与 PPO 的关键区别:没有 Critic 的前向传播和参数更新,优势直接由组内奖励的统计量计算。在实际训练框架(如 verl、TRL)中,GRPO 的组采样、奖励计算和策略更新被封装为完整的训练循环,但核心逻辑不变。
4.6.3 KTO:只需要"好"或"坏"标签
KTO(Kahneman-Tversky Optimization) 受到行为经济学中前景理论(Prospect Theory)的启发,由 Contextual AI 提出。它的核心创新是:不再需要成对的偏好数据,只需要单标签数据——这个回答是好还是坏。
用教学类比来说:DPO 要求老师每次都拿出两个学生的作业来对比"谁更好",而 KTO 只需要老师对每份作业打"合格"或"不合格"——大大降低了标注难度。
数据格式对比
DPO 需要(成对偏好):
(prompt, chosen_response, rejected_response)
← 必须找到一对好/坏回答,标注成本高
KTO 只需要(单标签):
(prompt, response, label)
label ∈ {desirable, undesirable}
← 每条数据独立标注,成本极低
这意味着 KTO 可以利用:
✅ 用户点赞/点踩数据(如 ChatGPT 的 👍👎)
✅ 产品评分(1-5 星转化为好/坏)
✅ 用户留存/转化数据(转化=好,流失=坏)
✅ 任何有正负标签的隐式反馈KTO 损失函数
L_KTO = E[ λ_desirable · max(0, 1 - h(x,y)) ← 好回答应让 h > 1
+ λ_undesirable · max(0, h(x,y) - 1) ] ← 坏回答应让 h < 1
其中 h(x,y) = β · log(π_θ(y|x) / π_ref(y|x))
直观理解:
- 期望回答(desirable):让 h(x,y) > 1,即当前模型对该回答的概率远高于参考模型
- 不期望回答(undesirable):让 h(x,y) < 1,即当前模型对该回答的概率低于参考模型
- λ_desirable / λ_undesirable 控制正负样本权重平衡KTO 的优势与局限
优势:
- 数据获取成本极低——不需要人工对比标注,可利用大规模隐式反馈
- 可以利用产品中已有的用户行为数据(点赞、评分、留存)
- 效果与 DPO 相当,在某些场景下甚至更好
局限:
- 仍需参考模型(与 DPO 一样)
- 单标签信息量低于成对偏好,可能需要更多数据才能达到同等效果
- 对标签噪声更敏感(一个错误标签就是一个错误梯度方向)