引言
强化学习从人类反馈(RLHF)是让大语言模型与人类偏好对齐的关键技术。然而,传统RLHF采用PPO算法,训练过程不稳定、超参数敏感、工程实现复杂。2023-2026年间,一系列RLHF替代方案涌现,它们通过不同的数学推导简化了偏好对齐过程。本文将系统对比DPO、GRPO、SimPO等主流方案。
RLHF回顾:PPO的标准流程
标准RLHF包含三个阶段:
- SFT(监督微调):在高质量对话数据上微调基座模型
- RM(奖励模型训练):训练奖励模型 $r_\phi(x, y)$ 拟合人类偏好
- 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的核心创新在于:
- 无需价值模型:通过组内相对排名替代绝对价值估计
- 自然探索:多采样天然带来探索多样性
- 适合推理任务:对有明确对错答案的数学、代码任务效果好
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
全面对比
| 维度 | PPO | DPO | GRPO | SimPO |
|---|---|---|---|---|
| 需要RM | ✅ | ❌ | ❌ | ❌ |
| 需要参考模型 | ✅ | ✅ | ✅ | ❌ |
| 需要价值模型 | ✅ | ❌ | ❌ | ❌ |
| 在线学习 | ✅ | ❌ | ✅ | ❌ |
| 训练稳定性 | ★★☆ | ★★★★ | ★★★★ | ★★★★★ |
| 工程复杂度 | 高 | 中 | 中 | 低 |
| 推理任务效果 | ★★★★ | ★★★ | ★★★★★ | ★★★☆ |
| 对话任务效果 | ★★★★★ | ★★★★ | ★★★☆ | ★★★★ |
| 显存需求 | 4x模型 | 2x模型 | 2x模型+采样 | 1x模型 |
实践建议
选择决策树
是否有明确奖励信号(数学/代码)?
├── 是 → GRPO(组内对比效果好)
│ └── 计算资源充足?是 → PPO + RM(上限最高)
└── 否 → 偏好数据为主?
├── 是 → 计算资源有限?
│ ├── 是 → SimPO(最轻量)
│ └── 否 → DPO(成熟稳定)
└── 否 → Constitutional AI + DPO组合
混合策略
2026年的最佳实践是组合使用多种方法:
- SFT → DPO → GRPO:先SFT获得基础能力,再用DPO做偏好对齐,最后用GRPO强化推理能力
- DPO + 在线DPO:离线DPO启动,逐步切换到在线DPO收集更难的偏好数据
- GRPO + RM辅助:用RM提供额外密集奖励,弥补GRPO仅靠组内对比的局限
结语
从PPO到DPO、GRPO、SimPO,偏好对齐技术的发展趋势是:简化流程、降低门槛、提高稳定性。没有一种方法在所有场景下都最优,理解每种方法的原理和适用场景,根据具体需求选择或组合,才是工程实践的正确路径。随着研究的深入,我们可能会看到更多结合在线学习效率和离线训练稳定性的混合方案。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
