DPO Meets PPO: Token级强化优化统一RLHF范式

DPO Meets PPO: Token级强化优化统一RLHF范式

ArXiv ID: 2404.18922
作者: Han Zhong, Zikang Shan, Guhao Feng (Peking Univ) + Wei Xiong (Princeton) + Microsoft Research
机构: Peking University, Princeton University, Microsoft Research
发布日期: 2024-04-29 (最新更新: 2025-05-21)
会议: ICML 2025
代码: GitHub


核心创新

这篇ICML 2025论文提出了Reinforced Token Optimization (RTO),首次成功将DPO和PPO两大RLHF范式统一。传统RLHF方法要么使用离线DPO(简单但性能有限),要么使用在线PPO(强大但复杂),RTO创造性地将两者结合:

两阶段框架:

1
阶段1: DPO学习Token级Reward → 阶段2: PPO使用Token Reward优化

核心洞察是将RLHF从句子级优化转变为token级MDP,DPO为每个token学习细粒度质量信号,然后PPO在这些信号指导下进行策略优化。

性能突破:

  • AlpacaEval 2: +7.5点提升 (35.2% → 42.7% win rate vs GPT-4)
  • Arena-Hard: +4.1点提升,逼近GPT-4-Turbo
  • 训练效率: 相比纯PPO节省30%时间

问题动机

传统RLHF的局限

句子级奖励的粗粒度:

1
2
3
4
5
# 传统方法: 整个response一个reward
reward = reward_model(prompt, full_response) # scalar

# 问题: 无法区分哪些token好,哪些不好
"春天的景色很美丽,气温适宜[错误信息]" → reward = ?

好token和坏token被平均,模型学习信号模糊。

DPO vs PPO的权衡困境:

方法 优势 劣势
DPO 简单、稳定、高效 性能上限受限于离线数据
PPO 性能天花板高、可在线探索 训练复杂、不稳定、成本高

能否两者兼得? RTO给出了肯定答案。


技术方案

核心思想: Token-wise MDP

传统MDP (句子级):

  • 状态: prompt
  • 动作: 完整response
  • 奖励: r(prompt, response)

RTO的MDP (token级):

  • 状态: prompt + 已生成tokens
  • 动作: 下一个token
  • 奖励: r_t(token | context)
1
2
3
4
5
6
State_0: "写一首诗"
↓ a_0="春天"
State_1: "写一首诗\n春天" → reward_1
↓ a_1="来了"
State_2: "写一首诗\n春天来了" → reward_2
↓ ...

每个token决策都有即时reward,累积获得总reward。

阶段1: Token-wise DPO

传统DPO损失:

1
L_DPO = -E[log σ(β log π(y_w)/π_ref(y_w) - β log π(y_l)/π_ref(y_l))]

仅对整个response y 打分。

RTO的Token-DPO:
分解为token序列 y = [t_1, t_2, …, t_n]:

1
r_RTO(t_i | context) = β log [π(t_i|context) / π_ref(t_i|context)]

关键区别:

  • 传统: 一个response → 一个reward
  • RTO: 一个response → n个token rewards

学习目标:
优先学习preferred response中的token,惩罚rejected response中的token。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 伪代码
for (prompt, y_w, y_l) in preference_data:
# 计算token级log概率比
for i, token in enumerate(y_w):
context = prompt + y_w[:i]
r_w[i] = beta * log(pi(token|context) / pi_ref(token|context))

for i, token in enumerate(y_l):
context = prompt + y_l[:i]
r_l[i] = beta * log(pi(token|context) / pi_ref(token|context))

# 损失: 最大化preferred累积reward与rejected的差距
loss += -log(sigmoid(sum(r_w) - sum(r_l)))

阶段2: Token-wise PPO

使用阶段1学到的token reward function r_RTO 指导PPO:

标准PPO目标:

1
maximize E[r(response)] - β KL(π || π_ref)

RTO的Token-PPO:

1
maximize E[Σ_t r_RTO(t_t | s_t)] - β KL(π || π_ref)

优势:

  1. 细粒度反馈: 每个token都知道自己的质量
  2. 更快收敛: reward信号更密集
  3. 更稳定: token级控制避免句子级的大幅波动

实现细节:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# PPO训练循环
for epoch in range(num_epochs):
# 1. 采样
prompts = sample_prompts(batch_size)
responses = policy.generate(prompts)

# 2. 计算token级rewards (使用DPO学到的r_RTO)
token_rewards = []
for i, token in enumerate(response):
context = prompt + response[:i]
r = beta * log(policy(token|context) / ref_policy(token|context))
token_rewards.append(r)

# 3. 计算advantages
advantages = compute_gae(token_rewards, values)

# 4. PPO更新
policy.update(responses, advantages)

实验结果

AlpacaEval 2 (Win Rate vs GPT-4)

方法 Win Rate 提升
Base SFT 12.3% -
DPO 27.8% +15.5
PPO 35.2% +7.4
RTO (本文) 42.7% +7.5

RTO在PPO基础上实现21%相对提升,这在2024年是显著突破。

Arena-Hard (困难问题挑战)

方法 Score Gap to GPT-4-Turbo
PPO 31.2 -18.8
RTO 35.3 -14.7
GPT-4-Turbo 50.0 -

缩小与GPT-4-Turbo的差距22%。

训练效率

GPU小时数 (达到相同性能):

  • PPO: ~800 GPU hours
  • RTO: ~560 GPU hours (节省30%)

