当前位置: 首页 > news >正文

【大模型】使用DPO技术对大模型Qwen2.5进行微调

前言

  1. 定义
    • DPO(Direct Preference Optimization)即直接偏好优化算法,是一种在自然语言处理领域,特别是在训练语言模型时使用的优化策略。它的主要目的是使语言模型的输出更符合人类的偏好。
  2. 背景和原理
    • 在传统的语言模型训练中,通常是基于极大似然估计(MLE)来训练模型,让模型预测的下一个词的概率分布尽可能地接近训练数据中的真实分布。然而,这种方法没有直接考虑人类对于不同生成文本的偏好。
    • DPO则不同,它通过直接优化人类对生成文本的偏好来训练语言模型。例如,给定一对生成文本(文本A和文本B),人类标注者会表明对它们的偏好(比如更喜欢文本A),DPO算法就会利用这种偏好信息来调整语言模型的参数。
    • 从数学角度看,DPO的目标是最大化一个基于偏好的奖励函数。假设我们有一个语言模型 (p_{\theta}(y|x))(其中(\theta)是模型参数,(x)是输入,(y)是输出文本),奖励函数 (r(y)) 表示人类对生成文本 (y) 的偏好得分。DPO的目标是调整(\theta),使得生成的文本能够获得更高的奖励得分。
  3. 训练过程
    • 首先,需要收集人类对生成文本的偏好数据。这可以通过人工标注来完成,例如让标注者比较两个由语言模型生成的文本片段,并选择更喜欢的一个。
    • 然后,在训练过程中,DPO算法会根据这些偏好数据来计算损失函数。具体来说,它会比较语言模型生成的不同文本的概率和人类偏好的关系,使更受偏好的文本的生成概率相对更高。
    • 例如,如果文本A比文本B更受偏好,DPO算法会调整模型参数,使得 (p_{\theta}(y = A|x)) 相对 (p_{\theta}(y = B|x)) 增大。
  4. 应用场景
    • 对话系统:在聊天机器人的开发中,DPO可以用于训练模型,使其生成的回答更符合用户的偏好。比如,在一个客服聊天机器人中,通过DPO训练可以让机器人的回答更有礼貌、更准确,从而提高用户满意度。
    • 文本生成:在故事生成、新闻写作等文本生成任务中,DPO可以帮助模型生成更吸引人、更符合人们期望的内容。例如,在生成小说情节时,使生成的情节更符合读者对于情节跌宕起伏、逻辑连贯等方面的偏好。
  5. 优势和局限性
    • 优势
      • 直接考虑人类偏好:与传统方法相比,DPO能够更直接地将人类对文本的偏好融入到模型训练中,从而生成更符合人类期望的文本。
      • 灵活性:可以根据不同的任务和用户群体,灵活地收集和利用偏好数据来训练模型。
    • 局限性
      • 偏好数据收集困难:获取高质量的人类偏好数据是一个比较复杂和耗时的过程,需要大量的人工标注工作。
      • 偏好的主观性:不同的人可能有不同的偏好,这可能会导致在训练数据收集和模型训练过程中出现不一致的情况。

1-环境

pip install transformers trl

2-数据集

  1. 选择数据集:根据具体的微调任务,选择合适的数据集。例如,可以选择与任务相关的文本分类数据集、对话数据集等 。确保数据集的格式符合 LLaMA-Factory 的要求,一般是 JSON 格式,包含输入文本、输出文本等必要信息.
  2. 数据预处理:对数据集进行必要的预处理,如清洗数据,去除噪声、重复或无效的样本等。还可以进行分词、标记化等操作,以便将文本数据转换为模型能够处理的格式.
  3. 标注偏好数据:对于 DPO 算法,需要人工标注或通过其他方式获取文本的偏好数据,即对于同一输入,哪一个输出更符合期望。标注数据应整理成包含 “prompt”(输入提示)、“chosen”(更优的生成响应)、“rejected”(次优的生成响应)三个键的字典形式.

1、选择数据集:lvwerra/stack-exchange-paired
2、下载数据集:可以使用 Hugging Face 的 datasets 库来加载数据集:

from datasets import load_dataset
dataset = load_dataset('lvwerra/stack-exchange-paired')

3、数据格式:将数据处理为 DPO 所需的格式。通常,DPO 需要一个包含对话对和相应偏好标签的数据集。

3-配置DPO训练

配置训练参数

你需要配置 DPO 的训练参数,包括模型配置、训练设置等。以下是一个基本的配置示例(通常保存在 YAML 文件中):

model:name_or_path: "Qwen2.5"  # 替换为 Qwen2.5的模型路径或名称bos_token_id: 0  # 设置 bos_token_id,如果模型没有此 tokentraining:output_dir: "./output"per_device_train_batch_size: 8per_device_eval_batch_size: 8num_train_epochs: 3logging_dir: "./logs"logging_steps: 10evaluation_strategy: "steps"save_strategy: "epoch"dpo:draw_threshold: 0.25# 其他 DPO 特定配置

创建 DPO 训练器

