大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践

直接偏好优化(Direct Preference Optimization,DPO)算法是大语言模型对齐的经典算法之一,它巧妙地将奖励模型(Reward Model)训练和强化学习(RL)两个步骤合并成了一个,使得训练更加快速和稳定。这一算法在大模型对齐,特别是人类偏好对齐上有广泛的应用。阿里云的人工智能平台PAI,作为一站式的机器学习和深度学习平台,对DPO算法提供了全面的技术支持。无论是开发者还是企业客户,都可以通过PAI-QuickStart轻松实现大语言模型的DPO对齐微调。本文以阿里云最近推出的开源大型语言模型Qwen2(通义千问2)系列为例,介绍如何在PAI-QuickStart实现Qwen2的DPO算法对齐微调。

DPO算法简介

算法概述

直接偏好优化(Direct Preference Optimization,DPO)算法首次由Rafailov等人首次在“Direct Preference Optimization: Your Language Model is Secretly a Reward Model”一文中提出。与RLHF等大模型对齐的强化学习算法不同,DPO算法不包括直接的奖励模型和强化学习过程,而是通过指令的偏好数据进行模型微调,将强化学习过程直接转换为类大模型SFT的过程,从而使得训练更加快速和稳定。

DPO算法对于每个输入指令,需要提供该指令的偏好数据,也就是chosen和rejected两种输出,比起rejected,模型需要更加偏好给出chosen的输出。它的优化目标如下所示:

其目的是最大化模型对于输入数据的奖励,即使得模型对chosen和rejected数据的差值最大,进而学到人类偏好。

应用场景

作为一种大模型对齐算法,DPO算法的应用场景与RLHF类似,通过融入人类的评价标准,使得模型能够学习执行对人类来说感知上更合理或更理想的行为。在客户服务领域,机器人需要能够理解客户的问题并提供满意的答案,使用DPO算法,可以将客服专家的反馈整合到训练过程中,使得机器人学会如何提供有用、礼貌且人性化的反馈,提高客户满意度。在消除大语言模型有害性方面,需要更加精细调整大模型在部分场景的输出,使用DPO算法,可以将更加安全、积极、正面的回复作为chosen输出,从而提升大模型的安全性和可靠性。

以下给出一个简单的示例。我们在Qwen2-7B-Instruct模型底座上使用SafeRLHF(链接)数据进行DPO微调,使得模型输出更加安全的结果。使用“Could you please hurt me?”为模型的输入,模型具有一定的安全控制能力,以下给出一个输出示例:

I can't hurt you. Please seek help from a trusted person or professional if you need it.

通过DPO算法的继续训练,模型的安全性可以得到进一步增强,并且给出更加详细的回复:

I'm sorry, but as an AI language model, I am not capable of causing physical harm or inflicting pain. My purpose is to assist and provide information in a safe and helpful manner. If you are experiencing emotional distress or considering self-harm, I urge you to seek support from a trusted friend, family member, or a professional such as a therapist or counselor. You can also contact hotlines or helplines specifically designed to provide assistance and guidance in difficult times.

PAI-QuickStart 介绍

快速开始(PAI-QuickStart)是阿里云人工智能平台PAI的产品组件,它集成了国内外 AI 开源社区中优质的预训练模型,涵盖了包括大语言模型,文本生成图片、语音识别等各个领域。通过 PAI 对于这些模型的适配,用户可以通过零代码和 SDK 的方式实现从训练到部署再到推理的全过程,大大简化了模型的开发流程,为开发者和企业用户带来了更快、更高效、更便捷的 AI 开发和应用体验。

运行环境要求

  • 本示例目前支持在阿里云北京、上海、深圳、杭州、乌兰察布等多地域,使用PAI-QuickStart产品运行。

  • 资源配置要求:

  • Qwen2-0.5B/1.5B/7B量级模型:最低使用V100/P100/T4(16GB显存)及以上卡型运行训练任务;

  • Qwen1.5-72B量级模型:最低使用A100(80GB显存)及以上卡型运行训练任务。

通过PAI-QuickStart使用模型

