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

十分钟学会微调大语言模型

有同学给我留言说想知道怎么训练自己的大语言模型,让它更贴合自己的业务场景。完整的大语言模型训练成本比较高昂,不是我们业余玩家能搞的,如果我们只是想在某个业务场景或者垂直的方面加强大模型的能力,可以进行微调训练。

本文就来介绍一种大语言模型微调的方法,使用的工具是我最近在用的 Text Generation WebUI,它提供了一个训练LoRA的功能。

LoRA是什么

LoRA之于大语言模型,就像设计模式中的装饰器模式:装饰器模式允许向一个对象添加新的功能,而不改变其结构。具体来说,装饰器模式会创建一个装饰类,用来包装原有的类,并在保持原有类方法签名完整性的前提下,提供额外的功能。

LoRA,全称为Low-Rank Adaptation,是一种微调大型语言模型的技术。LoRA通过向大型语言模型添加一层额外的、低秩的可训练权重,来增强或调整模型的功能,而不需要改变原有模型的结构或重新训练整个模型。这就像是用装饰器包装了一个对象,增强了其功能,但没有改变原有对象的本质。

LoRA的关键思想是在模型的某些部分(通常是Transfomer注意力机制的权重矩阵)中引入低秩矩阵(低秩就是矩阵的行和列相对大模型的矩阵比较少)。在前向传播和反向传播过程中,这些低秩矩阵与大模型的权重矩阵相结合,从而实现对模型的微调。

相比完整的训练,LoRA训练具备两个明显的优势:

  • 高效:微调过程中需要的计算资源和存储空间相对很少,如果训练数据只是几千条对话数据,我们可以在分钟级的时间内完成微调。
  • 灵活:因为引入的参数数量相对较少,可以在一定程度上避免过拟合问题,使得模型更容易适应新任务。

因此,研究人员和开发者使用LoRA,可以在不牺牲模型性能的前提下,以较低的成本对模型进行有效的定制和优化。

工具安装

安装比较简单,如果遇到问题,欢迎留言讨论。


为了方便测试,我在云环境也创建了一个镜像,相关的环境都配置好了,大家都可以用,内置了几个国内开源的大语言模型,比如清华智谱的ChatGLM3-6B、零一万物的Yi-34B,还有最近阿里云开源的Qwen1.5-32B。

镜像使用方法:

2、GPU型号:最好选择 3090 或者 4090。因为大模型需要的显存一般都不低,6B、7B的模型做推理都需要15G左右的显存。GPU数量选择1个就够了。

3、镜像:选择“社区镜像”,输入 yinghuoai-text-generation-webui ,即可选择到我分享的镜像。

4、服务器开机后,点击“JupyterLab”进入一个可编程的Web交互环境。

5、镜像内置了一个“启动器”,点击其中的启动按钮可以直接启动WebUI。

程序默认加载的是阿里开源的 Qwen1.5-7B-Chat 模型,你也可以更换别的模型,只需要去掉命令前边的“#”,注意同时只能加载一个模型,其它模型不使用时,请使用“#”注释掉。

6、在下方的日志中看到类似输出的时候,就代表启动成功了。其中的 [xxx.gradio.live]就是WebUI的链接,点击就可以在浏览器打开它的使用界面。

Lora训练方法

终于来到重点环节了。

训练

训练需要一个基础模型,镜像默认加载的是 Qwen1.5-7B-Chat。你也可以在WebUI中更换别的模型(前提是已经下载到模型目录),在 Model 页签这里选择别的模型,然后点击 Load 加载它。

我们先来快速的过一遍训练过程,请按照下边的步骤开启LoRA训练:

1、切换到 Training 页签。

2、点击 Train LoRA,进入LoRA训练设置页面。

3、填写Lora模型的名字,注意名字中不能包含英文的点(.)。

4、点击 Formatted DataSet,代表训练将使用格式化的数据集。

5、Data Format 数据格式,这里选择 alpaca-format,这是一种Json数据格式,每条数据声明了指令、输入和输出(其中input是可选的,我们可以把input的内容填写到instructions中,从而去掉input节点),如下所示:

