Direct Preference Optimization (DPO) Loss — From-Scratch Study Drill
1. 数学原理 / Mathematical Formulation
隐式奖励 / Implicit Reward
DPO 将策略模型 与参考模型 的对数概率比定义为隐式奖励:
DPO 损失 / Loss (per sample)
给定偏好对 ,其中 为优选(chosen)响应, 为拒绝(rejected)响应:
等价地,令 ,则 。
带 Label Smoothing 的保守变体 / Conservative Variant
当 时(参见 Rafailov et al. 2023 §5):
逐序列对数概率 / Per-Sequence Log-Probability
标准 next-token cross-entropy,对序列长度求和并 mask 掉 ignore_index=-100 的 padding 位置:
2. 直觉与复杂度 / Intuition & Complexity
直觉 / Intuition
DPO 的核心洞察是:无需训练单独的 reward model,可以直接用 作为隐式奖励。损失函数本质上是一个二分类目标——让优选回答的隐式奖励高于被拒绝回答的奖励。 控制 KL 散度约束的强度: 越大,策略越贴近参考模型。
复杂度 / Complexity
令 为 batch size, 为序列长度, 为词表大小:
| 操作 | 时间复杂度 | 备注 |
|---|---|---|
compute_log_probs_from_logits |
log_softmax + gather | |
dpo_loss |
仅逐元素算术 |
总计算量约 (四个 logits 张量各过一次 log-prob 计算)。内存主要受 logits 张量 支配。
3. 文件清单 / Files
本演练目录下仅有以下三个文件:
| 文件 | 说明 |
|---|---|
from_scratch.py |
核心实现:compute_log_probs_from_logits、dpo_loss、DPOLossModule,以及自测入口 |
test_dpo_loss.py |
单元测试,验证损失函数数值正确性与梯度传播 |
README.md |
本文件 |
4. 运行 / Run
# 演示与自测 / Demo & smoke-test
python from_scratch.py
# 运行单元测试 / Run tests
python test_dpo_loss.py
5. 追问分层 / Stratified Follow-ups
L1 — 基础 / Basic
- 什么是 DPO? 为什么 DPO 可以替代 RLHF 中的 reward model + PPO 流程?
- 隐式奖励的含义:
r(y|x) = β · (log π_θ − log π_ref)这个量在直觉上代表什么?为什么它与 Bradley-Terry 偏好模型一致? beta的作用: 将beta从 0.1 改为 1.0 或 0.01,loss 行为会如何变化?什么情况下beta=0会导致问题?ignore_index的用途: 为什么需要在compute_log_probs_from_logits中 mask 掉labels == -100的位置?如果不 mask 会怎样?
L2 — 进阶 / Intermediate
- Label Smoothing 的效果: 代码中
label_smoothing > 0时,损失函数变成了什么形式?这如何防止对偏好数据的过拟合(overfitting to preference data)? - Reference model 冻结: 为什么
reference_chosen_logps和reference_rejected_logps在训练中不应当有梯度流过?如果参考模型也被更新,会出现什么问题? - Reward margin 的监控: 代码返回了
reward_margin = chosen_rewards - rejected_rewards。训练过程中这个值应如何变化?持续上升是好事吗?为什么? - 数值稳定性: 直接用
torch.log(torch.sigmoid(...))代替F.logsigmoid(...)可能在哪些场景下导致数值溢出(overflow/underflow)?
L3 — 深入 / Deep
- DPO 的理论假设: DPO 推导假设偏好服从 Bradley-Terry 模型。如果真实偏好数据违反了 BT 假设(例如存在循环偏好或不可传递偏好),DPO 的优化目标会出现什么偏差?label smoothing 能在多大程度上缓解这个问题?
- 与 RLHF 的等价性边界: DPO 论文证明了在 BT 模型下 DPO 与 RLHF 等价。但当策略 偏离 较远时,这种等价性是否仍然成立?离线(offline)DPO 的主要局限是什么?
- 与 KL 约束的关系: 从带 KL 约束的 RL 目标 出发,推导 DPO 的闭式最优策略 ,并解释 如何在奖励最大化和 KL 约束之间做权衡。
- 从 DPO 到后续改进: SimPO、IPO、KTO 等方法分别解决了 DPO 的哪些已知问题?如果要在本代码基础上实现 IPO(Identity Preference Optimization),需要修改哪些部分?