简介
虽然大规模无监督语言模型(LMs)学习了广泛的世界知识和一些推理技能,但由于它们是基于完全无监督训练,仍很难控制其行为。
微调无监督LM使其对齐偏好,尽管大规模无监督的语言模型(LMs)能够学习广泛的世界知识和一些推理技能,但由于它们的训练完全是无监督的,要精确控制它们的行为是困难的。
现有方法为了获得这种可操纵性,会收集人类对模型生成内容相对质量的标签,并微调无监督LM,使其与这些偏好一致,通常会使用基于人类反馈的强化学习(RLHF)。然而,RLHF是一个复杂且经常不稳定的过程,首先需要拟合一个反映人类偏好的奖励模型,然后使用强化学习微调大型无监督LM,以最大化这个估计奖励,同时不太偏离原始模型。
在这篇论文中,我们介绍了一个RLHF中新的奖励模型参数化方法,该方法可以在闭式中提取对应的最优策略,使我们仅使用简单的分类损失来解决标准的RLHF问题。最终算法我们称之为直接偏好优化(DPO),该算法稳定、性能良好且计算成本低,无需在微调时从LM中进行抽样或进行显著的超参数调整。
实验表明,DPO可以与现有方面一样或更好地微调LM以对齐人类偏好。值得注意的是,使用DPO微调LMs在控制生成内容的情感方面超过了基于PPO的RLHF,并且在摘要和单轮对话的回复质量上效果相当或有提升,同时大大地简化了实现和训练过程。
1 介绍
在大型数据集上训练的大规模无监督语言模型(LMs)获得了惊人能力。然而,这些模型是在人类生成的具有多样化的目标、优先级和技能的数据集上训练的。
然而,这些模型是基于具有各种目标、优先级和技能集的人类生成的数据进行训练的。其中一些目标和技能集我们可能并不想模仿;例如,我们想要我们的AI编程助手理解常见的编程错误并纠正,但在生成代码时,我们希望我们的模型倾向于它训练数据中存在的(可能很罕见)高质量编程能力。同样地,我们希望我们的语言模型能理解50%的人相信的常见误解,但我们当然不希望模型在关于这个误解的查询中有50%声称它是真的!换句话说,从模型广泛的知识和能力中选择期望的回复和行为,对于构建安全、高效和可控的AI系统来说,是至关重要的。
虽然现有方法通常使用强化学习(RL)引导LMs对齐人类偏好,但我们将证明现有方法使用的基于RL的目标,可以通过简单的二元交叉熵目标精确地优化,大大地简化了偏好学习流程。
反馈的强化学习(RLHF/RLAIF)。RLHF方法对一个人类偏好数据集拟合一个奖励模型,然后使用RL来优化一个语言模型策略,以产生被分配了高奖励的响应,同时不过度偏离原始模型。
虽然RLHF产生了在对话和编码能力上表现不错的模型,但RLHF流程比监督学习复杂的多,涉及多LMs训练以及在训练循环中从LM策略中采样,导致计算成本非常高。
本文中,我们展示了如何直接优化语言模型以遵循人类偏好,无需显式的奖励建模或者强化学习。我们提出了一种直接偏好优化(DPO)算法,它隐式地优化与已有的RLHF算法相同的目标(KL散度约束的奖励最大化),但实现简单,训练直接。直觉上,相对于不偏好响应,DPO更新增加了偏好响应的对数概率,但它包含了一个动态的、每个例子的重要性权重,这可以防止我们发现的使用朴素的概率目标时出现的模型退化。
与现有方法一致,DPO依赖于一个理论偏好模型(例如Bradley-Terry模型);该模型衡量给定奖励函数与经验偏好数据的一致性。然而,尽管现有方法使用偏好模型定义偏好损失来训练奖励模型,然后再训练一个策略优化学好的奖励模型,DPO使用一个变量变体直接将偏好损失定义为策略函数。给定一个模型响应的人类偏好数据集,DPO因此可以使用简单的二元交叉熵目标来优化策略,产生一个对隐式奖励函数的最优策略,以拟合偏好数据。
我们主要的贡献是直接偏好优化(DPO),一种简单从偏好中训练语言模型的非强化学习算法。实验证明,DPO至少与现有方法(包括基于PPO的RLHF)的性能相当,可以使用多达6B参数的语言模型,从情感调节、总结、对话等任务中的偏好中学习。
2 相关工作
规模不断增大的语言模型可以使用零样本或少样本提示完成一些任务。然而,在指令和人工回复的数据集上微调,对于提升这些模型的性能和对齐用户意图至关重要。“指令微调”过程可以使LLMs在指令微调数据集之外的指令上具备泛化性,通常增加了模型的可用性。
尽管指令微调取得了成功,但相对于专家示例来说,人类判别回复质量的数据更容易收集【排序数据比生成数据容易收集】。因此,后续的工作利用人类偏好数据集微调LLM,以提升模型在翻译、总结、故事编写、指令遵循等方面的专业性。
这些方法首先利用偏好数据集优化一个神经网络奖励函数,以兼容偏好数据集下的偏好模型。然后,使用强化学习算法微调一个语言模型,以最大化给定奖励,常见方法有REINFORCE、PPO及其变体。
这项紧密相关的工作是,利用经过人类反馈微调的LLMs来遵循指示,生成针对特定属性(如安全性和无害性)的额外合成偏好数据,以LLM的注释形式为准则,只使用人类提供的弱监督进行文本标注。
这些方法代表了两个领域的融合:一个工作领域是使用强化学习训练语言模型用于各种目标,另一个领域是从人类偏好中学习的通用方法。
尽管使用相对人类偏好的方法具有吸引力,但使用强化学习微调大语言模型仍是一种主要的实践挑战;本文提供了一种合理的方法论,可不使用RL优化相对偏好。
在语言之外的领域,从偏好中学习策略已在赌博机和强化学习环境中进行了研究,并提出了几种方法。
使用偏好或行动排序而非奖励的上下文赌博机制学习,被称为上下文对决赌博机制(CDB)。在缺乏绝对奖励的情况下,CDB的理论分析将最优策略的概念替换为冯·诺依曼赢家,其对其他任何策略的预期胜率至少为50%。然而在CDB场景,偏好标签是在线给出的,而在人类偏好学习中,我们通常是从固定的离线偏好标注的批次中学习。
类似地,基于偏好的RL(PbRL)从未知的“评分”函数中学习二元偏好,而非奖励。目前存在各种PbRL,包括可以重用离线偏好数据的方法,但通常涉及首先明确估计潜在的评分函数(即奖励模型),然后再进行优化。相反,我们提出了一种单阶段策略学习方法,直接优化策略来满足偏好。
3 预备知识
我们回顾一下Ziegler等人提出的RLHF pipeline,其通常包括三个阶段:
- 监督微调(SFT)
- 偏好采样和奖励学习
- RL优化
监督微调(SFT): RLHF的初始模型 π SFT \pi^\text{SFT} πSFT,通常是在高质量的感兴趣的下游任务(如对话、总结等)上使用监督学习微调的预训练的语言模型。
奖励建模阶段(Reward Modeling Phase): 在第二阶段,SFT模型使用提示 x x x,产生答案对 ( y 1 , y 2 ) ∼ π SFT ( y ∣ x ) (y_1, y_2) \sim \pi^\text{SFT}(y|x) (y1,y2)∼πSFT(y∣x)。然后让标注员从这些答案对中标注一个偏好的答案,表示为 y w > y l ∣ x y_w > y_l | x yw>yl∣x,其中 y w y_w yw和 y l y_l yl分别表示偏好回复和不偏好回复。假设这些偏好是由一些潜在的奖励模型生成的,但实际上我们并不能访问这些奖励模型。
存在一些建模偏好的方法,Bradley-Terry (BT) 模型是一个常见的选择(尽管更一般的Plackett-Luce排序模型在我们可以访问的多个排序答案时也与该框架兼容)。BT模型将人类偏好分布
p
∗
p^*
p∗定义为以下形式:
p
∗
(
y
1
>
y
2
∣
x
)
=
exp
(
r
∗
(
x
1
,
y
1
)
)
exp
(
r
∗
(
x
,
y
1
)
)
+
exp
(
r
∗
(
x
,
y
2
)
)
=
1
1
+
exp
(
r
∗
(
x
,
y
2
)
−
r
∗
(
x
,
y
1
)
)
=
σ
(
r
∗
(
x
,
y
1
)
−
r
∗
(
x
,
y
2
)
)
\begin{align} p^*(y_1>y_2|x) &=\frac{\exp(r^*(x_1, y_1))}{\exp(r^*(x, y_1)) + \exp(r^*(x, y_2))} \\ &=\frac{1}{1+\exp(r^*(x,y_2)-r^*(x,y_1))}=\sigma(r^*(x,y_1)-r^*(x,y_2)) \tag 1 \end{align}
p∗(y1>y2∣x)=exp(r∗(x,y1))+exp(r∗(x,y2))exp(r∗(x1,y1))=1+exp(r∗(x,y2)−r∗(x,y1))1=σ(r∗(x,y1)−r∗(x,y2))(1)
假设可以访问从
p
∗
p^*
p∗中采样的一个静态数据集
D
=
{
x
(
i
)
,
y
w
(
i
)
,
y
l
(
i
)
}
i
=
1
N
\mathcal D = \{x^{(i)}, y_w^{(i)}, y_l^{(i)}\}_{i=1}^N
D={x(i),yw(i),yl(i)}i=1N,那么我们可以参数化奖励模型
r
ϕ
(
x
,
y
)
r_\phi(x,y)
rϕ(x,y),并通过最大似然来估计参数。将问题框定为二分类问题,我们有以下负对数似然损失:
L
R
(
r
ϕ
,
D
)
=
−
E
(
x
,
y
w
,
y
l
)
[
log
σ
(
r
ϕ
(
x
,
y
w
)
−
r
ϕ
(
x
,
y
l
)
)
]
(2)
\mathcal L_R(r_\phi, \mathcal D)=-\mathbb E_{(x,y_w,y_l)} \big[\log \sigma(r_\phi(x,y_w)-r_\phi(x,y_l))\big] \tag 2
LR(rϕ,D)=−E(x,yw,yl)[logσ(rϕ(x,yw)−rϕ(x,yl))](2)
其中, σ \sigma σ为逻辑函数。在LMs的背景下,网络 r ϕ ( x , y ) r_\phi(x,y) rϕ(x,y)通常是从SFT模型 π SFT ( y ∣ x ) \pi^\text{SFT}(y|x) πSFT(y∣x)初始化,并且在transformer的最后一层加上线性层,用于预测奖励标量值。为保证奖励函数低方差,此前工作对奖励做了标准化,例如对于所有的 x x x,使得 E x , y ∼ D [ r ϕ ( x , y ) ] = 0 \mathbb E_{x,y\sim\mathcal D}[r_\phi(x,y)]=0 Ex,y∼D[rϕ(x,y)]=0。
强化学习微调阶段(RL Fine-Tuning Phase): 在强化学习阶段,我们使用学习好的奖励函数为语言模型提供反馈。具体来说,我们用公式表示以下最优问题:
max
π
θ
E
x
∼
D
,
y
∼
π
θ
(
y
∣
x
)
[
r
ϕ
(
x
,
y
)
]
−
β
D
KL
[
π
θ
(
y
∣
x
)
∣
∣
π
ref
(
y
∣
x
)
]
(3)
\max_{\pi_\theta}\mathbb E_{x\sim\mathcal D, y\sim\pi_\theta(y|x)}\big[r_\phi(x,y)\big]-\beta\mathbb D_\text{KL}\big[\pi_\theta(y|x)\ ||\ \pi_\text{ref}(y|x)\big] \tag 3
πθmaxEx∼D,y∼πθ(y∣x)[rϕ(x,y)]−βDKL[πθ(y∣x) ∣∣ πref(y∣x)](3)
其中,
β
\beta
β是用于控制与基础参考模型
π
ref
\pi_\text{ref}
πref(即初始的SFT模型
π
SFT
\pi^\text{SFT}
πSFT)之间偏差的参数。实际上,语言策略模型也是从
π
SFT
\pi^\text{SFT}
πSFT初始化。这个附加约束非常重要,它可防止模型偏离奖励模型准确度高的分布太远,同时也可以保持生成多样性以及防止模型在某个高奖励答案上出现坍塌。
由于语言生成离散性,该目标函数不可微,因此通常使用强化学习优化。标准方法通常是构建以下形式的奖励函数,并使用PPO优化。
r
(
x
,
y
)
=
r
ϕ
(
x
,
y
)
−
β
(
log
π
θ
(
y
∣
x
)
−
log
π
ref
(
y
∣
x
)
)
r(x,y)=r_\phi(x,y)-\beta(\log\pi_\theta(y|x)-\log\pi_\text{ref}(y|x))
r(x,y)=rϕ(x,y)−β(logπθ(y∣x)−logπref(y∣x))
4 直接偏好优化
受大规模问题(如微调语言模型)上应用强化学习存在挑战的驱动,我们的目标是推演出一种直接使用偏好的简单的策略优化方法。不同于之前的RLHF模型,此类方法先学习奖励模型然后再使用RL优化,我们的方法利用了一种特定的奖励模型参数化选择,使得可以以闭式提取其最优策略,而不需要RL训练循环。
接下来我们详细描述,我们的关键观点是利用从奖励函数到最优策略的分析映射,这使我们能够将奖励函数的损失函数转化为策略的策略损失。这种变量改变的方法避免了拟合显式、独立的奖励模型,而是在现有的人类偏好模型(如Bradley-Terry模型)下进行优化。本质上,策略网络代表语言模型和(隐式)奖励。
推演DPO目标函数
我们从与之前工作相同的RL目标开始,即公式3,针对一个通用的奖励函数
r
r
r。根据之前工作,很显而易见,在公式3中,KL约束下的奖励最大化目标的最优解具有以下形式:
π
r
(
y
∣
x
)
=
1
Z
(
x
)
π
ref
(
y
∣
x
)
exp
(
1
β
r
(
x
,
y
)
)
(4)
\pi_r(y|x)=\frac{1}{Z(x)}\pi_\text{ref}(y|x)\exp\Big(\frac{1}{\beta}r(x,y)\Big) \tag 4
πr(y∣x)=Z(x)1πref(y∣x)exp(β1r(x,y))(4)
其中,
Z
(
x
)
=
∑
y
π
r
e
f
(
y
∣
x
)
exp
(
1
β
r
(
x
,
y
)
)
Z(x)=\sum_y\pi_{ref}(y|x)\exp\Big(\dfrac{1}{\beta}r(x,y)\Big)
Z(x)=∑yπref(y∣x)exp(β1r(x,y))为配分函数。
推导过程(详见附录A.1)
max π E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ( x , y ) ] − β D KL [ π ( y ∣ x ) ∣ ∣ π ref ( y ∣ x ) ] = max π E x ∼ D , y ∼ π [ r ( x , y ) ] − E x ∼ D , y ∼ π [ β log π ( y ∣ x ) π ref ( y ∣ x ) ] = min π E x ∼ D , y ∼ π [ log π ( y ∣ x ) π ref ( y ∣ x ) − 1 β r ( x , y ) ] = min π E x ∼ D , y ∼ π [ log π ( y ∣ x ) π ref ( y ∣ x ) exp ( 1 β r ( x , y ) ) 1 Z ( x ) Z ( x ) ] = min π E x ∼ D , y ∼ π [ log π ( y ∣ x ) 1 Z ( x ) π ref ( y ∣ x ) exp ( 1 β r ( x , y ) ) − log Z ( x ) ] \begin{align} & \max_\pi\mathbb E_{x\sim\mathcal D, y\sim\pi_\theta(y|x)}\big[r(x,y)\big]-\beta\mathbb D_\text{KL}\big[\pi(y|x)\ ||\ \pi_\text{ref}(y|x)\big]\\ &=\max_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[r(x,y)\Big]- \mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\beta\log\frac{\pi(y|x)}{\pi_\text{ref}(y|x)}\Big] \\ &=\min_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\log\frac{\pi(y|x)}{\pi_\text{ref}(y|x)}-\frac{1}{\beta}r(x,y)\Big]\\ &=\min_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\log\frac{\pi(y|x)}{\pi_\text{ref}(y|x)\exp\Big(\dfrac{1}{\beta}r(x,y)\Big)\dfrac{1}{Z(x)}Z(x)}\Big]\\ &=\min_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\log\frac{\pi(y|x)}{\frac{1}{Z(x)}\pi_\text{ref}(y|x)\exp\Big(\dfrac{1}{\beta}r(x,y)\Big)}-\log Z(x)\Big] \end{align} πmaxEx∼D,y∼πθ(y∣x)[r(x,y)]−βDKL[π(y∣x) ∣∣ πref(y∣x)]=πmaxEx∼D,y∼π[r(x,y)]−Ex∼D,y∼π[βlogπref(y∣x)π(y∣x)]=πminEx∼D,y∼π[logπref(y∣x)π(y∣x)−β1r(x,y)]=πminEx∼D,y∼π[logπref(y∣x)exp(β1r(x,y))Z(x)1Z(x)π(y∣x)]=πminEx∼D,y∼π[logZ(x)1πref(y∣x)exp(β1r(x,y))π(y∣x)−logZ(x)]令 Z ( x ) = ∑ y π ref ( y ∣ x ) exp ( 1 β r ( x , y ) ) Z(x)=\sum_y\pi_\text{ref}(y|x)\exp\Big(\dfrac{1}{\beta}r(x,y)\Big) Z(x)=∑yπref(y∣x)exp(β1r(x,y)),则上述分母为概率分布,定义为 π ∗ ( y ∣ x ) \pi^*(y|x) π∗(y∣x)。由于 Z ( x ) Z(x) Z(x)不是 π \pi π的函数,最小化时可忽略,因此:
max π E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ( x , y ) ] − β D KL [ π ( y ∣ x ) ∣ ∣ π ref ( y ∣ x ) ] = min π E x ∼ D , y ∼ π [ log π ( y ∣ x ) π ∗ ( y ∣ x ) − log Z ( x ) ] = min π E x ∼ D , y ∼ π [ log π ( y ∣ x ) π ∗ ( y ∣ x ) ] = min π E x ∼ D [ D K L ( π ( y ∣ x ) ∣ ∣ π ∗ ( y ∣ x ) ) ] \begin{align} & \max_\pi\mathbb E_{x\sim\mathcal D, y\sim\pi_\theta(y|x)}\big[r(x,y)\big]-\beta\mathbb D_\text{KL}\big[\pi(y|x)\ ||\ \pi_\text{ref}(y|x)\big]\\ &=\min_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\log\frac{\pi(y|x)}{\pi^*(y|x)}-\log Z(x)\Big]\\ &=\min_\pi\mathbb E_{x\sim\mathcal D,y\sim\pi}\Big[\log\frac{\pi(y|x)}{\pi^*(y|x)}\Big]\\ &=\min_\pi\mathbb E_{x\sim\mathcal D}[\mathbb D_{KL}(\pi(y|x)\ ||\ \pi^*(y|x))] \end{align} πmaxEx∼D,y∼πθ(y∣x)[r(x,y)]−βDKL[π(y∣x) ∣∣ πref(y∣x)]=πminEx∼D,y∼π[logπ∗(y∣x)π(y∣x)−logZ(x)]=πminEx∼D,y∼π[logπ∗(y∣x)π(y∣x)]=πminEx∼D[DKL(π(y∣x) ∣∣ π∗(y∣x))]因此,最优解 π r ( y ∣ x ) \pi_r(y|x) πr(y∣x)为 π ∗ ( y ∣ x ) \pi^*(y|x) π∗(y∣x),得证。
即使我们使用MLE估计奖励函数
r
∗
r^*
r∗的真值
r
ϕ
r_\phi
rϕ,配分函数
Z
(
x
)
Z(x)
Z(x)仍难以估计,使得这种表示方法实际上难以应用。然而,我们可以重新整理公式4,将奖励函数表示为最优策略
π
r
\pi_r
πr、参考策略
π
ref
\pi_\text{ref}
πref和未知配分函数
Z
(
⋅
)
Z(\cdot)
Z(⋅)的函数。具体来说,我们先对公式4两边取对数,然后进行一些代数运算可以得到:
r
(
x
,
y
)
=
β
log
π
r
(
y
∣
x
)
π
ref
(
y
∣
x
)
+
β
log
Z
(
x
)
(5)
r(x,y)=\beta\log\frac{\pi_r(y|x)}{\pi_\text{ref}(y|x)}+\beta\log Z(x) \tag 5
r(x,y)=βlogπref(y∣x)πr(y∣x)+βlogZ(x)(5)
我们可以将这个重参数化的模型应用到真实奖励
r
∗
r^*
r∗和对应的最优模型
π
∗
\pi^*
π∗。幸运的是,Bradley-Terry模型仅依赖于两种回复的奖励差异,见公式1。将公式5带入公式1参考模型,可消去配分函数。此时,我们可以仅使用优化策略
π
∗
\pi^*
π∗和参考策略
π
ref
\pi_\text{ref}
πref表示人类偏好概率。因此,BT模型下的最优RLHF策略
π
∗
\pi^*
π∗满足参考模型:
p
∗
(
y
1
>
y
2
∣
x
)
=
1
1
+
exp
(
β
log
π
∗
(
y
2
∣
x
)
π
ref
(
y
2
∣
x
)
−
β
log
π
∗
(
y
1
∣
x
)
π
ref
(
y
1
∣
x
)
)
(6)
p^*(y_1>y_2|x)=\frac{1}{1+\exp\Big(\beta\log\frac{\pi^*(y_2|x)}{\pi_\text{ref}(y_2|x)}-\beta\log\frac{\pi^*(y_1|x)}{\pi_\text{ref}(y_1|x)}\Big)} \tag 6
p∗(y1>y2∣x)=1+exp(βlogπref(y2∣x)π∗(y2∣x)−βlogπref(y1∣x)π∗(y1∣x))1(6)
推导过程详见附录A.2。尽管公式6使用BT模型,但我们仍可以在更通用的Plackett-Luce下推演出相似的表达,详见附录A.3。
现在我们有优化策略形式的人类偏好数据的概率,而不是奖励模型,我们可以为参数策略
π
θ
\pi_\theta
πθ定义形式化的最大似然目标。类似于奖励建模方法(即公式2),我们的策略目标变为:
L
DPO
(
π
θ
;
π
ref
)
=
−
E
(
x
,
y
w
,
y
l
)
∼
D
[
log
σ
(
β
log
π
θ
(
y
w
∣
x
)
π
ref
(
y
w
∣
x
)
−
β
log
π
θ
(
y
l
∣
x
)
π
ref
(
y
l
∣
x
)
)
]
=
−
E
(
x
,
y
w
,
y
l
)
∼
D
[
σ
(
β
(
log
π
θ
(
y
w
∣
x
)
−
log
π
θ
(
y
l
∣
x
)
)
−
β
(
log
π
ref
(
y
w
∣
x
)
−
log
π
ref
(
y
l
∣
x
)
)
)
]
\begin{align} \mathcal L_\text{DPO}(\pi_\theta;\pi_\text{ref}) &=-\mathbb E_{(x,y_w,y_l)\sim\mathcal D}\Big[\log\sigma\Big(\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)}\Big)\Big] \\ \tag 7 &=-\mathbb E_{(x, y_w, y_l)\sim \mathcal D}\Big[\sigma\Big(\beta (\log\pi_\theta(y_w|x) - \log\pi_\theta(y_l|x)) - \beta(\log\pi_\text{ref}(y_w|x) -\log\pi_\text{ref}(y_l|x))\Big)\Big] \end{align}
LDPO(πθ;πref)=−E(x,yw,yl)∼D[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]=−E(x,yw,yl)∼D[σ(β(logπθ(yw∣x)−logπθ(yl∣x))−β(logπref(yw∣x)−logπref(yl∣x)))](7)
以这种方式,我们使用一种替代的参数化拟合隐式奖励,其最优策略是简单的
π
θ
\pi_\theta
πθ。而且,由于我们的流程等价于拟合一个重参数化的BT模型,它具有理论支持,例如适当的偏好数据分布下具有一致性。在第5节,我们进一步讨论在其他相关工作中DPO的理论性。
DPO更新做了什么?
为理解DPO的机制,有必要分析下损失函数 L DPO \mathcal L_\text{DPO} LDPO的梯度。参数 θ \theta θ的梯度可以写为:
其中, r ^ θ ( x , y ) = β log π θ ( y ∣ x ) π ref ( y ∣ x ) \hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y|x)}{\pi_\text{ref}(y|x)} r^θ(x,y)=βlogπref(y∣x)πθ(y∣x)是由语言模型 π θ \pi_\theta πθ和参考模型 π ref \pi_\text{ref} πref隐式定义的奖励(详见第5节)。直觉上,损失函数 L DPO \mathcal L_\text{DPO} LDPO的梯度增加了偏好回复 y w y_w yw的似然,减少了非偏好回复 y l y_l yl的似然。重要的是,示例的权重取决于隐式奖励模型对非偏好回复评分的高低,通过 β \beta β缩放,即隐式奖励模型对回复排序的不正确程度,归因于KL约束的作用。我们实验证明了这种加权的重要性,因为没有加权系数的朴素方法会导致语言模型退化。
DPO概述
常见的DPO流程如下:
- 对于每一个 x x x,采样参考模型的回复 y 1 , y 2 ∼ π ref ( ⋅ ∣ x ) y1,y2\sim\pi_\text{ref}(\cdot|x) y1,y2∼πref(⋅∣x),人工标注构建离线偏好数据集 D = { x ( i ) , y w ( i ) , y l ( i ) } i = 1 N \mathcal D=\{x^{(i)},y_w^{(i)},y_l^{(i)}\}_{i=1}^N D={x(i),yw(i),yl(i)}i=1N
- 基于给定的参考模型 π ref \pi_\text{ref} πref、数据集 D \mathcal D D和期望 β \beta β,最小化损失 L DPO \mathcal L_\text{DPO} LDPO,优化语言模型 π θ \pi_\theta πθ
实际上,我们希望重新利用公开可用的偏好数据集,而不是生成样本再收集人类偏好。由于偏好数据集是从 π SFT \pi^\text{SFT} πSFT中采样获取的,我们始终初始化 π ref = π SFT \pi_\text{ref}=\pi^\text{SFT} πref=πSFT。然而,当 π SFT \pi^\text{SFT} πSFT模型不可用时,我们通过偏好回复的最大似然初始化 π ref \pi_\text{ref} πref,即 π ref = arg max π E x , y w ∼ D [ log π ( y w ∣ x ) ] \pi_\text{ref}=\arg\max_\pi\mathbb E_{x,y_w\sim\mathcal D}[\log\pi(y_w|x)] πref=argmaxπEx,yw∼D[logπ(yw∣x)]。这一过程有助于缓解未知真实参考分布和DPO使用的 π ref \pi_\text{ref} πref之间的分布偏移。
5 DPO理论分析
本章节,我们对DPO方法做进一步解释,并提供理论支持,将DPO的优势与RLHF使用的actor-critic算法的问题联系起来。
5.1 你的语言模型其实是一种奖励模型
DPO使用单个最大似然目标函数,可避免拟合显式的奖励模型以及执行RL学习策略。公式5优化目标等价于包含奖励参数 r ∗ ( x , y ) = β log π θ ∗ ( y ∣ x ) π ref ( y ∣ x ) r^*(x,y)=\beta\log\dfrac{\pi_\theta^*(y|x)}{\pi_\text{ref}(y|x)} r∗(x,y)=βlogπref(y∣x)πθ∗(y∣x)的BT模型,我们优化参数化模型 π θ \pi_\theta πθ,这等效于在变量变换下对公式2中的奖励模型进行优化。
本章节中,我们将构建重参数化背后的理论,展示它并不限制学习奖励模型的方法,以及允许准确恢复最优策略。我们首先定义奖励函数之间的的等价关系。
定义1 如果存在函数 f f f使得 r ( x , y ) − r ′ ( x , y ) = f ( x ) r(x,y)-r'(x,y)=f(x) r(x,y)−r′(x,y)=f(x) ,则奖励函数 r ( x , y ) r(x,y) r(x,y)和 r ′ ( x , y ) r'(x,y) r′(x,y)等价。
显而易见,这确实是等价关系,它将奖励函数划分为类。我们可以声明以下两个引理:
引理1 在Plackett-Luce下,特别是在Bradley-Terry偏好框架下,来自同一类别的两个奖励函数将产生相同的偏好分布。
引理2 在约束的强化学习问题下,来自同一类别的两个奖励函数将产生相同的最优策略。
DPO源码解析
样本集 { x , y w , y l } \{x, y_w, y_l\} {x,yw,yl},构造dataloader:
- build_dataset: 对于每一条样本,预处理后的样本集(dataloader中的dataset)为[{‘chosen_input_ids’: […], ‘chosen_attention_mask’: […], ‘chosen_labels’: […], ‘rejected_input_ids’: […], ‘rejected_attention_mask’: […], ‘rejected_labels’: […]}]
- 从dataset中采样batch,经collator转换并padding为[{“input_ids”: …, “attention_mask”: …, “labels”: …}, …, {“input_ids”: …, “attention_mask”: …, “labels”: …}],其中前半部分为接受样本,后半部分为对应的拒绝样本,依次类推
核心训练代码:
def concatenated_forward(model, batch: dict):
logits = model(**batch).logits
per_token_logps = torch.gather(logits.log_softmax(-1), dim=2, index=batch["labels"].unsqueeze(2)).squeeze(2)
loss_mask = batch["labels"] != -100
logps = (per_token_logps * loss_mask).sum(-1)
logps_avg = logps / loss_mask.sum(-1) # 对数似然,可作为SFT Loss
batch_size = batch["input_ids"].size(0) // 2
chosen_logps, rejected_logps = logps.split(batch_size, dim=0)
chosen_logps_avg = logps_avg[:batch_size]
return chosen_logps, rejected_logps, chosen_logps_avg
# policy model前向
policy_chosen_logps, policy_rejected_logps, policy_chosen_logps_avg = concatenated_forward(model, batch)
# 使用lora算法的reference model前向
ref_context = accelerator.unwrap_model(model).disable_adapter()
with torch.no_grad(), ref_context:
reference_chosen_logps, reference_rejected_logps, *_ = concatenated_forward(model, batch)
# 计算每条样本对的偏好损失
pi_logratios = policy_chosen_logps - policy_rejected_logps
ref_logratios = reference_chosen_logps - reference_rejected_logps
logits = pi_logratios - ref_logratios
losses = (-F.logsigmoid(beta * logits) * (1 - label_smoothing) - F.logsigmoid(-beta * logits) * label_smoothing)
# 添加sft loss
if ftx_gamma > 1e-6:
sft_loss = -policy_chosen_logps_avg
losses += ftx_gamma * sft_loss
# 计算平均loss
loss = losses.mean()