{"instruction": "下面是一个对话:","input":"只剩一个心脏了还能活吗?","output": "能,人本来就只有一个心脏。"
}

6、Dataset 选择数据集,我这里从 huggingface 上下载了一份弱智吧的问答数据集,镜像中已经内置。你如果使用自己的训练数据集,请上传到 text-generation-webui/training/datasets 中,然后在这里刷新后就可以选择到。

7、点击 Start LoRA Training 开始训练。

8、这里会展示训练的进度,还剩多长时间。

训练完成后,这里会显示“Done”。注意这里有个问题:如果WebUI和服务器断开了网络连接,这里就不更新进度了,此时可以去 AutoDL的 jupyterlab 或者你的命令界面中查看训练进度。

验证

训练完成后,我们需要测试下效果,参考如下步骤:

1、切换到 Model 页面。

2、点击 Reload 重新加载模型,因为此时模型已经被训练污染了。

3、刷新LoRA列表。

4、选择我们训练出来的模型。

5、Apply LoRAs 应用LoRA模型。

然后在 Parameters 中选择内置的聊天对话角色。

最后切换到 Chat 页面,开始对话测试。下面是我分别使用基础模型和添加LoRA模型后的对话截图,测试不是很严谨,但也能看到比较明显的差别。

两个 Qwen1.5-7B-Chat 很难回答正确的问题:

  • 生鱼片是死鱼片吗?
  • 小明的爸爸妈妈为什么不邀请小明参加他们的婚礼?

训练参数

在上边的步骤中我们使用的都是默认的训练参数,一般也就够了。但有时候对训练出的生成效果不太满意,就可以手动调整下训练参数,重新训练。

我这里把主要的几个参数介绍下:

1、目标模块

这个参数仅针对 llama 类型的模型结构,默认勾选的是 q_proj 和 v_proj,具体的名词不容易理解,我就不多说了,可以简单的认为是对模型的理解能力进行优化,一般这两个就够了。当然我们可以勾选更多的项目,优化模型的生成效果。但是可能会导致两个问题,一是训练要使用更多的资源,更慢;二是可能导致过拟合问题,也就是只在训练的数据上表现的好,面对新问题就不灵了。Qwen1.5-7B的模型结构也是llama类型的。

2、Epochs

这个参数代表我们要训练多少轮。训练的轮次越多,模型从训练数据中学到的越多,生成就越精确,不过也可能会导致过拟合的问题,所以需要根据实际测试的结果进行调整。

3、LoRA Rank

维度计数,模型权重的更新量。值越大越文件越大,内容控制力更强;较低的值则表示文件更小,控制程度较低。

对于较为简单的任务或者数据量较小的应用场景,可以选择较低的值,比如4或8。这样可以保持模型的简洁性,减少所需的存储空间和计算资源,同时避免过拟合。

对于复杂的自然语言处理任务,特别是需要捕捉精细语义关系、句法结构或领域专业知识的任务,或者大规模训练数据时,可能需要选择较高的值,如128、256甚至1024以上,这样才有足够的容量来学习到复杂的模式。更高的LoRA Rank需要更多的显存支持。

LoRA Rank还应该与LLM的基础模型规模相匹配,百亿权重的模型可以设置更大值,因为它可以承受更多的权重调整而不会过拟合。

4、LoRA Alpha

数值越高代表LoRA的影响力越大,默认是LoRA Rank值的两倍。当这个值较高时,适应新任务的能力会增强,但是对基础模型的影响会比较大,有过拟合的风险,尤其是在数据量有限的情况下。当这个值比较低时,对基础模型参数的改变较为温和,这可以保持预训练模型的泛化能力,但也会降低对新任务的适应性,特别是LoRA任务与预训练任务差异比较大时。

5、Learning Rate

学习率。机器学习在训练过程中会不断检查自己与训练数据的偏离程度,它有个名词叫损失(loss),一个合适的学习率会让损失逐渐收敛在一个最小值。如果学习率太大,步子就会迈的太大,不能获取较好的效果;但是如果学习率太小,又会训练的很慢,成本太高。如下图所示:

