引言

强化学习从人类反馈(RLHF)是让大语言模型与人类偏好对齐的关键技术。然而,传统RLHF采用PPO算法,训练过程不稳定、超参数敏感、工程实现复杂。2023-2026年间,一系列RLHF替代方案涌现,它们通过不同的数学推导简化了偏好对齐过程。本文将系统对比DPO、GRPO、SimPO等主流方案。

RLHF回顾:PPO的标准流程

标准RLHF包含三个阶段:

  1. SFT(监督微调):在高质量对话数据上微调基座模型
  2. RM(奖励模型训练):训练奖励模型 $r_\phi(x, y)$ 拟合人类偏好
  3. PPO(强化学习优化):用奖励模型的分数作为奖励信号优化策略

PPO的目标函数:

$$ \max_{\pi_\theta} \mathbb{E}{x \sim \mathcal{D}, y \sim \pi\theta(\cdot|x)} \left[ r_\phi(x, y) - \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} \right] $$

其中 $\beta$ 是KL散度惩罚系数,防止策略偏离参考模型太远。

PPO的痛点:

  • 需要4个模型同时加载(策略模型、参考模型、奖励模型、价值模型)
  • 训练不稳定,需要精细的超参数调优
  • 奖励模型与策略模型训练目标不一致
  • 工程实现复杂,训练效率低

DPO:直接偏好优化

核心思想

DPO(Direct Preference Optimization)的关键洞察是:RLHF的最优解有闭式表达。通过数学推导,可以将奖励函数用策略模型本身表示,从而跳过奖励模型训练和强化学习。

数学推导

RLHF的最优策略为:

$$ \pi^*(y|x) = \frac{\pi_{\text{ref}}(y|x) \exp\left(\frac{r(x, y)}{\beta}\right)}{Z(x)} $$

反解得到:

$$ r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x) $$

代入Bradley-Terry偏好模型:

$$ p(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l)) $$

$Z(x)$ 项在偏好比较中消去,得到DPO损失:

$$ \mathcal{L}{\text{DPO}} = -\mathbb{E}{(x, y_w, y_l)} \left[ \log \sigma\left(\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right) \right] $$

代码实现

import torch
import torch.nn.functional as F

class DPOLoss(nn.Module):
    def __init__(self, beta=0.1, label_smoothing=0.0):
        super().__init__()
        self.beta = beta
        self.label_smoothing = label_smoothing
    
    def forward(self, policy_chosen_logps, policy_rejected_logps,
                ref_chosen_logps, ref_rejected_logps):
        # 计算对数比率
        chosen_logratios = policy_chosen_logps - ref_chosen_logps
        rejected_logratios = policy_rejected_logps - ref_rejected_logps
        
        # DPO loss
        logits = self.beta * (chosen_logratios - rejected_logratios)
        loss = -F.logsigmoid(logits).mean()
        
        # 可选:label smoothing
        if self.label_smoothing > 0:
            loss = (1 - self.label_smoothing) * loss + \
                   self.label_smoothing * F.logsigmoid(-logits).mean()
        
        return loss

def compute_logps(model, input_ids, attention_mask, labels):
    outputs = model(input_ids, attention_mask=attention_mask)
    logits = outputs.logits[:, :-1, :]
    labels = labels[:, 1:]
    logps = F.log_softmax(logits, dim=-1)
    return torch.gather(logps, 2, labels.unsqueeze(-1)).squeeze(-1).sum(dim=-1)

DPO的优缺点

优点

  • 无需奖励模型,直接从偏好数据学习
  • 训练稳定,类似SFT
  • 工程实现简单,只需策略模型和参考模型

缺点

  • 对偏好数据质量敏感
  • 容易过拟合 chosen 和 rejected 的表面差异
  • 缺乏在线学习能力

GRPO:Group Relative Policy Optimization

核心思想

GRPO(Group Relative Policy Optimization)是DeepSeek提出的方案,核心是通过对同一prompt生成一组回答,用组内相对排名作为奖励信号,省去了价值模型的训练。

算法流程

