DPO 隐式地优化了与现有 RLHF 算法(基于 KL 散度约束的奖励最大化)相同的目标函数。然而,与传统 RLHF 方法(需要首先训练一个独立的奖励模型,然后通过强化学习来优化策略)不同,DPO 推导并提出了一种直接利用人类偏好数据进行策略优化的简单、稳定的方法,完全避免了训练奖励模型和 RL 训练的复杂过程
RLHF 流程
首先让我们来回顾一下 RLHF 的基本流程:1)SFT;2)偏好采样和奖励建模;3)RL
SFT
在标注数据上对预训练的大型语言模型进行微调,得到一个初始策略 \(\pi^{\mathrm{SFT}}\)。这个模型作为后续优化的起点和参考。
偏好采样和奖励建模
目标: 从人类偏好中学习一个奖励函数。
- 数据采集: 使用 SFT 模型 \(\pi^{\mathrm{SFT}}\) 或其他策略,对给定的提示 \(x\) 生成一对或多对候选答案,例如 \((y_1, y_2)\)。随后,人类标注者对这些答案对表达他们的偏好,通常记为 \(y_w \succ y_l | x\),其中 \(y_w\) 和 \(y_l\) 分别表示人类偏好和不偏好的回答。
- 奖励建模: 假设这些人类偏好是基于某个潜在的奖励模型 \(r^*(y, x)\) 产生的,我们无法直接知道它的值。为了从成对或排序偏好数据中学习这个奖励函数,我们需要对偏好进行建模。Bradley-Terry 模型是一个流行的选择,可以对成对比较数据进行建模。如果能获取多个答案的排序(而非仅仅成对比较),则可以使用更通用的 Plackett-Luce 模型。
- 奖励模型训练: 我们据此训练出一个奖励模型 \(r(x, y)\),该模型将在接下来的 RL 阶段向语言模型提供标量反馈。训练过程通常是最大化偏好的对数似然。
RL
目标: 使用学习到的奖励模型 \(r(x, y)\) 优化策略 \(\pi_\theta\)。
最终优化的目标是最大化预估奖励,同时通过 KL 散度约束,防止新策略 \(\pi_\theta\) 偏离其参考策略 \(\pi_{\mathrm{ref}}\)(通常是 \(\pi^{\mathrm{SFT}}\))过远,同时保持生成多样性,防止模式坍塌(Mode Collapse)到一个或少数几个能获得高奖励但缺乏通用性的特定答案。
优化的目标函数可以表示为
其中 \(\mathcal{D} = \{x^{(i)}, y_w^{(i)}, y_l^{(i)}\}_{i = 1}^N\) 是一个人类偏好数据集,\(\beta\) 是一个控制与参考策略 \(\pi_{\mathrm{ref}}\) 偏差的参数。在实践中,语言模型策略 \(\pi^\theta\) 也初始化为 \(\pi^{\mathrm{SFT}}\)。
由于语言生成的离散性,该目标函数不可微,通常使用强化学习进行优化。
推导 DPO 目标函数
关于 KL 散度:
分布 \(p(x)\) 与 \(q(x)\) 之间的 KL 散度的定义为\[\mathbb{D}_{\mathrm{KL}}(p||q) = \sum_x p(x)\log\frac{p(x)}{q(x)} \]这其实也可以视为是在求 \(\log\dfrac{p(x)}{q(x)}\) 在分布 \(p(x)\) 下的期望,即
\[\mathbb{D}_{\mathrm{KL}}(p||q) = \mathbb{E}_{x \sim p(x)}\left[\log\frac{p(x)}{q(x)}\right] \]
注意到 \(\mathbb{E}_{y \sim \pi_\theta(y|x)}\left[\log\frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x) \exp(\frac{1}{\beta}r(x,y))}\right]\) 这一形式其实很像 KL 散度,只是分母并不是一个概率分布。如果我们可以可以把分母部分构造成一个概率分布,将这个式子凑成 KL 散度,根据 KL 散度在两个分布完全相同时取得最小值就可以解出 \(\pi_\theta\)。如果这个分布不依赖于 \(\theta\) 就更好了,这样 \(\pi_\theta\) 的解直接就是这一分布。
基于这个想法,我们可以构造出一个配分函数(partition function)
使用这一配分函进行归一化,将分母部分凑成一个概率分布
于是
由于 \(Z(x)\) 不依赖于 \(\theta\),可以简化为
故 \(\pi_\theta\) 的解即为 \(\pi^*(y|x)\)。
虽然我们现在得到了闭式解,但是我们却很难使用它来进行计算。首先,我们是无法直接知道 \(r^*(y, x)\) 的值的。而即便我们使用极大似然估计来求解它的值,\(Z(x)\) 的计算也仍然是个大问题。想要估计 \(Z(x)\),需要对一个prompt \(x\) 采样足够多的回答 \(y\),这个代价是十分昂贵的。
并且,我们目前推导出的闭式解仍然依赖于一个确定的奖励函数,这并未实现我们的目标:跳过训练奖励模型,一步到位直接训练出对齐模型。
注意到,由这一闭式解 \(\pi^*(y|x) = \frac{1}{Z(x)}\pi_{\mathrm{ref}}(y|x) \exp(\frac{1}{\beta}r(x,y))\) 我们可以反解出
至此,我们得以使用策略来表示奖励。这种变量替换方法避免了拟合一个明确的、独立的奖励模型,同时在人类偏好的现有模型(如 Bradley-Terry 模型)下进行优化。本质上,策略网络既代表了语言模型,也代表了(隐式的)奖励。
现在我们将策略表示的奖励 \(r_\theta(x, y)\) 代入到人类偏好模型的似然函数中,从而直接优化策略 \(\pi_\theta\)。
Bradley-Terry 模型
Bradley-Terry 模型是一种用于对成对比较数据进行建模和分析的统计模型。假设每个对象 \(i\) 都有一个潜在的 “能力”(或“偏好”) 用非负参数 \(p_i\) 表示,当对象 \(i\) 和 \(j\) 进行比较时,对象 \(i\) 战胜对象 \(j\) 的概率为
人类偏好分布可以表示为
其中 \(\sigma\) 是 logistic 函数。
这其实可以看作是对回答进行二元分类,使用负对数似然损失。
梯度
由于
又
令 \(u = \beta\log\dfrac{\pi_\theta(y_w|x)}{\pi_{\mathrm{ref}}(y_w|x)} - \beta\log\dfrac{\pi_\theta(y_l|x)}{\pi_{\mathrm{ref}}(y_l|x)}\),则
在一通链式求导之后我们可以得到
直观上,损失函数的梯度会增加偏好答案 \(y_w\) 的概率,并减少不偏好答案 \(y_l\) 的概率。
重要的是,每个样本都有一个权重 \(\sigma(r_\theta(x, y_l) - r_\theta(x, y_w))\),这个权重代表了隐式奖励模型对回答的评估有多不正确。该权重由 \(\beta\) 进行缩放,这考虑了 KL 约束的强度。实验证明了这种权重的重要性,未包含权重系数的这种方法的朴素版本会导致语言模型退化。
Plackett-Luce 模型
Plackett-Luce 模型是对 Bradley-Terry 模型在排序(而不仅仅是两两比较)上的推广。假设我们有一个包含 \(K\) 个对象的集合(例如比赛中的 \(K\) 个选手),每个对象 \(i\) 都有一个潜在的 “能力”(或“偏好”) 用非负参数 \(p_i\) 表示,对于这些对象的一个排序 \(\tau\),这一排序发生的概率被建模为
观察这个连乘的式子,其第一项 \(\frac{p_{\tau(1)}}{\sum\limits_{j = 1}^K p_{\tau(j)}}\) 是 \(\tau(1)\) 在所有对象中被选为第一位的概率,第二项 \(\frac{p_{\tau(2)}}{\sum\limits_{j = 2}^K p_{\tau(j)}}\) 是 \(\tau(2)\) 在除去 \(\tau(1)\) 的剩余对象中被选为第一位的概率,此后各项以此类推,一直到所有对象都被排好序。
当 \(K = 2\) 时,这个式子其实就是 Bradley-Terry 模型。
对于 prompt \(x\) 和一组回答 \(y_1, \dots, y_K\) 的人类指定排序 \(\tau\),该排序发生的概率为
对于一个包含 \(N\) 个排序样本的数据集 \(\mathcal{D} = \{\tau^{(i)}, y_1^{(i)}, \dots, y_K^{(i)}, x^{(i)} \}_{i = 1}^N\),损失函数为