偏好对齐全链路:RLHF → DPO → SimPO → GRPO¶
更新日期:2026-04-26
一、对齐方法演进¶
flowchart LR
sft["SFT<br/>(监督模仿)"]
rlhf["RLHF<br/>2022<br/>policy+ref+RM+value"]
rlaif["RLAIF<br/>2022<br/>AI 标注"]
dpo["DPO<br/>2023<br/>2-model 闭式"]
ipo["IPO<br/>2023<br/>正则"]
kto["KTO<br/>2024<br/>二元标签"]
simpo["SimPO<br/>2024<br/>无 ref_model"]
orpo["ORPO<br/>2024<br/>SFT+pref 一阶段"]
grpo["GRPO<br/>2024<br/>在线 + 组归一"]
rlvr["RLVR<br/>2025<br/>验证器 reward"]
sft --> rlhf --> dpo
rlhf --> rlaif
dpo --> ipo
dpo --> kto
dpo --> simpo
dpo --> orpo
rlhf --> grpo --> rlvr
classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
class sft,rlhf,rlaif,dpo,ipo,kto,simpo,orpo,grpo,rlvr stage
| 方法 | 年份 | 核心改进 | 为什么需要 | 实践建议 | 论文 |
|---|---|---|---|---|---|
| RLHF | 2022 | 人类偏好 → RM → PPO | SFT 只能模仿数据分布,无法学"好坏"偏好 | 仍是理论基线;除非有丰富 RL 工程经验 + 大量 GPU,否则优先 DPO | InstructGPT |
| RLAIF | 2022 | AI 反馈替代人类反馈 | 人类标注成本高($1-3/条)、慢、一致性差;AI judge 成本降低 10-100× | Claude / GPT-4 级模型做标注时,详细 rubric + 5% 人工抽检 | Constitutional AI |
| DPO | 2023 | 直接从偏好优化,跳过 RM | RLHF 需 4 模型(policy/ref/RM/value),显存 4× SFT;DPO 只 2 模型 | 小团队首选;β=0.1 稳健起点;ref_model 必须冻结 | DPO |
| IPO | 2023 | 解决 DPO 过拟合 | DPO 在偏好数据少 / 噪声大时把 chosen 概率推到极端 | 数据 <2K 对或标注质量差时优先 IPO;τ 从 0.1 起调 | IPO |
| KTO | 2024 | 只需二元标签(好 / 坏) | 实际业务难收成对偏好,但"这个回答好不好"的二元标注容易 | 用户点赞 / 点踩日志;正负样本 1:1 - 1:3 | KTO |
| ORPO | 2024 | 统一 SFT + 偏好 | 传统两阶段(SFT → 偏好)流程复杂,SFT 阶段可能学坏习惯 | 数据有限 + 简化 pipeline 时;β 从 0.1 起调 | ORPO |
| SimPO | 2024 | 无需参考模型 | DPO 的 ref_model 占一半显存(7B → 14GB) | 显存紧;β=2.0、γ=1.0;缺 KL,建议早停 | SimPO |
| GRPO | 2024 | 组内相对优化 | DPO 离线受静态数据集限制,无法探索新策略 | DeepSeek-R1 核心;G=64 常用;需可验证 reward | GRPO |
| RLVR | 2025 | 可验证奖励(数学/代码) | 传统 RM 是"学出来的评分器"有误差且易 hack;数学/代码答案可精确验证 | 2026 主流;适用于有确定性验证器的领域 | DeepSeek-R1 |
二、RLHF 完整流程¶
2.1 三阶段¶
flowchart LR
base["Pretrained LM"]
sft["Stage 1<br/>SFT<br/>demo data"]
rm["Stage 2<br/>RM training<br/>preference pairs"]
ppo["Stage 3<br/>PPO<br/>policy + ref + RM + value"]
final["Aligned model"]
base --> sft --> rm --> ppo --> final
classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
classDef io fill:#f5f3eb,stroke:#bdb9ab,color:#1a1a1a;
class base,final io
class sft,rm,ppo stage
四个模型同时驻留显存:
| 模型 | 是否更新 | 用途 |
|---|---|---|
| Policy π_θ | ✅ 更新 | 当前训练的模型 |
| Reference π_ref | ❌ 冻结 | KL 约束基线,防偏离 SFT |
| Reward Model RM | ❌ 冻结(Stage 3) | 给 (prompt, response) 打分 |
| Value V_φ | ✅ 更新 | PPO advantage baseline |
7B model RLHF 显存 ≈ 4 × SFT,所以 RLHF 的硬件成本一直是 frontier lab 才能负担。
2.2 Reward Model 训练¶
class RewardModel:
def __init__(self, base_model):
self.backbone = base_model # 从 SFT 模型初始化
self.reward_head = Linear(d_model, 1) # 替换 LM head 为标量
def forward(self, prompt, response):
hidden = self.backbone(prompt + response)
# 用最后一个 token 的 hidden state
return self.reward_head(hidden[:, -1]).squeeze()
# 训练: Bradley-Terry 模型
def train_rm(rm, preference_pairs):
for prompt, chosen, rejected in preference_pairs:
r_chosen = rm(prompt, chosen)
r_rejected = rm(prompt, rejected)
# 好的回答得分更高
loss = -log(sigmoid(r_chosen - r_rejected))
loss.backward()
2.3 PPO 阶段¶
def ppo_step(policy, ref_policy, reward_model, prompts, beta=0.1, eps=0.2):
for prompt in prompts:
# 1. Rollout
response = policy.generate(prompt)
# 2. raw reward
raw_reward = reward_model(prompt, response)
# 3. KL 惩罚
log_ratio = log_prob(policy, response) - log_prob(ref_policy, response)
kl_penalty = beta * log_ratio
# 4. 最终奖励
total_reward = raw_reward - kl_penalty
# 5. GAE advantage
advantages = compute_gae(total_reward, values)
# 6. PPO clip
ratio = exp(log_prob_new - log_prob_old)
clipped = clip(ratio, 1 - eps, 1 + eps)
policy_loss = -min(ratio * advantages, clipped * advantages)
policy_loss.backward()
工程挑战:4 模型 + GAE + clip + KL,每个超参都得调。这是为什么 DPO 系列 2023 年一出来就横扫小团队。
三、DPO 深入推导¶
3.1 DPO 的数学原理¶
DPO 的关键洞察:最优策略的闭式解可以直接从偏好数据优化,不需要显式 RM。参考 DPO Paper (Rafailov et al., 2023)。
RLHF 的目标:
max_π E[r(x,y)] - β KL(π || π_ref)
闭式解:
π*(y|x) = (1/Z(x)) · π_ref(y|x) · exp(r(x,y) / β)
从这个解, 可以推出 reward 和策略的关系:
r(x,y) = β · log(π*(y|x) / π_ref(y|x)) + β · log Z(x)
代入 Bradley-Terry 偏好模型:
P(y_w > y_l | x) = σ(r(x, y_w) - r(x, y_l))
= σ(β · log(π(y_w|x)/π_ref(y_w|x))
- β · log(π(y_l|x)/π_ref(y_l|x)))
DPO loss:
L_DPO = -E[log σ(β · (log(π(y_w|x)/π_ref(y_w|x))
- log(π(y_l|x)/π_ref(y_l|x))))]
3.2 DPO 实现¶
def dpo_loss(policy, ref_policy, prompt, chosen, rejected, beta=0.1):
log_pi_chosen = log_prob(policy, chosen, prompt)
log_pi_rejected = log_prob(policy, rejected, prompt)
log_ref_chosen = log_prob(ref_policy, chosen, prompt)
log_ref_rejected = log_prob(ref_policy, rejected, prompt)
# 隐式 reward
r_chosen = log_pi_chosen - log_ref_chosen
r_rejected = log_pi_rejected - log_ref_rejected
# Bradley-Terry loss
loss = -log(sigmoid(beta * (r_chosen - r_rejected)))
return loss.mean()
for prompt, chosen, rejected in preference_data:
loss = dpo_loss(model, ref_model, prompt, chosen, rejected)
loss.backward()
optimizer.step()
3.3 DPO vs RLHF 对比¶
| 维度 | RLHF (PPO) | DPO |
|---|---|---|
| 模型数 | 4(policy + ref + RM + value) | 2(policy + ref) |
| 显存 | 4× SFT | 2× SFT |
| 训练阶段 | 3(SFT → RM → PPO) | 2(SFT → DPO) |
| 在线/离线 | 在线 rollout | 离线(预收集偏好对) |
| 探索新策略 | ✅ 能(PPO 在线) | ❌ 受限于数据集 |
| Reward hacking | RM 有,能 game | 无显式 RM,间接 hack |
| 调参难度 | 高(PPO 多 hyperparam) | 低(β + LR) |
| 训练稳定性 | 中(PPO 易崩) | 高 |
| 适合 | 大团队 / 探索性任务 | 小中团队 / 标准对齐 |
四、DPO 变体¶
4.1 SimPO:无需参考模型¶
def simpo_loss(policy, prompt, chosen, rejected, beta=2.0, gamma=1.0):
# 创新: 不需要 ref_model
# 用长度归一化的 log 概率作为隐式 reward
log_pi_chosen = log_prob(policy, chosen, prompt) / len(chosen)
log_pi_rejected = log_prob(policy, rejected, prompt) / len(rejected)
# 加 margin γ: 好回答应至少高 γ
loss = -log(sigmoid(beta * (log_pi_chosen - log_pi_rejected) - gamma))
return loss.mean()
# 优势:
# 1. 内存减半(不需要 ref_model)
# 2. 长度归一化防止"写长回答"
# 劣势:
# 1. 没有 KL 约束,可能偏离 SFT 太远 → 需早停
4.2 KTO:只需二元标签¶
def kto_loss(policy, ref_policy, prompt, response, is_good, beta=0.1):
log_ratio = log_prob(policy, response, prompt) - log_prob(ref_policy, response, prompt)
r = beta * log_ratio
z_ref = estimate_reference_reward() # 基线
if is_good:
loss = -sigmoid(r - z_ref) # 推高好回答
else:
loss = -sigmoid(z_ref - r) # 推低坏回答
return loss.mean()
# 优势:
# - 标注更容易(不需要成对比较)
# - 对标注噪声更鲁棒
4.3 ORPO:SFT + 偏好同时优化¶
def orpo_loss(policy, prompt, chosen, rejected, beta=0.1):
# SFT loss on chosen
sft_loss = -log_prob(policy, chosen, prompt)
# Odds ratio preference
log_odds_chosen = log(sigmoid(log_prob(policy, chosen, prompt)))
log_odds_rejected = log(sigmoid(log_prob(policy, rejected, prompt)))
pref_loss = -log(sigmoid(log_odds_chosen - log_odds_rejected))
return sft_loss + beta * pref_loss
# 优势: 一阶段同时学 SFT + 偏好
五、GRPO:在线 RL 的重生¶
# GRPO vs DPO 的本质区别:
# DPO: 离线,用预先收集的偏好数据
# GRPO: 在线,训练中动态采样
def grpo_step(policy, ref_policy, prompts, verifier, group_size=64, beta=0.04, eps=0.2):
for prompt in prompts:
# 1. 同 prompt 采样 G 个回答
responses = [policy.generate(prompt) for _ in range(group_size)]
# 2. 验证器评分
rewards = torch.tensor([verifier(r, prompt) for r in responses])
# 3. 组内归一化(替代 PPO 的 value baseline)
advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-8)
# 4. 策略更新
for resp, adv in zip(responses, advantages):
log_ratio = log_prob(policy, resp, prompt) - log_prob(ref_policy, resp, prompt)
ratio = exp(log_ratio)
clipped = clip(ratio, 1 - eps, 1 + eps)
policy_loss = -min(ratio * adv, clipped * adv)
kl = log_ratio
total_loss = policy_loss + beta * kl
total_loss.backward()
GRPO 的工程节省:
- 砍掉 value network → 显存少 ¼
- 砍掉 RM → 显存少 ¼(reward 是 verifier 函数,无参数)
- 用 group baseline 替代 GAE → 实现简化
代价:方差比 PPO 大(无 value baseline),需要更大 G 来平均(典型 G=8-64)。
参考 E3-E6 文档深入各 RL 方向。
六、方法选型决策¶
flowchart TB
start["有偏好对齐需求"]
q1{"团队规模<br/>+ 算力"}
q2{"任务类型"}
start --> q1
q1 -->|"小团队<br/>单机"| simpo["SimPO<br/>显存最小"]
q1 -->|"中团队<br/>多卡"| dpo["DPO<br/>稳定基线"]
q1 -->|"大团队<br/>千卡"| q2
q2 -->|"标准对齐"| rlhf["RLHF / DPO 混合"]
q2 -->|"推理 / 数学 / 代码"| grpo["RLVR / GRPO<br/>R1 路线"]
q2 -->|"宪法 + 安全"| cai["CAI + RLAIF<br/>Anthropic 路线"]
classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
classDef decision fill:#f5f3eb,stroke:#bdb9ab,color:#1a1a1a;
class start,simpo,dpo,rlhf,grpo,cai stage
class q1,q2 decision
2026 年的工程选择建议:
- 小团队 / 快速迭代:DPO(简单稳定)或 SimPO(最简单)
- 中等团队:DPO + GRPO 组合(DPO 学格式,GRPO 学推理)
- 大团队 / SOTA 模型:Cold Start SFT → 大规模 GRPO / RLVR(DeepSeek-R1 路线)
- 需要安全 / 宪法对齐:加 CAI 自评层(见 Anthropic alignment)
参考文献¶
- Ouyang et al. InstructGPT (RLHF). NeurIPS 2022. arXiv:2203.02155
- Rafailov et al. DPO: Direct Preference Optimization. NeurIPS 2023. arXiv:2305.18290
- Meng et al. SimPO. 2024. arXiv:2405.14734
- Ethayarajh et al. KTO. 2024. arXiv:2402.01306
- Hong et al. ORPO. 2024. arXiv:2403.07691
- Azar et al. IPO. 2023. arXiv:2310.12036
- Shao et al. DeepSeekMath (GRPO). 2024. arXiv:2402.03300
- DeepSeek-AI. DeepSeek-R1. 2025. arXiv:2501.12948
- Bai et al. Constitutional AI. 2022. arXiv:2212.08073
↑ 上级 · E. 后训练与对齐