《第一篇》大模型强化学习中的 PPO、DPO、KTO、ORPO 全解析
本文系统解析了大语言模型微调中的四种强化学习算法:PPO、DPO、KTO和ORPO。PPO通过约束策略更新实现稳定优化,DPO直接利用人类偏好数据避免奖励建模,KTO在DPO基础上加入KL正则项,ORPO则专注于离线数据训练。文章详细介绍了各算法的原理、数据格式、数学公式和简化实现,并对比了它们的适用场景和特点。这些方法为LLM优化提供了不同路径,从传统的在线策略优化到更高效的离线偏好学习,帮助开
大模型强化学习中的 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:离线偏好监督强化学习
- 总结对比
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)如下:
LPPO(θ)=Et[min(rt(θ)A^t,clip(rt(θ),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)]
其中:
- rt(θ)=πθ(at∣st)πθold(at∣st)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}_tA^t 是 advantage(优势函数)
简单实现(使用 trl 库)
from trl import PPOTrainer
trainer = PPOTrainer(model, ref_model, tokenizer, args)
trainer.step(prompt_tensors, response_tensors, rewards)
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."
}
公式
优化目标为最大化以下似然差异:
LDPO=logexp(β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) 是模型输出对输入 xxx 生成 yyy 的打分(logit)
- β\betaβ 控制偏好强度
简单实现(trl)
from trl import DPOTrainer
trainer = DPOTrainer(model, args)
trainer.train(preference_dataset)
KTO:KL-guided Preference Optimization
原理
KTO 是 DPO 的改进版,引入了 KL 正则项,鼓励新模型不要偏离参考模型太远。
适用于奖励来源不稳定或参考模型非常可靠的场景。
样例数据
与 DPO 相同(prompt + chosen + rejected)
公式
KTO 的损失函数如下:
LKTO=LDPO+λ⋅KL(πθ∥π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)
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 的损失包含两个部分:
LORPO=LMLE−λ⋅R(y) \mathcal{L}_{\text{ORPO}} = \mathcal{L}_{\text{MLE}} - \lambda \cdot R(y) LORPO=LMLE−λ⋅R(y)
- LMLE\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 | 是 | 是 | 否 | 离线数据训练 |
更多推荐
所有评论(0)