DPO介绍+公式推理

news/2025/3/31 13:46:34/文章来源:https://www.cnblogs.com/GreenOrange/p/18798910

1. 什么是DPO?

DPO(Direct Preference Optimization)是一种用于对齐大语言模型(LLMs)的新型方法,旨在高效地将人类偏好融入模型训练中。它提供了一种替代强化学习(如 RLHF, Reinforcement Learning with Human Feedback)的方式,能够直接优化偏好数据,而无需显式地引入奖励模型(Reward Model)或策略梯度方法。

所以DPO到底是什么?

我们先看看训练DPO需要的数据集形式:

{"prompt": "What are the benefits of meditation?","chosen": "Meditation helps reduce stress, improve focus, and enhance emotional well-being.","rejected": "Meditation is sitting quietly for a while, but it may not help everyone."
}

给一个提示词,给两个选择,chosen是人选的,rejected是人不选的,现在希望LLM也能像人一样选对,这就是对齐人类偏好。

之前的解决方案是RLHF,但是RLHF需要用到PPO算法,而PPO算法需要训练策略网络和价值网络,训练成本过高,而PPO是一种成本低很多,而且很简单的方式。

2. 具体算法

2.1 KL散度

先上公式:

\[ KL(P||Q)=\sum_{x\in X}P(x)\log\left(\frac{P(x)}{Q(x)}\right) \]

这个在LLM训练中很常见,在PPO算法中也介绍过,主要约束模型在参数更新过程中不能变化太大,保证模型基本的能力。

2.2 Bradley-Terry模型

先说这个模型的作用就是根据成对比较的胜负结果估计选项的相对偏好或胜率。也就是通过两两比较来估计该模型中每一个相对元素的实力。

举个例子:

已知,

对战
A 对 B 8 4
A 对 C 3 5

显然可以看出A比B强点,A比C弱一点,所以强度排名:C > A > B,但是我再问一句,A打败B的概率又是多少呢?

是这样的呢:

对战
A 对 B 4 7
A 对 C 7 12

能不能评估出B和C谁更强一点?如果再加入D,E,F,G这些别的选手呢,对局的场数非常非常多了,有没有什么办法能给这些角色排个名呢?那如果我能用一个数字来量化每个角色强度的话,排名是不是就很容易了?Bradley-Terry就是用来做这个的。

首先我们用\(\alpha\)来表示一个角色的实力,\(\alpha_i\)来表示第\(i\)个角色的实力,如果A比B强,那么\(P(A > B)=\frac{\alpha_A}{\alpha_A+\alpha_B}\)是不是就应该越大越好,最起码得大于0.5,那这个\(P(A > B)\)​就表示A打败B的概率,回忆一下学过的最大似然估计,这个时候是不是就能派上用场了。

这里直接快进到求完对数的步骤:

\[\ln L = 8\ln\left(\frac{\alpha_A}{\alpha_A+\alpha_B}\right)+4\ln\left(\frac{\alpha_B}{\alpha_A+\alpha_B}\right)+3\ln\left(\frac{\alpha_A}{\alpha_A+\alpha_C}\right)+5\ln\left(\frac{\alpha_C}{\alpha_A+\alpha_C}\right) \]

其中\(L\)是我们要估计的似然值,在这里,既然只需要量化实力,那就需要一个参照值,我们将A的实力设置为1,也就是\(\alpha_A\)为1,那我们分别对\(\alpha_B\)\(\alpha_C\)求偏导等于0可以算出\(\alpha_B=0.5\)\(\alpha_C=\frac{5}{3}\),这样就能算出B战胜C的概率,\(P(B > C)=\frac{\alpha_B}{\alpha_B+\alpha_C}\approx0.23\)

这个\(\alpha\)值对应到PPO算法里面就是奖励值\(r\),下标也不用\(i\)了换一种表示形式\(\alpha_i\)变成了\(r(x, y_l)\)\(r(x, y_w)\),其中\(x\)表示prompt,\(y_l\)表示人类不是很偏向的回答,\(y_w\)表示人类偏好的回答,因此\(P(A > B)=\frac{\alpha_A}{\alpha_A+\alpha_B}\)就变成了

\[P(y_w > y_l)=\frac{r(x,y_w)}{r(x,y_w)+r(x,y_l)} \]

我们不喜欢负数,不妨都加一个指数,式子就变成了

\[P(y_w > y_l)=\frac{\exp(r(x,y_w))}{\exp(r(x,y_w))+\exp(r(x,y_l))} \]

做最大似然估计,目标就变成了

\[\mathbb{E}_{(x,y_w,y_l)\sim D}\left[\ln\frac{\exp(r(x,y_w))}{\exp(r(x,y_w))+\exp(r(x,y_l))}\right] \]

要让它最大化,但是我们的\(loss\)值一般是最小化,所以加个负号就行。

由于sigmod函数表达式为:

