大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 并训练自己的数据集

大模型主流微调训练方法总结

LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning

概述

大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对它们进行总结。
LoRA (Learned Representations for Finetuning)
LoRA是一种新型的微调方法,旨在解决预训练模型微调过程中存在的两大问题,模型调整过程中对初始模型过度依赖以及微调过程中存在的过拟合问题。LoRA通过在预训练模型中引入一个额外的线性层,并使用特定任务的训练数据来微调这个线性层。这种方法使模型能够更好地适应特定任务,同时减少了对初始模型的过度依赖。
Adapter
Adapter是一种简单而有效的微调方法,它通过在预训练模型的特定层上添加一个可学习的附加层来适应特定任务。这个附加层可以是线性层、非线性层或其他类型的层,其目的是对预训练模型的输出进行微调,使其更好地适应特定任务。Adapter具有较低的计算成本和较好的性能,使其成为处理小数据集的理想选择。
Prefix-tuning
Prefix-tuning方法通过微调预训练模型的特定部分(称为“前缀”)以适应特定任务。这种方法只微调前缀,而不是整个模型,从而减少了计算成本和过拟合的风险。Prefix-tuning的性能通常优于传统的微调方法,但不及完整的模型微调。
P-tuning
P-tuning是一种改进的微调方法,通过引入一个参数化转换矩阵来调整预训练模型的权重。这个矩阵可以学习地改变预训练模型的权重分布,使其更好地适应特定任务。P-tuning在保持良好性能的同时,减少了微调过程中对初始模型的过度依赖。
Prompt-tuning
Prompt-tuning是一种新颖的微调方法,利用了近年来自然语言处理领域的prompting技术。该方法通过修改预训练模型的输入来适应特定任务,使其在输入阶段就考虑到任务的特定需求。Prompt-tuning可以显著提高模型的性能,同时减少了对初始模型的过度依赖和过拟合的风险。

总结:

这五种微调方法在处理大型预训练模型以适应特定任务方面都具有各自的优点和适用场景。LoRA通过引入额外的线性层来减少对初始模型的过度依赖和过拟合问题;Adapter具有较低的计算成本和较好的性能,适用于小数据集;Prefix-tuning只微调预训练模型的前缀,减少了计算成本和过拟合的风险;P-tuning通过引入参数化转换矩阵来调整预训练模型的权重,减少了过度依赖;Prompt-tuning利用prompting技术修改预训练模型的输入,显著提高性能并减少过度依赖和过拟合的风险。在实际应用中,应根据具体任务和数据集选择合适的微调方法。

详述

在这里插入图片描述

LoRA