默认值 3e-4 表示 3 乘以 10 的负 4 次方,也就是 0.0003。最大1e-2表示0.01,最小1e-6表示0.000001。

另外需要平衡学习率和轮次:

高学习率 + 低轮次 = 非常快但质量较低的训练。

低学习率 + 高轮次 = 较慢但质量较高的训练。

6、LR Scheduler

学习率调度算法,默认的是线性衰减,也就是随着学习轮次的增加学习率逐渐降低。

还有使用常量、余弦退火、逆平方根、多项式时间等算法,线性衰减和余弦退火比较简单有效,平常使用的比较多,逆平方根衰减和多项式时间衰减在处理大规模数据或需要长时间训练时能提供更为稳定的收敛表现。


一个好的模型与训练数据和训练参数都有很大的关系,很难一蹴而就。

如果你对训练的结果不满意,可以调整这几个参数试试。注意重新训练前,先把基础模型重新加载。

以上就是本文的主要内容,如有问题,欢迎给我留言交流。

关注萤火架构,提升技术认知!

本文转自 https://juejin.cn/post/7359103640106106918,如有侵权,请联系删除。

相关文章:

十分钟学会微调大语言模型

有同学给我留言说想知道怎么训练自己的大语言模型,让它更贴合自己的业务场景。完整的大语言模型训练成本比较高昂,不是我们业余玩家能搞的,如果我们只是想在某个业务场景或者垂直的方面加强大模型的能力,可以进行微调训练。 本文…...

结合简单工厂和工厂方法模式:实现灵活的对象创建

前言 在软件开发过程中,创建对象的方式直接影响代码的灵活性和可维护性。设计模式提供了一种解决复杂问题的方法,其中简单工厂模式和工厂方法模式是两种常用的创建型模式。在这篇文章中,我们将结合这两种模式,通过一个实际案例&a…...

网抑云特殊版,登录即永久

前言 今天分享一款特殊版本的音乐软件,相信大家在听网抑云的时候会有两大烦恼, 一是歌曲需要开通VIP才可以收听,不管怎么说也是国内厂商普遍操作 但是第二种烦恼你万万想不到的是,开通了会员后,惊奇的发现&#xff…...

Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题

一、问题 新的项目试用一下kotlin, 调用数据库查询数据的时候报了这个问题:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in com.neusoft.collect.entity.cm.CmRoom matc…...

HTML(5)——列表表格

列表 无序列表 作用:布局排列整齐的不需要规定顺序的区域。 标签:ul嵌套il,ul是无序列表,li是列表条目 注:ul标签只能包裹li标签,li标签可以包含任何内容 有序列表 作用:布局排列整齐的需…...

FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践

简介 FreeBSD、CBSD、Jail和Ubuntu,四者的组合方案可以说是强强联合,极具性价比和竞争力!同时安装简单方便,整体方案非常先进。 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案…...

SpringCloud总结(springcloud alibaba)

目录 版本说明(很重要) springcloud alibaba对应组件版本说明 简述 spring cloud albaba 几大模块 周会讨论 - spring cloud alibaba每周都会有周会讨论,社区活跃 spring cloud alibaba官网 注册配置中心 简单介绍 nacos 步骤 示例代码 依赖…...

轻轻松松上手的LangChain学习说明书

本文为笔者学习LangChain时对官方文档以及一系列资料进行一些总结~覆盖对Langchain的核心六大模块的理解与核心使用方法,全文篇幅较长,共计50000字,可先码住辅助用于学习Langchain。 一、Langchain是什么? 如今各类AI…...

全面对比与选择指南:Milvus、PGVector、Zilliz及其他向量数据库

本文全面探讨了Milvus、PGVector、Zilliz等向量数据库的特性、性能、应用场景及选型建议,通过详细的对比分析,帮助开发者和架构师根据具体需求选择最合适的向量数据库解决方案。 文章目录 向量数据库概述向量数据库的关键功能向量数据库的扩展和选择向量…...

svm 超参数

