编辑
2025-05-12
深度学习
00

目录

PPO和DPO强化学习方法比较
PPO (Proximal Policy Optimization)
DPO (Direct Preference Optimization)
Reference模型与Actor模型可否为同一个
使用参考模型时 (userefmodel=True)
无参考模型时 (userefmodel=False)

PPO和DPO强化学习方法比较

PPO (Proximal Policy Optimization)

PPO是一种传统的强化学习方法,在RLHF (Reinforcement Learning from Human Feedback)中应用广泛:

  1. 基本组成

    • 策略模型(Actor):生成文本响应
    • 奖励模型(Reward Model):评估响应质量
    • 参考模型(Reference Model):限制与初始模型的偏离
  2. 训练流程

    • 策略模型生成回答
    • 奖励模型对生成的回答打分
    • 通过奖励信号更新策略模型
    • 使用KL惩罚项防止过度偏离参考模型
  3. 核心公式

    L_PPO(θ) = E_π_old[ min(r(θ)A, clip(r(θ), 1-ε, 1+ε)A) ] - β·KL(π_θ || π_ref)

    其中r(θ)是新旧策略的概率比,A是优势函数,后面是KL散度正则项。

  4. 优缺点

    • 优点:效果好,理论基础扎实
    • 缺点:需要复杂的训练流程和三个模型(策略、奖励、参考),计算开销大

DPO (Direct Preference Optimization)

DPO简化了RLHF过程,直接从偏好数据对中学习:

  1. 基本思想

    • 绕过显式构建奖励模型
    • 直接从(preferred, rejected)数据对学习
    • 隐式推导出奖励函数
  2. 数学基础: DPO证明了在最优奖励模型下,可以将PPO的目标函数转换为:

    L_DPO(θ) = -E_{(x,y_w,y_l)}[ log σ(β(log(π_θ(y_w|x)/π_ref(y_w|x)) - log(π_θ(y_l|x)/π_ref(y_l|x)))) ]

    其中:

    • π_θ是当前策略模型
    • π_ref是参考模型
    • y_w是preferred响应
    • y_l是rejected响应
    • β是温度参数
  3. 优势

    • 无需训练单独的奖励模型
    • 训练流程更简单、更稳定
    • 计算效率更高

Reference模型与Actor模型可否为同一个

DPO算法中,Reference模型与Actor模型确实可以是同一个模型,但有以下考虑:

  1. 理论上

    • 在LLaMA-Factory实现中,有use_ref_model参数控制是否使用单独的参考模型
    • use_ref_model=False时,算法会使用不同的损失函数变体(如ORPO、SimPO)
  2. 代码实现

    python
    # 在DPO训练器中 if not self.finetuning_args.use_ref_model: if self.loss_type == "orpo": losses = self.odds_ratio_loss(policy_chosen_logps, policy_rejected_logps) elif self.loss_type == "simpo": losses = self.simpo_loss(policy_chosen_logps, policy_rejected_logps) else: losses, chosen_rewards, rejected_rewards = self.dpo_loss( policy_chosen_logps, policy_rejected_logps, reference_chosen_logps, reference_rejected_logps )
  3. 实际考虑

    • 优点:节省内存,简化实现
    • 缺点:可能导致模型偏离原始行为过大,训练不稳定
    • 通常推荐使用单独的reference模型,即训练前的初始模型,以保持KL约束
  4. 实现细节: 当不使用独立reference模型时,代码会临时禁用adapter以计算reference logits:

    python
    if self.ref_model is None: ref_model = model ref_context = self.accelerator.unwrap_model(model).disable_adapter() else: ref_model = self.ref_model ref_context = nullcontext()

实际应用中,对于资源受限情况可考虑使用同一模型,但为获得最佳效果,建议使用独立的reference模型。

在传统的DPO算法中,参考模型(reference model)是必需的组件,用于计算KL散度约束。但LLaMA-Factory提供了两种不同的工作模式:

使用参考模型时 (use_ref_model=True)

使用标准DPO损失函数,需要两个模型:

python
losses, chosen_rewards, rejected_rewards = self.dpo_loss( policy_chosen_logps, policy_rejected_logps, reference_chosen_logps, reference_rejected_logps )

这里的DPO公式是:

L_DPO(θ) = -log σ(β(log(π_θ(y_w|x)/π_ref(y_w|x)) - log(π_θ(y_l|x)/π_ref(y_l|x))))

无参考模型时 (use_ref_model=False)

这是LLaMA-Factory的创新点,当无法或不想使用参考模型时,它提供了两种替代算法:

  1. ORPO (Odds Ratio Policy Optimization):

    python
    def odds_ratio_loss(self, chosen_logps, rejected_logps): log_odds = (chosen_logps - rejected_logps) - ( torch.log1p(-torch.exp(chosen_logps)) - torch.log1p(-torch.exp(rejected_logps)) ) sft_loss = -chosen_logps odds_ratio_loss = -F.logsigmoid(log_odds) orpo_loss = sft_loss + self.beta * odds_ratio_loss return orpo_loss

    ORPO使用概率比的对数几率,无需参考模型就能区分首选和拒绝样本。

  2. SimPO (Simple Policy Optimization):

    python
    def simpo_loss(self, chosen_logps, rejected_logps): pi_logratios = chosen_logps - rejected_logps gamma_logratios = self.simpo_gamma / self.beta logits = pi_logratios - gamma_logratios simpo_loss = -F.logsigmoid(self.beta * logits) return simpo_loss

    SimPO简化了目标函数,同时引入γ参数控制首选和拒绝样本之间的奖励边界。

这种设计的好处是:即使在内存受限或只有单模型情况下,也能进行偏好优化训练。这些变体通过巧妙的数学变换,消除了对参考模型的依赖,同时保持了偏好学习的核心思想。

您可以根据自己的资源和需求选择使用标准DPO(双模型)或这些单模型变体(ORPO/SimPO)。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!