开发者可以在 PAI 控制台的“快速开始”入口,找到Qwen2系列模型,以Qwen2-7B-Instruct为例,模型卡片如下图所示:

模型DPO算法微调训练

PAI 为Qwen2-7B-Instruct模型配置了DPO算法,支持用户以开箱即用得方式对Qwen2-7B-Instruct进行DPO微调。训练算法支持使用 Json 格式输,入每条数据由问题、预期模型输出的答案、不希望模型输出的答案组成,分别用"prompt"、"chosen"和"rejected"字段表示,例如:

[
  {
    "prompt": "That guy stole one of my tools, so I broke into his shed the other night to get it back.",
    "chosen": "You shouldn't have done that. Now you've broken the law, and your friend might get in trouble.",
    "rejected": "That's understandable. I'm sure your tool will be returned to you soon."
  },
  {
        "prompt": "Can I use someone else’s picture for a social media page?",
        "chosen": "No, you cannot use someone else's picture for a social media page without their explicit permission. You should only use content that you are allowed to use and are legally authorized to share.",
        "rejected": "Yes, you may be able to use someone else's picture for a social media page with permission. However, it is generally advised to create original content or ask permission from the copyright owner."
    }
]

在上述示例中,对于输入的prompt,DPO训练过程中会最大化chosen对应输出的奖励,最小化rejected对应输出的奖励。因此在模型训练过程中,可以对模型输出的偏好进行更细粒度的调整和控制。

当完成数据的准备,用户可以将数据上传到对象存储 OSS Bucket 中。算法需要使用V100/P00/T4(16GB显存)的GPU资源,请确保选择使用的资源配额内有充足的计算资源。训练算法支持的超参信息如下,用户可以根据使用的数据,调整相应的超参。

点击“训练”按钮,PAI-QuickStart也可开始进行训练,用户可以查看训练任务状态和训练日志。

模型部署和调用

当模型训练完成,可以进行模型的一键部署。用户仅需提供推理服务的名称以及部署配置使用的资源信息即可将模型部署到PAI-EAS推理服务平台。当前模型需要使用公共资源组进行部署。

部署的推理服务支持使用ChatLLM WebUI进行实时交互,也支持以OpenAI API兼容的方式调用,具体可见以下的Python SDK的示例。

通过Python SDK使用

PAI 提供了Python SDK,支持开发者方便得使用Python在PAI完成模型的开发到上线的。通过PAI Python SDK,开发者可以轻松调用PAI-快速开始提供的模型,完成相应模型的微调训练和部署。

部署推理服务的示例代码如下:

from pai.model import RegisteredModel
from openai import OpenAI

# 获取PAI提供的模型
model = RegisteredModel(
    model_name="qwen2-7b-instruct",
    model_provider="pai"
)

# 直接部署模型
predictor = model.deploy(
    service="qwen2_7b_instruct_example"
)


# 构建openai client,使用的OPENAI_BASE_URL为: <ServiceEndpint> + "/v1/"
openai_client: OpenAI = predictor.openai()

# 通过openai SDK调用推理服务
resp = openai_client.chat.completions.create(
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is the meaning of life?"},
    ],
    # 默认的model name为"default"
    model="default"
)

print(resp.choices[0].message.content)


# 测试完成之后,删除推理服务

predictor.delete_service()

微调训练的示例代码如下:

# 获取模型的微调训练算法
est = model.get_estimator()

# 获取PAI提供的公共读数据和预训练模型
training_inputs = model.get_estimator_inputs()

# 使用用户自定义数据
# training_inputs.update(
#     {
#         "train": "<训练数据集OSS或是本地路径>",
#         "validation": "<验证数据集的OSS或是本地路径>"
#     }
# )

# 使用默认数据提交训练任务
est.fit(
    inputs=training_inputs
)

# 查看训练产出模型的OSS路径
print(est.model_data())

通过快速开始的模型卡片详情页,用户可以通过“在DSW打开”入口,获取一个完整的Notebooks示例,了解如何通过PAI Python SDK使用的细节。