\[\sigma(x)=\frac{1}{1 + \exp(-x)} \]

因此,可以做如下变化:

\[\begin{align*} \text{Loss}&=-\mathbb{E}_{(x,y_w,y_l)\sim D}\left[\ln\frac{\exp(r(x,y_w))}{\exp(r(x,y_w))+\exp(r(x,y_l))}\right]\\ &=-\mathbb{E}_{(x,y_w,y_l)\sim D}\left[\ln\frac{1}{1 + \exp(r(x,y_l)-r(x,y_w))}\right]\\ &=-\mathbb{E}_{(x,y_w,y_l)\sim D}\left[\ln\sigma(r(x,y_w)-r(x,y_l))\right]\\ &=-\ln\sigma(r(x,y_w)-r(x,y_l)) \end{align*} \]

到此,Bradley-Terry模型就介绍完了。其中的\(r\)我们可以类比成PPO里的奖励值。

2.3. DPO

我们先看DPO的训练目标是什么,肯定就是在尽可能拿多奖励的同时又不至于变化太大,也就是最大化以下目标:

\[\mathbb{E}_{x\sim D,y\sim\pi}[r(x,y)] - \beta\mathbb{D}_{KL}[\pi(y|x)||\pi_{ref}(y|x)] \]

再做一些数学变换:

\[\begin{align*} &\max_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}[r(x,y)] - \beta\mathbb{D}_{KL}[\pi(y|x)||\pi_{ref}(y|x)]\\ =&\max_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}[r(x,y)] - \mathbb{E}_{x\sim D,y\sim\pi}\left[\beta\log\frac{\pi(y|x)}{\pi_{ref}(y|x)}\right] \tag{1}\\ =&\max_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[r(x,y) - \beta\log\frac{\pi(y|x)}{\pi_{ref}(y|x)}\right] \tag{2}\\ =&\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi_{ref}(y|x)}-\frac{1}{\beta}r(x,y)\right] \tag{3} \end{align*} \]

步骤(1)是对KL散度的展开,步骤(3)是加了个负号然后除了一个\(\beta\),除以一个常数不影响参数更新,虽然写的等号但是其实不相等,不过这样做对结果没有影响。

后续步骤:

\[\begin{align*}&=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi_{ref}(y|x)}-\log\exp\left(\frac{1}{\beta}r(x,y)\right)\right] \tag{4}\\ &=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}\right] \tag{5}\\ &=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)\frac{1}{Z(x)}Z(x)}\right] \tag{6}\\ &=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}-\log Z(x)\right] \tag{7} \end{align*} \]

步骤(4)对\(r(x, y)\)同时取指数和对数,步骤(5)利用对数函数的性质,步骤(6)引入了一个\(Z(x)\),由于是恒等变换,只要这个\(Z(x)\)不等于0,取什么都是可以的,因此作者取\(Z(x)=\sum_y \pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)\),为什么这么取,因为这么取完之后\(\frac{\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}{\sum_y\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}\)是一个概率,\(\sum_y{\frac{\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}{\sum_y\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}} = 1\)

现在我们处理步骤(7)第一个log下面那一坨复杂的东西,不妨给它一个代号\(\pi^*\),即:

\[\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)=\frac{\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}{\sum_y\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)}=\pi^*(y|x) \]

先往下推理:

\[\begin{align} &=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi^*(y|x)}-\log Z(x)\right] \tag{8}\\ &=\min_{\pi} \mathbb{E}_{x\sim D,y\sim\pi}\left[\log\frac{\pi(y|x)}{\pi^*(y|x)}\right] \tag{9}\\ &=\min_{\pi} \mathbb{E}_{x\sim D}\left[\mathbb{D}_{KL}(\pi(y|x)||\pi^*(y|x))\right]\Rightarrow \pi(y|x)=\pi^*(y|x)=\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right) \tag{10} \end{align} \]

对于步骤9,我们要更新的是策略\(\pi\)的参数,而\(\pi_{ref}\)是参照模型,是不需要更新参数的,也就是说在优化目标式中它是一个常数,可以直接丢掉,对于步骤(10),我们发现步骤(9)就是符合KL散度定义的,其实不这么引入也行,要最小化步骤(9)的式子,我们使\(\pi(y|x)=\pi^*(y|x)\)即可。因此得到了步骤(10)的最后一个式子也就是

\[\pi(y|x)=\pi^*(y|x)=\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right) \]

也就是

\[\pi(y|x)=\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right) \]

推理一下:

\[\begin{align*} \pi(y|x)&=\frac{1}{Z(x)}\pi_{ref}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)\tag{1}\\ \Rightarrow\exp\left(\frac{1}{\beta}r(x,y)\right)&=\frac{\pi(y|x)}{\pi_{ref}(y|x)}Z(x)\tag{2}\\ \Rightarrow r(x,y)&=\beta\ln\left(\frac{\pi(y|x)}{\pi_{ref}(y|x)}Z(x)\right)\tag{3}\\ \Rightarrow r(x,y)&=\beta\ln\frac{\pi(y|x)}{\pi_{ref}(y|x)}+\beta\ln Z(x)\tag{4} \end{align*} \]

