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等]的更多相关文章

  1. ORACLE SQL TUNING ADVISOR 使用方法

    sql tunning advisor 使用的主要步骤: 1 建立tunning task 2 执行task 3 显示tunning 结果 4 根据建议来运行相应的调优方法  下面来按照这个顺序来实施 ...

  2. 原生JS添加节点方法与jQuery添加节点方法的比较及总结

    一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="d ...

  3. JS添加节点方法与JQuery添加节点方法的比较及总结

    原生JS添加节点方法与JQuery添加节点方法的比较及总结   一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div ...

  4. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  5. java 遍历map 方法 集合 五种的方法

    package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...

  6. 为什么Java方法里面不能再嵌套方法?

    直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...

  7. iOS中的过期方法和新的替代方法

    关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...

  8. java中的方法重载与重写以及方法修饰符

    1. 方法重载Overloading , 是在一个类中,有多个方法,这些方法的名字相同,但是具有不同的参数列表,和返回值 重载的时候,方法名要一样,但是参数类型和参数个数不一样,返回值类型可以相同,也 ...

  9. 使用jquery获取url及url参数的方法及定义JQuery扩展方法

    1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javascript的基础的window对象,并没有用jquery的知识. 2.jquery获取 ...

  10. [Effective JavaScript 笔记]第20条:使用call方法自定义接收者来调用方法

    不好的实践 函数或方法的接收者(即绑定到特殊关键字this的值)是由调用者的语法决定的.方法调用语法将方法被查找的对象绑定到this变量,(可参阅之前文章<理解函数调用.方法调用及构造函数调用之 ...

随机推荐

  1. [FE] jsoneditor 在 vue-router 和 vue-ssr 渲染下出现两个实例的问题

    由于 vue-router 页面是无刷新的,如果存在两次渲染,会出现如下情形. 简单粗暴的解决办法是通过判断容器中是否已经有了子节点. 此时再从其他 router link 返回就不会重复渲染了. M ...

  2. [Go] gorm 错误处理 与 链式/Finisher方法

    使用 gorm 在调用 Finisher 方法之后,建议都进行错误检查. Finishers 是会立即执行注册回调的方法,然后生成并执行 SQL,比如这些方法: Create, First, Find ...

  3. WPF 解决 Skia 因为找不到字体而绘制不出中文字符

    在 WPF 使用 Skia 做渲染工具,如果绘制的中文都是方块,也许是字体的问题.字体的问题是 Skia 没有找到字体,本文告诉大家如何修复 在 Skia 使用特定字体,可以使用 SkiaSharp ...

  4. 以 standalone 模式启动 Aapche Pulsar

    以 standalone 模式启动 Aapche Pulsar standalone 模式常用于开发测试阶段,请勿在生产环境使用. 目录 以 standalone 模式启动 Aapche Pulsar ...

  5. JS代码优化小技巧

    下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...

  6. 2.docker-compose安装prometheus

    一.docker-compose安装 前期准备 # docker配置文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json < ...

  7. Data Lake_理解数据湖

    Pentaho首席技术官James Dixon创造了"数据湖"一词.它把数据集市描述成一瓶水(清洗过的,包装过的和结构化易于使用的).而数据湖更像是在自然状态下的水,数据流从源系统 ...

  8. Google C++ 语言规范

    1. 命名空间 KeyNotes: 鼓励在.cc文件里使用匿名命名空间或者sttic声明 禁止使用内联命令空间,X::Y::foo 等价与X::foo.其主要用于跨版本的ABI兼容问题 namespa ...

  9. WEB服务与NGINX(9)-NGINX作为下载服务器的相关配置

    目录 1. NGINX的目录索引功能 2. NGINX的限速功能 2.1 限制下载速度 2.2 限制单位时间内产生的http请求数 2.3 限制客户端同一时刻的并发连接数 1. NGINX的目录索引功 ...

  10. Django——form组件之循环生成标签

    from django.contrib import admin from django.urls import path from app01.views import index urlpatte ...