https://www.cnblogs.com/ChevisZhang/p/12932674.html https://wenku.baidu.com/view/b8a2c73cfd4733687e21af45b307e87100f6f861.html?wkts1718332423081&bdQuerysvm%E7%9A%84%E8%B6%85%E5%8F%82%E6%95%B0 用交叉验证找到最好的参数 C 和γ 。使用 RBF 核时&#xff0c…...

001-基于Sklearn的机器学习入门:Sklearn库基本功能和标准数据集

本节将介绍Sklearn库基本功能,以及其自带的几个标准数据集的调用方法。本节是学习后面内容的基础,如果您已经对本节内容相当熟悉,可跳过本节内容。 1.1 Sklearn库基本功能 的 1.2 Sklearn库标准数据集 Sklearn自带许多标准数据集&#xff…...

充电学习—7、BC1.2 PD协议

BC1.2(battery charging)充电端口识别机制: SDP、CDP、DCP 1、VBUS detect:vbus检测 PD(portable device,便携式设备)中有个检测VBUS是否有效的电路,电路有个参考值,高…...

技术点梳理0618

ann建库,分布式建库,性能优化,precision recall参数优化 hnsw,图索引 1. build a)确定层:类似跳表思路建立多层,对每一个插入的节点,random层号l,从图的起始点search_…...

石英砂酸洗提纯方法和工艺

石英砂酸洗提纯方法和工艺是石英砂加工中至关重要的一个环节,其目的是通过化学手段去除石英砂中的杂质,提升其纯度。以下将详细介绍石英砂酸洗提纯的方法和工艺,以便更好地理解和应用这一技术。 一、概述 石英砂酸洗提纯主要是利用酸液对石英…...

linux安装dgl

1.DGL官网、选择与自己cuda、python版本匹配的dgl的whl文件CUDA11.8、python10并下载 2.用pip install运行 pip install /home/u2023170749/download/dgl-2.2.0cu118-cp310-cp310-manylinux1_x86_64.whl或者直接安装https://blog.csdn.net/weixin_44017989/article/details/13…...

【SAP-ABAP】-权限批导-批量给某个角色导入事务码权限

需求:SAP期初上线的时候,业务顾问经常会遇到批量创建角色和分配角色权限的情况 岗位需求:一般是业务顾问定义权限,BASIS进行后期运维,今天讲两个批导功能,方便期初上线 主要函数:PRGN_READ_ROLE…...

异常处理总结

自定义异常 ​ 系统中的异常可以分为我们能预知的异常和未知的系统异常,对于我们能预知的异常如空值判断,用户名错误,密码错误等异常我们需要返回客户端,对于系统内部异常如SQL语法错误,参数格式转换错误等需要统一包…...

大模型日报2024-06-18

大模型日报 2024-06-18 大模型资讯 大模型产品 Olvy 3.0:AI加速客户反馈分析 摘要: Olvy 3.0推出AI自动监听和智能标签功能,通过Google Meet集成轻松提取洞察,贴近客户,激发同理心。 PlantIdentify-免费植物识别应用 摘要: PlantI…...

NumPy 双曲函数与集合操作详解

NumPy 双曲函数 NumPy 提供了 sinh()、cosh() 和 tanh() 等 ufunc,它们接受弧度值并生成相应的双曲正弦、双曲余弦和双曲正切值。 示例: import numpy as npx np.sinh(np.pi/2)print(x)示例 找到数组 arr 中所有值的双曲余弦值: import…...

ABSD-系统架构师(十三)

1、CDN和反向代理的基本原理都是()。 A缓存 B负载均衡 C路由转发 DNAT转发 答案:A 2、(必考)在ABSD(基于架构的软件开发)方法中,顶层被分解为()&#xff…...

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议,它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议,被广泛应用于各种设备之间的通信,如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…...

第二十三篇——香农第二定律(二):到底要不要扁平化管理?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 对于企业的理解,扁平化的管理,如果从香农第二定律…...

stm32f103 HAL库 HC-SR04测距

目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…...

vue中通过自定义指令实现一个可拖拽,缩放的弹窗

效果 功能描述 按住头部可拖拽鼠标放到边框,可缩放多层重叠丰富的插槽,易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…...