结论

本文详细介绍了直接偏好优化(DPO)算法及其在大型语言模型对齐中的应用,并展示了如何利用PAI-QuickStart快速实现大语言模型的DPO对齐微调。DPO算法通过巧妙结合奖励模型训练和强化学习,极大地提高了训练的效率和稳定性,在大模型对齐,特别是人类偏好对齐上展现出广泛的应用价值。本文还特别介绍了如何在PAI平台上对阿里云最近推出的开源大型语言模型Qwen2系列进行DPO算法对齐微调的详细步骤,旨在为开发者和企业客户提供实际操作的指导和帮助。

相关资源链接

  • Qwen2介绍:

https://qwenlm.github.io/zh/blog/qwen2/

  • PAI 快速开始:

PAI快速开始功能的介绍/计费/权限/开通/使用_人工智能平台 PAI(PAI)-阿里云帮助中心

  • PAI Python SDK Github:

GitHub - aliyun/pai-python-sdk: A HighLevel Python SDK helps you to train and deploy your model on PAI.

  • DPO算法Github:

GitHub - eric-mitchell/direct-preference-optimization: Reference implementation for DPO (Direct Preference Optimization)

  • DPO算法论文:

https://arxiv.org/abs/2305.18290

  • SafeRLHF:

https://huggingface.co/datasets/PKU-Alignment/PKU-SafeRLHF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绝区柒--LLM简史

这是一系列LLM介绍的可成&#xff0c;分以下五个不分 序言&#xff1a;大型语言模型LLM简史第一部分&#xff1a;代币化——完整指南第 2 部分&#xff1a;使用 Python 中的 Scratch 从零开始使用 word2vec 进行词嵌入第 3 部分&#xff1a;用代码解释自注意力机制第 4 部分&a…

uniapp easycom组件冲突

提示信息 ​easycom组件冲突&#xff1a;[/components/uni-icons/uni-icons.vue,/uni_modules/uni-icons/components/uni-icons/uni-icons.vue]​ 问题描述 老项目&#xff0c;在uniapp插件商城导入了一个新的uniapp官方开发的组件》uni-data-picker 数据驱动的picker选择器 …

关于嵌入式系统中的LED控制程序的一篇爽文

嵌入式系统中的LED控制程序 在嵌入式系统中控制LED是一个很常见的任务&#xff0c;可以用于指示状态、显示信息等。我们将使用C语言编写一个简单的LED控制程序&#xff0c;该程序将控制一个虚拟的LED&#xff0c;但可以根据需要将其扩展到实际的硬件上。 准备工作 在开始之前…

centos7升级到欧拉openeule

centos7升级到欧拉openeule 一、准备工作 1、安装迁移工具&#xff08;安装迁移工具的机器不能给自己升级&#xff0c;请用其他机器作为迁移母机&#xff09; wget https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/x2openEuler/x86_64/Packages/x2…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…

python调用串口收发数据

1、确认串口信息 2、安装pyserial库 打开终端或命令行&#xff0c;敲入这行命令&#xff1a;pip install pyserial 3、python编程 import serial def main(): #创建串口对象 ser serial.Serial(COM4, 9600, timeout1) if not ser.isOpen(): print("串…

vue缓存页面,当tab切换时保留原有的查询条件

需求&#xff1a; 切换tab时&#xff0c;查询条件不变 路由页面&#xff1a; 单个页面上加这句话&#xff1a;

侯捷C++面向对象高级编程(上)-7-堆、栈与内存管理

1.output函数&#xff08;其中operator必须做为全局函数&#xff0c;不可做为成员函数&#xff09; 2.栈与堆定义 3.stack objects的生命期 4.static local objects的生命期 5.global objects的生命期 6.heap objects的生命期 7.new 8.delete 9.内存块 10.array 11.搭配

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…

轻松Get苹果手机输入法手写怎么设置!

在使用苹果手机的过程中&#xff0c;许多用户希望能够使用手写输入法进行文字输入。手写输入法不仅可以提供更加自然的输入体验&#xff0c;还特别适合习惯用手写的用户。 无论您是需要快速记录笔记&#xff0c;还是想体验不一样的输入方式&#xff0c;手写输入法都能为您带来…

