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…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
