LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]
由于LLM参数量都是在亿级以上,少则数十亿,多则数千亿。当我们想在用特定领域的数据微调模型时,如果想要full-tuning所有模型参数,看着是不太实际,一来需要相当多的硬件设备(GPU),二来需要相当长的训练时间。因此,我们可以选择一条捷径,不需要微调LLM的全量参数,而只需要新增少量的参数,通过固定原始模型参数,而只需要微调新增的少量参数,从而达到接近使用全参数full-tuning的效果。本章主要讲述在LLM时代,当下主流的微调方法。
1.Adapter tuning(2019)
(1) 论文信息
来自2019年,论文《Parameter-Efficient Transfer Learning for NLP》
摘要内容
:微调大型预训练模型在自然语言处理中是一种有效的迁移学习机制。然而,在存在许多下游任务的情况下,微调显得参数效率低下:因为每个任务都需要一个全新的模型。作为替代方案,我们提出了带有适配器模块的迁移学习方法。适配器模块能够生成一个紧凑且可扩展的模型;它们仅为每个任务增加少量可训练参数,并且可以在不重新访问先前任务的情况下添加新任务。原始网络的参数保持不变,从而实现了高度的参数共享。
为了展示适配器的有效性,我们将最近提出的BERT Transformer模型迁移到了26个不同的文本分类任务中,包括GLUE基准测试。适配器在仅为每个任务增加少量参数的情况下,达到了接近最先进性能的水平。在GLUE基准测试中,我们在仅为每个任务增加3.6%参数的情况下,实现了与完整微调性能相差不到0.4%的结果。相比之下,微调则需要对每个任务的100%参数进行训练。
(2) 思路
- 固定Transformer的全部参数
- 在Transformer的每一个Block里嵌入一些新初始化的Adapter Network。
- 其中Adapter由两层MLP组成,分别负责将Transformer的表征降维和升维
(3) 优势
- 只需要添加不到5%的可训练参数,即可以几乎达到全参数训练的效果
- 在训练过程中大大节省了训练时间,做到时间有效性。
- 基本不降低模型在下游任务中的表现
2.Prefix tuning(2021)
(1) 论文信息
来自论文《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
摘要内容
:微调是实际上利用大型预训练语言模型执行下游任务的首选方法。然而,这种方法会修改所有语言模型的参数,因此必须为每个任务存储完整的副本。在本文中,我们提出了前缀微调(prefix-tuning),这是一种针对自然语言生成任务的轻量级微调替代方案。该方法保持语言模型参数不变,但优化了一个小的、连续的任务特定向量(称为前缀)。前缀微调受到提示机制的启发,允许后续标记关注这个前缀,就像它们是“虚拟标记”一样。我们将前缀微调应用于GPT-2进行表格到文本的生成,以及应用于BART进行文本摘要。我们发现,通过仅学习0.1%的参数,前缀微调在全数据设置下取得了与微调相当的性能,在低数据设置下超越了微调,并且更好地推广到了训练过程中未见过的主题示例。
(2) 思路
固定预训练参数,为每一个任务额外添加一个或多个embedding,且利用多层感知编码prefix。不再像prompt tuning继续输入LLM。
(3) 结构
在seq前面加idx个虚拟token,以此构造一个连续的token,作为微调参数(结构一样是transformer)
固定LLM的参数
由于发现直接加prefix层,模型不稳定,故在其后加了MLP层,用于reparametrization参数 $P_θ$
$$P_θ[i:]=MLP_θ(P'_θ[i,:])$$
原始$P_θ$维度为$ \mid P_{idx} \mid \times dim(h_{i})$,$P'θ$维度为$ \mid P\mid \times k$,经过$MLP$复原原始维度。
针对不同任务,有不同最优的k值,经过实验,作者建议
- Table-to-table任务,k=512
- Summarization任务,k=800
(4) 优势
- 在Table2Text任务上,只有0.1%参数量级的prompt tuning效果要优于微调
(5) 缺点
- 摘要任务上,prompt的效果要略差于微调
3.Prompt tuning(2021)
(1) 论文信息
来自论文《The Power of Scale for Parameter-Efficient Prompt Tuning》
- 摘要:
在这项工作中,我们探索了“提示微调”(prompt tuning),这是一种简单而有效的机制,用于学习“软提示”来条件化冻结的语言模型以执行特定的下游任务。与GPT-3使用的离散文本提示不同,软提示是通过反向传播学习的,并且可以根据任意数量的标记示例进行调整。我们的端到端学习方法在性能上大幅超越了GPT-3的少量样本学习。
更值得一提的是,通过使用T5模型进行模型大小的消融实验,我们展示了提示微调随着规模的增加变得更加具有竞争力:当模型参数超过数十亿时,我们的方法“缩小了差距”并达到了模型微调(即调整所有模型权重)的强大性能。这一发现尤为重要,因为大型模型的共享和部署成本高昂,而能够重用一个冻结的模型来执行多个下游任务可以减轻这一负担。
我们的方法可以看作是最近提出的Li和Liang(2021)的“前缀微调”方法的简化版本,我们提供了与此方法以及其他类似方法的比较。最后,我们展示了使用软提示条件化冻结模型在提高域迁移鲁棒性和实现高效“提示集成”方面的优势。
(2) 思路
固定预训练LLM的参数,为每一个任务额外添加一个或多个embedding。之后拼接query正常输入LLM,并只训练这些embedding
(3) 优势
- 效果优于GPT-3的few-shot learning
- 当模型参数量达100亿时,接近于全模型微调效果
4.P-tuning(2021)
V2版本:2023更新
(1) 论文信息
来自论文《GPT Understands, Too》,发表于2021年
摘要
:使用自然语言模式对预训练语言模型进行提示已被证明在自然语言理解(NLU)任务中有效。然而,我们的初步研究表明,手动设计的离散提示往往导致性能不稳定——例如,仅改变提示中的一个单词就可能导致性能大幅下降。为此,我们提出了一种新颖的方法P-Tuning,该方法在离散提示的基础上结合了可训练的连续提示嵌入。实验表明,P-Tuning不仅通过最小化不同离散提示之间的差距来稳定训练过程,而且在一系列NLU任务(包括LAMA和SuperGLUE)上显著提高了性能。P-Tuning在完全监督和少量样本设置下,对冻结和微调的语言模型均普遍有效。
(2) 思路
固定LLM参数,用多层感知机和LSTM对prompt进行编码,编码后与其他向量进行拼接,正常输入LLM。
注意,训练之后只保留prompt编码之后的向量,无需保留编码器。
(3) 结构
对于prompt模板,使用MLP+LSTM进行编码,替代原始的input embedding
对于原始的输入input和target,则使用原始的input embedding
(4) 使用方式
离散和连续template token混合时,显示地插入一下anchor(离散的token)有助于template的优化
(5) 优势
- 能缓解离散prompt方法,导致的模型输出结果到达局部最优
(6) 缺点
- 查找的最优提示,可能是次优的
- 在小参数量模型中表现差(小参数模型如Bert,330M),上了10B的模型效果才开始可以持平
- 序列标注等对推理和理解要求高的任务,prompt-tuning效果会变差
5.P-tuning v2 (2022)
(1) 论文信息
来自论文《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》,发表于2022年。
摘要:提示微调(Prompt Tuning),该方法仅对冻结的语言模型中的连续提示进行微调,极大地减少了训练时每个任务的存储和内存使用。然而,在NLU(自然语言理解)的背景下,先前的工作表明,对于正常大小的预训练模型,提示微调的性能并不理想。我们还发现现有的提示微调方法无法处理复杂的序列标注任务,这表明其缺乏普适性。
我们提出了一个新颖的实验发现:经过适当优化的提示微调可以在广泛的模型规模和NLU任务中普遍有效。它在性能上与微调相当,但仅需要调整0.1%-3%的参数。我们的方法P-Tuning v2是Deep Prompt Tuning(Li和Liang, 2021; Qin和Eisner, 2021)的一种实现,针对NLU进行了优化和适配。鉴于P-Tuning v2的普适性和简单性,我们相信它可以作为微调的替代方案,并为未来的研究提供一个强大的基线。
(2) 思路
- 固定LLM参数
- 类似Prefix-tuning
- 在Deep FT层:在seq前面加n个虚拟token,以此构造一个连续的token,作为微调参数(结构一样是transformer)
- 在多种任务上下进行微调
- 完全变为生成模型,无需verbalizer
(3) 优势
- 在小、大模型上,效果均优于P-tuning。
- 当参数量达10B,效果相当于FT
6.LoRA(2021)
(1) 论文信息
来自论文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》
摘要:自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练,并适应特定任务或领域。随着我们预训练更大的模型,全面微调(即重新训练所有模型参数)变得不太可行。以GPT-3 175B为例,部署独立的微调模型实例,每个实例都有175B参数,成本是极其昂贵的。我们提出了低秩适应(Low-Rank Adaptation,简称LoRA),该方法冻结预训练模型的权重,并在Transformer架构的每一层中注入可训练的低秩分解矩阵,从而大大减少了下游任务的可训练参数数量。与使用Adam对GPT-3 175B进行微调相比,LoRA可以将可训练参数数量减少10,000倍,GPU内存需求减少3倍。尽管LoRA的可训练参数较少,训练吞吐量更高,并且与适配器不同,没有额外的推理延迟,但它在RoBERTa、DeBERTa、GPT-2和GPT-3上的模型质量上仍然与微调相当或更好。我们还对语言模型适应中的秩不足问题进行了实证调查,这揭示了LoRA的有效性
(2) 思路
固定LLM参数,在每一个self-attention层中,加入一个low-rank的矩阵,即$B \times A$。在微调时,只更新$B \times A$的参数。
(3) 结构
在每一层self-attention中,添加新的参数 $\bigtriangleup W$
$$h=W_0x+\bigtriangleup Wx=W_0x+BAx$$
其中,预训练模型的原始参数为$W_0 \in R^{d \times k}$。
LoRA的新增参数为$B \in R^{d \times r}$,$A \in R^{r \times k}$。$B$ 初始化为一个全0矩阵,$A$ 是一个高斯随机初始化的矩阵。$B$ 初始化为全0矩阵的目的是,在开始训练时,让$B \times A$等于0矩阵,即参数从0开始。
其中LoRA的中间维度$r$,远小于原始模型的维度,即$r\ll min(d,k)$
(4) 学习目标
原始的LLM,一般也是CLM (Causal Language Model/Conditional Language Model),学习目标为
而加入LoRA后,学习目标为
(5) 配置
- 在多个部位$(Q/K/V/Output)$同时添加$\bigtriangleup W$ ,会比只在单一部分上添加权重$\bigtriangleup W$,效果要好
- 在wikiSQL/MultiNLI数据集上测试得出结论:小的γ值,能达到较好好的效果(一般为4-8)
(6) 优势
- 用于低资源的场景。也就是硬件设备资源有限的情况下。
- 更新参数量少。对于175B的GPT模型,使用该方法只需要额外更新0.01%的参数量。
- 是全参数微调(FT)的一种替代方案
(7) 缺点
- 全参数微调(FT)效果要比LoRA稍微要好
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]的更多相关文章
- ORACLE SQL TUNING ADVISOR 使用方法
sql tunning advisor 使用的主要步骤: 1 建立tunning task 2 执行task 3 显示tunning 结果 4 根据建议来运行相应的调优方法 下面来按照这个顺序来实施 ...
- 原生JS添加节点方法与jQuery添加节点方法的比较及总结
一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="d ...
- JS添加节点方法与JQuery添加节点方法的比较及总结
原生JS添加节点方法与JQuery添加节点方法的比较及总结 一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- java 遍历map 方法 集合 五种的方法
package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...
- 为什么Java方法里面不能再嵌套方法?
直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...
- iOS中的过期方法和新的替代方法
关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...
- java中的方法重载与重写以及方法修饰符
1. 方法重载Overloading , 是在一个类中,有多个方法,这些方法的名字相同,但是具有不同的参数列表,和返回值 重载的时候,方法名要一样,但是参数类型和参数个数不一样,返回值类型可以相同,也 ...
- 使用jquery获取url及url参数的方法及定义JQuery扩展方法
1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javascript的基础的window对象,并没有用jquery的知识. 2.jquery获取 ...
- [Effective JavaScript 笔记]第20条:使用call方法自定义接收者来调用方法
不好的实践 函数或方法的接收者(即绑定到特殊关键字this的值)是由调用者的语法决定的.方法调用语法将方法被查找的对象绑定到this变量,(可参阅之前文章<理解函数调用.方法调用及构造函数调用之 ...
随机推荐
- dotnet 世界猜测 随机数的小测试
这是一个半技术向的博客,主题来源于我读过的某本书的片段,这是一个稍稍有些前置知识的故事,主题的大概内容就是假定世界存在某个规则序列,通过一代代的探索,可以获取到此序列的内容.本文将模拟此情形,写一个随 ...
- Redisant Toolbox——面向开发者的多合一工具箱
Redisant Toolbox--面向开发者的多合一工具箱 Redisant Toolbox 拥有超过30种常用的开发工具:精心设计,快速.高效:离线使用,尊重您的隐私.官网地址:http://ww ...
- 八、Dataphin
Dataphin是阿里巴巴集团OneData数据治理方法论内部实践的云化输出,一站式提供数据采.建.管.用全生命周期的大数据能力,以助力企业显著提升数据治理水平,构建质量可靠.消费便捷.生产安全经济的 ...
- 文件上传--php user.ini详解
文件上传 参考文档:https://www.php.net/manual/zh/configuration.file.per-user.php 如果你的 PHP 以模块化运行在 Apache 里,则用 ...
- Golang ETCD包的安装使用 golang安装etcd第三方库clientv3 报错 解决
目录 ETCD 官网 视频地址 课件资料 ETCD 日志收集项目 为什么要自己写不用ELK? 项目的架构 上节课项目进度 etcd介绍 安装etcd windows安装 Ubuntu(linux系统) ...
- 《Modern C++ Design》之上篇
如下内容是在看侯捷老师翻译的<Modern C++ Design>书籍时,整理的code和摘要,用于不断地温故知新. 第一章 1. 运用 Template Template 参数实作 Po ...
- leaflet叠加图片图层
<!DOCTYPE html> <html> <head> <title>Layers Control Tutorial - Leaflet</t ...
- mysql如何优雅的备份数据
MySQL 有多种备份方式,以下是几种常用的备份方式: 使用 mysqldump 命令备份数据 mysqldump 是 MySQL 自带的备份工具,可以备份指定数据库或表的数据为 SQL 文件.可以通 ...
- Splashtop远程桌面再次增强:支持4K视频流
远程桌面工具,主流的有10款总有,国内用的比较多的有teamviewer.Splashtop.向日葵等.几款软件各有千秋,其中Splashtop最大的特性就是快速.流畅.产品无敌,运营佛系,哈哈.下面 ...
- IDEA的Ctrl+Enter补全代码失效
前景提示 IDEA有个ctrl+enter可以补全代码的功能,但是,今天突然失效了,原来是这个问题. 修改配置 进入setting修改 进入Edit-->找到Intertions,搜素Intro ...