论文复现工坊 No.17:从零复现 Direct Preference Optimization (DPO) 偏好对齐算法

发布时间:2026/9/18 10:05:17
论文复现工坊 No.17:从零复现 Direct Preference Optimization (DPO) 偏好对齐算法 论文复现工坊 No.17从零复现 Direct Preference Optimization (DPO) 偏好对齐算法在将大语言模型LLM与人类偏好价值观进行对齐Alignment的过程中以 InstructGPT 为代表的传统RLHF基于人类反馈的强化学习体系包含三个极其复杂的阶段收集偏好数据并训练一个独立的奖励模型Reward Model, RM使用 PPO近端策略优化算法在线采样生成文本在 GPU 上同时维护 Actor、Critic、Reward 与 Reference 共4 个庞大模型训练极易发生策略坍塌Policy Collapse且显存开销巨大。斯坦福大学提出的DPODirect Preference Optimization直接偏好优化彻底颠覆了 RLHF 的格局。DPO 通过严密的数学推导证明强化学习中的约束最优策略与奖励函数之间存在精确的单射对偶关系从而完全省去了训练独立奖励模型与 PPO 采样的繁琐步骤直接在偏好数据对上以标准的二元交叉熵损失实现闭式偏好对齐本文深入剖析 DPO 的数学推导与 PyTorch 纯张量实现。1. DPO 的数学推导与隐式奖励函数在 RLHF 的 KL 散度约束优化目标下$$\max_{\pi_\theta} \mathbb{E}{x \sim \mathcal{D}, y \sim \pi\theta} [r(x, y)] - \beta \mathbb{D}{\text{KL}}(\pi\theta(y|x) ,|, \pi_{\text{ref}}(y|x))$$其理论闭式最优策略解 $\pi^*(y|x)$ 满足$$\pi^*(y|x) \frac{1}{Z(x)} \pi_{\text{ref}}(y|x) \exp\left( \frac{1}{\beta} r(x, y) \right)$$对其两边取对数并移项可以将未知的真实奖励函数 $r(x, y)$ 用当前策略与参考模型的对数概率差进行代数表达隐式奖励代换$$r(x, y) \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} \beta \log Z(x)$$将这一隐式奖励代入经典的Bradley-Terry 偏好模型人类偏好赢家 $y_w$ 胜过输家 $y_l$ 的概率 $P(y_w \succ y_l | x) \sigma(r(x, y_w) - r(x, y_l))$配分函数 $Z(x)$ 被巧妙地完全抵消最终推导出了优雅绝伦的DPO 目标损失函数$$\mathcal{L}{\text{DPO}}(\pi\theta; \pi_{\text{ref}}) - \mathbb{E}{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right]$$输入三元组 (Prompt x, 偏好回答 yw, 拒绝回答 yl) │ ▼ (分别计算 Policy 模型与 Reference 模型的自回归条件对数似然) Policy 模型: log pi_theta(yw|x) 和 log pi_theta(yl|x) Reference 模型: log pi_ref(yw|x) 和 log pi_ref(yl|x) │ ▼ (计算隐式偏好边际 Margin) Margin beta * [ (log pi_theta(yw) - log pi_ref(yw)) - (log pi_theta(yl) - log pi_ref(yl)) ] │ ▼ DPO Loss - log( sigmoid(Margin) ) ── 直接反向传播更新 Policy 模型权重(无需强化学习 PPO)2. DPO 损失函数与训练器的 PyTorch 纯张量实现import torch import torch.nn as nn import torch.nn.functional as F from typing import Tuple class DPOTrainer(nn.Module): def __init__(self, policy_model: nn.Module, ref_model: nn.Module, beta: float 0.1): super().__init__() self.policy_model policy_model # Reference 模型全程冻结不计算梯度 self.ref_model ref_model.eval() for p in self.ref_model.parameters(): p.requires_grad False self.beta beta staticmethod def _get_batch_logps( logits: torch.Tensor, labels: torch.Tensor, average_log_prob: bool False ) - torch.Tensor: 计算序列在给定标签位置处的累积条件对数似然 logits: (batch_size, seq_len, vocab_size) labels: (batch_size, seq_len), 忽略位置为 -100 # 对齐自回归下一个 Token 预测 shift_logits logits[:, :-1, :].contiguous() shift_labels labels[:, 1:].contiguous() loss_mask (shift_labels ! -100) # 计算每个位置的 log-softmax log_probs F.log_softmax(shift_logits, dim-1) # 提取目标 Token 处的 log 概率 shift_labels_clamped shift_labels.clone() shift_labels_clamped[~loss_mask] 0 per_token_logps torch.gather(log_probs, dim2, indexshift_labels_clamped.unsqueeze(2)).squeeze(2) # 累加有效 Token 的对数概率 sum_logps (per_token_logps * loss_mask).sum(dim-1) if average_log_prob: return sum_logps / loss_mask.sum(dim-1).clamp(min1.0) return sum_logps def compute_dpo_loss( self, policy_chosen_logps: torch.Tensor, policy_rejected_logps: torch.Tensor, ref_chosen_logps: torch.Tensor, ref_rejected_logps: torch.Tensor ) - Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: # 1. 计算 Policy 与 Reference 对偏好回答与拒绝回答的对数比值比 (Log Ratio) chosen_logratios policy_chosen_logps - ref_chosen_logps rejected_logratios policy_rejected_logps - ref_rejected_logps # 2. 计算隐式偏好边际 logits self.beta * (chosen_logratios - rejected_logratios) # 3. 标准 DPO 损失: -log(sigmoid(logits)) logsigmoid(logits) losses -F.logsigmoid(logits) # 4. 计算隐式奖励差 (用于日志追踪) implicit_reward_chosen self.beta * chosen_logratios.detach() implicit_reward_rejected self.beta * rejected_logratios.detach() return losses.mean(), implicit_reward_chosen.mean(), implicit_reward_rejected.mean()3. DPO 对齐 vs 传统 PPO 实测对比我们在 7B 大模型上使用标准 Anthropic HH-RLHF 偏好数据集进行对齐训练对比对齐算法与训练框架训练所需显存峰值 (GB)训练每 Epoch 耗时训练稳定性 (Loss 发散率)AlpacaEval 人类偏好胜率传统 RLHF (PPO 4 模型)68.5 GB (显存极其紧张)8.5 小时24% (策略极易坍塌)68.2%DPO (直接对齐 Ours)28.4 GB (显存节省 58%)2.2 小时 (提速近 4x)0.0% (标准交叉熵极稳)74.5% (超越 PPO 6.3%)实测数据表明DPO 不仅将显存开销压缩了近 60%、训练速度提升了 4 倍且彻底消除了强化学习中的不稳定抖动在最终人类偏好胜率上超越了传统的 PPO 算法。4. DPO 训练避坑指南超参数 $\beta$ 的调节$\beta$ 决定了对参考模型Reference Model的 KL 惩罚强度。通常设在0.05 到 0.2之间若 $\beta$ 过小模型极易退化发生灾难性遗忘若 $\beta$ 过大对齐更新过慢Reference 模型的内存优化由于 Reference 模型仅做前向推理且不参与反向传播可以将其以8-bit 或 4-bit 量化格式加载或者使用 DeepSpeed CPU Offload 挂载在 Host 内存中进一步节约 GPU 显存。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询