PEFT: 在低资源硬件上对十亿规模模型进行参数高效微调

1 引言

最近,深度学习的研究中出现了许多大型预训练模型,例如 GPT-3、BERT 等,这些模型可以在多种自然语言处理任务中取得优异的性能表现。而其中,ChatGPT 模型因为在对话生成方面的表现而备受瞩目,成为了自然语言处理领域的热门研究方向。   然而,这些大型预训练模型的训练成本非常高昂,需要庞大的计算资源和大量的数据,一般人难以承受。这也导致了一些研究人员难以重复和验证先前的研究成果。为了解决这个问题,研究人员开始研究  Parameter-Efficient Fine-Tuning(PEFT)技术。   PEFT 技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。因此,PEFT 技术可以在提高模型效果的同时,大大缩短模型训练时间和计算成本,让更多人能够参与到深度学习研究中来。下面我们将深入探讨 PEFT 的一些主要做法。    

1.1 Adapter Tuning

谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的 PEFT 微调方式,拉开了 PEFT 研究的序幕。他们指出,在面对特定的下游任务时,如果进行 Full-fintuning(即预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。   于是他们设计了如下图所示的 Adapter 结构,将其嵌入 Transformer 的结构里面,在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构进行微调。   同时为了保证训练的高效性(也就是尽可能少的引入更多参数),他们将 Adapter 设计为这样的结构:首先是一个 down-project 层将高维度特征映射到低维特征,然后过一个非线形层之后,再用一个 up-project 结构将低维特征映射回原来的高维特征;同时也设计了 skip-connection 结构,确保了在最差的情况下能够退化为 identity。  

从实验结果来看,该方法能够在只额外对增加的 3.6% 参数规模(相比原来预训练模型的参数量)的情况下取得和 Full-finetuning 接近的效果(GLUE 指标在 0.4% 以内)。  

1.2 Prefix Tuning

Prefix Tuning 方法由斯坦福的研究人员提出,与 Full-finetuning 更新所有参数的方式不同,该方法是在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 Transformer 中的其他部分参数固定。该方法其实和构造 Prompt 类似,只是 Prompt 是人为构造的“显式”的提示,并且无法更新参数,而 Prefix 则是可以学习的“隐式”的提示。   同时,为了防止直接更新 Prefix 的参数导致训练不稳定的情况,他们在 Prefix 层前面加了 MLP 结构(相当于将 Prefix 分解为更小维度的 Input 与 MLP 的组合后输出的结果),训练完成后,只保留 Prefix 的参数。   实验结果也说明了 Prefix Tuning 的方式可以取得不错的效果。  

除此之外,作者还做了一系列的消融实验说明该方法的有效性:  

  • Prefix 长度的影响:不同的任务所需要的 Prefix 的长度有差异。

  • Full vs Embedding-only:作者对比了 Embedding-only(只有最上层输入处的 Embedding 作为参数更新,后续的参数固定)和 Full(每一层的 Prefix 相关的参数都训练)的方式的效果。
  • Prefixing vs Infixing:对比了 [PREFIX; x; y] 方式与 [x; INFIX; y] 方式的差异,还是 Prefix 方式最好。

  • Initialization:用任务相关的 Prompt 去初始化 Prefix 能取得更好的效果。

1.3 Prompt Tuning

论文《The Power of Scale for Parameter-Efficient Prompt Tuning》  我给这篇文章取了个新名字:Scale is All You Need,总的来说就是,只要模型规模够大,简单加入 Prompt tokens 进行微调,就能取得很好的效果。   该方法可以看作是 Prefix Tuning 的简化版本,只在输入层加入 prompt tokens,并不需要加入 MLP 进行调整来解决难训练的问题,主要在 T5 预训练模型上做实验。似乎只要预训练模型足够强大,其他的一切都不是问题。作者也做实验说明随着预训练模型参数量的增加,Prompt Tuning 的方法会逼近 Fine-tune 的结果。  

作者做了一系列对比实验,都在说明:随着预训练模型参数的增加,一切的问题都不是问题,最简单的设置也能达到极好的效果。  

  • Prompt 长度影响:模型参数达到一定量级时,Prompt 长度为 1 也能达到不错的效果,Prompt 长度为 20 就能达到极好效果。
  • Prompt 初始化方式影响:Random Uniform 方式明显弱于其他两种,但是当模型参数达到一定量级,这种差异也不复存在。
  • 预训练的方式:LM Adaptation 的方式效果好,但是当模型达到一定规模,差异又几乎没有了。
  • 微调步数影响:模型参数较小时,步数越多,效果越好。同样随着模型参数达到一定规模,zero shot 也能取得不错效果。

1.4 P-Tuning

1.4.1 P-Tuning V1

P-Tuning 方法的提出主要是为了解决这样一个问题:大模型的 Prompt 构造方式严重影响下游任务的效果。  

P-Tuning 提出将 Prompt 转换为可以学习的 Embedding 层,只是考虑到直接对 Embedding 参数进行优化会存在这样两个挑战:  

Discretenes:对输入正常语料的 Embedding 层已经经过预训练,而如果直接对输入的 prompt embedding 进行随机初始化训练,容易陷入局部最优。

Association:没法捕捉到 prompt embedding 之间的相关关系。

作者在这里提出用 MLP+LSTM 的方式来对 prompt embedding 进行一层处理

4.1.1 与 Prefix-Tuning 的区别

这篇文章(2021-03)和 Prefix-Tuning(2021-01)差不多同时提出,做法其实也有一些相似之处,主要区别在  

Prefix Tuning 是将额外的 embedding 加在开头,看起来更像是模仿 Instruction 指令;而 P-Tuning 的位置则不固定。

Prefix Tuning 通过在每个 Attention 层都加入 Prefix Embedding 来增加额外的参数,通过 MLP 来初始化;而 P-Tuning 只是在输入的时候加入 Embedding,并通过 LSTM+MLP 来初始化。

1.4.2 P-Tuning V2 

论文《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》   从标题就可以看出这篇文章的野心,P-Tuning v2 的目标就是要让 Prompt Tuning 能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌 Fine-tuning 的结果。   那也就是说当前 Prompt Tuning 方法未能在这两个方面都存在局限性。  

不同模型规模:Prompt Tuning 和 P-tuning 这两种方法都是在预训练模型参数规模够足够大时,才能达到和 Fine-tuning 类似的效果,而参数规模较小时效果则很差。

不同任务类型:Prompt Tuning 和 P-tuning 这两种方法在 sequence tagging 任务上表现都很差。

主要结构

相比 Prompt Tuning 和 P-tuning 的方法,P-tuning v2 方法在多层加入了 Prompts tokens 作为输入,带来两个方面的好处:   1. 带来更多可学习的参数(从 P-tuning 和 Prompt Tuning 的 0.1% 增加到0.1%-3%),同时也足够 parameter-efficient。   2. 加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响。

几个关键设计因素

  • Reparameterization:Prefix Tuning 和 P-tuning 中都有 MLP 来构造可训练的 embedding。本文发现在自然语言理解领域,面对不同的任务以及不同的数据集,这种方法可能带来完全相反的结论。
  • Prompt Length:不同的任务对应的最合适的 Prompt Length 不一样,比如简单分类任务下 length=20 最好,而复杂的任务需要更长的 Prompt Length。
  • Multi-task Learning 多任务对于 P-Tuning v2 是可选的,但可以利用它提供更好的初始化来进一步提高性能。
  • Classification Head 使用 LM head 来预测动词是 Prompt Tuning 的核心,但我们发现在完整的数据设置中没有必要这样做,并且这样做与序列标记不兼容。P-tuning v2 采用和 BERT 一样的方式,在第一个 token 处应用随机初始化的分类头。

实验结果

不同预训练模型大小下的表现,在小模型下取得与Full-finetuning相近的结果,并远远优于P-Tuning。

不同任务下的 P-Tuning v2 效果都很好,而 P-Tuning 和 Prompt Learning 效果不好;同时,采用多任务学习的方式能在多数任务上取得最好的结果。

Verbalizer with LM head v.s. [CLS] label with linear head,两种方式没有太明显的区别

Prompt depth,在加入相同层数的 Prompts 前提下,往更深层网络加效果优于往更浅层网络(只有 BoolQ 中 17-24 反而低于 1-8 是例外)。

1.5 LoRA

微软和 CMU 的研究者指出,现有的一些 PEFT 的方法还存在这样一些问题:  

  • 由于增加了模型的深度从而额外增加了模型推理的延时,如 Adapter 方法
  • Prompt 较难训练,同时减少了模型的可用序列长度,如 Prompt Tuning、Prefix Tuning、P-Tuning 方法
  • 往往效率和质量不可兼得,效果差于 full-finetuning

有研究者对语言模型的参数进行研究发现:语言模型虽然参数众多,但是起到关键作用的还是其中低秩的本质维度(low instrisic dimension)。本文受到该观点的启发,提出了 Low-Rank Adaption(LoRA),设计了如下所示的结构,在涉及到矩阵相乘的模块,引入 A、B 这样两个低秩矩阵模块去模拟Full-finetune 的过程,相当于只对语言模型中起关键作用的低秩本质维度进行更新。  

这么做就能完美解决以上存在的 3 个问题:  

  • 相比于原始的 Adapter 方法“额外”增加网络深度,必然会带来推理过程额外的延迟,该方法可以在推理阶段直接用训练好的 A、B 矩阵参数与原预训练模型的参数相加去替换原有预训练模型的参数,这样的话推理过程就相当于和 Full-finetune 一样,没有额外的计算量,从而不会带来性能的损失。
  • 由于没有使用 Prompt 方式,自然不会存在 Prompt 方法带来的一系列问题。
  • 该方法由于实际上相当于是用 LoRA 去模拟 Full-finetune 的过程,几乎不会带来任何训练效果的损失,后续的实验结果也证明了这一点。

在实验中,研究人员将这一 LoRA 模块与 Transformer 的 attention 模块相结合,在 RoBERTa 、DeBERTa、GPT-2 和 GPT-3 175B 这几个大模型上都做了实验,实验结果也充分证明了该方法的有效性。  

2 PETL

PETL是HuggingFace的一个高效微调模型的工具箱。参数高效微调 (PEFT) 方法可以使预先训练的语言模型 (PLM) 有效适应各种下游应用程序,而无需微调所有模型的参数。微调大模型的花费通常令人望而却步。在这方面,PEFT方法仅微调少量(额外)模型参数,从而大大降低了计算和存储成本。 最近最先进的 PEFT 技术实现了与完全微调相当的性能。

与 Accelerate 无缝集成,利用 DeepSpeed 和大模型推理实现大规模模型。(Accelerate 是为那些喜欢编写 PyTorch 模型的训练循环但不愿意编写和维护使用多 GPU/TPU/fp16 所需的样板代码的 PyTorch 用户创建的。)

PEFT 使用起来也非常方便

from transformers import AutoModelForSeq2SeqLM
# 导入peft
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"# 配置peft参数
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
# 把模型根据参数搞成peft的
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

2.1 PEFT论文

Towards a Unified View of PETL这篇 ICLR2022 的文章研究了典型的 PEFT 方法,试图将 PEFT 统一到一个框架下,找出它们起作用的具体原因,并进行改进。主要研究了三个问题:  

  • 典型的PEFT方法有什么联系?
  • 典型的PEFT方法中是哪些关键模块在起作用?
  • 能否对这些关键模块进行排列组合,找出更有用的 PEFT 方法?

通用形式

通过对 Prefix Tuning 的推导,得出了和 Adapter Tuning 以及 LoRA 形式一致的形式。

更近一步地,可以将这些 Tuning 的方法统一在同一套框架下,  

包括这几大要素: 

嵌入 Transformer 结构的方式(分为 Parrell 和 Sequential 两种。Parallel 指的是在输入层嵌入,这样与原有结构可以并行计算;Sequential 指的是在输出层嵌入,相当于增加了网路的深度,与原有结构存在依赖关系)

修改的表示层(主要指对 attention层的修改还是对 ffn 层的修改)

组合方式。怎么与原有的参数组合,包括简单相加(Adapter)、门控式(Prefix Tuning)、缩放式(LoRA)三种)

