Lecture 8: 模仿学习与从人类反馈中学习 —— RLHF 与 DPO(Imitation Learning, RLHF and DPO)

目录 · ← l7 · l9 →

Lecture 8: 模仿学习与从人类反馈中学习 —— RLHF 与 DPO(Imitation Learning, RLHF and DPO)

对应材料:官方 lecture8pre.pdf(65 页)/ lecture8post.pdf(68 页,本笔记以此为准)|Week 5 周一 2026-02-02(Midterm 2/4 周三,A3 2/6 发布)|SB 教材无对应章节;参考:Ross et al. 2011(DAgger)、Christiano et al. 2017(Deep RL from Human Preferences)、Stiennon et al. 2020、Ouyang et al. 2022(InstructGPT)、Yue et al. 2012(dueling bandits)、Rafailov et al. 2023(DPO)、CS224N Lec 11(Tatsu Hashimoto,讲义第 37–65 页来源) 一句话定位:本讲把 L5–L7 的策略梯度/PPO 工具箱搬到「没有奖励函数」的场景:先用示范(模仿学习)或成对偏好比较(奖励学习)得到监督信号,再把 RLHF 三段式流水线(SFT → RM → RL 微调)代数化,推出 DPO —— 一个不需要显式奖励模型、不需要在线采样、却与 KL 约束最优策略理论等价的闭式损失。


8.1 概述

本讲回答的核心问题是:当奖励函数写不出来时,RL 还能不能做? 讲义开篇即给出动机页「How Can RL Enable Transformative LLM?」——大语言模型(Large Language Model, LLM)的「有用、无害、诚实」无法用一条手写奖励公式表达,但人类可以(a)演示期望行为,或(b)对两个候选回答说「A 比 B 好」。因此本讲分两大块:

  1. 模仿学习(imitation learning):L7 已引入行为克隆(Behavior Cloning, BC),本讲重述其复合误差(compounding errors)这一致命问题,并给出修复方案 DAgger(Dataset Aggregation,数据集聚合),其误差界从 BC 的 $O(\epsilon T^2)$ 降到 $O(\epsilon T)$。
  2. 从人类反馈中学习(learning from human feedback):先说清人类输入的「成本–信息」光谱(示范 → 成对标签 → 常量教学),再用 Bradley–Terry(BT)模型把偏好变成奖励,串起 RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习) 三段式流水线,最后完整推导 DPO(Direct Preference Optimization,直接偏好优化)

在课程知识链上,本讲是 L5–L7 生成模型侧策略梯度L9–L12 数据高效 RL(bandit、探索)之间的桥梁,同时为 L14/L16 的伦理与价值对齐提供技术底座。


8.2 核心概念的数学形式化

记号约定(SPEC §4):本讲前一半沿用 MDP 记号 $\mathcal{S},\mathcal{A},\pi_\theta(a\vert s)$;后一半(LLM 部分)按讲义惯例把状态写成上下文/提示(context/prompt) $x\in\mathcal{X}$,动作写成回答(response) $y\in\mathcal{Y}$,即 $s \leftrightarrow x$、$a \leftrightarrow y$。策略写作 $\pi_\theta(y\vert x)$。

8.2.1 模仿学习设定与行为克隆

严格定义:模仿学习(imitation learning / learning from demonstrations)的输入是一个无奖励 MDP $(\mathcal{S},\mathcal{A},P)$ 加上专家策略 $\pi^$ 的 $m$ 条示范轨迹 $\{\tau^{(i)}\}_{i=1}^{m}$,其中 $\tau^{(i)}=(s_0,a_0,s_1,a_1,\dots)$ 且 $a_t\sim\pi^(\cdot\vert s_t)$;目标是输出一个策略 $\hat\pi$ 使 $J(\hat\pi)$ 尽量接近 $J(\pi^*)$。行为克隆把它退化为标准监督学习:固定策略类(神经网络、决策树……),在数据集 $\mathcal{D}=\{(s_t,a_t)\}$ 上最小化负对数似然

\[\hat\pi=\arg\min_{\pi\in\Pi}\ \mathbb{E}_{(s,a)\sim\mathcal{D}}\big[-\log\pi(a\vert s)\big]\]

直观解释:BC 是「照着老师的答案抄」,它在训练分布(专家访问到的状态)上是正确的,但在测试分布(自己走出来的状态)上从未被纠正过;一旦某步走偏,后面每一步都落在训练时没见过的状态里,错误便滚雪球。

具体示例:取一条长度 $T=10$ 的轨迹,若每一步以 $\epsilon=0.1$ 的概率偏离专家动作,且在偏离后无法恢复,则期望错误步数按几何级数累积:

\[\mathbb{E}[\text{Total errors}]\approx \epsilon\big(T+(T-1)+\dots+1\big)=\epsilon\frac{T(T+1)}{2}\propto \epsilon T^2\]

代入 $T=10,\epsilon=0.1$ 得 $0.1\times 55=5.5$ 步——超过轨迹一半。讲义 p.9 给出「独立同分布」的乐观近似 $\epsilon T=1$ 步,p.11 给出真实的 ${\propto}\epsilon T^2$。

与前序方法对比:监督学习假设训练与测试的 $(x,y)$ 同分布 $\sim\mathcal{D}$;而在 MDP 中训练时 $s_t\sim d^{\pi^*}$、测试时 $s_t\sim d^{\hat\pi}$,这正是 L3 里 off-policy 评估遇到过的分布漂移(distribution mismatch),只不过这次漂移由策略自身造成,会自我放大。

8.2.2 DAgger(数据集聚合)

严格定义:DAgger 是一个迭代式的交互式模仿学习算法。第 $i$ 轮:用当前策略 $\hat\pi_i$ 在环境中自己走(rollout)产生状态序列,请专家对这些自己走到的状态打标签 $a^_t\sim\pi^(\cdot\vert s_t)$,把新数据聚合进数据集 $\mathcal{D}\leftarrow\mathcal{D}\cup\mathcal{D}i$,再在全部聚合数据上重训 $\hat\pi{i+1}$。

直观解释:BC 的病症是「没在自己犯错的地方被纠正」,DAgger 的处方就是到学生实际会去的地方请老师重新示范。它把「监督学习的分布匹配」重新变成「在线学习中不断修正的分布」,于是误差从「每步独立犯错」变回「近似线性累积」。

具体示例:网格世界长度 $T=10$、$\epsilon=0.1$ 时,BC 的期望错误 $\approx 5.5$ 步;若 DAgger 每轮把自身访问分布上的错误压到 $\epsilon^{\prime}=0.01$,则聚合到第 $N$ 轮后期望错误 $\approx \epsilon^{\prime}T=0.1$ 步——相差 50 倍。代价是每一步都要问专家(见 8.5 与 8.8 的关键局限)。

与 BC 对比:BC 只要求一份离线示范数据集(便宜、可复用),DAgger 要求一个可随时查询的交互式专家(昂贵,人类必须实时标注 learner 访问的任意状态)。讲义 p.12 总结而不展开的一句「Key limitation?」正是这一条。

8.2.3 从示范到偏好:为什么需要奖励学习

严格定义奖励学习(reward learning)指在无 $R$ 的设定下,由人类输入推断一个奖励函数 $\hat R$(讲义 p.14 的「Feature Based Reward Function」),再用它做规划或 RL。人类输入有三种形态,其「单次信息量/单位成本」不同:

人类输入形态每次标注给的信息单位成本讲义对应
仅示范(demonstrations only)一个完整动作序列pp.22-23
DAgger / 常量教学(constant teaching)任意状态上的正确动作最高(需持续在线)pp.12, 22-23
成对标签(pairwise labels)「A 比 B 好」的一个比特最低pp.23-27(讲义标为 sweet spot)

直观解释:人手写奖励函数「brittle(脆弱)」(L7 p.27);让人从头演示一个高维动作序列又太贵;而比较是人类最擅长、最可靠、最便宜的判断——「这两个回答哪个更好」比「给这个回答打几分」稳定得多。讲义 p.39 明确指出人类直接打分是 noisy and miscalibrated(有噪声且校准差),故改用成对比较(Phelps et al. 2015;Clark et al. 2018)。

具体示例:讲义 p.39 的经典例子——提示是「旧金山发生了地震」。候选 $\hat y_1$:「有轻微财产损失但无人受伤」;$\hat y_2$:「湾区天气好但易发生地震和野火」;$\hat y_3$:「4.2 级地震造成大规模破坏」。人类标注 $\hat y_1 \succ \hat y_2$、$\hat y_1 \succ \hat y_3$,奖励模型给 $\hat y_1$ 打 1.2,并且必须满足 $r_\phi(\hat y_1) > r_\phi(\hat y_2), r_\phi(\hat y_3)$。

对比:这正是 L9–L12 的 dueling bandit / 偏好反馈 bandit 问题(Yue, Broder, Kleinberg & Joachims 2012;Sadigh et al. 2017 的主动偏好学习)——反馈不是标量奖励而是「谁赢」。讲义 p.29 给出三种「赢家」定义:Condorcet 赢家(对所有对手胜率 $>0.5$)、Copeland 赢家(胜场减负场最多)、Borda 赢家(期望得分最高,胜 1 分、平 0.5 分、负 0 分)。

8.2.4 Bradley–Terry 偏好模型

严格定义:给定 $K$ 个候选 $b_1,\dots,b_K$($k=2$ 即 dueling bandit),假设存在潜在奖励 $r(b)$,人类做带噪成对比较,其概率由 Bradley–Terry 模型(1952)给出:

\[P(b_i \succ b_j)=\frac{\exp\big(r(b_i)\big)}{\exp\big(r(b_i)\big)+\exp\big(r(b_j)\big)}=\sigma\big(r(b_i)-r(b_j)\big),\qquad \sigma(z)=\frac{1}{1+e^{-z}}\]

