来自:克鲁斯卡
OpenAI发布了 o1之后,LLM领域又掀起了Inference Scaling Law的热潮,此次推理能力的大幅提升其中就有强化学习的参与,其利用 RL 改进模型思维链的中间步骤,得到了更好的答案。
LLM发展到现在这个阶段,从最初的 Pre-training 到现在的 Post-training,也是有了明显的范式变化。其中 Post-training 中对齐的方法也比较多了,从最初的 RLHF 到现在的各种O,各有优劣。标准的RLHF流程虽然清晰明了,但是相对来说实现起来更加复杂,而DPO就是旨在简化对齐这一过程,同时保持甚至提高性能。
本文就逐步骤的推理一下DPO(Direct Preference Optimization)算法的设计,希望能够通过细致的推导帮助理解算法背后的原理。
总体文章结构如下:
在推导之前,还是先了解下RLHF的做法。
1. RLHF
1.1 RLHF 架构
如图 1 所示,RLHF(Reinforcement Learning with Human Feedback)的完整流程包含三个阶段:
-
Self-Supervised Pre-Training
:在大量无标注的文本上训练LLM,得到一个base model
-
Supervised Fine-Tuning(SFT)
:使用QA数据对base model进行指令微调(Instruct Tunning),得到chat model
,一般可以把这个复制一份作为后续使用的参考模型
-
-
Preference Sampling
:输入准备好的问题到
,得到答案后,人为标注偏好数据集
-
Reward Learning
:使用偏好数据训练奖励模型
,使其能分辨哪个更好
-
RL Finetuning
:使用奖励模型的指导,利用强化学习进一步微调,对齐人类偏好,比如近端策略优化(PPO),至少会用到上述的
、
、
图1:RLHF总体框架
由上述流程可以看到,RLHF的关键组成是奖励模型和PPO强化学习微调部分,前者的难点在于数据的构造以及奖励模型的准确性,而后者则是RL的通病,难以训练。Pre-training 和 SFT 老生常谈了,先关注下
-
-
还是先从 RLHF 开始,方便后面理解DPO推导以及其优化的点。
1.2 训练奖励模型
偏好数据包括相同提示
的两个回复
和
,组成一个样本
训练奖励模型的目标是让好回答获得更高的分数,尽量对齐人类的偏好,其损失函数如下:
进而可以得到奖励模型的训练目标:
其中:
-
-
-
是问题(prompt),
和
分别是好回答和差回答。
目标非常简单明了:让好回答的得分比差回答高,从而拉大它们之间的差距。
细节解释
-
:期望值代表在所有训练数据上的平均表现,模型不仅要学会在单个问题上判断好坏,还要在不同问题上都能正确地给出评分。
-
:这个部分表示从数据集
中随机采样一组问题和回答。
-
即 Sigmoid 函数,用来将两个回答的得分差距转换为 0 到 1 之间的概率。这个值越接近 1,表明模型更加确信好回答要明显优于差回答;如果值接近 0.5,则表示模型无法很清晰地分辨两者的好坏。这个公式的核心目标就是
最大化好回答与差回答得分差距的概率
。
-
🔥
总结
:通过这个训练过程,我们希望构建一个模型,它能通过对问题的不同回答打分,从而确保好的回答总是能得到更高的分数,而差的回答则分数较低。这个模型随着训练会逐渐提高对好坏回答的区分能力。
上述是训练奖励模型的损失函数,至于为什么要这么设置,下面章节会详细解释
建议阅读,帮助理解 DPO 公式,也可直接跳过,看第二部分
1.2.1 损失函数推导
双偏好奖励损失
Bradley-Terry 模型
奖励模型
的训练通常使用
Bradley-Terry 模型
,这是一个经典的用于排序和偏好建模的统计模型。它的目的是通过
将不可观测的隐性分数映射到明确的偏好上
,以估计两个输出间的偏好概率。
Bradley-Terry 模型是一种经典的统计模型,最初用于描述竞赛和比较的结果。在这个模型中,如果两个对象
和
相互竞争,模型会为每个对象分配一个“隐性得分”
和
,用来表示各自的“实力”或“偏好值”。模型的核心思想是:
对象获胜的概率取决于两个对象得分的相对大小
。具体来说,对于
和
,获胜的概率计算为
这个模型可以自然地推广到排序问题,即如何根据各个对象的得分来预测哪一个更优。
在此模型中,给定输入prompt
和两个候选回复
和
,
表示模型认为回复
比
更优的概率。这个概率计算如下:
这里,
和
分别表示两个答案的“评分”经过指数化后的值
引入Sigmoid 函数
将上式进一步变形,可以得到一个更简洁的表达:
其中
是 sigmoid 函数,定义为:
具体推导过程如下:
概率建模
为了训练奖励模型
,我们希望通过
最大化 模型正确判断偏好的概率
来优化参数。这意味着我们需要构建一个损失函数,使得
现在我们用二分类的方式模拟上述过程,引入
交叉熵损失
(Cross-Entropy Loss),其用于衡量模型预测的概率分布与实际目标分布之间的差异。转换一下:
-
-
如果
,情况正好相反。因此,可以构建如下的二分类损失:
简化为奖励模型的损失函数
对于有明确的偏好对的数据(即知道
比
更优,因此
总是 1,这样可以简化损失表达式:
通过这种方式,我们将
概率表达式
与
交叉熵损失
联系了起来,构建了一个可以用于优化的损失函数。核心思想是:
最大化模型正确判断偏好的概率
,即最小化预测错误的损失,让奖励模型学会这种预测模式。
多偏好奖励损失
Plackett-Luce
上面我们使用Bradley-Terry模型结合交叉熵,推导出来奖励模型的优化目标,但是这是针对只有两个回复的情况
。而对于超过两条回复的情况,则需要使用
Plackett-Luce 模型
来进行推导。
Plackett-Luce模型是一种经典的概率排序模型,用于描述多项选择或多项排序的情况。与Bradley-Terry模型主要处理两个对象间的偏好不同,Plackett-Luce模型适用于
多个对象
的排序问题。在Plackett-Luce模型中,每个对象都会被分配一个“隐性得分”
,用于表示其相对的“偏好强度”或“选择可能性”。模型的核心思想是:在多项选择中,某个对象被选中的概率由该对象的隐性得分相对于所有候选对象隐性得分的总和来决定。
比如对于一个输入
,我们有
个候选回复
。我们手动的逐个为这些回复进行了排序,记为
,表示
是最优的,
次之,以此类推。
排序概率的计算
Step 1: 选出第一个回复
首先,我们希望计算在给定prompt
时,哪个回复是最好的概率。模型为每个回复计算一个得分
,然后通过指数化得到一个正值
,代表人类对该回复的相对“偏好”。
指数函数
有个很好的特性:无论
是什么值,指数变换后的结果都会是正数,并且指数变换还保留了奖励的相对大小关系。
第一个被选出的最优回复
的概率可以表示为:
这表示
的概率是其得分占所有回复得分之和的比重,分母部分确保了所有回复的概率总和为 1。
Step 2: 选出第二个回复
选出第一个回复后,接下来从剩下的
个回复中选出第二个最优的
。我们假设第一个回复
已经被选出,那么第二个回复的概率可以写为:
这表示我们从剩余回复中选择
的概率,分母只考虑除
之外的回复。
Step 3: 持续选择,直到最后一个
我们继续这个过程,直到选出最后一个回复
。整个排序的联合概率为:
概率建模
在二分类情况下,我们使用交叉熵损失来最大化正确分类的概率。在这里,我们可以借鉴相同的思想:通过最大化
模型预测的排序概率与人类排序一致的概率
来优化模型。
也就是,如果人类排序为
,我们希望模型给出同样排序的概率
尽可能大。
在概率模型中,直接最大化概率有时会遇到数值上的不稳定问题,所以常见的做法是
最小化负对数似然
。从数学上讲,
最小化负对数似然等价于最大化模型预测的概率
,换句话说,NLL 越小意味着模型预测的排序与人类偏好越一致。
负对数似然的数学形式来源于对概率
的对数进行取负号:
使用对数概率可以使优化过程更加稳定,将概率变换为 一个更线性和数值上更稳定的值域,避免了在极小概率(接近 0)时数值计算的问题。同时,通过对数函数,乘法变加法,在后续多步选择过程中,可降低复杂度,使梯度计算和优化更加高效。
简化为奖励模型的损失函数
详细解释下多回答偏好数据集下奖励模型的损失函数:
-
求和
:对每个候选回复的偏好顺序
进行求和。也就是说,模型逐层选择每一个候选回复(从第一个到第
个)的概率,构建整个偏好顺序的联合概率
-
打分
:奖励模型
为第
个候选回复
给出的偏好打分。在输入prompt
下,模型认为
回答的有多好
-
-
分子:最大化当前选中回复
的偏好得分
相对于其他候选回复的偏好得分之和。
-
分母:分母部分是当前未选中的回复得分的总和,公式
表示所有还未被选中的回复在当前层次的得分归一化项。模型通过比较
的偏好得分和其他答案偏好得分之和,计算该回复在剩余候选项中的相对优越性。
对于每一个被选中的回复
,模型的目标是最大化其得分
与剩余候选回复得分之和的对数差值。换句话说,我们
希望被选中的回复得分越高,剩余未选中的回复得分越低
。通过最大化这个差值,模型将逐步优化多回复的排序结构。
1.3 使用强化学习(RL)
在经过上述的推导之后,假设我们已经有了一个能够评分的奖励模型,接下来使用强化学习(RL)来优化模型的输出。我们希望模型生成的回答不仅得分高,还不能偏离原有的回答风格。
因此,利用上述提到的三个模型,RLHF 目标可以被表述为一个受约束的优化问题:
其中:
-
:我们要训练的目标模型(也称为策略模型),让其生成符合人类偏好的回答
-
-
🔥这个公式的含义是,我们希望
生成的回答分数尽可能高(最大化预期奖励)
,但同时不希望模型在生成过程中
偏离参考模型太多
,以避免生成一些没有意义的内容(作弊赢得奖励)。
细节解释(可跳过)
-
-
:表示给定
,根据当前策略采样输出
,这里的策略
是参数化的,描述了模型在给定输入
时生成输出
的概率分布
-
:这是 KL 散度,用来衡量训练中的新模型和参考模型之间的差异
-
:这个超参数决定了在训练过程中对 KL 散度的重视程度。
越大,模型越不会偏离参考模型
以上就是 RLHF 的总体目标,对应图 1 中 Post-Training 的部分,整体训练的过程,还涉及到一个在线迭代的训练方式,这也是比 DPO 灵活的地方,我们在推导完 DPO 之后再做对比。
RLHF虽好,但是有很多难点需要解决,简单列举几个:
-
计算复杂:上述过程要至少用到三个模型,对资源要求较高
-
采样过程不可微:输出序列涉及到采样,这个过程并不是连续函数,因此不存在明确的梯度,就不能用传统的梯度下降来优化
-
训练不稳定:上述过程有非常多的不确定性,比如奖励模型的训练质量、数据偏差等,还有RL非常多的超参需要调整,都会影响整个训练过程
在看完了 RLHF 的过程,我们再来看看 DPO 是怎么做的,尤其是对以上难点的优化
2. DPO 推导
2.1 DPO 架构
DPO 的目的就是为了克服RLHF 的诸多缺点,让alignment 变成熟悉的 SFT 风格。
如图 2 所示,一句话:
DPO 是直接优化策略
,而不需要进行显式的奖励计算或使用强化学习算法。
注意对比两个框架图的不同
图2:DPO总体框架
话不多说,继续推导,同样从上述受约束的优化问题出发:
为了推导的完整性,此处先不拆分,关键步骤🎈有解释
2.2 详细解释
KL散度相关,公式 (🎈1)
上述推导中,第一步可以转换的关键点在于:
-
KL 散度的定义
:KL 散度本质上是两个分布的对数比的期望值,因此可以直接展开。
-
线性性质
:期望值具有线性性质,所以两个期望值可以合并成一个。KL散度(back-Leibler divergence)是衡量两个概率分布之间差异的常用方法。它的定义是:
KL散度
的数学定义是:
或在连续情况下:
其中,
和
分别是两个概 率分布。直观上,它衡量了使用分布
来近似分布
的信息损失程度。
如果
对所有
成立,那么:
因此,KL散度的值为:
这表明当两个分布
和
完全相等时,KL散度为0,
KL散度在两个分布相等时取最小值
。从物理意义上讲,KL散度可以直观地理解为两个分布之间的“距离”或差异。当两个分布完全相等时,说明它们描述的事物是完全相同的,因此我们不需要额外的信息来描述这种差异。所以,KL散度为0,表示没有差异。
分母归一化,公式(🎈6)
为什么要引入
?
上述推导中,第6步为:
在这里,
是一种概率分布,描述模型在给定输入
时生成不同输出
的概率,
同理。
但是分母中的
是一个
奖励函数
,它衡量某个输出
在给定输入
时的得分或好坏程度。奖励函数的输出是一个数值,可以是正的、负的,或者大于1,甚至小于0,但
这不是概率
,不满足概率的基本性质:
回顾一下DPO或者Alignment的目的:在语言模型的输出中,模型
其实是一个条件概率分布,它描述了在给定prompt
时,输出不同回复
的概率。我们
优化的是这个分布
,使得模型能生成更符合人类偏好的输出。具体方法则是想通过奖励函数
来调整模型的输出概率,使得分更高的答案的生成概率越高。
为什么不能直接使用
?
由于