paper:(https://arxiv.org/pdf/2106.09685.pdf)

简介:

自然语言处理目前存在一个重要范式:一般领域数据的大规模预训练,对特定任务或领域的适应(finetune)。但是随着预训练语言模型越来越大,这个范式存在以下问题:
● 当我们finetune大模型时,由于训练成本太高,不太可能重新训练所有模型参数
● 以前的方法(论文发表于2021年)都或多或少有其它性能问题,如adapter增加了模型层数,引入了额外的推理延迟;prefix-tuning比较难训练,效果不如直接finetune。
基于上述背景,论文作者得益于前人的一些关于内在维度(intrinsic dimension)的发现:模型是过参数化的,它们有更小的内在维度,模型主要依赖于这个低的内在维度(low intrinsic dimension)去做任务适配。假设模型在任务适配过程中权重的改变量是低秩(low rank)的,由此提出低秩自适应(LoRA)方法,LoRA通过优化适应过程中密集层变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预先训练的权重不变。

方法

LoRA的实现思想很简单,如下图所示,就是冻结一个预训练模型的矩阵参数,并选择用A和B矩阵来替代,在下游任务时只更新A和B。

在这里插入图片描述
结合图片来看,LoRA的实现流程如下:
● 在原始预训练语言模型(PLM)旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的内在秩。
● 训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。
● 模型的输入输出维度不变,输出时将BA与PLM的参数叠加。
● 用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵。

实现

从公式上解释LoRA的实现。假设要在下游任务微调一个预训练语言模型(如GPT3),则需要更新预训练模型参数,公式表示如下:
W0是预训练模型初始化的参数,ΔW就是需要更新的参数。如果是全参数微调,则它的参数量=W0参数量(如果是GPT3,则ΔW≈175B)。从这可以看出要全参数微调大语言模型,没有超级好的显卡群是没法实现的。
由于前人的工作发现预训练的语言模型具有较低的“内部维度(intrinsic dimension)”,在任务适配过程中,即使随机投影到较小的子空间,仍然可以有效地学习。因此,LoRA做的就是增加小参数模块去学习改变量ΔW。

在这里插入图片描述

在训练过程中,W0是固定不变的,只有A和B包含训练参数,是变化的。而在推理的过程中,只需要把改变量放回原模型,就不会有任何延迟。如果想切换任务,只需要切换任务的过程中,减去BA,然后换上用其它任务训练好的BʹAʹ就可以了。

总结

基于大模型的内在低秩特性,增加旁路矩阵来模拟full finetuning,LoRA是一个能达成lightweight finetuning的简单有效的方案。目前该技术已经广泛应用于大模型的微调,如Alpaca,stable diffusion+LoRA,而且能和其它参数高效微调方法有效结合

2. Adapter

paper:(https://arxiv.org/pdf/1902.00751.pdf)

简介

2019年,Houlsby N等人将Adapter引入NLP领域,作为全模型微调的一种替代方案。

方法

Adapter主体架构下图所示。
在这里插入图片描述
AdapterFusion将学习过程分为两个阶段:
● 1.「知识提取阶段」:训练Adapter模块学习下游任务的特定知识,将知识封装在Adapter模块参数中。
● 2.「知识组合阶段」:将预训练模型参数与特定于任务的Adapter参数固定,引入新参数学习组合多个Adapter中的知识,提高模型在目标任务中的表现。

实现

其中对于N的不同的下游任务训练N个Adapter模块。然后使用AdapterFusion组合N个适配器中的知识,将预训练参数Θ和全部的Adapter参数Φ固定,引入新的参数Ψ,使用N个下游任务的数据集训练,让AdapterFusion学习如何组合N个适配器解决特定任务。参数Ψ在每一层中包含Key、Value和Query(上图右侧架构所示)。
在Transformer每一层中将前馈网络子层的输出作为Query,Value和Key的输入是各自适配器的输出,将Query和Key做点积传入SoftMax函数中,根据上下文学习对适配器进行加权。在给定的上下文中,AdapterFusion学习经过训练的适配器的参数混合,根据给定的输入识别和激活最有用的适配器。「作者通过将适配器的训练分为知识提取和知识组合两部分,解决了灾难性遗忘、任务间干扰和训练不稳定的问题。Adapter模块的添加也导致模型整体参数量的增加,降低了模型推理时的性能」。

总结

Adapter Fusion 在 Adapter 的基础上进行优化,通过将学习过程分为两阶段来提升下游任务表现。作者对全模型微调(Full)、Adapter、AdapterFusion三种方法在各个数据集上进行和对比试验。AdapterFusion在大多数情况下性能优于全模型微调和Adapter,特别在MRPC(相似性和释义任务数据集)与RTE(识别文本蕴含数据集)中性能显著优于另外两种方法

3. Prefix-tuning

Paper:(https://arxiv.org/pdf/2101.00190.pdf)

简介

前缀微调(prefix-tunning),用于生成任

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开篇介绍——蓝桥赛前冲刺(JavaB组)

开篇介绍 蓝桥杯赛事时间安排 专栏内容介绍 在接下来的几天时间内,老汉会不间断的更新该专栏,主要针对蓝桥杯B组赛事高频考点的复习巩固,其中包括老汉认为较优质的算法讲解(文章、视频),以及对应的真题、…

关系型数据库mysql(2)SQL语句

目录 一.SQL语句简介 1.1SQL语言 1.2SQL语句分类 1.3SQL分类 1.4SQL 语言规范 二.数据库基本操作 2.1查看数据库中的库信息 2.2查看数据库中的表信息 数据库内查看 数据库外查看 2.3显示数据库的结构(字段) ​编辑 2.4 字段属性 2.5常见的数…

【Linux】文件属性信息、文件目录权限修改

Linux文件属性信息 在 Linux 中,ls命令用于列出目录内容,并提供了许多参数以定制输出和显示不同类型的信息。以下是一些常用的ls命令参数 -a显示所有文件和目录,包括以.开头的隐藏文件。-l使用长格式列出文件和目录的详细信息,包…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1、碰撞形状与视觉形状 像立方体和球体这样的简单形状&a…

【JAVA笔记】IDEA配置本地Maven

文章目录 1 配置本地Maven1.1 Maven下载1.2 Maven安装与配置1.2.1 安装1.2.2 配置1.2.2.1 环境配置1.2.2.2 本地仓库配置 2 IDEA设置本地Maven 1 配置本地Maven 1.1 Maven下载 官网:http://maven.apache.org/下载地址:http://maven.apache.org/downloa…

机器学习-05-回归算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中回归算法,包括线性回归,岭回归,逻辑回归等部分。 参考 fit_transform,fit,transform区别和作用详解!!!!!&am…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc(HarmonyOS Device Connector)是 HarmonyOS 为开发人员提供的用于调试的命令行工具,通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取,存放于 /Huawei/Sdk/openhar…

python统计分析——正态分布

参考资料&#xff1a;python统计分析【托马斯】 正态分布或高斯分布是所有分布函数中最重要的。这是由于当样本数足够大的时候&#xff0c;所有分布函数的平均值都趋近于正态分布。数学上正态分布的特征有平均数μ和标准差σ确定。 其中&#xff0c;-∞<x<∞&#xff0c;…

【STL基础】vector、stack、queue、list、pair、map、unordered_map、set、unordered_set(详细讲解)

vector、list、pair、unordered_map、unordered_set、stack、queue 参考文章&#xff1a; &#xff08;1&#xff09;【apollo】泛型编程 与 STL &#xff08;2&#xff09;c stack用法 入门必看 超详细 &#xff08;3&#xff09;C中queue的用法&#xff08;超详细&#xff0c…

7年产品老兵自述:无代码“导演”数字孪生!

文章导读&#xff1a; 有人说自己天生不适合体制内的工作&#xff0c;当不了金丝雀&#xff0c;只能做野飞的麻雀。但逃离体制&#xff0c;就真的能过上自己想要的生活吗&#xff1f;睿睿的回答是&#xff1a;可以&#xff01;且看内向天蝎男&#xff0c;如何离别体制、一路生…

前端学习笔记 | JS进阶

一、作用域 1、局部作用域 &#xff08;1&#xff09;函数作用域 &#xff08;2&#xff09;块作用域 let和const会产生块作用域 &#xff0c;而var不会产生块作用域 2、全局作用域 script标签和js文件的【最外层】变量 3、作用域链 本质&#xff1a;底层的变量查找机制 4、JS…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中&#xff0c;了解网络速度是一个重要的环节。而tcpdump&#xff0c;作为一个强大的网络数据包分析工具&#xff0c;不仅可以用于分析数据包的内容&#xff0c;还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

什么是 Transformer 机器学习模型?

此为视频What are Transformers (Machine Learning Model)?的笔记。 其实标题里已经揭示了最重要的一点&#xff1a;Transformer&#xff0c;也就是GPT中的T&#xff0c;是一种机器学习模型&#xff0c;或者更准确的说&#xff0c;是一种深度学习模型。基于翻译为中文可能会导…

jmeter的函数助手使用方法

如某个上传文件接口&#xff0c;一个文件只能同时被一个接口调用&#xff0c;如果被并发同时调用就会报错 创建多个测试文件 比如50并发&#xff0c;创建更多的文件防止并发多时随机数生成重复 生成随机数函数 工具–函数助手-选择random-输入范围&#xff08;1-696&#…

基于net的医院病历管理系统

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;医院病历管理系统以互联网为基础&#xff0c;利用net技术&#xff0c;和SQL Server数据库开发设计一套医院病历管理系统&#xff0c;提高工作…

【鸿蒙HarmonyOS开发笔记】通知模块之发布基础类型通知,内含如何将图片变成PixelMap对象

通知简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知常见的使用场景&#xff1a; 显示接收到的短消息、即时消息等。 显示应用的推送消息&#xff0c;如广告、版本更新等。 显示当前正…

基于SpringBoot的学生成绩管理系统

基于SpringBootVue的家教管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 系统功能结构展示 登录界面图 现今&#xff0c;越来越多的人乐于选择一项合适的管理方案&#xff0c;但是普通用户往往受到管理经验地限制&…

利用 STM32 TIMER 触发 ADC 实现分组转换

1、问题描述 使用 STM32G4 系列芯片开发产品&#xff0c;用到其中一个 ADC 模块的多个通道&#xff0c;他希望使 用 TIMER 来定时触发这几个通道的转换。不过他有两点疑惑。第一&#xff0c;他期望定时器触发这几个 通道是每触发一次则只转换一个通道&#xff0c;这样依次触发…

五、分支结构

一、程序的组织结构 无论程序是大是小&#xff0c;都可以用顺序结构、选择结构和循环结构表示 二、单分支结构 单分支结构&#xff1a;如果表达式的值是True就执行代码&#xff0c;如果表达式的值是False就跳过语句执行后面语句 ageint(input(请输入你的年龄&#xff1a;)) i…

聚类分析 | Matlab实现基于PCA+DBO+K-means的数据聚类可视化

聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化 目录 聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PCA&#xff08;主成分分析&#xff09;、DBO&#xff08;蜣螂优化算法&#xff09;和K-means聚类…