class GRPOTrainer:
    def __init__(self, model, ref_model, beta=0.04, num_generations=8):
        self.model = model
        self.ref_model = ref_model
        self.beta = beta
        self.num_generations = num_generations
    
    def compute_advantage(self, rewards):
        """组内相对优势计算"""
        # 标准化:组内排名作为优势
        mean_reward = rewards.mean(dim=-1, keepdim=True)
        std_reward = rewards.std(dim=-1, keepdim=True) + 1e-8
        advantages = (rewards - mean_reward) / std_reward
        return advantages
    
    def loss(self, prompts, responses, rewards, old_logps):
        # 计算当前策略的log概率
        new_logps = self.compute_logps(prompts, responses)
        
        # 重要性采样比率
        ratio = torch.exp(new_logps - old_logps)
        
        # 组内相对优势
        advantages = self.compute_advantage(rewards)
        
        # PPO-style clipped objective
        surr1 = ratio * advantages
        surr2 = torch.clamp(ratio, 1 - 0.2, 1 + 0.2) * advantages
        policy_loss = -torch.min(surr1, surr2).mean()
        
        # KL惩罚
        ref_logps = self.compute_logps_ref(prompts, responses)
        kl_loss = (new_logps - ref_logps).mean()
        
        return policy_loss + self.beta * kl_loss

GRPO的优势

GRPO的核心创新在于:

  1. 无需价值模型:通过组内相对排名替代绝对价值估计
  2. 自然探索:多采样天然带来探索多样性
  3. 适合推理任务:对有明确对错答案的数学、代码任务效果好

DeepSeek-R1使用GRPO在数学推理上取得了显著突破,AIME 2024准确率从SFT基线的2.2%提升到RL后的71.8%。

SimPO:简单偏好优化

核心思想

SimPO(Simple Preference Optimization)在DPO基础上进一步简化,去掉了参考模型,使用回答的长度归一化对数概率作为隐式奖励:

$$ r_{\text{SimPO}}(x, y) = \frac{\beta}{|y|} \log \pi_\theta(y|x) + \gamma $$

其中 $\gamma$ 是目标奖励边距(target reward margin)。

SimPO损失函数

$$ \mathcal{L}{\text{SimPO}} = -\mathbb{E}{(x, y_w, y_l)} \left[ \log \sigma\left(\frac{\beta}{|y_w|} \log \pi_\theta(y_w|x) - \frac{\beta}{|y_l|} \log \pi_\theta(y_l|x) - \gamma\right) \right] $$

class SimPOLoss(nn.Module):
    def __init__(self, beta=2.0, gamma=0.5):
        super().__init__()
        self.beta = beta
        self.gamma = gamma  # target reward margin
    
    def forward(self, chosen_logps, rejected_logps, 
                chosen_lengths, rejected_lengths):
        # 长度归一化的奖励
        chosen_rewards = self.beta * chosen_logps / chosen_lengths
        rejected_rewards = self.beta * rejected_logps / rejected_lengths
        
        # 带边距的loss
        logits = chosen_rewards - rejected_rewards - self.gamma
        loss = -F.logsigmoid(logits).mean()
        return loss

全面对比

维度PPODPOGRPOSimPO
需要RM
需要参考模型
需要价值模型
在线学习
训练稳定性★★☆★★★★★★★★★★★★★
工程复杂度
推理任务效果★★★★★★★★★★★★★★★☆
对话任务效果★★★★★★★★★★★★☆★★★★
显存需求4x模型2x模型2x模型+采样1x模型

实践建议

选择决策树

是否有明确奖励信号(数学/代码)?
├── 是 → GRPO(组内对比效果好)
│       └── 计算资源充足?是 → PPO + RM(上限最高)
└── 否 → 偏好数据为主?
         ├── 是 → 计算资源有限?
         │       ├── 是 → SimPO(最轻量)
         │       └── 否 → DPO(成熟稳定)
         └── 否 → Constitutional AI + DPO组合

混合策略

2026年的最佳实践是组合使用多种方法:

  1. SFT → DPO → GRPO:先SFT获得基础能力,再用DPO做偏好对齐,最后用GRPO强化推理能力
  2. DPO + 在线DPO:离线DPO启动,逐步切换到在线DPO收集更难的偏好数据
  3. GRPO + RM辅助:用RM提供额外密集奖励,弥补GRPO仅靠组内对比的局限

结语

从PPO到DPO、GRPO、SimPO,偏好对齐技术的发展趋势是:简化流程、降低门槛、提高稳定性。没有一种方法在所有场景下都最优,理解每种方法的原理和适用场景,根据具体需求选择或组合,才是工程实践的正确路径。随着研究的深入,我们可能会看到更多结合在线学习效率和离线训练稳定性的混合方案。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。