Direct Preference Optimization (DPO): 一种无需强化学习的语言模型偏好优化方法
论文地址:https://arxiv.org/pdf/2305.18290
1. 背景与挑战
近年来,大规模无监督语言模型(LM)在知识获取和推理能力方面取得了显著进展,但如何精确控制其行为仍是一个难题。 现有的方法通常通过**强化学习从人类反馈(RLHF)**来引导模型行为,但RLHF存在以下问题:
- 复杂性高:RLHF需要先训练一个奖励模型来反映人类偏好,然后使用强化学习来微调语言模型,使其在最大化奖励的同时不偏离原始模型太远。
- 不稳定性:RLHF训练过程复杂且容易不稳定,需要大量超参数调优和采样。
- 计算成本高:RLHF涉及训练多个模型和在训练循环中采样,消耗大量计算资源。
2. DPO:一种更简单、更高效的方法
为了解决上述问题,本文提出了一种名为 Direct Preference Optimization (DPO) 的新算法,直接从人类偏好数据中优化语言模型,而无需显式的奖励建模或强化学习。
2.1 DPO 的核心思想
DPO 的核心思想是:
- 将偏好学习问题转化为一个简单的二元分类问题:DPO 通过最大化人类偏好的对数概率,同时最小化不偏好的对数概率,来直接优化语言模型。
- 引入动态重要性权重:为了防止模型退化,DPO 引入了基于隐式奖励模型的动态重要性权重,该权重根据模型对偏好的排序错误程度进行调整。
2.2 DPO 的工作原理
-
构建偏好数据集:从参考模型(通常是经过监督微调的语言模型)中采样生成多个候选响应,并使用人类偏好数据对它们进行标注,生成偏好对 ( y w , y l ) (y_w, y_l) (yw,yl),其中 y w y_w yw 表示更受偏好的响应, y l y_l yl 表示较不受偏好的响应。
-
定义 DPO 损失函数:
L D P O ( π θ ; π r e f ) = − E ( x , y w , y l ) ∼ D [ log σ ( β log π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β log π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] \mathcal{L}_{\mathrm{DPO}}(\pi_{\theta};\pi_{\mathrm{ref}}) = -\mathbb{E}_{(x,y_{w},y_{l})\sim\mathcal{D}}\left[\log\sigma\left(\beta\log\frac{\pi_{\theta}(y_{w}\mid x)}{\pi_{\mathrm{ref}}(y_{w}\mid x)}-\beta\log\frac{\pi_{\theta}(y_{l}\mid x)}{\pi_{\mathrm{ref}}(y_{l}\mid x)}\right)\right] LDPO(πθ;πref)=−E(x,yw,yl)∼D[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]
- π θ \pi_{\theta} πθ:待优化的语言模型。
- π r e f \pi_{\mathrm{ref}} πref:参考模型,通常是初始的监督微调模型。
- β \beta β:控制 KL 散度的超参数,用于平衡奖励最大化与模型偏离程度。
- σ \sigma σ: sigmoid 函数,将输入映射到 (0,1) 之间。
该损失函数鼓励模型生成更受偏好的响应,同时惩罚生成不受偏好的响应。
-
优化模型:
DPO 通过梯度下降法优化上述损失函数,更新模型参数 θ \theta θ。 梯度计算如下:
∇ θ L D P O ( π θ ; π r e f ) = − β E ( x , y w , y l ) ∼ D [ σ ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) ) ( ∇ θ log π ( y w ∣ x ) − ∇ θ log π ( y l ∣ x ) ) ] \nabla_{\theta}\mathcal{L}_{\mathrm{DPO}}(\pi_{\theta};\pi_{\mathrm{ref}}) = -\beta\mathbb{E}_{(x,y_{w},y_{l})\sim\mathcal{D}}\left[\sigma\big(\hat{r}_{\theta}(x,y_{l})-\hat{r}_{\theta}(x,y_{w})\big)\left(\nabla_{\theta}\log\pi(y_{w}\mid x)-\nabla_{\theta}\log\pi(y_{l}\mid x)\right)\right] ∇θLDPO(πθ;πref)=−βE(x,yw,yl)∼D[σ(r^θ(x,yl)−r^θ(x,yw))(∇θlogπ(yw∣x)−∇θlogπ(yl∣x))]
其中, r ^ θ ( x , y ) = β log π θ ( y ∣ x ) π r e f ( y ∣ x ) \hat{r}_{\theta}(x,y) = \beta\log\frac{\pi_{\theta}(y|x)}{\pi_{\mathrm{ref}}(y|x)} r^θ(x,y)=βlogπref(y∣x)πθ(y∣x) 表示隐式奖励模型。
- 当隐式奖励模型对偏好排序错误时,权重 σ ( r ^ θ ( x , y l ) − r ^ θ ( x , y w ) ) \sigma\big(\hat{r}_{\theta}(x,y_{l})-\hat{r}_{\theta}(x,y_{w})\big) σ(r^θ(x,yl)−r^θ(x,yw)) 更大,这意味着模型会更多地关注那些排序错误的样本,从而更有效地纠正错误。
- 梯度更新方向:增加偏好响应的对数概率,同时减少不偏好响应的对数概率。
3. DPO 的优势
- 无需显式奖励建模:DPO 直接从偏好数据中学习,无需训练单独的奖励模型,简化了训练流程。
- 无需强化学习:DPO 使用简单的二元交叉熵损失进行优化,避免了强化学习带来的复杂性和不稳定性。
- 计算效率高:DPO 训练过程更高效,消耗的计算资源更少。
- 性能优越:实验表明,DPO 在控制生成文本的情感、摘要生成和对话生成等任务上,性能优于或至少与现有的 RLHF 方法相当。
4. 实验结果
4.1 情感生成任务
在控制情感生成任务中,DPO 在奖励-KL 散度边界上表现优异,能够在保持低 KL 散度的同时,实现更高的奖励,优于 PPO 等方法。