FreeRtos-09事件组的使用

1. 事件组的理论讲解 事件组:就是通过一个整数的bit位来代表一个事件,几个事件的or和and的结果是输出 #define configUSE_16_BIT_TICKS 0 //configUSE_16_BIT_TICKS用1表示16位,用0表示32位 1.1 事件组适用于哪些场景 某个事件若干个事件中的某个事件若干个事件中的所有事…...

多路h265监控录放开发-(1)建立head窗口并实现鼠标拖动整个窗口

头文件: //鼠标事件 用于拖动窗口//一下三个函数都是QWidget的可重载成员函数void mouseMoveEvent(QMouseEvent* ev) override;void mousePressEvent(QMouseEvent* ev) override;void mouseReleaseEvent(QMouseEvent* ev) override; 源文件: / /// 鼠标…...

ICMR 2024在普吉岛闭幕,学者与泰国舞者共舞,燃爆全场

惊艳!ICMR 2024在普吉岛闭幕,学者与泰国舞者共舞,燃爆全场! 会议之眼 快讯 ICMR(International Conference on Multimedia Retrieval)即国际多媒体检索会议,是一个专注于多媒体检索领域的顶级…...

大模型精调:实现高效迁移学习的艺术

在人工智能领域,大型预训练模型(以下简称“大模型”)已经取得了令人瞩目的成果。这些模型通过在海量数据上进行预训练,能够捕捉到丰富的特征信息,为各种下游任务提供强大的支持。然而,如何将这些大模型应用…...

epoll服务端和客户端示例代码

epoll 服务端demo #include <stdio.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <ne…...

最大乘积和-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第85讲。 最大乘积和&#…...

wordpress子页面密码/近三天发生的重要新闻

原帖来自:一个新应用发现&#xff0c;表格定义替代offset定义 http://t.excelhome.net/thread-8875-1-1.html 简单的来说,用以下几步来设定下拉菜单,可以实现数据源追加的场合,下拉菜单内容自动追加的效果: 1.将数据源内容定义为表格 2.定义名称,将该名称的引用位置设定为操…...

网站数据每隔几秒切换怎么做的/谷歌三件套下载

原因&#xff1a; 使用不属于当前类型的内置方法时&#xff0c;就会提示XXX is not a function 举例&#xff1a; indexOf()是String字符串类型的方法&#xff0c;不能作用于object&#xff0c;Number等类型&#xff0c;但是能作用于Array类型。 比如说&#xff1a; let a {aa…...

网站开发软件最流行/百度开店怎么收费

上一节较为详细的讨论了普通二叉搜索树的局限性&#xff0c;在此基础上引出了红黑树的概念并介绍了其原理。在文章最后提到&#xff0c;为了维护一棵红黑树&#xff0c;在插入或者删除节点后&#xff0c;需要对二叉树做重着色和变换操作。那么&#xff0c;为什么要做重着色和变…...

免费自己做网站软件/桂平seo关键词优化

如果用户还在连接&#xff0c;就无法删除&#xff0c;必须强制用户下线&#xff0c;当然我第一次遇到这个问题不是我没有断开而是好像数据库存在问题&#xff0c;当我重新登录pl/sql develop时问题就解决了&#xff0c;当然我们可以通过pl/sql develop主动断开会话。 (1)查看用…...

凡科网之前做的网站在哪看/谷歌搜索引擎香港入口

环境&#xff1a;ubantu18.04,python3,jupyter notebook import pymysql conn pymysql.connect(host“127.0.0.1”,user“root”,passwd“123123”,db“test_database”) 出现1045 "Access denied for user等错误提示 解决问题 经分析&#xff0c;很可能是因为mysql 登录…...

做h5网站pc加手机版要多少钱/达州seo

接着 Macaca 实现 IOS Monkey 测试 聊&#xff0c;c 语言早就忘干净了&#xff0c;各种语言都是相通的&#xff0c;连蒙带猜的方式修改了 idevicecrashreport.c 文件&#xff0c;优化了一个功能&#xff0c;新增了一个功能。idevicecrashreport 的问题打算使用 idevicecrashrep…...