该模型传递(transitive):$p_{ik}$ 由 $p_{ij}$ 与 $p_{jk}$ 决定。对轨迹同样成立:把两个轨迹 $\tau^1,\tau^2$ 的潜在回报 $R^1=\sum_{i=0}^{T-1}r^1i$、$R^2=\sum{i=0}^{T-1}r^2_i$ 当作分数(讲义 pp.33-34)。

直观解释:BT 把「奖励差」压进 sigmoid:奖励差为 0 时胜率恰好 0.5,差越大越接近 1。它只依赖差值,因此绝对水平和常数平移不可辨识。

具体示例:设 $r(b_1)=1.2,\ r(b_2)=-0.8$,则 $P(b_1\succ b_2)=\sigma(2.0)=0.881$。若把所有奖励同时加 5,胜率不变:$\sigma((1.2+5)-(-0.8+5))=\sigma(2.0)=0.881$。

与前序方法对比:L7 的「Check Your Understanding L7N3」指出,仅凭「专家最优」这一条件,使专家最优的 $R$ 有无穷多个(讲义 p.16 答案:There are an infinite set of R)。BT 是一个结构性假设,把无穷多个 $R$ 收窄到「只差一个 context 内常数」的等价类——这正是本讲代码实验 C 要验证的内容。

8.2.5 RLHF 三段式流水线

严格定义:RLHF 把「对齐」拆成三个可独立训练的阶段(讲义 p.38「High-level instantiation: ‘RLHF’ pipeline」,并注明第一步是 instruction tuning):

  1. SFT(Supervised Fine-Tuning,监督微调):在人类示范/指令数据 $\mathcal{D}$ 上做最大似然,
\[\pi^{SFT}=\arg\max_\theta\ \mathbb{E}_{(x,y)\sim\mathcal{D}}\big[\log\pi_\theta(y\vert x)\big]\]
  1. 奖励模型(Reward Model, RM)训练:用成对偏好数据 $\mathcal{D}=\{(x,y_w,y_l)\}$($w$ = winner/preferred,$l$ = loser/dispreferred)拟合 BT 模型,最小化负对数似然
\[\mathcal{L}(\phi)=-\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\Big[\log\sigma\big(r_\phi(x,y_w)-r_\phi(x,y_l)\big)\Big]\]

讲义 p.32(pre 版 p.32 / post 版 p.32)给出含平局的一般化交叉熵:设标注 $\mu^{(1)}=1$ 表示 $b_i\succ b_j$、$\mu^{(1)}=0.5$ 表示「打平」、$\mu^{(1)}=0$ 表示 $b_j\succ b_i$,则

\[\mathcal{L}_{\text{BT}}(\phi)=-\sum_{(b_i,b_j,\mu)\in\mathcal{D}}\Big[\mu^{(1)}\log P(b_i\succ b_j)+\big(1-\mu^{(1)}\big)\log P(b_j\succ b_i)\Big]\]

$\mu^{(1)}=0.5$ 时两项各占一半权重,等价于把平局样本的损失软化为「不确定」。讲义同时提醒(p.40):先确认奖励模型能用——在 held-out 人类判断上评估 RM 的预测准确率,数据足够多、模型足够大时 RM 可接近单个标注者的水平(Stiennon et al. 2020)。

  1. RL 微调(RLHF 的第三段):固定 $r_\phi$,从 $\pi^{SFT}$ 复制出待优化策略 $\pi_\theta$,最大化「奖励减 KL 惩罚」:
\[\max_\theta\ \mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi_\theta(\cdot\vert x)}\Big[r_\phi(x,y)-\beta\,\mathrm{KL}\big(\pi_\theta(\cdot\vert x)\,\vert \,\pi_{ref}(\cdot\vert x)\big)\Big]\]

直观解释:第三段是一句「想要高分,但别离原始模型太远」(讲义 p.47:Want high reward… but keep KL to original model small!)。KL 项是每偏离就收费的税(讲义 p.41:「Pay a price when $\pi^{RL}_\theta(y)>\pi^{SFT}(y)$」,In expectation 就是 KL 散度)。它同时抑制奖励攻击(reward hacking)——奖励模型只是人类偏好的代理,若不加约束,策略会跑到 RM 的高分但人类并不喜欢的区域。

具体示例(本讲代码的极小模型):$x\in\{0,1,2\}$、$y\in\{0,1,2,3\}$,$\pi_\theta(y\vert x)=\mathrm{softmax}(\theta_x)$。取 $\beta=0.1$,DPO 训练后从 $\pi_{ref}$ 出发把 $E[r_{true}]$ 从 $0.4729$ 提到 $1.6270$,而 $\mathrm{KL}(\pi_\theta\vert \pi_{ref})=1.3493$——收益与漂移同时发生,$\beta$ 就是二者的兑换率

对比:SFT 是纯监督学习(无 RL);RM 训练是成对分类/排序学习(不是 RL);只有第三段才是 RL(用 PPO,见 L6/L7)。讲义 p.44 引 Dubois et al. 2023 的重要提醒:PPO 确实有效,但 Best-of-$n$ 采样与「只在好输出上做 SFT」这类简单基线也很强

8.2.6 DPO 与「隐含奖励」

严格定义DPO(Direct Preference Optimization,直接偏好优化) 用一个闭式损失直接在偏好数据上优化策略,完全跳过显式 RM 与在线 RL:

\[\mathcal{L}_{DPO}(\theta)=-\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\left[\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}\right)\right]\]

其中 $\pi_{ref}$ 是参考策略(通常就是 SFT 模型),$\beta$ 与 RLHF 中的 KL 系数同义。定义隐含奖励(implicit reward)

\[\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}\]

则 DPO 损失恰是「把 $\hat r_\theta$ 当作奖励模型的 BT 负对数似然」。讲义 p.56 的图注解释了这一项的含义:该比值在策略比参考模型更喜欢该回答时为正、更不喜欢时为负

直观解释:DPO 说「你不需要先学一个奖励模型再学策略——策略本身就已经隐含了一个奖励模型」。只要把 BT 里那个学出来的 $r_\phi$ 换成 $\hat r_\theta$,两者就是同一个似然。

具体示例(本讲代码,$\beta=0.1$):训练后隐含奖励矩阵(行中心化前)

[[-1.4313 -0.8814  0.1352 -1.8128]
 [-0.6101 -2.5638 -1.2642  0.1293]
 [-1.6632 -0.1572  0.1551 -0.9470]]

它与真实奖励 $R_{TRUE}$ 行中心化后的 Pearson 相关系数 $r=0.9975$——没有任何显式奖励模型,隐含奖励却几乎复原了真值

对比:见 8.3 结尾的 RLHF vs DPO 对照表——RM 有无、在线与否、是否需要 $\pi_{ref}$、稳定性与理论等价性。


8.3 算法伪代码与完整推导

8.3.1 DAgger 伪代码

Algorithm: DAgger (Dataset Aggregation)  —— Ross et al. 2011
输入: 无奖励 MDP (S, A, P),可查询专家 π*,初始示范数据 D
输出: 确定性策略 π̂

初始化: 用专家示范 D 训练初始策略 π̂_1(即先做一次行为克隆)
        D ← D          # 聚合数据集,只增不减
for i = 1, 2, ..., N do
    # 1) 让学生自己走:这里才是关键,不是专家走
   用 π̂_i 在环境中 rollout,收集状态序列 {s_1, s_2, ..., s_{mi}}
    # 2) 请专家对这些「学生自己走到的」状态打标签
   for each s_t in 该序列 do
       查询专家 a*_t ~ π*(·| s_t)
   end for
   D_i ← {(s_t, a*_t)}
    # 3) 数据集聚合(Dataset Aggregation 得名于此)
   D ← D ∪ D_i
    # 4) 在聚合后的全部数据上重训
   π̂_{i+1} ← 在 D 上做监督学习(cost-sensitive 分类 / 交叉熵)
end for
return 表现最好的 π̂_i(或最后一轮 π̂_N)

算法逻辑解说:与 BC 唯一的、也是全部的区别在步骤 (1)——rollout 用的不是专家策略而是当前学到的策略。因此新标签恰好落在学生将来的访问分布 $d^{\hat\pi_i}$ 上,训练分布与测试分布被反复「重新对齐」。讲义 p.12 的评价是:DAgger obtains a stationary deterministic policy with good performance under its induced state distribution(在其诱导的状态分布下取得良好性能的平稳确定性策略)。

数学推导(为什么是 $O(\epsilon T)$ 而不是 $O(\epsilon T^2)$):记第 $i$ 轮在学习器诱导分布上犯错的概率为 $\epsilon_i$。BC 的误差来自「训练分布 $\ne$ 测试分布」,每步错误概率 $\epsilon$ 且不可恢复,于是

\[\mathbb{E}[\text{errors}] \approx \epsilon\big(T+(T-1)+\dots+1\big)=\epsilon\frac{T(T+1)}{2}=O(\epsilon T^2)\]

DAgger 把问题写成 no-regret online learning(无遗憾在线学习):把每一轮 $i$ 视为一次在线决策,损失是「在分布 $d^{\hat\pi_i}$ 上与专家动作不一致的代价」。若在线学习器的遗憾(regret)为 $u_N$(即 $\frac{1}{N}\sum_i \ell_i - \min_\pi \frac{1}{N}\sum_i \ell_i(\pi)\le u_N$),且每轮平均错误率为 $\epsilon$,则存在 $i\le N$ 使

\[J(\hat\pi_i)\ \le\ J(\pi^*)\ +\ T\epsilon\ +\ u_N\]

