
Comparison of RL Algorithm —— PPO、GRPO、DPO、DAPO、GSPO技术详解与对比
从12个核心维度系统对比PPO、GRPO、DPO、DAPO与GSPO五种大模型强化学习对齐算法,剖析其技术演进脉络、核心机制与适用场景,揭示从"通用重器"到"专属利刃"的进化逻辑。
阅读文章ZHY's Blog
A UNIVERSE OF IDEAS · BY ZHANG HAOYI
让好奇心 点亮知识宇宙
在代码、模型与思想之间自由漫游。这里持续记录人工智能、机器学习、软件工程与成长实践,让每次阅读都成为一次新的发现。
ARTICLE NOTE
Important
在上一篇文章中,我们详细讲解了PPO如何通过裁剪机制和KL散度约束,在大模型强化学习对齐中扮演核心角色。然而,PPO虽强,却有一个无法回避的问题:它太“重”了。

标准RLHF流程的四阶段重负:
这种复杂性在学术界和工业界都催生了一个根本性的追问:我们真的需要先训练一个奖励模型,再用强化学习去优化它吗? 或者说,这种“先建模、再优化”的两阶段范式,是否是这个问题的唯一解?
2023年,斯坦福大学Rafael Rafailov团队在论文Direct Preference Optimization: Your Language Model is Secretly a Reward Model中给出了一个颠覆性的答案 —— 带KL散度约束的奖励最大化问题,其最优策略与奖励函数之间存在一一对应关系。因此,优化策略等价于优化奖励函数,无需显式构建奖励模型,更无需强化学习的采样循环。这篇论文的核心洞察正如其标题所言:“Your Language Model is Secretly a Reward Model”——你的语言模型本身就隐藏着一个奖励模型。
DPO的核心思想极为简洁:直接优化语言模型以符合人类偏好,无需显式训练独立的奖励模型,也无需复杂的强化学习阶段。它将RLHF的多阶段流程替换为单个训练阶段,本质上是一个监督学习问题。
如果说PPO是“训练一个裁判(奖励模型),再让选手(策略)按照裁判的评分标准去训练”,那么DPO就是“直接给选手看冠军(偏好回答)和淘汰者(被拒绝回答)的对比录像,让它自己领悟评分标准”。前者需要一整套比赛和评分系统,后者仅需一组对比案例。
标准RLHF的优化目标是最大化带KL散度约束的奖励期望,核心是寻找一个策略 πθ,在最大化奖励的同时,不偏离参考策略 πref 太远:
LRLHF(πθ)=Ex∼D,y∼πθ(⋅∣x)[r(x,y)]−β⋅DKL(πθ(⋅∣x)∥πref(⋅∣x))各符号的含义:
问题在于,这个目标函数包含对策略 πθ 的采样期望,而采样操作是不可微的——这正是为什么我们需要PPO这样的强化学习算法来优化它。PPO本质上是在找一个数值解。
DPO的突破性洞察在于:对于上述带KL约束的奖励最大化问题,其最优策略不仅存在,而且可以用奖励函数的闭式表达出来。
注意,KL散度可以展开为:
DKL(π∥πref)=Ey∼π(⋅∣x)[logπref(y∣x)π(y∣x)]代入原目标,构造拉格朗日函数求解:
L(π)=Ey∼π(⋅∣x)[r(x,y)−βlogπref(y∣x)π(y∣x)]通过变分法求解,对于每个输入 x,最优策略 π∗ 应满足:
π∗(y∣x)=Z(x)1πref(y∣x)exp(β1r(x,y))其中 Z(x)=∑yπref(y∣x)exp(β1r(x,y)) 是配分函数(Partition Function) ,用于归一化概率分布。
这个公式的深刻含义:最优策略 π∗ 是在参考策略的基础上,按照指数比例向高奖励区域偏移的结果。β 控制偏移的”温度”——β 越小,偏移越集中到最高奖励的回答上;β 越大,偏移越平缓,保留更多参考策略的多样性。
逆向看这个公式,奖励函数 r 可以被 π∗ 和 πref 表达:
r(x,y)=βlogπref(y∣x)π∗(y∣x)+βlogZ(x)这个看似简单的数学变换,正是DPO”语言模型本身就是奖励模型”的第一个理论基础。它告诉我们:奖励函数与最优策略之间,存在着一一对应的关系。
在RLHF中,偏好数据通常以成对比较的形式收集:给定输入 x,标注者从两个回答 (yw,yl) 中选出更喜欢的一个(yw表示”获胜”回答,yl表示”落败”回答)。
Bradley-Terry模型假设人类偏好遵循逻辑斯谛概率。该模型假设:对于一对回答 (yw,yl),人类偏好 yw 胜过 yl 的概率为:
P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))其中 σ(t)=1+e−t1 是sigmoid函数。这个假设的直觉是:两个回答的奖励差异越大,人类偏好其中之一的概率就越高。如果 r(x,yw)≫r(x,yl),偏好概率趋近于1;反之则趋近于0;若两者奖励相近,偏好概率约为0.5。
Bradley-Terry模型是DPO推导的第二个理论基础。它将隐式的人类偏好,映射为了一个可计算的概率表达式。
现在,将第 2.2 节的最优策略表达式代入 2.3 节的Bradley-Terry模型中。注意,配分函数 Z(x) 在相减中完美抵消:
P(yw≻yl∣x)=σ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))这个公式是DPO的核心方程。它的物理含义是:偏好概率可以直接由当前策略 πθ 和参考策略 πref 的对数概率比来表示,完全不需要显式的奖励模型!
这个公式的直觉表明模型的偏好预测完全由以下机制决定:
于是,DPO的训练目标是最小化负对数似然损失:
LDPO(πθ;πref)=−E(x,yw,yl)∼D[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]这个损失函数的直观理解:
损失函数的梯度分析:为了更深入理解DPO的优化行为,我们对损失函数关于策略参数 θ 求梯度:
∇θLDPO=−β⋅E[σ(β⋅Δ)⋅(∇θlogπθ(yw∣x)−∇θlogπθ(yl∣x))]其中 Δ=logπref(yw∣x)πθ(yw∣x)−logπref(yl∣x)πθ(yl∣x)。
梯度分析的关键分析:
然而,梯度公式中也隐藏着一个重要问题:∇θlogπθ(yl∣x) 项的系数为负,意味着被拒绝回答的梯度方向是减大概率。当被拒绝回答本身在参考模型中有较高概率时,这个梯度信号会非常强,可能导致模型过度惩罚某些本来合理的回答。这正是DPO”被拒绝样本过度影响”问题的数学根源。
仔细观察上述公式,DPO虽然没有显式训练奖励模型,但它在训练过程中隐式地定义了一个奖励函数:
rθ(x,y)=βlogπref(y∣x)πθ(y∣x)
这个隐式奖励有一个重要的自归一化特性:在任意输入 x 下,所有可能的 y 上的期望值 Ey∼πref[erθ(x,y)/β]=1,不需要像显式奖励模型那样额外做归一化处理。
这个隐式奖励函数衡量的是当前策略相比参考策略,在生成回答 y 上的相对优势:
关键细节:
1import torch2import torch.nn.functional as F3from transformers import AutoModelForCausalLM4
5# ==================== 初始化阶段 ====================6# 1. 加载参考模型 (通常是SFT后的模型,冻结)7model_ref = AutoModelForCausalLM.from_pretrained("sft_model")8for param in model_ref.parameters():9 param.requires_grad = False10
11# 2. 加载待训练的策略模型 (从SFT模型初始化)12model_policy = AutoModelForCausalLM.from_pretrained("sft_model")13
14# 3. 加载偏好数据集: (prompt, chosen_response, rejected_response)15# chosen_response: 人类偏好的回答16# rejected_response: 人类不偏好的回答17dataset = load_preference_data("my_preference_data.jsonl")18
19# 超参数20BETA = 0.1 # KL惩罚系数,控制隐式奖励的缩放21LEARNING_RATE = 5e-622BATCH_SIZE = 3223optimizer = torch.optim.AdamW(model_policy.parameters(), lr=LEARNING_RATE)24
25# ==================== 训练循环 ====================26model_policy.train()27for epoch in range(num_epochs):28 for batch in dataloader(dataset, batch_size=BATCH_SIZE):29 prompts, chosen, rejected = batch30
31 # ----- Step 1: 前向传播 -----32 # 计算策略模型在偏好回答和被拒绝回答上的对数概率33 policy_chosen_logps = model_policy(prompts, chosen).log_probs # shape: (B,)34 policy_rejected_logps = model_policy(prompts, rejected).log_probs35
36 # 计算参考模型在偏好回答和被拒绝回答上的对数概率 (冻结,无梯度)37 with torch.no_grad():38 ref_chosen_logps = model_ref(prompts, chosen).log_probs39 ref_rejected_logps = model_ref(prompts, rejected).log_probs40
41 # ----- Step 2: 计算DPO损失 -----42 # 计算隐式奖励之差43 implicit_chosen_reward = BETA * (policy_chosen_logps - ref_chosen_logps)44 implicit_rejected_reward = BETA * (policy_rejected_logps - ref_rejected_logps)45 reward_diff = implicit_chosen_reward - implicit_rejected_reward46
47 # DPO损失: 负对数sigmoid48 # loss = -log(sigmoid(reward_diff))49 loss = -F.logsigmoid(reward_diff).mean()50
51 # 可选: 添加一个正则化项,控制策略与参考模型的绝对偏离52 # 这有助于缓解DPO的过拟合问题53 # kl_regularization = BETA * (policy_chosen_logps - ref_chosen_logps).pow(2).mean()54 # loss = loss + 0.01 * kl_regularization55
56 # ----- Step 3: 反向传播与优化 -----57 optimizer.zero_grad()58 loss.backward()59 # 梯度裁剪,防止梯度爆炸60 torch.nn.utils.clip_grad_norm_(model_policy.parameters(), max_norm=1.0)61 optimizer.step()62
63 # 监控指标64 if step % 100 == 0:65 # 计算当前batch的准确率: 模型是否正确区分偏好回答66 accuracy = (reward_diff > 0).float().mean()67 print(f"Loss: {loss.item():.4f}, Acc: {accuracy.item():.2f}")68
69# ==================== 推理阶段 ====================70# 训练完成后,model_policy即可用于生成符合人类偏好的回答71model_policy.eval()72response = model_policy.generate(prompt)要点总结:
| 创新点 | 说明 |
|---|---|
| 奖励模型参数化技巧 | 通过数学推导将奖励函数表示为策略与参考模型的对数概率比,实现闭式求解,绕过了配分函数计算这一传统难题 |
| 从强化学习到监督学习的降维 | 将RLHF的复杂优化问题转化为二元分类问题,大幅降低工程门槛和计算资源需求 |
| 隐式奖励机制 | 策略模型本身成为奖励信号的载体,无需额外训练奖励模型,自然地编码了人类偏好 |
| 离线训练 | DPO完全基于静态的偏好数据集进行训练,无需在线采样,适用于无法与环境交互的场景 |
| 仅需两个模型 | 相比PPO的四个模型,DPO只需Actor和Reference两个模型,显存占用减半 |
| 优势 | 说明 |
|---|---|
| 极简高效 | 将复杂的RLHF流程简化为一个损失函数,训练速度快、资源消耗低 |
| 训练稳定 | 本质是监督学习,不存在强化学习的不稳定性问题 |
| 理论完备 | 与RLHF优化相同的目标函数,有严格的数学证明 |
| 易于实现 | 代码实现简单,门槛低,已被HuggingFace TRL等主流框架原生支持 |
| 保持基础能力 | 在合适超参数下,DPO微调对模型的通用能力影响较小 |
| 局限 | 说明 |
|---|---|
| 依赖静态数据 | DPO是离线算法,无法像PPO那样在训练中动态采样、探索新策略,也无法利用在线交互的反馈 |
| 容易过拟合 | DPO往往会很快过拟合偏好数据集,尤其是在数据不够大或不够多样化时,导致泛化能力下降 |
| 对偏好数据质量高度敏感 | 数据质量直接决定对齐效果,低质量数据(如标签噪声、偏见数据)会放大负面影响 |
| 梯度不平衡问题 | PPO对获胜和失败样本保持相对平衡的梯度更新,而DPO存在梯度不平衡——模型权重的更新不成比例地来自被拒绝样本,可能导致训练不稳定 |
| 缺乏细粒度控制 | DPO优化的是完整回答的偏好,缺乏提供token级别细粒度反馈的能力,在需要精细化控制的场景(如逐步推理)中表现不足 |
| 对初始化敏感 | 研究表明DPO对模型初始化高度敏感,可能将概率质量意外地转移到无关或不良的回答上 |
| 长度偏差 | DPO倾向于生成更长的回答来“讨好”偏好信号,因为更长的回答往往有更高的累积对数概率 |
| 维度 | PPO | DPO |
|---|---|---|
| 模型数量 | 4个(Actor + Critic + Reward + Reference) | 2个(Actor + Reference) |
| 训练方式 | 在线强化学习(需与环境交互采样) | 离线监督学习(静态数据集) |
| 奖励信号 | 显式奖励模型打分 | 隐式奖励(策略-参考对数概率比) |
| 超参数 | 多(ε, β, λ, lr, GAE参数等) | 少(主要是β) |
| 稳定性 | 中等(需精细调优,有崩溃风险) | 高(本质是监督学习,收敛平滑) |
| 灵活性 | 高(可动态探索、支持细粒度token级反馈) | 低(依赖静态数据,整体偏好优化) |
| 样本效率 | 中(在线采样成本高,但数据复用) | 高(离线数据可多次遍历) |
| 计算成本 | 极高(四模型显存+采样开销) | 低(两模型,节省50-60%成本) |
| 适用场景 | 复杂需求、严格约束、对质量要求极高的场景 | 快速验证、资源受限、偏好明确的场景 |
| 理论基础 | 信任域策略优化 | 隐式KL约束奖励最大化 |
Note如果说PPO回答的是“如何在追求目标时保持稳定”的问题,那么DPO回答的则是一个更为根本的问题:我们能否绕过“先建模型再优化”的两步走,直接让模型从偏好中学习?
DPO通过一个精妙的数学推导给出了肯定的答案:
RLHF优化问题闭式解最优策略⇔奖励函数代入BT模型二元分类损失
这个推导过程将强化学习问题降维为监督学习问题,让大模型对齐从一个需要四模型协同、在线采样、精细调参的复杂工程,变成了一个只需两个模型、静态数据、简单交叉熵的训练流程。
DPO的出现,标志着大模型对齐领域的一个重要范式转变:从“用强化学习优化奖励”到“直接学习偏好”。它让更多团队能够以可承受的成本参与到模型对齐的实践中来,极大地推动了整个领域的发展。
然而,DPO并非万能灵药。它的离线特性、对数据质量的依赖、以及对复杂推理任务的局限,决定了它目前还无法完全取代PPO。
在实际工程中,PPO和DPO更像是一对互补的工具——PPO适合对质量要求极高、资源充足的场景(如顶尖闭源模型的最终对齐);DPO适合快速迭代、资源受限的场景(如开源模型的偏好微调、学术研究)。理解两者的本质差异和各自的适用边界,才是选择对齐方案的正确思路。
按顺序完成这组文章,循序渐进地掌握主题
发现错误、内容过时或有改进想法?欢迎告诉我
根据本文分类与标签,为你推荐可能感兴趣的内容

从12个核心维度系统对比PPO、GRPO、DPO、DAPO与GSPO五种大模型强化学习对齐算法,剖析其技术演进脉络、核心机制与适用场景,揭示从"通用重器"到"专属利刃"的进化逻辑。
阅读文章
系统梳理GSPO群组序列策略优化的核心原理,解析其如何通过序列级重要性比率与长度归一化从根本上修复GRPO的token级采样缺陷,解决MoE专家震荡与长序列方差累积问题,并探讨GSPO的局限与后续演进。
阅读文章
系统梳理DAPO解耦裁剪与动态采样策略优化的核心技术原理,解析Clip-Higher、Dynamic Sampling、Token-Level Loss与Overlong Reward Shaping四项创新如何解决GRPO在长CoT场景下的熵崩塌与训练不稳定问题,将GRPO从实验室算法打磨为工业级系统。
阅读文章请使用微信扫描二维码分享
当前文章会保持在原页面