Skip to content

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 的核心逻辑,逐行注释:

python
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 一样)
  • 单标签信息量低于成对偏好,可能需要更多数据才能达到同等效果
  • 对标签噪声更敏感(一个错误标签就是一个错误梯度方向)