与理论的对应:当学习器是强无遗憾的($u_N\to 0$,例如在线梯度下降/Follow-the-Leader 在凸损失下),界退化为 $J(\hat\pi)-J(\pi^*)\le T\epsilon=O(\epsilon T)$——相比 BC 的 $O(\epsilon T^2)$ 少了一个 $T$ 因子。这解释了为什么 DAgger 在实践中对长时域任务(自动驾驶、机器人操作)如此关键。注意界限里 $\epsilon$ 是在聚合后的诱导分布上测量的训练误差。

8.3.2 RLHF 三段式流水线伪代码

Algorithm: RLHF pipeline (InstructGPT 式) —— Christiano 2017 / Stiennon 2020 / Ouyang 2022
输入: 预训练 LM ρ(y|x),人类示范数据 D_demo,成对偏好数据 D_pref = {(x, y_w, y_l)}
输出: 对齐后的策略 π_θ

# ---------- 第 1 段:SFT / instruction tuning ----------
π_SFT ← argmax_θ  E_{(x,y)~D_demo}[ log π_θ(y|x) ]        # 纯监督,无 RL

# ---------- 第 2 段:奖励模型 RM ----------
初始化 r_φ(通常由 π_SFT 去掉最后一层 + 一个标量头)
repeat
    取一批 (x, y_w, y_l)
    L(φ) = -E[ log σ( r_φ(x,y_w) - r_φ(x,y_l) ) ]           # Bradley-Terry 负对数似然
    φ ← φ - η ∇_φ L(φ)
until 收敛
在 held-out 人类判断上评估 RM 的分对准确率              # 讲义 p.40:先确认 RM 能用!

# ---------- 第 3 段:RL 微调(PPO) ----------
π_ref ← π_SFT                       # 冻结的参考策略(KL 的锚点)
π_θ   ← π_SFT 的副本                 # 待优化
repeat
    采样一批 prompt x ~ D
    对每个 x 采样 y ~ π_θ(·|x)      # 在线采样
    R(x,y) = r_φ(x,y) - β log( π_θ(y|x) / π_ref(y|x) )      # 逐步 KL 惩罚
    θ ← θ + η ∇_θ [ PPO 目标(R, π_θ, π_ref) ]               # 见 L6/L7 的 PPO/GAE
until 收敛
return π_θ

算法逻辑解说:三段各自的「监督信号来源」完全不同——第 1 段是人类写的答案,第 2 段是人类给的比较,第 3 段是第 2 段自己生成的标量分数。第 3 段的每一步都要现场采样 $y\sim\pi_\theta$,因此是 on-policy、昂贵的,并且必须在线查询 RM。

数学推导(KL 惩罚为何等价于「逐步扣分」):把目标按单个 $x$ 展开,

\[\mathbb{E}_{y\sim\pi_\theta}\big[r_\phi(x,y)\big]-\beta\,\mathrm{KL}\big(\pi_\theta(\cdot\vert x)\vert \pi_{ref}(\cdot\vert x)\big)=\mathbb{E}_{y\sim\pi_\theta}\Big[r_\phi(x,y)-\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}\Big]\]

即 KL 惩罚可以在每个样本上算出来($-\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}$),因此它就是 PPO 里可以逐 token 累加的那一项奖励整形(讲义 p.41:「In expectation, it is known as the KL divergence」)。而 PPO 本身用 L6/L7 的裁剪目标 + GAE 优势估计来优化它。

8.3.3 DPO 完整推导(本讲数学核心)

目标:证明带 KL 约束的 RLHF 目标存在闭式最优策略,由此把「奖励模型」消掉,得到只依赖 $\pi_\theta,\pi_{ref}$ 的损失。

Step 1|RLHF 目标(带 KL 正则)

\[\max_{\pi}\ \mathbb{E}_{x\sim\mathcal{D}}\Big[\mathbb{E}_{y\sim\pi(\cdot\vert x)}\big[r_\phi(x,y)\big]-\beta\,\mathrm{KL}\big(\pi(\cdot\vert x)\,\vert \,\pi_{ref}(\cdot\vert x)\big)\Big]\]

Step 2|把 KL 写成期望,再看清单个 $x$ 的子问题

\[\mathrm{KL}\big(\pi(\cdot\vert x)\vert \pi_{ref}(\cdot\vert x)\big)=\mathbb{E}_{y\sim\pi(\cdot\vert x)}\Big[\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}\Big]\] \[\Longrightarrow\quad \max_{\pi}\ \mathbb{E}_{y\sim\pi(\cdot\vert x)}\Big[r_\phi(x,y)-\beta\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}\Big]\]

Step 3|构造归一化常数 $Z(x)$ 与候选最优策略

\[Z(x)=\sum_{y}\pi_{ref}(y\vert x)\exp\!\Big(\frac{1}{\beta}r_\phi(x,y)\Big),\qquad \pi^*(y\vert x)=\frac{1}{Z(x)}\,\pi_{ref}(y\vert x)\exp\!\Big(\frac{1}{\beta}r_\phi(x,y)\Big)\]

其中 $Z(x)$ 是配分函数(partition function),$\pi^*$ 是合法的概率分布(非负且和为 1)。讲义 p.52 特别注明:$Z(x)$ 是对所有可能回答的求和,不可 tractable(intractable sum over possible responses),所以不能直接用这个式子——这个提醒是理解推导动机的关键。

Step 4|闭式最优性证明(把目标改写成一个 KL + 常数)

由 Step 3 反解 $\exp\big(\frac{1}{\beta}r_\phi(x,y)\big)=\frac{Z(x)\pi^*(y\vert x)}{\pi_{ref}(y\vert x)}$,两边取对数并乘 $\beta$:

\[r_\phi(x,y)=\beta\log\frac{\pi^*(y\vert x)}{\pi_{ref}(y\vert x)}+\beta\log Z(x)\]

代回 Step 2 的被积项:

\[r_\phi(x,y)-\beta\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}=\beta\log\frac{\pi^*(y\vert x)}{\pi(y\vert x)}+\beta\log Z(x)=-\beta\log\frac{\pi(y\vert x)}{\pi^*(y\vert x)}+\beta\log Z(x)\]

因此对任意 $\pi$,

\[\mathbb{E}_{y\sim\pi}\Big[r_\phi(x,y)-\beta\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}\Big]=-\beta\,\mathrm{KL}\big(\pi(\cdot\vert x)\vert \pi^*(\cdot\vert x)\big)+\beta\log Z(x)\]

由于 $\beta\log Z(x)$ 与 $\pi$ 无关,而 $-\beta\,\mathrm{KL}\ge 0$ 且当且仅当 $\pi=\pi^*$ 时取 0,最优解就是

\[\pi^*(y\vert x)=\frac{1}{Z(x)}\,\pi_{ref}(y\vert x)\exp\!\Big(\frac{1}{\beta}r_\phi(x,y)\Big)\]

Step 5|奖励重参数化:把「奖励」写成「策略」的函数

把 Step 4 的式子反过来解出 $r_\phi$(讲义 p.53 的 “Rearrange:write any reward function as function of optimal policy”):

\[r_\phi(x,y)=\beta\log\frac{\pi^*(y\vert x)}{\pi_{ref}(y\vert x)}+\beta\log Z(x)\]

这正是讲义 p.56 所说的「比值在策略比参考模型更喜欢该回答时为正、更不喜欢时为负」。

Step 6|代入 Bradley–Terry:$Z(x)$ 抵消

\[P(y_w\succ y_l\vert x)=\sigma\big(r_\phi(x,y_w)-r_\phi(x,y_l)\big)\]

把 Step 5 的表达式代入差中(并把 $\pi^*$ 用待优化的 $\pi_\theta$ 替代):

\[r_\phi(x,y_w)-r_\phi(x,y_l)=\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}+\underbrace{\beta\log Z(x)-\beta\log Z(x)}_{=\,0}\]

关键:$\beta\log Z(x)$ 是同一个 $x$ 下的常数,在里被消掉——这就是讲义 p.57 的图注「When substituting, the log Z term cancels, because the loss only cares about difference in rewards」。于是那个「对所有回答求和、不可计算」的 $Z(x)$ 根本不需要被计算

Step 7|得到 DPO 损失

\[\mathcal{L}_{DPO}(\theta)=-\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\left[\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}\right)\right]\]

它只含 $\pi_\theta$(待训练)与 $\pi_{ref}$(冻结参考),没有任何奖励模型、没有任何采样、没有任何 RL 循环

Step 8|梯度推导与「判错程度」权重

记 $\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}$,$\delta=\hat r_\theta(x,y_w)-\hat r_\theta(x,y_l)$,则损失为 $-\log\sigma(\delta)$。用 $\frac{d}{d\delta}\big[-\log\sigma(\delta)\big]=-\big(1-\sigma(\delta)\big)=-\sigma(-\delta)$ 与 $\nabla_\theta\delta=\beta\big(\nabla_\theta\log\pi_\theta(y_w\vert x)-\nabla_\theta\log\pi_\theta(y_l\vert x)\big)$:

\[\nabla_\theta \mathcal{L}_{DPO}=-\beta\,\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\Big[\sigma\big(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w)\big)\Big(\nabla_\theta\log\pi_\theta(y_w\vert x)-\nabla_\theta\log\pi_\theta(y_l\vert x)\Big)\Big]\]

解读(这是 DPO 最漂亮的一步):

  • 方向:$\nabla_\theta\log\pi_\theta(y_w\vert x)$ 前面是负号进入 $\theta$ 的更新(因为整体是梯度下降),所以它提高被偏好回答的似然、降低被嫌弃回答的似然——与直觉一致。
  • 权重:$\sigma(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w))$ 是「模型当前认为 $y_l$ 比 $y_w$ 好的概率」,即模型判错的程度。模型已经答对的样本($\hat r_\theta(y_w)\gg\hat r_\theta(y_l)$)权重趋近 0,不再浪费梯度;模型答错的样本权重接近 1,主导更新。
  • 与「隐含奖励」的联系:整个梯度是在对隐式奖励模型 $\hat r_\theta$ 做 BT 负对数似然的梯度下降,只是在策略参数上做,而非在独立的 $\phi$ 上做。因此 DPO 常被称为「reward-model-free but not reward-free」。