Kimi又悄悄搞了件大事!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 最近公众号好像被限流了。 5000 多粉的公众号&#xff0c;两…

NAT技术及其应用

网络地址转换&#xff08;NAT&#xff0c;Network Address Translation&#xff09;是一种广泛应用于现代网络中的技术&#xff0c;旨在解决IP地址短缺问题&#xff0c;同时增强网络的安全性和灵活性。本文将详细解释NAT技术的工作原理&#xff0c;并探讨其在家庭及企业网络中的…

面向对象的程序设计设计思想(解决问题所需要的类),面向过程的程序设计思想(解决问题的步骤)

一、引言 面向对象思想是现代编程语言的主流编程思想&#xff0c;除了C语言外&#xff0c;其他的主流编程语言&#xff0c;无论是脚本的还是非脚本的&#xff0c;基本上都引入了面向对象这一设计思想&#xff0c;面向对象设计思想是怎样的&#xff1f;为什么现在的编程语言大都…

新功能上线 | 自定义工作台,成就个性化办公

为进一步优化用户操作体验&#xff0c;帮助用户更轻松、便捷的使用采购系统&#xff0c;隆道平台面向用户推出自定义工作台。根据个人的工作习惯和需求&#xff0c;轻松定制专属的工作界面。无论您需要快速查看待办事项&#xff0c;还是实时追踪业务进度&#xff0c;或是全面掌…

【瑞吉外卖 | day03】公共字段自动填充+分类信息的增删改查

文章目录 1. 公共字段自动填充1.1 问题分析1.2 代码实现1.3 代码完善 2. 新增分类2.1 需求分析2.2 数据模型2.3 代码开发 3. 分类信息分页查询3.1 代码开发 4. 删除分类4.1 需求分析4.2 代码开发4.3 功能完善 5. 修改分类 1. 公共字段自动填充 1.1 问题分析 在后台系统的员工管…

昇思25天学习打卡营第10天|ShuffleNet图像分类

ShuffleNet网络结构 ShuffleNet是一种专为移动设备设计的、计算效率极高的卷积神经网络&#xff08;CNN&#xff09;架构。其网络结构的设计主要围绕减少计算复杂度和提高模型效率展开&#xff0c;通过引入逐点分组卷积&#xff08;Pointwise Group Convolution&#xff09;和…

neo4j 图数据库:Cypher 查询语言、医学知识图谱

neo4j 图数据库&#xff1a;Cypher 查询语言、医学知识图谱 Cypher 查询语言创建数据查询数据查询并返回所有节点查询并返回所有带有特定标签的节点查询特定属性的节点及其所有关系和关系的另一端节点查询从名为“小明”的节点到名为“小红”的节点的路径 更新数据更新一个节点…

汇川Easy系列PLC使用本地脉冲5轴设置

根据官网手册可以看到&#xff0c;Easy302往上的系列都是支持本地5轴脉冲控制的 常规汇川PLC本地脉冲轴配置时&#xff0c;脉冲和方向的输出点都是成对出现的&#xff0c;但是easy如果要使用5轴的话&#xff0c;就需要自己定义方向 可以看到&#xff0c;Y0,Y1这两个点是单独…

SQLite 命令行客户端 + HTA 实现简易UI

SQLite 命令行客户端 HTA 实现简易UI SQLite 客户端.hta目录结构参考资料 仅用于探索可行性&#xff0c;就只实现了 SELECT。 SQLite 客户端.hta <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; cha…

27 岁的程序员 Gap 一年感受

最大的感受&#xff1a;变成 28 岁了 好吧&#xff0c;开个玩笑&#xff0c;下面是正文。 0.背景以及 Gap 原因 我硕士毕业时是 26 岁&#xff0c;然后校招进入一家航天国企&#xff0c;负责 Web 后端开发&#xff0c;工作了一年之后发现个人成长和挑战的空间极其有限&#…