根据这个统一的框架,还另外设计了三种变体Parallel Adapter、Multi-head Parallel Adapter、Scaled Parallel Adapter。  

2.2 一些实验

哪种嵌入形式更好:Parallel or Sequencial?

答案是:Parallel 更好

对哪块结构做修改更好?Attention or FFN?

当微调的参数量较多时,从结果来看,对 FFN 层进行修改更好一种可能的解释是 FFN 层学到的是任务相关的文本模式,而 Attention 层学到的是成对的位置交叉关系,针对新任务并不需要进行大规模调整。

当微调参数量较少(0.1%)时,对 Attention 进行调整效果更好。

哪种组合方式效果更好? 从结果来看,缩放式的组合效果更好。

2.3 结论

基于以上的经验,

Scaled parallel adapter is the best variant to modify FFN

FFN can better utilize modification at larger capacities

modifying head attentions like prefix tuning can achieve strong performance with only 0.1% parameters

研究者设计出最新的结构 MAM Adapter,取得了最好的效果:

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

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

相关文章

sublime text 3 分屏和关闭分屏

有时候需要编辑多个地方的代码,开多个编辑器又太麻烦,那么Sublime自带的分屏快捷键可以解决烦恼。 Altshift2 分为2列 Altshift3 分为3列 Altshift4 分为4列 Altshift5 分为2行2列 Altshift8 分为2行 Altshift9 分为3行 取消分屏:Alts…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建一个TcpConnection实例 以及 接收客户端数据