8.3.4 DPO 训练伪代码

Algorithm: DPO (Direct Preference Optimization) —— Rafailov et al. 2023
输入: 参考策略 π_ref(= π_SFT,冻结),偏好数据 D = {(x, y_w, y_l)},系数 β,学习率 η
输出: 对齐后的策略 π_θ

初始化: π_θ ← π_ref 的副本
repeat
    取一批 (x, y_w, y_l)
    # 隐含奖励(in-context 直接算,不需要额外网络)
    r̂_w = β * [ log π_θ(y_w|x) - log π_ref(y_w|x) ]
    r̂_l = β * [ log π_θ(y_l|x) - log π_ref(y_l|x) ]
    L = -mean( log σ( r̂_w - r̂_l ) )                 # 即 DPO 损失
    # 闭式梯度:权重 = 模型判错程度
    w = σ( r̂_l - r̂_w )
    θ ← θ - η * ( -β * w * ( ∇_θ log π_θ(y_w|x) - ∇_θ log π_θ(y_l|x) ) )
until 收敛
return π_θ

与理论的对应:三种视角说的是同一件事——(i) BT 似然视角:DPO 是在策略上参数化的 BT 分类;(ii) KL 约束最优视角:$\pi_\theta$ 的最优解与 RLHF 的 $\pi^*$ 属于同一个解族,因此是「理论等价」;(iii) 加权监督视角:梯度是对 $y_w$ 的似然上升、$y_l$ 的似然下降,权重由「模型错得多离谱」决定,类似难例挖掘。

8.3.5 RLHF 与 DPO 对照表

维度RLHF(PPO 版)DPO
是否需要显式奖励模型 $r_\phi$需要(第 2 段单独训练)不需要(隐含奖励 $\hat r_\theta=\beta\log\frac{\pi_\theta}{\pi_{ref}}$)
是否在线采样,每步 $y\sim\pi_\theta(\cdot\vert x)$(on-policy),只吃固定的偏好数据集(offline)
是否需要参考策略 $\pi_{ref}$需要(KL 锚点)需要(分母 $\pi_{ref}$,同时是初值)
需同时驻留的模型数3(RM、$\pi_\theta$、$\pi_{ref}$)+ 常驻 critic2($\pi_\theta$、$\pi_{ref}$)
训练稳定性差(PPO 超参敏感、奖励尺度漂移)好(单一交叉熵式损失,无需 advantage/裁剪)
算力与工程复杂度高(rollout + PPO + RM 推理)低(等价于一次监督微调)
理论等价性带 KL 约束的最优解 $\pi^*$同一 $\pi^*$(在 BT 偏好模型下等价)
主要失效模式reward hacking、PPO 崩溃、采样成本分布外偏好过拟合、对 $\pi_{ref}$ 覆盖的依赖
讲义对应页pp.38–48(含 p.41 的 KL 公式)pp.49–65

8.4 代码实现与实验分析

环境:numpy 2.0.1matplotlib 3.9.2pandas 2.2.2无 torch / gym / scipy。两个脚本均位于 cs234/code/L08_reward_model.py(BT 拟合细节)与 L08_dpo.py(DPO 与前沿对比)。所有数值都是 python3 真实运行输出。

8.4.1 极小的离散「类 LLM」设定

$K=3$ 个上下文(prompt)$x\in\{0,1,2\}$,每个上下文 $M=4$ 个候选回答 $y\in\{0,1,2,3\}$,策略是逐上下文的 softmax:

\[\pi_\theta(y\vert x)=\mathrm{softmax}\big(\theta_x\big)_y=\frac{\exp(\theta_{x,y})}{\sum_{y^{\prime}}\exp(\theta_{x,y^{\prime}})}\]

潜在真实奖励 $R_{TRUE}$ 与参考策略 $\pi_{ref}$(SFT 模型):

R_TRUE = [[ 0.0,  0.5,  1.6, -0.4],     pi_ref = [[0.3158 0.1916 0.2586 0.2340],
          [ 1.2, -0.8,  0.3,  1.9],               [0.2245 0.3349 0.1663 0.2742],
          [-0.5,  1.0,  1.4,  0.2]]               [0.2729 0.2234 0.2021 0.3016]]

偏好数据由 $\pi_{ref}$ 采出候选对,再按真实 BT 模型加噪标注胜负:训练 4000 对、测试 2000 对,各 context 计数 [1316 1347 1337],每个 $(x,y)$ 平均出现 55.6 次。

8.4.2 代码一:Bradley–Terry 奖励模型拟合(含平局与不可辨识性)

import numpy as np

np.random.seed(0)
X, Y = 3, 4
R_TRUE = np.array([[0.0, 0.5, 1.6, -0.4],
                   [1.2, -0.8, 0.3, 1.9],
                   [-0.5, 1.0, 1.4, 0.2]])
THETA_REF = np.array([[0.30, -0.20, 0.10, 0.00],
                      [0.00, 0.40, -0.30, 0.20],
                      [0.20, 0.00, -0.10, 0.30]])

def softmax(z):
    z = z - z.max(axis=-1, keepdims=True)
    e = np.exp(z)
    return e / e.sum(axis=-1, keepdims=True)

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))

PI_REF = softmax(THETA_REF)

def row_center(M):                      # BT 只识别「同一 context 内的奖励差」
    return M - M.mean(axis=1, keepdims=True)

def pearson(a, b):
    a, b = a - a.mean(), b - b.mean()
    return float((a * b).sum() / np.sqrt((a * a).sum() * (b * b).sum()))

def make_prefs(n, tie_rate=0.0):
    """返回 (x, y_i, y_j, mu):mu=1 表示 i≻j,0.5 平局,0 表示 j≻i。"""
    xs = np.random.randint(0, X, size=n)
    yi = np.array([np.random.choice(Y, p=PI_REF[x]) for x in xs])
    yj = np.empty_like(yi)
    for k, x in enumerate(xs):
        p = PI_REF[x].copy(); p[yi[k]] = 0.0
        yj[k] = np.random.choice(Y, p=p / p.sum())
    p_win = sigmoid(R_TRUE[xs, yi] - R_TRUE[xs, yj])
    decisive = np.random.rand(n) > tie_rate
    mu = np.full(n, 0.5)
    win = np.random.rand(n) < p_win
    mu[decisive & win] = 1.0
    mu[decisive & ~win] = 0.0
    return xs, yi, yj, mu

def bt_loss(phi, xs, yi, yj, mu, weight_ties=True):
    """讲义 p.32 的一般化交叉熵:-Σ[ mu*log P(i≻j) + (1-mu)*log P(j≻i) ]。"""
    d = phi[xs, yi] - phi[xs, yj]
    p = sigmoid(d)
    if not weight_ties:                  # RLHF 常见做法:只用决胜对
        m = mu != 0.5
        return float(-np.mean(mu[m] * np.log(p[m] + 1e-12)
                              + (1 - mu[m]) * np.log(1 - p[m] + 1e-12)))
    return float(-np.mean(mu * np.log(p + 1e-12) + (1 - mu) * np.log(1 - p + 1e-12)))

def fit_bt(xs, yi, yj, mu, steps=4000, lr=0.5, weight_ties=True):
    """mu=0.5 的平局在损失里被软化成「两项各半」;weight_ties=False 时按 RLHF
    的常见做法直接丢弃平局对(只保留 mu in {0,1} 的决胜对)。"""
    phi = np.zeros((X, Y))
    if not weight_ties:
        m = mu != 0.5
        xs, yi, yj, mu = xs[m], yi[m], yj[m], mu[m]
    for _ in range(steps):
        p = sigmoid(phi[xs, yi] - phi[xs, yj])
        g = -(mu - p) / len(xs)          # dL/d(phi_i - phi_j) = -(mu - p)
        np.add.at(phi, (xs, yi), -lr * g)
        np.add.at(phi, (xs, yj), +lr * g)
    return phi

# --- A) 无平局 ---
XP, YI, YJ, MU = make_prefs(6000)
XS_TE, YI_TE, YJ_TE, MU_TE = make_prefs(3000)
PHI = fit_bt(XP, YI, YJ, MU)
print("NLL(phi=0) =", bt_loss(np.zeros((X, Y)), XP, YI, YJ, MU))
print("NLL(fit)   =", bt_loss(PHI, XP, YI, YJ, MU))
print("r_phi(行中心化) =\n", np.round(row_center(PHI), 3))
print("与 R_TRUE 的 Pearson r =", pearson(row_center(PHI).ravel(), row_center(R_TRUE).ravel()))
print("测试集分对准确率 =", float(np.mean((PHI[XS_TE, YI_TE] > PHI[XS_TE, YJ_TE]) == (MU_TE == 1.0))))

# --- B) 含 40% 平局 ---
XP2, YI2, YJ2, MU2 = make_prefs(6000, tie_rate=0.4)
PHI_T = fit_bt(XP2, YI2, YJ2, MU2, weight_ties=True)            # 讲义式带平局损失
PHI_C = fit_bt(XP2, YI2, YJ2, MU2, weight_ties=False)           # 只用决胜对
print("带平局拟合 vs R_TRUE: r =", pearson(row_center(PHI_T).ravel(), row_center(R_TRUE).ravel()))
print("只用决胜对     vs R_TRUE: r =", pearson(row_center(PHI_C).ravel(), row_center(R_TRUE).ravel()))