原因: Token级reward提供更密集信号,加速收敛。

案例分析

Prompt: “解释黑洞的形成过程”

PPO输出:

“黑洞是恒星坍缩形成的。当恒星耗尽燃料,核心坍缩产生强大引力场,连光也无法逃逸。[后续内容质量下降,出现重复]”

RTO输出:

“黑洞的形成经历三个阶段。首先,大质量恒星(≥20倍太阳质量)在核聚变反应耗尽时,核心压力无法抵抗引力…[保持高质量到结尾]”

分析:

  • PPO的句子级reward无法指出后半段质量下降
  • RTO的token级reward在每个token都提供反馈,保持全程质量

技术对比

RTO vs 传统方法

vs 纯DPO:

1
2
3
4
DPO → RTO
+ 增加在线PPO阶段
+ 性能提升显著 (+7.5点)
- 计算成本增加 (需要在线采样)

vs 纯PPO:

1
2
3
4
5
PPO → RTO
+ DPO预训练提供更好初始化
+ Token级reward更精准
+ 训练更稳定、更快收敛
- 需要额外DPO阶段

vs Sentence-level PPO + RM:

1
2
3
4
传统PPO → RTO
+ 不需要单独训练reward model
+ Token级反馈更细粒度
+ DPO隐式学习reward

何时使用RTO

✅ 推荐场景:

  1. 追求SOTA性能 - 对标GPT-4等顶级模型
  2. 已有DPO模型 - 希望进一步提升
  3. 长文本生成 - Token级控制避免尾部质量下降
  4. 算力充足 - 可承担PPO的在线成本

❌ 不推荐场景:

  1. 预算受限 - 纯DPO更经济
  2. 快速迭代 - DPO单阶段更快
  3. 小规模部署 - 性能提升不值得额外成本

实施建议

超参数设置

DPO阶段:

1
2
3
4
beta: 0.1           # KL惩罚系数
learning_rate: 5e-7 # 非常低的LR
epochs: 1 # 单epoch避免过拟合
batch_size: 64

PPO阶段:

1
2
3
4
5
beta_kl: 0.05       # PPO的KL系数
learning_rate: 1e-6
ppo_epochs: 4
batch_size: 256
clip_range: 0.2

关键工程技巧

1. Token Reward的Scale:

1
2
3
4
5
# 问题: token reward可能scale差异大
raw_rewards = [0.01, 0.05, -0.02, ...]

# 解决: normalize
normalized_rewards = (raw_rewards - mean) / std

2. 长序列的Reward累积:

1
2
# 使用GAE (Generalized Advantage Estimation) 降低方差
advantages = compute_gae(token_rewards, values, gamma=0.99, lambda=0.95)

3. 避免DPO过度优化:

1
2
3
4
# 监控KL散度,及时停止DPO训练
kl_div = compute_kl(policy, ref_policy)
if kl_div > threshold: # e.g., 0.1
early_stop()

最小可行实现

基于HuggingFace TRL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from trl import DPOTrainer, PPOTrainer

# 阶段1: DPO
dpo_trainer = DPOTrainer(
model=sft_model,
ref_model=ref_model,
beta=0.1,
train_dataset=preference_data
)
dpo_model = dpo_trainer.train()

# 阶段2: PPO with token rewards
def token_reward_fn(prompt, response):
"""使用DPO学到的策略计算token级reward"""
rewards = []
for i, token in enumerate(response):
context = prompt + response[:i]
log_ratio = log_prob(dpo_model, token, context) - \
log_prob(ref_model, token, context)
rewards.append(0.1 * log_ratio) # beta=0.1
return rewards

ppo_trainer = PPOTrainer(
model=dpo_model,
reward_fn=token_reward_fn, # 使用token级reward
config=ppo_config
)
final_model = ppo_trainer.train()

个人评价

RTO是2024-2025年RLHF领域最重要的方法创新之一。它优雅地解决了DPO和PPO各自的局限,实现了1+1>2的效果。

突出优势

  1. 理论优雅 - Token-wise MDP形式化严谨,统一两大范式
  2. 性能领先 - AlpacaEval +7.5点在2024年是显著突破
  3. 工程可行 - 基于成熟的DPO和PPO,易于实现
  4. 开源友好 - 提供代码和模型,推动社区发展

存在挑战

  1. 计算成本 - 两阶段训练相比纯DPO增加成本
  2. 超参数敏感 - Token reward的scale需要careful tuning
  3. 长序列问题 - 序列越长,token reward的累积误差越大

未来方向

  1. 在线RTO - 能否在PPO阶段继续更新token reward?
  2. 多模态扩展 - 图像-文本生成的token级优化
  3. 效率优化 - 能否用LoRA降低两阶段训练成本?

最终评分: 4.3/5.0

推荐指数: ⭐⭐⭐⭐⭐ (如果算力充足)

这是当前追求SOTA性能的必选方法。如果你的目标是对标GPT-4,RTO值得投入。但对于预算受限的团队,纯DPO仍是更实用的选择。


代码仓库: GitHub - microsoft/LMOps/rto

模型: HuggingFace - RLHFlow

引用:

1
2
3
4
5
6
@inproceedings{zhong2025rto,
title={DPO Meets PPO: Reinforced Token Optimization for RLHF},
author={Zhong, Han and Shan, Zikang and Feng, Guhao and others},
booktitle={ICML},
year={2025}
}
© 2026 Generative AI Discovery All Rights Reserved.
Theme by hiero