大模型强化学习中的 PPO、DPO、KTO、ORPO 全解析
大模型强化学习中的 PPO、DPO、KTO、ORPO 全解析
本文聚焦大语言模型(LLM)微调阶段中的强化学习方法,全面介绍四大主流算法:PPO(Proximal Policy Optimization)、DPO(Direct Preference Optimization)、KTO(Kullback-Leibler Preference Optimization)、ORPO(Offline RL with Preference Optimization)。通过原理、训练样例、公式与代码解析,帮助你理解它们在 RLHF(基于人类反馈的强化学习)中的定位与区别。
✨ 目录
- PPO:传统但强大的策略优化方法
- DPO:去奖励建模的偏好优化算法
- KTO:KL 指导的直接偏好优化
- ORPO:离线偏好监督强化学习
- 总结对比
1️⃣ PPO:Proximal Policy Optimization
✅ 原理
PPO 是强化学习中最常见的策略优化算法之一,适用于 RLHF 的最后一阶段。它通过约束新旧策略之间的距离,避免模型剧烈更新。
在 LLM 中,PPO 通常如下流程:
- 提供一个问题 prompt
- 当前策略生成多个候选回复
- 使用奖励模型(Reward Model)打分
- 将得分用于更新策略
✅ 样例数据
{"prompt": "Explain quantum computing in simple terms","completion": "Quantum computing uses qubits instead of bits...","reward": 6.2
}
✅ 公式
目标函数(clipped)如下:
L P P O ( θ ) = E t [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L^{PPO}(\theta) = \mathbb{E}_t \left[ \min(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t) \right] LPPO(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
其中:
- r t ( θ ) = π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} rt(θ)=πθold(at∣st)πθ(at∣st)
- A ^ t \hat{A}_t A^t 是 advantage(优势函数)
✅ 简单实现(使用 trl 库)
from trl import PPOTrainer
trainer = PPOTrainer(model, ref_model, tokenizer, args)
trainer.step(prompt_tensors, response_tensors, rewards)
2️⃣ DPO:Direct Preference Optimization
✅ 原理
DPO 不再训练奖励模型,而是直接使用人类偏好进行优化。输入为两条回复(chosen 和 rejected),目标是让模型直接学会偏好。
优势:
- 无需训练额外 reward model
- 与 SFT 类似的训练范式,稳定易实现
✅ 样例数据
{"prompt": "What is the capital of France?","chosen": "The capital of France is Paris.","rejected": "France's capital city is Germany."
}
✅ 公式
优化目标为最大化以下似然差异:
L DPO = log exp ( β f θ ( x , y + ) ) exp ( β f θ ( x , y + ) ) + exp ( β f θ ( x , y − ) ) \mathcal{L}_{\text{DPO}} = \log \frac{\exp(\beta f_\theta(x, y^{+}))}{\exp(\beta f_\theta(x, y^{+})) + \exp(\beta f_\theta(x, y^{-}))} LDPO=logexp(βfθ(x,y+))+exp(βfθ(x,y−))exp(βfθ(x,y+))
其中:
- f θ ( x , y ) f_\theta(x, y) fθ(x,y) 是模型输出对输入 x x x 生成 y y y 的打分(logit)
- β \beta β 控制偏好强度
✅ 简单实现(trl)
from trl import DPOTrainer
trainer = DPOTrainer(model, args)
trainer.train(preference_dataset)
3️⃣ KTO:KL-guided Preference Optimization
✅ 原理
KTO 是 DPO 的改进版,引入了 KL 正则项,鼓励新模型不要偏离参考模型太远。
适用于奖励来源不稳定或参考模型非常可靠的场景。
✅ 样例数据
与 DPO 相同(prompt + chosen + rejected)
✅ 公式
KTO 的损失函数如下:
L K T O = L DPO + λ ⋅ K L ( π θ ∥ π ref ) \mathcal{L}_{KTO} = \mathcal{L}_{\text{DPO}} + \lambda \cdot KL(\pi_{\theta} \| \pi_{\text{ref}}) LKTO=LDPO+λ⋅KL(πθ∥πref)
✅ 实现(类 DPO,可加 KL loss)
loss = dpo_loss + lambda_ * kl_divergence(new_logits, ref_logits)
4️⃣ ORPO:Offline RL with Preference Optimization
✅ 原理
ORPO 是 OpenChat 提出的 RLHF 替代方案。目标是用 offline dataset(已存在的人类偏好数据)一次性训练,无需在线 rollout。
核心思想:将奖励模型的偏好信息嵌入损失函数中,像 SFT 一样训练。
✅ 样例数据
{"prompt": "Define inflation.","response": "Inflation is the rate at which prices increase...","score": 0.85
}
✅ 公式
ORPO 的损失包含两个部分:
L ORPO = L MLE − λ ⋅ R ( y ) \mathcal{L}_{\text{ORPO}} = \mathcal{L}_{\text{MLE}} - \lambda \cdot R(y) LORPO=LMLE−λ⋅R(y)
- L MLE \mathcal{L}_{\text{MLE}} LMLE 是传统的最大似然损失
- R ( y ) R(y) R(y) 是偏好得分(或奖励)
✅ 简单实现
loss = cross_entropy_loss - lambda_ * reward_score
✅ 总结对比
方法 | 训练阶段 | 是否需奖励模型 | 是否用偏好数据 | 在线策略优化 | 适用场景 |
---|---|---|---|---|---|
PPO | RLHF 后期 | ✅ 是 | ✅ 间接 | ✅ 是 | 高控制力 |
DPO | 替代 RLHF | ❌ 否 | ✅ 是 | ❌ 否 | 稳定、易部署 |
KTO | DPO 增强 | ❌ 否 | ✅ 是 | ❌ 否 | 偏差控制好 |
ORPO | 替代 RLHF | ✅ 是 | ✅ 是 | ❌ 否 | 离线数据训练 |