# --- C) 不可辨识性 ---
print("NLL(r_phi)                =", bt_loss(PHI, XP, YI, YJ, MU))
print("NLL(r_phi + 每 context 常数) =", bt_loss(PHI + np.array([[0.7], [-1.3], [2.1]]), XP, YI, YJ, MU))
print("NLL(r_phi + 全局常数 5.0)   =", bt_loss(PHI + 5.0, XP, YI, YJ, MU))

# --- D) 轨迹级偏好:分数 = 轨迹回报 sum_t r_t ---
T = 4
traj = np.random.randint(0, Y, size=(2000, T)); ctx = np.random.randint(0, X, size=2000)
R1 = R_TRUE[ctx[:, None], traj].sum(1)
s1 = PHI[ctx[:, None], traj].sum(1)
print("轨迹分数 vs 真实轨迹回报: Pearson r =", pearson(s1, R1))

代码做什么:把讲义 p.28–p.34 的 Bradley–Terry 模型完整实现为一个表格参数 $r_\phi\in\mathbb{R}^{3\times 4}$ 的最大似然拟合。损失对参数差 $\phi_i-\phi_j$ 的梯度是 $-( \mu - p)$,用 np.add.at 把每个样本的梯度散射回 $y_i$、$y_j$ 两行,从而自动得到「奖励只能定到行内常数」的结构。实验 A 是无平局基线,B 加入 40% 的 $\mu=0.5$ 平局标记并对比两种处理(讲义式软化损失 vs 只用决胜对),C 用三种常数平移检验不可辨识性,D 把「轨迹回报」当作分数验证讲义 pp.33–34 的轨迹级 BT。

RL 机制透视:奖励模型训练是本讲唯一不是 RL 的学习问题——它是成对比较下的排序/分类学习,没有策略、没有采样、没有值函数。但它输出的 $r_\phi$ 正是后面 RL 阶段(PPO)的目标函数,所以 RM 的误差会直接变成策略的「目标偏移」,这也是 8.5 里必须先在 held-out 人类判断上验证 RM 的原因。梯度里出现的 $-( \mu - p)$ 说明:拟合会自动把「模型已经判对的比较」权重压到 0($p\to\mu$ 时梯度 $\to0$),与 8.3.3 Step 8 中 DPO 梯度权重 $\sigma(\hat r_l-\hat r_w)$ 是同一个「判错程度加权」机制。

实验观察(真实运行输出):

[A] 无平局偏好(6000 对)拟合 Bradley-Terry:
    NLL(初始 phi=0)      = 0.6931
    NLL(拟合后)          = 0.5078
    r_phi(行中心化)=
 [[-0.432  0.072  1.183 -0.823]
  [ 0.504 -1.511 -0.377  1.384]
  [-1.066  0.436  0.922 -0.293]]
    与 R_TRUE 的 Pearson r = 0.9989
    测试集决胜对预测准确率 = 0.7777

[B] 含 40% 平局标记(mu=0.5)的偏好数据:
    平局对数 = 2425 / 6000
    讲义式带平局损失拟合:与 R_TRUE 的 r = 0.9938
    只用决胜对拟合:    与 R_TRUE 的 r = 0.9967
    两者相对差 max|rT-rC|(行中心化后)= 0.7202

[C] 奖励的不可辨识性(同一 context 内差不变 ⇒ 似然不变):
    NLL(r_phi)                 = 0.507772
    NLL(r_phi + 每 context 常数) = 0.507772
    NLL(r_phi + 全局常数 5.0)    = 0.507772

[D] 轨迹级偏好(讲义 pp.33-34):
    学到的轨迹分数 与 真实轨迹回报 R(tau) 的 Pearson r = 0.9763
    轨迹对 BT 概率 P(tau1≻tau2) 的平均值 = 0.5004

三点值得注意:(i) 拟合后的 NLL $0.5078$ 与理论下界一致——数据由真实 BT 模型生成,$N=6000$ 时其条件熵就是 $0.5078$(初始 $0.6931=\ln 2$ 即随机猜测);(ii) 实验 C 的三个 NLL 连小数点后 6 位都完全相同(0.507772),这是「BT 只识别同一 context 内奖励差」的直接数值证据;(iii) 加入 40% 平局后,两种处理达到的相关系数几乎一样(0.9938 vs 0.9967),但参数本身可以差到 0.72——似然等价类内的参数不可比,这正是讲义 L7N3「无穷多个 $R$」在本讲的延续。

8.4.3 代码二:DPO 训练、隐含奖励与 reward/KL 前沿

import numpy as np
np.random.seed(0)
X, Y = 3, 4
R_TRUE = np.array([[0.0, 0.5, 1.6, -0.4],
                   [1.2, -0.8, 0.3, 1.9],
                   [-0.5, 1.0, 1.4, 0.2]])
THETA_REF = np.array([[0.30, -0.20, 0.10, 0.00],
                      [0.00, 0.40, -0.30, 0.20],
                      [0.20, 0.00, -0.10, 0.30]])

def softmax(z):
    z = z - z.max(axis=-1, keepdims=True); e = np.exp(z); return e / e.sum(-1, keepdims=True)

def log_softmax(z):
    z = z - z.max(axis=-1, keepdims=True); return z - np.log(np.exp(z).sum(-1, keepdims=True))

def sigmoid(z): return 1.0 / (1.0 + np.exp(-z))

PI_REF, LOGPI_REF = softmax(THETA_REF), log_softmax(THETA_REF)
CTX = np.ones(X) / X                                   # prompt 分布 p(x) 均匀

def row_center(M): return M - M.mean(axis=1, keepdims=True)
def pearson(a, b):
    a, b = a - a.mean(), b - b.mean()
    return float((a * b).sum() / np.sqrt((a * a).sum() * (b * b).sum()))
def kl_div(p, logq): return float((p * (np.log(p + 1e-300) - logq)).sum(1).mean())

def make_preferences(n, ref=None):                     # 同 8.4.2,返回 (x, y_w, y_l)
    ref = PI_REF if ref is None else ref
    xs = np.random.randint(0, X, size=n)
    y1 = np.array([np.random.choice(Y, p=ref[x]) for x in xs])
    y2 = np.empty_like(y1)
    for i, x in enumerate(xs):
        p = ref[x].copy(); p[y1[i]] = 0.0; y2[i] = np.random.choice(Y, p=p / p.sum())
    p_win = sigmoid(R_TRUE[xs, y1] - R_TRUE[xs, y2])
    fw = np.random.rand(n) < p_win
    return xs, np.where(fw, y1, y2), np.where(fw, y2, y1)

XS, YW, YL = make_preferences(4000)

# ---------------- DPO:把 8.3.3 的 Step 7/8 直接写成代码 ----------------
def dpo_train(beta, steps=3000, lr=0.05, data=None, ref=PI_REF):
    xs, yw, yl = (XS, YW, YL) if data is None else data
    logq = log_softmax(ref)
    theta = ref.copy()
    hist, w_hist = [], []
    for t in range(steps + 1):
        lp = log_softmax(theta)
        rw = beta * (lp[xs, yw] - logq[xs, yw])         # 隐含奖励 r_hat(x, y_w)
        rl = beta * (lp[xs, yl] - logq[xs, yl])         # 隐含奖励 r_hat(x, y_l)
        loss = -np.mean(np.log(sigmoid(rw - rl) + 1e-12))     # L_DPO
        gd = -(1.0 - sigmoid(rw - rl)) / len(xs)        # dL/d(r_hat_w - r_hat_l)
        grad = np.zeros_like(theta)
        # dlogpi(y|x)/dtheta[x] = e_y - pi,两项相减后 -pi 抵消,只剩 e_w - e_l
        np.add.at(grad, (xs, yw), gd * beta)
        np.add.at(grad, (xs, yl), -gd * beta)
        theta -= lr * grad / max(np.linalg.norm(grad), 1e-12)   # 归一化步长
        if t % 500 == 0 or t == steps:
            hist.append((t, loss)); w_hist.append(float(np.mean(sigmoid(rl - rw))))
    return theta, hist, w_hist

BETA = 0.1
THETA_DPO, HIST, W_HIST = dpo_train(BETA)
LP_DPO, PI_DPO = log_softmax(THETA_DPO), np.exp(log_softmax(THETA_DPO))
R_HAT = BETA * (LP_DPO - LOGPI_REF)                    # 隐含奖励 = beta*log(pi/pi_ref)
print("DPO loss:", ["%d:%.4f" % (t, l) for t, l in HIST])
print("梯度权重 sigma(r_l-r_w): %.4f -> %.4f" % (W_HIST[0], W_HIST[-1]))
print("pi_theta =\n", np.round(PI_DPO, 4))
print("隐含奖励 r_hat =\n", np.round(R_HAT, 4))
print("r_hat vs R_TRUE 的 Pearson r = %.4f" % pearson(row_center(R_HAT).ravel(), row_center(R_TRUE).ravel()))
print("KL(pi_theta||pi_ref) = %.4f" % kl_div(PI_DPO, LOGPI_REF))
print("E[r_true]: pi_ref %.4f -> pi_theta %.4f"
      % (float((PI_REF * R_TRUE).sum(1).mean()), float((PI_DPO * R_TRUE).sum(1).mean())))

# ---------------- 显式 RM + 策略梯度(PPO 的表格精确极限) ----------------
def fit_rm(xs, yw, yl, steps=3000, lr=0.5):
    phi = np.zeros((X, Y))
    for _ in range(steps):
        g = -(1 - sigmoid(phi[xs, yw] - phi[xs, yl])) / len(xs)
        np.add.at(phi, (xs, yw), -lr * g); np.add.at(phi, (xs, yl), lr * g)
    return phi