#CSDN 年度征文|回顾 2023,赢专属铭牌等定制奖品# 一、主线程反应堆模型的事件添加和处理详解 >>服务器和客户端建立连接和通信流程: 基于多反应堆模型的服务器结构图,这主要是一个TcpServer,关于HttpServer,…

分布式协调系统

分布式协调系统 分布式协调系统解决的进程间的通信和协作,根据是否在同一时间和是否相互引用分为四个模型。 示例系统Chubby 主功能:让客户端实现同步,方法是加锁服务 介绍一下系统: 系统由五台服务器构成,通过pax…

智慧地球(AI•Earth)社区成立一周年啦!独家福利与惊喜彩蛋等你来拿!

原文:智慧地球(AI•Earth)社区成立一周年啦! 智慧地球社区 一周年庆典🎊 独家福利🎁与惊喜彩蛋🎉等你来拿! 智慧地球(AI•Earth)社区自2023年1月11日建立以…

app store里面的构建版本在线上传

开发苹果ios应用,无论是用原生开发、用hbuilderx开发还是用其他h5框架开发的app,都需要将打包好的ipa文件上传到app store。 在上架app store的过程中,我们会遇到下图的这样一个问题: 就是它要求我们上传一个构建版本&#xff0c…

如何保障开放网络边界安全?