4.2 摘要生成任务
在 TL;DR 摘要生成任务中,DPO 的胜率(与参考摘要相比)达到 61%,高于 PPO 的 57%。 此外,DPO 对采样温度的鲁棒性更强,而 PPO 的性能在高温下会下降。

4.3 对话生成任务
在 Anthropic HH 对话数据集上,DPO 是唯一一种在计算效率高的前提下,能够超越首选完成度的方法,并且其性能与计算成本更高的 Best of 128 基线相当。
4.4 泛化能力
在将 PPO 和 DPO 策略应用于不同分布(CNN/DailyMail 新闻文章)时,DPO 仍然优于 PPO,表明 DPO 策略具有较好的泛化能力。
4.5 GPT-4 评估与人类评估的一致性
为了验证 GPT-4 评估的可靠性,本文进行了人类研究,发现 GPT-4 的判断与人类判断的一致性较高,表明 GPT-4 是人类评估的合理代理。
5. 讨论与未来方向
- DPO 策略的泛化能力:DPO 策略在不同分布上的表现如何?与从显式奖励函数中学习相比如何?
- 奖励过度优化问题:DPO 中是否存在奖励过度优化问题?图 3 中性能的轻微下降是否是其表现?
- DPO 的可扩展性:DPO 能否扩展到更大规模的模型?
- GPT-4 评估的改进:如何更好地从自动化系统中获取高质量的判断?
- DPO 的其他应用:DPO 的应用范围可以扩展到其他模态的生成模型训练。
6. 总结
DPO 是一种无需强化学习的语言模型偏好优化方法,具有以下优势:
- 简化训练流程:无需显式奖励建模和强化学习。
- 计算效率高:训练过程更高效,消耗资源更少。
- 性能优越:在多个任务上表现优于或至少与现有的 RLHF 方法相当。
DPO 为训练更强大的、对齐的语言模型提供了一种更简单、更高效的方法。
相关文章:
Direct Preference Optimization (DPO): 一种无需强化学习的语言模型偏好优化方法
论文地址:https://arxiv.org/pdf/2305.18290 1. 背景与挑战 近年来,大规模无监督语言模型(LM)在知识获取和推理能力方面取得了显著进展,但如何精确控制其行为仍是一个难题。 现有的方法通常通过**强化学习从人类反馈&…...
跟我学C++中级篇——容器的连接
一、数据的整合 在实际的开发场景中,经常可以遇到以下的情况:有几个地方的数据需要整合在一起。解决办法也有很多,在不同的层面有不同的解决方式。比如经过清洗可以把非关系型数据转为关系型数据。但在底层编程的情况中会发现有几情况&#…...
java求职学习day15
多线程 1 基本概念 1.1 程序和进程的概念 (1)程序 - 数据结构 算法,主要指存放在硬盘上的可执行文件。 (2)进程 - 主要指运行在内存中的可执行文件。 (3)目前主流的操作系统都支持多进程&a…...
【脚本】如何禁用谷歌浏览器自动更新
这里写自定义目录标题 问题描述解决方法代码 问题描述 最近更新系统以后,发现chrome老是自己更新,导致我的代码也得跟着他更新,就跟一个拜托不掉的狗皮膏药一样。 解决方法 于是我写了一个脚本,以下代码都是bash代码࿰…...
【Linux】华为服务器使用U盘安装统信操作系统
目录 一、准备工作 1.1 下载UOS官方系统 1.2制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64),地址:统信UOS生态社区 - 打造操作系统创…...
WPF3-在xaml中引用其他程序集的名称空间
1. 如何在XAML里引用类库中的名称空间和类2. 小结 1. 如何在XAML里引用类库中的名称空间和类 首先需要记住一点:把类库引用到项目中是引用其中名称空间的物理基础,无论是C#还是XAML都是这样。 一旦将一个类库引用进程序,就可以引用其中的名…...
Python 在Word中添加、或删除超链接
在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…...
基于 WPF 平台使用纯 C# 实现动态处理 json 字符串
一、引言 在当今的软件开发领域,数据的交换与存储变得愈发频繁,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁、易读、便于解析和生成的特点,被广泛应用于各种应用程序中。在 W…...
「全网最细 + 实战源码案例」设计模式——单例设计模式
核心思想: 属于创建型设计模式,核心目的是确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。 控制共享资源的访问(如数据库链接、配置管理、日志处理器等) 真实世界类比:政府…...
第01章 19 通过点数据逐级构建球体体数据的综合性小例子
用VTK库来创建一个三维图像数据(vtkImageData),并填充标量数据以表示一个球体的体数据。球的半径为50,体数据的空间间隔为1.0/1000。 首先,我需要包含VTK的头文件,并且创建一个vtkImageData对象。然后&…...
CVE-2024-23897-Jenkins任意文件读取漏洞复现
content Jenkins是什么CVE-2024-23897总结修复建议 Jenkins是什么 Jenkins是一人基于Java开发的、可扩展的持续集成引擎,用于持续、自动地构建/测试软件项目,可以监控一些定时执行的任务。 官网文档: Jenkins是一款开源 CI&CD 软件&…...
前端react后端java实现提交antd form表单成功即导出压缩包
前端(React Ant Design) 1. 创建表单:使用<Form>组件来创建你的表单。 2. 处理表单提交:在onFinish回调中发起请求到后端API,并处理响应。 import React from react; import { Form, Input, Button } from ant…...
基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
摘要 本文分为两部分:Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置,可以实现用VSCode操作虚拟机。为了后续工作,搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础,包…...
接口(完)
大家好,今天我们着重来总结一下接口的知识,并且将接口和抽象类的区别罗列一下,帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!…...
数据结构——实验七·排序
欢迎各位大佬们来到Tubishu的博客🌟 Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥 求各位大佬们垂怜🔥点赞评论一下呗🔥🔥 本文专栏 ➡️ 数据结构 …...
JVM堆空间
JVM(Java虚拟机)堆空间是Java内存管理的核心区域之一,用于存储Java对象实例。以下是关于JVM堆空间的详细介绍: 1. 堆空间的作用 • 存储对象实例:几乎所有的Java对象实例(通过new关键字创建的对象…...
【详细】SSH公私钥认证与渗透测试攻击场景
SSH(Secure Shell)是一个用于远程登录和执行命令的网络协议,其认证方式通常有两种:基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制,并探讨在渗透测试场景中,如何利用对靶机具有读取和…...
常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...
C++异步future
🌎 C11异步futrue 文章目录: C11异步futrue future介绍 应用场景 future操作 std::async函数模版 std::packaged_task类模版 std::promise类模版 🚀future介绍 std::future是C11标准库…...
Oracle 12c 中的 CDB和PDB的启动和关闭
一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...
别再手动拆任务了!用CrewAI+DeepSeek打造你的第一个AI小团队(附PDF解析实战)
用CrewAI构建自动化AI团队:从PDF解析到智能协作实战 在传统AI开发中,开发者往往需要手动编写复杂的任务流程,像指挥一个士兵完成所有战斗。而CrewAI带来的革命性变化在于——它让你能够组建一支训练有素的AI特种部队,每个成员各司…...
别再手动同步了!利用STM32定时器主从模式与ITR触发,实现硬件级精准定时联动
嵌入式系统中的定时器协同:STM32主从模式与ITR触发的硬件级联动 在工业控制、电机驱动和精密测量等场景中,多个定时器的精确协同往往是系统可靠性的关键。想象一下,当你的电机控制PWM需要与电流采样ADC严格同步,或者多个通信接口必…...
OpenClaw对接Qwen3-VL:30B:飞书智能助手配置
OpenClaw对接Qwen3-VL:30B:飞书智能助手配置 1. 为什么选择这个组合? 去年我在团队内部尝试搭建一个能处理图片和文本的智能助手时,遇到了三个痛点:一是商业API调用成本太高,二是数据安全性无法保证,三是…...
TAICHI-flet终极排障指南:从新手到高手的完整解决方案
TAICHI-flet终极排障指南:从新手到高手的完整解决方案 【免费下载链接】TAICHI-flet 基于flet的一款windows桌面应用,实现了浏览图片、音乐、小说、漫画、各种资源的功能。 项目地址: https://gitcode.com/GitHub_Trending/ta/TAICHI-flet TAICHI…...
Jetson Nano/Xavier NX上,手把手解决Realsense D435i IMU数据丢失的完整配置流程
Jetson Nano/Xavier NX上解决Realsense D435i IMU数据丢失的实战指南 当你兴奋地启动Realsense D435i摄像头,准备获取IMU数据来增强你的机器人项目时,却发现虽然IMU话题存在,但数据流却空空如也——这种挫败感我深有体会。作为在Jetson平台上…...
Markdown Viewer 突破限制:全新自定义主题功能释放创作潜能
Markdown Viewer 突破限制:全新自定义主题功能释放创作潜能 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 副标题:如何通过自定义主题功能实现文档视觉体…...
7天打造智能助理:OpenClaw+Qwen3-VL:30B飞书开发周计划
7天打造智能助理:OpenClawQwen3-VL:30B飞书开发周计划 1. 为什么选择这个组合? 去年冬天,我偶然在GitHub上发现了OpenClaw这个项目。当时我正在为团队寻找一个既能处理日常办公自动化,又能理解图片内容的智能助手方案。传统的RP…...
ViGEmBus如何解决Windows游戏控制器兼容性难题?
ViGEmBus如何解决Windows游戏控制器兼容性难题? 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核模式驱动程序&a…...
Python多进程+ZeroMQ+内存映射=真无锁?资深架构师用17个生产事故告诉你为什么92%的“去GIL”方案在高并发下静默失败
第一章:Python无锁GIL环境下的并发模型避坑指南Python 的全局解释器锁(GIL)长期被误认为是“无锁”环境,实则恰恰相反——GIL 是 CPython 解释器中一把严格的互斥锁,它确保任意时刻仅有一个线程执行 Python 字节码。所…...
Mojo+Python混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)
第一章:MojoPython混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)在将 Mojo 模块嵌入 Python 3.11 环境的 CI/CD 流水线中,首次构建即触发运行时崩溃。核心现象为 mojo_runtime_init() 在 Python 进程内调用后立即…...