def pg_exact(R, beta, steps=3000, lr=0.5):
    """max E_x E_{y~pi}[R] - beta*KL(pi||pi_ref) 的精确表格策略梯度。"""
    theta = THETA_REF.copy()
    for _ in range(steps):
        lp = log_softmax(theta); p = np.exp(lp)
        rbar = (p * R).sum(1, keepdims=True)
        klx = (p * (lp - LOGPI_REF)).sum(1, keepdims=True)
        theta += lr * CTX[:, None] * p * ((R - rbar) - beta * ((lp - LOGPI_REF) - klx))
    lp = log_softmax(theta); p = np.exp(lp)
    return kl_div(p, LOGPI_REF), float((p * R_TRUE).sum(1).mean())

PHI = fit_rm(XS, YW, YL)
print("beta | DPO(KL, r_true) | learnedRM+PG | oracleRM+PG")
for b in [0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0]:
    th, _, _ = dpo_train(b); lp = log_softmax(th); p = np.exp(lp)
    print("%4.2f | (%6.3f, %6.3f) | %s | %s" % (
        b, kl_div(p, LOGPI_REF), float((p * R_TRUE).sum(1).mean()),
        np.round(pg_exact(PHI, b), 3), np.round(pg_exact(R_TRUE, b), 3)))

代码做什么dpo_train 是 8.3.3 的 Step 7/8 的逐行实现——用 $\hat r_\theta=\beta(\log\pi_\theta-\log\pi_{ref})$ 构造 BT 对数似然并求导;因为 $-\pi$ 项在 $y_w$ 与 $y_l$ 之间相减时抵消,梯度只剩 $(e_w-e_l)$ 的散射,代码里就体现为两行 np.add.atpg_exact 是「显式 RM + PPO」在表格 softmax 上的精确极限(闭式策略梯度,无需采样):$\nabla_\theta J=\sum_x p(x)\pi(y\vert x)\big[(R(x,y)-\bar R_x)-\beta(\log\frac{\pi}{q}-\mathrm{KL}_x)\big]$。三段实验分别回答:DPO 能否复原真值奖励?$\beta$ 如何控制 KL–奖励兑换?DPO 与「学 RM 再 PG」是否落在同一条前沿?

RL 机制透视:这段代码把 RLHF 与 DPO 的同一性摆在同一张表里。(1) DPO 的损失函数里没有任何 $r_\phi$,却有与 RM 训练完全相同的 BT 结构——差别只是「分数」来自策略比值而非独立网络;(2) pg_exact 用的是同一个 KL 正则目标,只不过走「先学 RM、再对 RM 做策略梯度」的绕路。讲义 pp.49–58 声称两者理论等价,实验表就展示了这种等价的数值形式:同一 $\beta$ 下两条前沿几乎重合。(3) $\beta$ 的作用被直接看到——它是 KL 的「价格」,不是数值稳定技巧。

实验观察(真实运行输出,节选):

[实验2] DPO 训练:beta=0.10,3000 步归一化 GD(从 pi_ref 出发)
  DPO 损失 (step:loss) = 0:0.6931, 500:0.5268, 1000:0.5252, 1500:0.5252, 2000:0.5252, 3000:0.5252
  平均梯度权重 sigma(r_hat_l - r_hat_w):首 0.5000 → 末 0.3481
  训练后 pi_theta = [[0.     0.     1.     0.    ]
                     [0.0005 0.     0.     0.9995]
                     [0.     0.0464 0.9536 0.    ]]
  行中心化隐含奖励 vs R_TRUE:Pearson r = 0.9975
  held-out 偏好预测准确率(隐含奖励)= 0.7745
  KL(pi_theta||pi_ref) = 1.3493
  真实期望奖励 E_y~pi_theta[r_true] = 1.6270(pi_ref 下为 0.4729)

[实验3] reward/KL 前沿(真实奖励 R_TRUE 评估)
  beta |  DPO (KL, r_true)  |  学到的RM+PG (KL, r_true)  |  oracle RM+PG (KL, r_true)
  0.02 | ( 1.415,  1.633) | ( 1.399,  1.631) | ( 1.401,  1.632)
  0.05 | ( 1.410,  1.633) | ( 1.393,  1.631) | ( 1.397,  1.631)
  0.10 | ( 1.349,  1.627) | ( 1.342,  1.625) | ( 1.376,  1.629)
  0.20 | ( 1.195,  1.600) | ( 1.186,  1.597) | ( 1.223,  1.606)
  0.50 | ( 0.701,  1.416) | ( 0.703,  1.419) | ( 0.737,  1.437)
  1.00 | ( 0.296,  1.115) | ( 0.284,  1.111) | ( 0.302,  1.130)
  2.00 | ( 0.105,  0.851) | ( 0.085,  0.830) | ( 0.090,  0.842)

[实验4] 偏好数据量 N 的影响(beta=0.1)
     N  | RM maxerr | DPO (KL, r_true) | oracle (KL, r_true)
     40 |     3.747 | ( 1.418,  1.260) | ( 1.376,  1.629)
    120 |     0.792 | ( 1.226,  1.360) | ( 1.376,  1.629)
   1000 |     0.335 | ( 1.267,  1.613) | ( 1.376,  1.629)
   4000 |     0.061 | ( 1.385,  1.631) | ( 1.376,  1.629)

[实验4b] 参考策略覆盖:让 pi_ref 更尖锐(scale 越大覆盖越窄)
  scale 1.0 | min (x,y) 出现次数 459 | 隐含奖励 vs R_TRUE 的 r = 0.9989 | min pi_ref = 0.1663
  scale 3.0 | min (x,y) 出现次数 214 | 隐含奖励 vs R_TRUE 的 r = 0.9985 | min pi_ref = 0.0621
  scale 6.0 | min (x,y) 出现次数  45 | 隐含奖励 vs R_TRUE 的 r = 0.9947 | min pi_ref = 0.0107

四点结论

  1. DPO 学出了正确的排序与正确的策略。 隐含奖励与真实奖励的相关系数 $r=0.9975$(RM 版本为 $0.9981$),held-out 偏好准确率都是 $0.7745$,与真实 BT 模型下的贝叶斯最优准确率一致;真实奖励从 $0.4729$ 提到 $1.6270$。
  2. $\beta$ 是 KL 的价格。 前沿表里 $\beta$ 从 $0.02\to2.0$,KL 从 $1.415$ 单调降到 $0.105$,真实奖励从 $1.633$ 降到 $0.851$——想让模型更自由就得接受更大漂移,这是讲义 p.41 KL 惩罚的定量形象。
  3. DPO ≈ 学到的 RM + PG。 同一 $\beta$ 下两列数值几乎逐行相同(如 $\beta=0.1$:DPO $(1.349,1.627)$ vs RM+PG $(1.342,1.625)$),说明 DPO 确实达到了 RLHF 的解族;oracle RM+PG 略高($(1.376,1.629)$)纯粹因为本设定里 $R_{TRUE}$ 在假设类内、且 RM 拟合误差只有 $\max\vert r_\phi^{c}-R^{c}_{TRUE}\vert =0.1338$。这个小小的差距正是 RLHF 多一段 RM 的收益与代价
  4. DPO 的失效模式被复现。 偏好数据只有 40 对时 RM 最大误差 $3.747$,DPO 学出的策略在 KL 恰好 $1.418$(比 oracle 的 $1.376$ 还大)时真实奖励却只有 $1.260$ vs oracle 的 $1.629$——分布外偏好导致的错配。同时 4b 显示:当 $\pi_{ref}$ 变得尖锐(scale $6.0$,最小 $\pi_{ref}=0.0107$),数据里稀有 $(x,y)$ 只出现 45 次,隐含奖励与真值的相关从 $0.9989$ 掉到 $0.9947$——DPO 的质量被参考策略的覆盖范围限制

8.5 评估指标与理论保证

(一)模仿学习侧

  • 评估指标:策略回报差 $J(\pi^*)-J(\hat\pi)$;在自身诱导分布 $d^{\hat\pi}$ 上与专家动作的不一致率 $\epsilon$;专家查询次数(人类成本)。
  • 理论保证:BC 的复合误差 $\mathbb{E}[\text{errors}]=\epsilon\frac{T(T+1)}{2}=O(\epsilon T^2)$;DAgger 在强无遗憾在线学习器
\[J(\hat\pi)-J(\pi^*)\ \le\ T\epsilon+u_N=O(\epsilon T)\quad(u_N\to0)\]
  • 条件依赖:DAgger 的界依赖 (i) 专家可在线查询任意学生访问的状态;(ii) 在线学习器无遗憾(凸损失 + 合适步长,例如 $\sum_t\alpha_t=\infty,\sum_t\alpha_t^2<\infty$);(iii) 数据规模随轮数线性增长($N$ 轮后 $\vert D\vert $ 正比于 $N\cdot m$)。BC 则只需一份离线数据,但承受 $O(\epsilon T^2)$。

(二)RLHF / DPO 侧

  • 评估指标:RM 在 held-out 人类判断上的分对准确率(pairwise accuracy);策略对参考策略的胜率(win rate);与参考策略的 $\mathrm{KL}(\pi_\theta\vert \pi_{ref})$;真实奖励 $E[r_{true}]$(仅仿真可得);reward/KL 前沿(讲义 pp.60-61 的做法:用 GPT2-XL 生成 IMDB 影评,用预训练情感分类器当 Gold RM,再分别用 PPO 与 DPO 优化同一条前沿)。讲义 p.40 强调:先确认 RM 能用——大 RM + 足够数据可接近单个标注者水平(Stiennon et al. 2020)。
  • 理论保证:(i) BT 参数的可辨识性只到「同一 $x$ 内的常数」等价类(L7N3 + 本讲实验 C);(ii) DPO 与 RLHF 的理论等价性——在 BT 偏好模型下,带 KL 约束目标的最优策略 $\pi^*=\frac{1}{Z(x)}\pi_{ref}\exp(\frac{1}{\beta}r)$ 同时是 RLHF 的 RL 阶段与 DPO 损失的最优解族。
  • 条件依赖:(i) RLHF/PPO 需要 on-policy 采样(每步 $y\sim\pi_\theta$),$KL$ 系数 $\beta$ 与 RM 尺度耦合;(ii) DPO 是 offline 的,质量取决于偏好数据是否覆盖 $\pi_\theta$ 将要去的区域(本讲实验 4b);(iii) 两者都强依赖 $\pi_{ref}$;(iv) 无理论保证能防住 reward hacking——KL 只是把策略拴在 $\pi_{ref}$ 附近,而 $\pi_{ref}$ 本身就可能不符合人类价值。