那我们现在知道\(r(x,y)\)了,我们之前提到过\(P(y_w > y_l)=\frac{r(x,y_w)}{r(x,y_w)+r(x,y_l)}\)​,那给了我们很多偏好数据,也就是两两比较的数据,我们是不是也能对他们做一个最大似然估计呢?之前我们提到的Bradley-Terry模型的损失函数:

\[Loss = =-\ln\sigma(r(x,y_w)-r(x,y_l)) \]

这里将\(r(x, y)\)带入

\[\begin{align*} &-\ln\sigma(r(x,y_w)-r(x,y_l))\\ =&-\ln\sigma\left(\beta\ln\frac{\pi(y_w|x)}{\pi_{ref}(y_w|x)}+\beta\ln Z(x)-\beta\ln\frac{\pi(y_l|x)}{\pi_{ref}(y_l|x)}-\beta\ln Z(x)\right)\\ =&-\ln\sigma\left(\beta\ln\frac{\pi(y_w|x)}{\pi_{ref}(y_w|x)}-\beta\ln\frac{\pi(y_l|x)}{\pi_{ref}(y_l|x)}\right) \end{align*} \]

就得到了DPO的最终优化目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习安装配置vue

1.先将nodejs下载2.在我们的安装目录下,创建名为node_cache和node_global的两个文件夹 3.打开cmd窗口,执行如下命令,将npm的全局模块目录和缓存目录配置到刚才创建的那两个目录。 npm config set prefix “D:\soft2024.7.6\nodejs\node_global” npm config set cache “D:\…

K8s Ingress, 你这个老6

Ingress 这个老6,结合nodeport和ClusterIp两种服务类型,你在引流这一块玩的花啊。 入口一夫当关,对内如鱼得水。本文是有态度马甲的第185篇原创。 本文记录了k8s中核心对象Ingress的产生背景和实现机制。 我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务…

C# .NET core 中处理图像,SkiaSharp,ImageSharp,NetVips,Magick.net多维度对比

2025年有哪些图像处理库,我们可以在项目中使用哪些库?本文列出了最流行的现有库。 .NET Core图片处理库SkiaSharp(https://github.com/mono/SkiaSharp) Magick.net(https://github.com/dlemstra/Magick.NET) ImageSharp(https://github.com/SixLabors/ImageSharp) NetV…

20243317 实验二《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2433 姓名: 邓雅文 学号:20243317 实验教师:王志强老师 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1、掌握python中函数定义与调用相关知识点 大致框架与C语言相同,同样有实参,形参,可能有返回值,形式如下: def 函数名…

MEBCY-v2

MERCY-v2 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.158.1 00:50:56:c…

人群密度分析预警摄像机

人群密度分析预警摄像机是可以实时地统计出一个指定区域内的总人数。当所监视区域的人员数量达到设定的阀值时摄像机输出报警信号。可设置人数阈值和时间阈值。用于设置触发进入区域内的人数值,达到该设定的阈值则摄像机输出报警信号。人数阈值可以手动设置,系统默认值为5人,…

CloudFlare DNS实现根域名跳转WWW域名,301跳转

0. 目的 托管在CloudFlare上的域名,已配置好www.bktai.com,想在用户访问根域名https://bktai.com时,重定向到 https://www.bktai.com. 为什么是重定向而不是同时可以访问?搜索引擎会搜到重复的内容,且维护两套路径都能正常工作,会造成混乱。 1. 配置根域名 点击自己要设置…

day:32 jmeter及性能测试——介绍

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

第六周第五天

所用时间:405分钟 代码量(行):689 博客量(篇):20 了解到的知识点: 1.VLAN的创建与划分 今天进行了计算机网络的实验一,在昨天下载的packet tracer上进行,实现了VLAN的创建与划分,进行跨交换机的相同vlan之间的计算机和不同vlan之间的计算机的通信实验2.树状结构查询…

独立按键控制LED数码管

前言 通过1个独立按键,控制LED数码管显示字符。 结合之前我的两篇文章独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974数码管静态显示 https://www.cnblogs.com/luckydoog/p/18797690效果原理 提前在程序里存储共阴极数码管的编码表,能表示的字符范…

day:32 jmeter操作数据库——参数化

一、数据库通过用户参数设置变量 1、建一个查询的jdbs请求2、前置处理器中添加用户参数3、修改线程数4、查看结果二、txt文档实现参数化 1.编辑sql语句中导入变量${变量名}新建一个txt文档:data 命名导入txt文档运行以上内容是将sql语句写入到txt文档中引用 2. 将数据写入txt文…