from trl import DPOTrainer
from transformers import AutoTokenizer, AutoModelForCausalLM
from datasets import load_dataset# 加载模型和 tokenizer
model_name = "Qwen2.5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)# 加载数据集
dataset = load_dataset('lvwerra/stack-exchange-paired')# 配置 DPO 训练
dpo_trainer = DPOTrainer(model=model,args=train_args,  # 训练参数从 YAML 文件中加载train_dataset=dataset["train"],eval_dataset=dataset["validation"],tokenizer=tokenizer
)# 执行训练
dpo_trainer.train()

4-执行训练

终端运行

python train_dpo.py --config_path path/to/your/config.yaml

5-评估和保存模型

训练完成后,你可以评估模型的性能,并保存微调后的模型:

# 保存模型
model.save_pretrained("./output")# 评估模型
results = dpo_trainer.evaluate()
print(results)

相关文章:

【大模型】使用DPO技术对大模型Qwen2.5进行微调

前言 定义 DPO(Direct Preference Optimization)即直接偏好优化算法,是一种在自然语言处理领域,特别是在训练语言模型时使用的优化策略。它的主要目的是使语言模型的输出更符合人类的偏好。 背景和原理 在传统的语言模型训练中&a…...

Maven 生命周期

文章目录 Maven 生命周期- Clean 生命周期- Build 生命周期- Site 生命周期 Maven 生命周期 Maven 有以下三个标准的生命周期: Clean 生命周期: clean:删除目标目录中的编译输出文件。这通常是在构建之前执行的,以确保项目从一个…...

网络不通该如何手动下载torch

如果遇到pip install torch2.5.0 下载不了的情况,大部分是网络的问题.可以考虑下载wheel文件在去安装 查看对应的cuda版本(举个例子:cuda为12.4,找到这个版本的 复制到服务器上下载): 有conda和pip下载的两种方式,二者选其一:如果没有安装anaconda,就直接使用pip的方式下载 如…...

基础电路的学习

1、戴维南定理 ①左边的图可简化为一个电阻+一个电压源。② ③电压源可相当于开路。将R2移到左边,R1和R2相当于并联。RR1//R2 Rx和Rt相等时,灵敏度最大,因此使Rt10K。 104电容是0.1uf。 三位数字的前两位数字为标称容量的有效数…...

对 MYSQL 架构的了解

MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分: 一、连接层 客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)…...

C#中方法参数传值和传引用的情况

对于引用类型 - 传类类型的具体值时 此时传的是引用 - 单纯传类类型 此时传的是个test引用的副本,在方法内修改的是这个副本的指向 传string,集合同理,只要是指向新对象,就是引用副本在指向 对于值类型 - 传普通值类型 …...

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...

2.3 携程的hook实现及dlsym函数

背景知识:(排除static 情况) 一个进程中可以有相同的命名吗? -- 不能 两个进程之间可以有相同的命名吗?--可以 一个进程和另一个静态库可以有相同的命名吗?--不能 一个进程和另一个动态库之间可以有相同…...

机器学习之KNN算法

K-Nearest Neighbors (KNN) 是一种常见的机器学习算法,广泛应用于分类和回归问题。KNN是一种基于实例的学习方法,它利用训练数据集的实例来进行分类或回归预测。在KNN中,预测的结果依赖于距离度量函数计算出的最近邻实例的标签或值。下面我们…...

《全排列问题》

题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1∼n1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留…...

pycharm 快捷键

PyCharm 是一款功能强大的集成开发环境(IDE),提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键(基于 Windows/Linux 系统,Mac 系统可能略有不同): 通用快捷键 功能快捷键&a…...

若依微服务如何获取用户登录信息

文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:后端获取当前用户信息第二步:前端获取当前用户信息 5、运行结果6、总结 1、需求提出 在微服务架构中,获取当前用户的登录信息是开发常见的需求。无论是后端处理业务…...

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…...

TCP三次握手,四次挥手

三次握手 第一次握手:客户端向服务器发送一个 SYN 包,其中 SYN 标志位被设置为 1,表示客户端请求建立连接,并随机生成一个初始序列号 seqx 。此时客户端进入 SYN_SENT 状态,等待服务器的确认1.第二次握手:服…...

Mono里建立调试C#脚本运行环境

前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...

Linux dnf 包管理工具使用教程

简介 dnf 是基于 Red Hat Linux 发行版的下一代包管理工具,它代替 yum 提供更好的性能、更好的依赖处理和更好的模块化架构。 基础语法 dnf [options] [command] [package] 常用命令用法 更新元数据缓存 sudo dnf check-update# 检查已安装的包是否有可用的更…...

Java 创建线程的方式有哪几种

在 Java 中,创建线程的方式有四种,分别是:继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future、使用线程池。以下是详细的解释和通俗的举例: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 步…...

计算机的错误计算(一百八十七)

摘要 用大模型计算 sin(123.456789). 其自变量为弧度。结果保留16位有效数字。第一个大模型是数学大模型。先是只分析,不计算;后经提醒,才给出结果,但是是错误结果。第二个大模型,直接给出了Python代码与结果&#xf…...

12. 最大括号深度

题目描述 现有一字符串仅由"(",")", "{","}", "[", "]"六种括号组成。若字符串满足以下条件之一, 则为无效字符串:任一类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号输出…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...