8.6 与其他讲次的关联

  • ← L5(Policy Gradient I):REINFORCE 的高方差问题在 RLHF 里换了个名字——PPO 用的 clip + GAE + baseline 都是 L5/L6 的产物。讲义 p.2–3 的 Refresh(REINFORCE:a、d 正确)正是本讲的热身。
  • ← L6(Policy Gradient II):RLHF 第三段的 PPO 就是 L6 的算法;KL 惩罚可以逐样本计算($-\beta\log\frac{\pi_\theta}{\pi_{ref}}$),因此它是「奖励整形」而不是「特殊优化器」。
  • ← L7(Policy Gradient III + Imitation Learning):L7 已经讲了 BC、DAgger 与 MaxEnt IRL。本讲把 BC 的复合误差($O(\epsilon T^2)$)与 DAgger 的 $O(\epsilon T)$ 复述并作为「偏好学习」的动机——示范太贵,比较便宜。讲义还重用了 L7 的 L7N1/L7N3 两道 Check Your Understanding。
  • → L9–L12(Bandits / 数据高效 RL):偏好反馈本质是 bandit 反馈(只有「谁赢」而看不到绝对分数)。讲义 pp.24-29 的 dueling bandits、Condorcet/Copeland/Borda 赢家、Sadigh et al. 的主动偏好学习,正是 L9–L12 的入口;而 RLHF 的高昂采样成本正是 L9 起要解决的「数据效率」问题。
  • → L13/L14(MCTS / AlphaZero / 伦理):DPO 之后的 CPL、可验证奖励的推理模型训练(RLVR)都与搜索/规划结合;讲义 p.65 的 CPL 与 pp.62-64 的大规模 DPO(Mistral、LLaMa3)展示趋势。
  • → L16(Value Alignment,Wanheng Hu 客座):本讲的 KL 正则与奖励攻击是「价值对齐」的技术前提——对齐的是代理奖励,不是人类价值本身。讲义 p.67 还指向 Koyejo 的 CS329H Machine Learning from Human Preferences,p.68 指回 TAMER(Knox & Stone 2008)。

8.7 关键要点

  • 没有奖励函数时,人类输入有三种价格档:完整示范(贵)→ 在线教学/DAgger(最贵,但把误差从 $O(\epsilon T^2)$ 降到 $O(\epsilon T)$)→ 成对偏好比较(便宜且可靠,是 RLHF 的燃料)
  • Bradley–Terry 是「把偏好变奖励」的桥梁:$P(y_w\succ y_l)=\sigma(r_w-r_l)$,只用交叉熵/负对数似然训练;代价是奖励只可辨识到同一上下文内的常数之差。
  • RLHF = SFT + RM + PPO:目标 $\max_\theta E[r_\phi(x,y)-\beta\,\mathrm{KL}(\pi_\theta\vert \pi_{ref})]$,KL 既防奖励攻击又防分布漂移,且是「逐样本可算」的奖励项。
  • DPO 的全部魔法是一步代数:带 KL 的最优策略有闭式解 → 反解出 $r$ 作为策略的函数 → 代入 BT 后 $\log Z(x)$ 在差里抵消 → 只依赖 $\pi_\theta$ 与 $\pi_{ref}$ 的损失。$Z(x)$ 不可算,但也无需算
  • DPO 的梯度 = 判错程度加权的似然上升/下降:权重 $\sigma(\hat r_\theta(y_l)-\hat r_\theta(y_w))$ 让「已经判对的样本」自动退出。
  • DPO 不是万能:它把 RLHF 的「在线探索」换成「离线吃数据」,因此对偏好数据的覆盖范围与 $\pi_{ref}$ 的质量高度敏感。

8.8 常见误区与注意事项

误区 1:RLHF 与 DPO 都训练一个显式奖励模型。 错误。只有 RLHF 的第 2 段训练显式的 $r_\phi$;DPO 不训练任何奖励网络,它把奖励「隐含」在策略与参考策略的比值里:$\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}$。正确认识:DPO 是 reward-model-free,但不是 reward-free——它仍然隐含地定义并优化了一个奖励。本讲实验 2 直接给出了「隐含奖励」矩阵,它与真值的相关系数达 0.9975。

误区 2:RLHF 只需要偏好数据,不需要 SFT。 错误。讲义 p.38 明确「First step: instruction tuning!」,第 3 段的 $\pi^{RL}$ 也是从 $\pi^{SFT}$ 复制并把它当作 KL 锚点 $\pi_{ref}$。正确认识:偏好数据只决定「往哪个方向走」,SFT 决定「从哪出发」——没有 SFT 的 RLHF 会在一个语言不通的基座上优化,也可能以极小的 KL 预算就崩掉。

误区 3:只要数据够多,Bradley–Terry 就能恢复真实奖励函数。 错误。BT 只识别同一上下文内的奖励差;加任意逐上下文常数或全局常数,似然完全不变。本讲实验 C 的三个 NLL 都是 0.507772。同理,讲义 L7N3 的答案是「有无穷多个 $R$ 使专家最优」。正确认识:奖励模型的意义在于排序/相对偏好,不要读它的绝对值;跨上下文比较 RM 分数在理论上没有保证。

误区 4:KL 惩罚只是为了训练稳定,$\beta$ 是个无关紧要的超参。 错误。KL 项就是「与 $\pi_{ref}$ 的距离价格」,它决定了 reward/KL 前沿上的位置:本讲前沿表显示 $\beta$ 从 $0.02$ 增到 $2.0$ 时 KL 从 $1.415$ 单调降到 $0.105$(真实奖励相应从 $1.633$ 降到 $0.851$)。而且它正是 DPO 闭式解的来源——去掉 KL,Step 3–4 的 $Z(x)$ 与最优解都不复存在。正确认识:$\beta$ 是「对齐强度 vs 漂移」的旋钮,必须与 RM 的尺度一起调。

误区 5:DAgger 的 $O(\epsilon T)$ 是白拿的。 错误。$O(\epsilon T)$ 的前提是一个可随时查询的专家,并且要在线获取「学生自己走到的状态」上的标签。这正是讲义 p.12「Key limitation?」的答案:人类必须持续、实时地为任意状态标注,成本远高于一次性示范;若专家本身有噪声或有系统性偏差,DAgger 会把偏差放大到自身诱导分布上。正确认识:DAgger 用人类成本误差界的 $T$ 因子

误区 6:奖励模型越准,最终策略一定越好。 错误。RM 只是人类偏好的代理,优化代理过头就是 reward hacking / over-optimization。本讲实验显示,只有在「$R_{TRUE}$ 恰在假设类内 + 偏好数据足够($N=4000$,RM 误差 0.061)」时 learned RM+PG 才追平 oracle;而 $N=40$ 时(RM 误差 3.747)策略在同样的 KL 预算下真实奖励只有 $1.260$(oracle $1.629$)。正确认识:KL 预算越大、RM 误差越大,过优化越严重;讲义 p.40 要求先在 held-out 人类判断上验证 RM,正是这个道理。

误区 7:DPO 是 offline 的,所以偏好数据随便采就行。 错误。DPO 的隐含奖励只在偏好数据覆盖到的 $(x,y)$ 上被约束。本讲实验 4b:当 $\pi_{ref}$ 变尖锐(scale $6.0$、最小概率 $0.0107$),稀有 $(x,y)$ 在 4000 对里只出现 45 次,隐含奖励与真值的相关从 $0.9989$ 降到 $0.9947$。正确认识:DPO 的偏好数据应当由与 $\pi_{ref}$ 一致的策略(甚至 on-policy 的 $\pi_\theta$)采样,否则学到的是分布外的偏好。

误区 8:DPO 的结果优于 RLHF,所以 PPO 没用了。 错误。讲义 p.44(Dubois et al. 2023)指出 PPO 确实有效,但 Best-of-$n$ 与「只在好输出上做 SFT」 这类简单基线也很强;DPO 与前两者是同一 KL 约束目标的不同求解路径,各有适用面(在线探索 vs 离线低成本)。正确认识:选择算法要看你能否在线采样奖励是否可验证算力预算,而不是简单地排名。


8.9 思考题(带答案)

讲义自带的 Check Your Understanding 有两道(p.2–3 的 L7N1 REINFORCE,答案 a、d;p.15–16 的 L7N3 特征奖励,答案「有无穷多个 $R$」)。下面第 4 题是围绕本讲 RLHF/DPO 的补充 Quick Check。

题 1(计算 / 推导):BC 与 DAgger 的误差界

设时域 $T=20$,BC 每步独立犯错概率 $\epsilon=0.05$ 且错误不可恢复。求期望错误步数。若改用 DAgger 且第 $N$ 轮后在学习器诱导分布上的错误率降到 $\epsilon^{\prime}=0.005$,并假设在线学习器遗憾 $u_N\approx0$,求误差界比值。

答案

BC 的错误步数服从几何式累积:

\[\mathbb{E}[\text{errors}]\approx\epsilon\frac{T(T+1)}{2}=0.05\times\frac{20\times21}{2}=0.05\times210=10.5\ \text{步}\]

平均每条轨迹一半以上都走错,这就是 $O(\epsilon T^2)$ 的直观含义(若误用 iid 假设只会得到 $\epsilon T=1$ 步,差 10.5 倍)。

