Direct Preference Optimization
REF: https://zhuanlan.zhihu.com/p/671780768
DPO(Direct Preference Optimization)和 RLHF(Reinforcement Learning from Human Feedback)是两种不同的方法,DPO 是一种直接优化用户或专家偏好的方法。它通过收集用户对模型输出的偏好数据,直接优化模型的参数,使得模型输出更符合用户的偏好,而后者通过收集人类对模型行为的反馈,使用这些反馈来指导强化学习过程,从而优化模型的性能。
优点: DPO 不需要复杂的强化学习算法,直接使用偏好数据进行优化;(更少的计算资源)由于不需要模拟环境和大量的探索,计算资源需求相对较低。
缺点:需要大量的高质量偏好数据,收集这些数据可能成本较高;(适用范围有限)对于一些需要复杂策略和长时间决策的任务,DPO 可能不如 RLHF 有效。
RLHF
RLHF 一般会分 2 步:
第一步是训练 reward model。训练数据是同一个 prompt 的 2 个回答,让人或 GPT4 标注哪个回答更好,reward model 会去优化如下的 loss:
rϕmax{E(x,ywin,ylose)∼D[logσ(rϕ(x,ywin)−rϕ(x,ylose))]}
其中 rϕ 就是 reward model 用来给回答打分。D 是训练数据集,x 是 prompt,ywin 和 ylose 分别是好的回答和不好的回答。也就是说,要尽可能让好的回答的得分比不好的回答高,拉大他们之间的差别。
第二步是用 RL 算法来提升模型的得分。使用的 loss 是:
πθmax{Ex∼D,y∼πθ(y∣x)[rϕ(x,y)]−βDKL[πθ(y∣x)∣∣πref(y∣x)]}
其中 πθ 是我们在训练的 LLM,πref 是训练的初始值。这个 loss 意思是希望 LLM 输出的回答的评分能尽可能高,同时 πθ 不要偏离 πref 太多,保证它还能正常做回答,不要训成一个评分很高但是回答乱码的东西。
DPO 的作者们意识到,后面的这个式子是有显式解的。因为:
πθmax{Ex∼D,y∼πθ(y∣x)[rϕ(x,y)]−βDKL[πθ(y∣x)∣∣πref(y∣x)]}=πθmaxEx∼D,y∼πθ(y∣x)[rϕ(x,y)−βlogπref(y∣x)πθ(y∣x)]=πθminEx∼D,y∼πθ(y∣x)[logπref(y∣x)πθ(y∣x)−β1rϕ(x,y)]=πθminEx∼D,y∼πθ(y∣x)[logπref(y∣x)erϕ(x,y)/βπθ(y∣x)]
先将 KL 散度公式展开,吸收至期望中,再提取一个 −β,和优化目标无关去除即可,即变为最小化,最后合并入 log 中。
如果我们归一化一下分母,即取 Z(x)=∑yπref(y∣x)erϕ(x,y)/β,也就可以构造出一个新的概率分布:
π∗(y∣x)=πref(y∣x)erϕ(x,y)/β/Z(x)
那么上式变成了:
πθminEx∼D,y∼πθ(y∣x)[logπref(y∣x)erϕ(x,y)/βπθ(y∣x)]=πθminEx∼D,y∼πθ(y∣x)[logπ∗(y∣x)πθ(y∣x)−logZ(x)]=πθminEx∼D,y∼πθ(y∣x)[logπ∗(y∣x)πθ(y∣x)]=πθminEx∼DDKL(πθ(y∣x)∣∣π∗(y∣x))
由于 KL 散度在 2 个分布相等时取最小值,我们得到了这样的结论:RLHF 训练希望得到的最优的概率分布就是 π∗*。
另一个角度来说,由 π∗ 的公式,我们相当于是得到了 rϕ 和 π∗ 的关系,那么是否我们可以把训练 rϕ 转化成直接去训练 π∗ 呢?
简单转换一下 π∗ 的定义式,可以得到:
rϕ(x,y)=βlogπref(y∣x)π∗(y∣x)+βlogZ(x)
带入最上面优化 rϕ 的 loss,也就有了:
π∗max{E(x,ywin,ylose)∼D[logσ(βlogπref(ywin∣x)π∗(ywin∣x)−βlogπref(ylose∣x)π∗(ylose∣x))]}
或者说,我们可以直接用这个 loss 去求 πθ:
πθmax{E(x,ywin,ylose)∼D[logσ(βlogπref(ywin∣x)πθ(ywin∣x)−βlogπref(ylose∣x)πθ(ylose∣x))]}
这就是 DPO 的 loss。DPO 通过以上的公式转换把 RLHF 无损地转化为了 SFT,在训练的时候不再需要同时跑 4 个模型(reward model, ref model, critic, actor),而是只用跑 actor 和 ref 2 个模型,甚至由于不再在线采数据,ref model 的输出可以预先存下来,训练的时候重复使用。