针对开放式网络(办事大厅、视频网络等),如何在内部网络构建起一道安全屏障,有效解决广大用户普遍存在的无法保证网络边界完整、边界安全、公共场所终端摄像头管理、办事大厅智能设备(一体机等)管理、开放场…

【C语言】Linux实现高并发处理的过程

一、实现高并发的几种策略 C语言本身并没有内建的多线程支持(新版C语言支持,但用得不多),但是在多数操作系统中,可以使用库来实现多线程编程。例如,在POSIX兼容系统上,可以使用 pthreads 库来创…

django学习:页面渲染与请求和响应

1.请求过程 2.页面渲染 在app中新建一个目录(Directory),文件名命名为templates。该文件名命名是固定的,不可命名出错,如若后续步骤出错,该目录文件名是一个检查的重点项目。在该目录下新建一个html文件&a…

探讨一下WebINFO 下的一些思考

在平时的开发中,我们经常看到一个/WEB-INF 这个目录,这个是web 容器初始化加载的一个标准路径。官方解释:WEB-INF 是 Java 的 web 应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。也就是说,这…

MySQL之视图内连接、外连接、子查询

一、视图 1.1 含义 虚拟表,和普通表一样使用 视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放…

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章:https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发,可能会遇到一些问题。 比如这样一个场景: Mobile或者前端调用部分…

如何评判一款智能酒精壁炉品质是否优秀

在当今家居设计中,智能酒精壁炉作为一种独特的取暖和装饰方式,受到越来越多人的青睐。然而,如何挑选和选择优质的智能酒精壁炉成为了一个重要的话题,下面将深入探讨哪样的智能酒精壁炉才算得上是品质卓越。 优质的智能酒精壁炉通常…

Guarded Suspension模式--适合等待事件处理

Guarded是被守护、被保卫、被保护的意思, Suspension则是暂停的意思。 如果执行现在的处理会造成问题, 就让执行处理的线程进行等待--- 这就是Guarded Suspension模式。 模式通过让线程等待来保证实例的安全性。 一个线程ClientThread会将请求 Request的…

AWS EKS1.26+kubesphere3.4.1

1、前提准备 1台EC2服务器Amazon Linux2,设置admin的角色 安装 aws cli V2 ​ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/installexport PATH/usr/local/bin:$PATHsou…

Multisim各版本安装指南

Multisim下载链接 https://pan.baidu.com/s/1En9uUKafhGOqo57V5rY9dA?pwd0531 1.鼠标右击【Multisim 14.3(64bit)】压缩包(win11及以上统需先点击“显示更多选项”)选择【解压到 Multisim 14.3(64bit)】。 2.打开解压后的文件夹,双击打开【…

目标检测 | YOLOv5 训练自标注数据集实现迁移学习

Hi,大家好,我是源于花海。本文主要了解 YOLOv5 训练自标注数据集(自行车和摩托车两种图像)进行目标检测,实现迁移学习。YOLOv5 是一个非常流行的图像识别框架,这里介绍一下使用 YOLOv5 给使用 Labelme 标注…

一文详解动态 Schema

在数据库中,Schema 常有,而动态 Schema 不常有。 例如,SQL 数据库有预定义的 Schema,但这些 Schema 通常都不能修改,用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构,确保…

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面,通过对收集的信息进行梳理,定位到安全薄弱点,从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…

Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

1. 什么是IO Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领…

YOLOv5改进 | Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层

一、本文介绍 本文给大家带来的改进机制是Damo-YOLO的RepGFPN(重参数化泛化特征金字塔网络),利用其优化YOLOv5的Neck部分,可以在不影响计算量的同时大幅度涨点(亲测在小目标和大目标检测的数据集上效果均表现良好涨点幅度超级高!)。RepGFPN不同于以往提出的改进模块,其…