DAgger 的界为 $J(\hat\pi)-J(\pi^*)\le T\epsilon^{\prime}+u_N$,用「每轨迹期望错误步数」近似即 $T\epsilon^{\prime}=20\times0.005=0.1$ 步。比值:

\[\frac{10.5}{0.1}=105\]

同样的时域下 DAgger 的误差量级比 BC 小两个数量级,代价是每一步都要向专家查询($T$ 次/轨迹/轮,且是学生自己走到的状态)。注意若 $\epsilon$ 不变而仅靠聚合数据,界仍是 $O(\epsilon T)$——DAgger 的收益来自把训练分布反复对齐到 $d^{\hat\pi}$,从而把 $\epsilon$ 压小;如果两次的 $\epsilon$ 相同,比较应为 $\epsilon\frac{T(T+1)}{2}$ vs $\epsilon T$,比值恰为 $\frac{T+1}{2}=10.5$。

题 2(完整推导):从 RLHF 目标推导 DPO 损失

请完整推导:从 KL 约束目标出发,得到闭式最优策略,反解奖励,代入 Bradley–Terry 模型,说明配分函数 $Z(x)$ 为何抵消,最终写出 $\mathcal{L}_{DPO}$。

答案(与 8.3.3 对应,逐步写出):

第一步,目标为

\[\max_{\pi}\ \mathbb{E}_{x\sim\mathcal{D}}\Big[\mathbb{E}_{y\sim\pi(\cdot\vert x)}[r_\phi(x,y)]-\beta\,\mathrm{KL}(\pi(\cdot\vert x)\vert \pi_{ref}(\cdot\vert x))\Big]\]

由于 $x$ 之间不耦合,可对每个 $x$ 独立求解。把 KL 展开:

\[\mathbb{E}_{y\sim\pi}\Big[r_\phi(x,y)-\beta\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}\Big]\]

第二步,令

\[Z(x)=\sum_{y}\pi_{ref}(y\vert x)\exp\Big(\frac{r_\phi(x,y)}{\beta}\Big),\qquad \pi^*(y\vert x)=\frac{\pi_{ref}(y\vert x)}{Z(x)}\exp\Big(\frac{r_\phi(x,y)}{\beta}\Big)\]

($\pi^$ 非负且 $\sum_y\pi^=1$,是合法分布。)

第三步(最优性),由定义取对数可得

\[\log\exp\Big(\frac{r_\phi}{\beta}\Big)=\frac{r_\phi}{\beta}=\log\pi^*(y\vert x)-\log\pi_{ref}(y\vert x)+\log Z(x)\]

即 $r_\phi(x,y)=\beta\log\frac{\pi^*(y\vert x)}{\pi_{ref}(y\vert x)}+\beta\log Z(x)$。代回第一步的项:

\[r_\phi(x,y)-\beta\log\frac{\pi(y\vert x)}{\pi_{ref}(y\vert x)}=\beta\log\frac{\pi^*(y\vert x)}{\pi(y\vert x)}+\beta\log Z(x)=-\beta\log\frac{\pi(y\vert x)}{\pi^*(y\vert x)}+\beta\log Z(x)\]

对 $y\sim\pi$ 取期望:

\[\mathbb{E}_{y\sim\pi}[\cdot]=-\beta\,\mathrm{KL}\big(\pi(\cdot\vert x)\vert \pi^*(\cdot\vert x)\big)+\beta\log Z(x)\]

因为 $\log Z(x)$ 与 $\pi$ 无关且 $-\beta\,\mathrm{KL}\le0$,最大值在 $\pi=\pi^*$ 处取得(此时 KL$=0$,最优值 $\beta\log Z(x)$)。故

\[\pi^*(y\vert x)=\frac{1}{Z(x)}\pi_{ref}(y\vert x)\exp\Big(\frac{r_\phi(x,y)}{\beta}\Big)\]

第四步(奖励重参数化),把上式当作关于 $r_\phi$ 的方程解出来:

\[r_\phi(x,y)=\beta\log\frac{\pi^*(y\vert x)}{\pi_{ref}(y\vert x)}+\beta\log Z(x)\]

第五步(代入 BT),把 $\pi^*$ 换成待学的 $\pi_\theta$ 并计算奖励差:

\[r_\phi(x,y_w)-r_\phi(x,y_l)=\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}+\beta\log Z(x)-\beta\log Z(x)\]

两个 $\beta\log Z(x)$ 是同一个 $x$ 的同一个常数,在差里抵消。所以 BT 概率

\[P(y_w\succ y_l\vert x)=\sigma\Big(\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}\Big)\]

第六步(取负对数似然)得

\[\mathcal{L}_{DPO}(\theta)=-\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\left[\log\sigma\!\left(\beta\log\frac{\pi_\theta(y_w\vert x)}{\pi_{ref}(y_w\vert x)}-\beta\log\frac{\pi_\theta(y_l\vert x)}{\pi_{ref}(y_l\vert x)}\right)\right]\]

要点:$Z(x)$ 需要对所有可能的回答求和(不可 tractable,讲义 p.52 专门标注),但因为它只出现在中而被消掉,所以 DPO 永远不需要计算它——这就是整个方法成立的关键。

题 3(推导 + 解释):DPO 的梯度与「判错程度」权重

推导 $\nabla_\theta\mathcal{L}_{DPO}$,解释每一项的物理含义,并说明为什么它是「隐含奖励模型」的 BT 梯度,以及它与 RLHF 第 2 段 RM 训练的异同。

答案:记 $\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\vert x)}{\pi_{ref}(y\vert x)}$、$\delta=\hat r_\theta(x,y_w)-\hat r_\theta(x,y_l)$,则 $\mathcal{L}=-\mathbb{E}[\log\sigma(\delta)]$。由 $\frac{d}{d\delta}[-\log\sigma(\delta)]=-(1-\sigma(\delta))=-\sigma(-\delta)$,以及

\[\nabla_\theta\delta=\beta\Big(\nabla_\theta\log\pi_\theta(y_w\vert x)-\nabla_\theta\log\pi_\theta(y_l\vert x)\Big)\]

($\pi_{ref}$ 冻结,不求导)得到

\[\nabla_\theta \mathcal{L}_{DPO}=-\beta\,\mathbb{E}\Big[\sigma\big(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w)\big)\Big(\nabla_\theta\log\pi_\theta(y_w\vert x)-\nabla_\theta\log\pi_\theta(y_l\vert x)\Big)\Big]\]

逐项含义:(i) $\nabla_\theta\log\pi_\theta(y_w\vert x)$ 前面带负号进入下降方向,故 $\theta$ 更新提升 $y_w$ 的对数似然;$\nabla_\theta\log\pi_\theta(y_l\vert x)$ 带正号,故压低 $y_l$ 的对数似然——与「喜欢被偏好的回答」直觉一致。(ii) 权重 $\sigma(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w))$ 是「模型当前认为 $y_l$ 优于 $y_w$ 的概率」,即判错程度:模型已经判对的样本权重 $\to0$(不再贡献梯度),判错的样本权重 $\to1$(主导更新),这是一种自动的难例挖掘。本讲实验 2 打印了这个权重(100 对数据的平均):从训练开始时的 $0.5000$(完全无法区分)降到收敛时的 $0.3481$。

与 RM 训练的异同:两者都是 BT 负对数似然,梯度形式都是「$-(1-\sigma(\delta))$ × 分数差的方向」。差别在参数化——RM 训练对独立的 $\phi$ 求导,梯度散射到 $r_\phi$ 表格/网络;DPO 对策略参数 $\theta$ 求导,而 $\hat r_\theta$ 是 $\theta$ 的非线性函数(含 $\pi_{ref}$ 归一化),因此梯度里出现了 $\nabla_\theta\log\pi_\theta$。还有一个本质差别:RM 训练的梯度只动奖励,DPO 的梯度同时改变了「奖励」和「生成分布」——这正是它能一步到位、但也更容易过拟合偏好数据的原因。

题 4(Quick Check,多选题):RLHF 与 DPO 的性质判断

判断下列陈述的真假,并给出理由:

(a) RLHF 与 DPO 都训练一个显式奖励模型。 (b) DPO 不需要在线采样,因此偏好数据集可以固定不变地反复使用。 (c) 在 Bradley–Terry 偏好模型下,DPO 损失的最优解与带 KL 约束的 RLHF 目标的最优解属于同一解族。 (d) RLHF 第 3 段中 KL 惩罚的作用只是提高数值稳定性,与「防止奖励攻击」无关。 (e) DPO 的梯度权重 $\sigma(\hat r_\theta(y_l)-\hat r_\theta(y_w))$ 在模型已经判对时趋近 0。

答案:(a) ——只有 RLHF 训练显式 $r_\phi$;DPO 的奖励隐含在 $\beta\log(\pi_\theta/\pi_{ref})$ 中。(b) ——DPO 是 offline 的,同一份偏好数据可反复用;但注意这正是它的弱点:若数据不覆盖 $\pi_\theta$ 会去的区域,隐含奖励在那些区域没有约束(本讲实验 4b)。(c) ——这正是 8.3.3 推导的结论,$\pi^*=\frac{1}{Z(x)}\pi_{ref}\exp(r/\beta)$ 同时是两个问题的最优策略。(d) ——KL 惩罚是「与参考模型的距离价格」,它直接抑制 reward hacking(跑到代理奖励的高分但人类不喜欢的区域),并决定了 reward/KL 前沿的位置;本讲前沿表显示 $\beta$ 单调控制 KL 与真实奖励的兑换率。(e) ——$\hat r_\theta(y_w)\gg\hat r_\theta(y_l)$ 时 $\sigma(\hat r_l-\hat r_w)\to0$,该样本不再贡献梯度。