大模型高效微调综述下: DiffPruning、BitFit、LoRa、AdaLoRA、MAM Adapters、UniPELT

news2024/11/15 15:25:49

文章目录

    • 四、Selective Methods
      • 4.1 DiffPruning(2020.10)
      • 4.2 BitFit(2021.6)
      • 4.3 Freeze and Reconfigure (FAR,2022)
      • 4.4 FishMask(略)
    • 五、Reparametrization-based methods(重参数化)
      • 5.1 Intrinsic SAID(2020.12)
      • 5.2 LoRa(2021.6)
        • 5.2.1 背景
        • 5.2.2 算法
        • 5.2.3 实验
      • 5.3 AdaLoRA(2023.3)
        • 5.3.1 背景
        • 5.3.2 算法
        • 5.3.3 实验
    • 六、混合方法
      • 6.1 SparseAdapter(略)
      • 6.2 MAM Adapters(2021.10)
        • 6.2.1 背景
        • 6.2.2 Prefix Tuning的进一步研究
        • 6.2.3 PEFT的统一框架
        • 6.2.4 转移设计元素
        • 6.2.5 MAM Adapters
      • 6.3 UniPELT(2021.10)
        • 6.3.1 背景
        • 6.3.2 模型结构
        • 6.3.3 实验
      • 6.4 Compacter(略)
      • 6.5 S4(略)
    • 七 、RLHF(有空再补)

  本文介绍了PEFT中Selective Methods的DiffPruning、 BitFit;重参数化方法中的LoRA和AdaLoRA;以及混合方法中的MAM Adapters和UniPELT。分类方法见PEFT综述论文《Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning》

四、Selective Methods

参考论文《Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning》

  选择性方法是对模型的现有参数进行微调的一种方法。可以根据层的深度、层的类型,甚至是某个参数进行选择。

4.1 DiffPruning(2020.10)

  • 论文《Parameter-Efficient Transfer Learning with Diff Pruning》
  • 知乎《Diff Pruning: 一种参数高效的迁移学习新方法》

  Adapter Tuning通过在模型的层之间插入针对特定任务的残差模块,并只优化这些残差模块。由于残差模块的参数更少(约3.6%),因此微调成本更低。

  本文提出的 Diff pruning 与Adapters类似,但 Diff pruning 不是修改模型的结构,而是通过一个特定任务的 diff 向量扩展基础模型,只需要微调0.5%的预训练参数,即Diff pruning 将特定任务的微调表述为学习一个 diff 向量 δ τ \delta _{\tau } δτ,该向量被添加到预先训练的模型参数 θ p r e t r a i n e d \theta _{pretrained} θpretrained(固定)中 :
θ t a s k = θ p r e t r a i n e d + δ t a s k \theta _{task}=\theta _{pretrained}+\delta _{task} θtask=θpretrained+δtask

差异向量用L0-norm惩罚的可微近似值进行重构,以鼓励稀疏性(详见知乎贴)。

  prompt tuning是微调一个soft prompt tokens,而DiffPruning也是冻结大部分语言模型参数只微调一个插入的diff向量,本质上是一样的。

4.2 BitFit(2021.6)

  • 论文《BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Masked Language-models》
  • 知乎《大模型参数高效微调技术原理综述(二)-BitFit、Prefix Tuning、Prompt Tuning》

理想状况下,我们希望有一种满足以下条件的高效微调方法:

  • 到达能够匹配全量微调的效果。
  • 仅更改一小部分模型参数。
  • 使数据可以通过流的方式到达,而不是同时到达,便于高效的硬件部署。
  • 改变的参数在不同下游任务中是一致的。

  Ben-Zaken等人(2021年)提出仅对网络的偏置进行微调。也就是说,在每个线性或卷积层中,权重矩阵W保持不变,只优化偏置向量b,伪代码如下:

params = (p for n, p
		in model.named_parameters()
		if "bias" in n)
optimizer = Optimizer(params)

  BitFit仅更新模型参数的约0.05%。原始论文证明了该方法在BERT模型(小于10亿个参数)中在低数据和中等数据情况下实现了类似或更好的性能。但在更规模更大的网络上,如T0-3B或GPT-3,BitFit效果低于fine-tuning和其他PEFT方法。

  对于Transformer模型而言,冻结大部分 transformer-encoder 参数,只更新bias参数跟特定任务的分类层参数。涉及到的bias参数有attention模块中计算query,key,value跟合并多个attention结果时涉及到的bias,MLP层中的bias,Layernormalization层的bias参数。

  通过在Bert-Large模型上基于GLUE数据集进行了 BitFit、Adapter和Diff-Pruning的效果对比,可以发现:

  • BitFit在参数量远小于Adapter、Diff-Pruning的情况下,效果与Adapter、Diff-Pruning相当,某些任务上甚至更优。
  • BitFit微调结果虽不及fine-tuning,但是远超固定全部模型参数的Frozen方式。

在这里插入图片描述
  同时,通过对比BitFit训练前后的参数,发现只有计算query以及FFN层的第一层(特征维度从N放大到4N)的bias参数变化最为明显,只更新这两类bias参数也能达到不错的效果,反之,固定其中任何一者,模型的效果都有较大损失。

4.3 Freeze and Reconfigure (FAR,2022)

  FAR(Vucetic等人,2022年)选择参数矩阵的列进行剪枝,并将线性层重新配置为可训练和冻结的状态。该方法分为两个阶段。

  • 阶段一:确定参数矩阵中最重要的行进行更新。这个过程类似于结构化剪枝,并可以使用任何剪枝方法。
  • 阶段二:将每个参数 W W W拆分为可训练部分 W t W_t Wt和冻结部分 W f W_f Wf,对偏置也执行类似的操作,然后将结果连接起来,重新配置网络。

整个方法伪代码如下:

def far_layer(x):
	h1 = x @ W_t 	# W_t为可训练部分参数
	h2 = x @ W_f 	# W_f为冻结部分参数
	return concat([h1, h2], dim=-1)

  原始论文主要关注边缘场景,并在实验中使用了DistilBERT(66M)。FAR仅应用于前馈层,因为这些层占据了DistilBERT参数的大部分。作者表明,FAR在五个GLUE任务和SQuAD 2.0(Rajpurkar等人,2018年)上更新了6%的参数,并实现了与微调相似的性能。

4.4 FishMask(略)

五、Reparametrization-based methods(重参数化)

5.1 Intrinsic SAID(2020.12)

《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》

  虽然预训练语言模型可以通过微调在广泛的语言理解任务中产生最先进的结果,但这一过程的动态性尚不完全了解,特别是在低数据情况下。为什么我们可以使用相对传统的梯度下降算法(例如,没有强正则化)来微调具有数亿参数的模型,并仅使用数百或数千个标记示例的数据集?

  在Aghajanyan等人(2020年)的工作中,他们证明了常见的预训练模型具有非常低的内在维度,故存在一种低维度的重新参数化方式,使微调效果媲美fine-tuning

  具体而言,他们使用Fastfood变换重新参数化模型权重的更新。他们的结果表明,与较小的模型相比,较大的模型需要在较低秩子空间中进行变化才能达到相同的微调性能。这个观察结果激发了对大型模型和参数效率微调的关注

  虽然可以优化的参数数量较低,但Fastfood的内存复杂度以及对所有模型参数的更新使得Intrinsic SAID在微调大型网络方面不实用。

5.2 LoRa(2021.6)

《LoRA: Low-Rank Adaptation of Large Language Models》、Microsoft/LoRA、stanford_alpaca

5.2.1 背景

  神经网络包含许多稠密层,这些层执行矩阵乘法。这些层中的权重矩阵通常具有满秩。Intrinsic SAID的研究表明,尽管预训练模型的参数量很大,但每个下游任务对应的Intrinsic Dimension(本征维度)并不大,即使在随机投影到较小子空间时,仍然可以有效学习。换句话说,理论上我们可以微调非常小的参数量,就能在下游任务取得不错的效果。

  受此启发,我们假设权重的更新在适应过程中也具有较低的intrinsic rank(内在秩)。对于一个预训练的权重矩阵 W 0 ∈ R d × k W_{0}\in \mathbb{R}^{d\times k} W0Rd×k,我们不直接微调 W 0 W_{0} W0,而是微调一个增量 Δ W \Delta W ΔW来更新模型。

5.2.2 算法

  具体来说,在原始的预训练模型PLM旁边增加一个新的通路(相当于一个外挂),通过前后两个矩阵A,B相乘,来模拟本征秩。外挂层和预训练模型层维度都为d,第一层会先将维度d通过全连接层降维至r,第二层再从r通过全连接层映射回d维度,其中,r<<d

  这里的r是矩阵的秩,这样矩阵计算就从d x d变为d x r + r x d,参数量减少很多,这一步就叫做低秩分解。

在这里插入图片描述

图1:重参数化,只训练A和B

添加外挂层后,前向传播用公式来表示就是:
h = W 0 x + Δ W x = W 0 x + B A x h=W_{0}x+\Delta Wx=W_{0}x+BAx h=W0x+ΔWx=W0x+BAx

其中 W 0 ∈ R d × k W_{0}\in \mathbb{R}^{d\times k} W0Rd×k B ∈ R d × r B\in \mathbb{R}^{d\times r} BRd×r A ∈ R r × k A\in \mathbb{R}^{r\times k} ARr×k

整个过程用伪代码表示就是:

def lora_linear(x):
	h = x @ W 			
	h += x @ W_A @ W_B  # 低秩分解
	return scale * h    # sacle为缩放因子,等于1/r

  第一个矩阵的A的权重参数会通过高斯函数初始化,而第二个矩阵的B的权重参数则会初始化为零矩阵,这样能保证训练开始时新增的通路BA=0从而对模型结果没有影响。

  在推理时,将左右两部分的结果加到一起即可, h = W 0 x + B A x = ( W 0 + B A ) x h=W_0x+BAx=(W_0+BA)x h=W0x+BAx=(W0+BA)x,所以只要将训练完成的矩阵乘积 B A BA BA跟原本的权重矩阵 W 0 W_0 W0加到一起作为新权重参数替换原本PLM的 W 0 W_0 W0即可,对于推理来说,不会增加额外的计算资源。

5.2.3 实验

  1. 对比其它PEFT方法的效果

在这里插入图片描述

表2:RoBERTa base,RoBERTa large和DeBERTa XXL在GLUE基准测试中使用不同的适应方法。我们报告了MNLI的整体(匹配和不匹配)准确率,CoLA的Matthew相关系数,STS-B的Pearson相关系数以及其他任务的准确率。所有指标都越高越好。*表示在之前的研究中发布的数字。†表示在设置类似于Houlsby等人(2019)的运行配置中进行了公平比较。

在这里插入图片描述

表3:使用不同的适应方法对GPT-2中型(M)和大型(L)模型在E2E NLG挑战赛上的表现。对于所有指标,数值越高越好。LoRA在可比较或更少的可训练参数情况下优于几个基线模型。我们运行的实验显示了置信区间。*表示在之前的研究中发布的数字。

  1. 微调权重选择

Transformer的权重矩阵包括:

  • Attention模块:
    • 计算query, key, value的 W q W_q Wq W k W_k Wk W v W_v Wv
    • 用于多头attention计算结果 h e a d 1 . . . h e a d n head_1...head_n head1...headn拼接时的矩阵 W o W_o Wo
  • MLP层的权重矩阵

  LoRA只应用于Attention模块中的4种权重矩阵,而且通过消融实验发现同时调整 W q W_q Wq W v W_v Wv 会产生最佳结果。
在这里插入图片描述

  另外,保证权重矩阵的种类的数量比起增加隐藏层维度r更为重要,增加r并不一定能覆盖更加有意义的子空间。
在这里插入图片描述
3. 秩的选择,通常选4、8、16即可。

在这里插入图片描述

表18:LoRA在使用GPT-2 Medium模型时,根据不同的秩r在E2E NLG Challenge上实现的验证损失和测试集指标。与在GPT-3上r = 1适用于许多任务不同,在这里验证损失的性能在r = 16时达到峰值,而BLEU指标在r = 4时达到峰值,这表明GPT-2 Medium在适应性方面与GPT-3 175B具有类似的内在秩。请注意,我们的某些超参数是在r = 4上进行调整的,这与另一个基线的参数数量相匹配,因此对于其他r的选择可能不是最优的。

5.3 AdaLoRA(2023.3)

论文《Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning》、QingruZhang/AdaLoRA

5.3.1 背景

之前的Adapter tuning方法和下游任务增量的方法都存在一些问题:

  • 添加小型网络模块:将小型网络模块添加到PLMs中,保持基础模型保持不变的情况下仅针对每个任务微调这些模块,可以用于所有任务。这样,只需引入和更新少量任务特定的参数,就可以适配下游的任务,大大提高了预训练模型的实用性。如:Adapter tuning、Prefix tuning、Prompt Tuning等。这类方法虽然大大减少了内存消耗。但是这些方法存在一些问题,比如:Adapter tuning引入了推理延时;Prefix tuning或Prompt tuning直接优化Prefix和Prompt是非单调的,比较难收敛,并且消耗了输入的token。
  • 下游任务增量更新:对预训练权重的增量更新进行建模,而无需修改模型架构,即W=W0+△W。比如:Diff pruning、LoRA等, 此类方法可以达到与完全微调几乎相当的性能,但是也存在一些问题,比如:Diff pruning需要底层实现来加速非结构化稀疏矩阵的计算,不能直接使用现有的框架,训练过程中需要存储完整的∆W矩阵,相比于全量微调并没有降低计算成本。 LoRA则需要预先指定每个增量矩阵的本征秩 r 相同,忽略了在微调预训练模型时,权重矩阵的重要性在不同模块和层之间存在显著差异,并且只训练了Attention,没有训练FFN,事实上FFN更重要。

基于以上问题进行总结:

  1. 我们不能预先指定矩阵的秩,需要动态更新增量矩阵的R,因为权重矩阵的重要性在不同模块和层之间存在显著差异。
  2. 需要找到更加重要的矩阵,分配更多的参数,裁剪不重要的矩阵。找到重要的矩阵,可以提升模型效果;而裁剪不重要的矩阵,可以降低参数计算量,降低模型效果差的风险。

  为了弥补这一差距,作者提出了AdaLoRA,它根据权重矩阵的重要性得分,在权重矩阵之间自适应地分配参数预算。

5.3.2 算法

AdaLoRA是对LoRA的一种改进,它根据重要性评分动态分配参数预算给权重矩阵。具体做法如下:

  • 调整增量矩分配。AdaLoRA将关键的增量矩阵分配高秩以捕捉更精细和任务特定的信息,而将较不重要的矩阵的秩降低,以防止过拟合并节省计算预算。
  • 以奇异值分解的形式对增量更新进行参数化,并根据重要性指标裁剪掉不重要的奇异值,同时保留奇异向量。由于对一个大矩阵进行精确SVD分解的计算消耗非常大,这种方法通过减少它们的参数预算来加速计算,同时,保留未来恢复的可能性并稳定训练。

W = W ( 0 ) + ∆ = W ( 0 ) + P Λ Q W = W^{(0)} + ∆ = W^{(0)}+ PΛQ W=W(0)+=W(0)+PΛQ

其中, P ∈ R d 1 × r P\in \mathbb{R}^{d_{1}\times r} PRd1×r Q ∈ R r × d 2 Q\in \mathbb{R}^{r\times d_{2}} QRr×d2,表示 Δ \Delta Δ的左/右奇异向量。对角矩阵 Λ ∈ R r × r \Lambda \in \mathbb{R}^{r\times r} ΛRr×r

  • 在训练损失中添加了额外的惩罚项,以规范奇异矩阵P和Q的正交性,从而避免SVD的大量计算并稳定训练。

5.3.3 实验

  通过实验证明,AdaLoRA 实现了在所有预算、所有数据集上与现有方法相比,性能更好或相当的水平。 例如,当参数预算为 0.3M 时,AdaLoRA 在RTE数据集上,比表现最佳的基线(Baseline)高 1.8%。

在这里插入图片描述

表1:在GLUE开发集上使用DeBERTaV3-base的结果。每个数据集上的最佳结果以粗体显示。我们报告了STS-B的平均相关性。Full FT、HAdapter和PAdapter分别代表完全微调、Houlsby适配器和Pfeiffer适配器。我们报告了使用不同随机种子进行的5次运行的平均值。

在这里插入图片描述

表2:在SQuAD v1.1和SQuAD v2.0上使用DeBERTaV3-base的结果。这里的# Params是相对于完全微调中的可训练参数数量。我们报告EM/F1。每个设置中的最佳结果以粗体显示。

六、混合方法

6.1 SparseAdapter(略)

6.2 MAM Adapters(2021.10)

  • 论文《Towards a Unified View of Parameter-Efficient Transfer Learning》
  • 参考《论文阅读:对参数高效迁移学习的统一看法》、知乎《大模型参数高效微调技术原理综述(六)-MAM Adapter、UniPELT》

6.2.1 背景

  最近的研究提出了多种参数高效的迁移学习方法,只微调少量(额外的)参数即可达到强大的性能。尽管这些方法有效,但对于成功的关键因素以及各种方法之间的联系了解甚少。

  例如下图展示了不同的微调方法,在Xsum数据集上做英文文本摘要任务的效果(ROUGE-2是该任务的评价指标(越大越好))以及其他高效微调方法参数量相对于全参数微调参数量的百分比。图中的左上角的位置是理想化的方法,从图中发现,Adapter,Prefix Tuning,LoRA都是性能比较好的方法。

Image 1Image 2
图1:展示了Transformer架构和一些最先进的参数高效调整方法。我们使用带虚线边界的块来表示这些方法添加的模块。图2:不同方法在XSum摘要任务上的性能。

这三种方法的数学表示整理如下:

在这里插入图片描述

  为什么看起来Adapter,Prefix Tuning,LoRA(在结构上和公式上)都不太一样,尤其是Prefix Tuning,但是这三种方法有近似的效果?

6.2.2 Prefix Tuning的进一步研究

  Prefix Tuning在每个层的多头注意力中,在key和value的前面添加了l个可调节的前缀向量。具体来说,两组前缀向量 P k , P v ∈ R l × d P^{k},P^{v}\in \mathbb{R}^{l\times d} Pk,PvRl×d与原始键K和值V进行连接。然后在新的前缀键和值上执行多头注意力计算。多头注意力的第i个头的计算变为:
在这里插入图片描述

  Prompt-tuning是通过仅在第一层前缀输入词嵌入来简化了前缀调整;类似的工作还包括P-tuning。下面作者推导出了公式5的等效形式,并提供了前缀调整的另一种观点。

在这里插入图片描述
  其中,λ(x)是一个标量,表示前缀上归一化注意力权重的总和。公式7中的第一项 A t t n ( x W q , C W k , C W v ) Attn(xW_q, CW_k, CW_v) Attn(xWq,CWk,CWv),是没有前缀的原始注意力,而第二项是独立于C的逐位置修改。公式7提供了前缀调整的另一种观点,它基本上通过线性插值对原始的头部注意力输出h进行逐位置修改:
在这里插入图片描述
我们重新定义 W 1 = W q P k T , W 2 = P v , f = s o f t m a x W_{1}=W_{q}P_{k}^{T},W_{2}=P_{v},f=softmax W1=WqPkT,W2=Pv,f=softmax,重写公式9则有:
在这里插入图片描述
  这种观点得出的公式与Adapter的公式 h ← h + f ( h ⋅ W d o w n ) ⋅ W u p h\leftarrow h+f(h\cdot W_{down})\cdot W_{up} hh+f(hWdown)Wup非常相似,只是前缀调整执行的是加权相加,而适配器不进行加权。图3b展示了从这个视角看前缀调整的计算图,它允许将前缀调整抽象为类似适配器的插件模块。

  此外,我们注意到当l很小时, W 1 ∈ R d h × l W_1∈\mathbb{R}^{d_h×l} W1Rdh×l W 2 ∈ R l × d h W_2∈\mathbb{R}^{l×d_h} W2Rl×dh是低秩矩阵,因此它们在功能上与适配器中的 W d o w n W_{down} Wdown W u p W_{up} Wup矩阵类似。这种观点还表明,前缀向量的数量l在适配器中扮演类似瓶颈维度r的角色:它们都表示修改向量∆h计算时的秩限制。因此,我们将l也称为瓶颈维度。

秩限制意味着对于任何x,∆h都是同样的l(或≤l)个基向量的线性组合。

6.2.3 PEFT的统一框架

  上一节,通过对Prefix Tuning变换,发现Prefix TuningAdapters的公式高度相似。进一步的 ,作者对最先进的PEFT方法进行了解构,并提出了一个统一的框架来建立它们之间的联系。具体而言,我们将它们重新定义为对预训练模型中特定隐藏状态的修改(修改∆h),并定义了一组设计维度,包括计算修改的函数和应用修改的位置等,这些维度在不同方法之间存在变化

  下图分析不同微调方法的内部结构和结构插入形式的相似之处。下图展示了高效微调方法Adapter、Prefix Tuning、LoRA以及新变体(通过更换一些元素,设计了前人的工作里没有的变体) Parallel Adapter、 Scaled PA的结构。
在这里插入图片描述

图3:现有方法和提出的变种的图形说明。"PLM模块"表示PLM(例如注意力或前馈网络)的某个子层被冻结。"Scaled PA"表示缩放的并行适配器

  下表展示了高效微调方法Adapter、Prefix Tuning、LoRA以及新变体在各个维度的对比。

在这里插入图片描述

  • ∆h functional form:计算∆h的具体函数,这部分是需要学习的部分。所有这些方法的函数形式都类似于projdown→nonlinear→projup架构,而 nonlinearLoRA中退化为特征函数。
  • Insertion form:添加模块的结构插入形式
  • modified representation:新增结构在PLM修改的具体位置
  • composition function:指修改后的向量∆h如何与原始的隐藏表达h组成,以形成新的隐藏表达。例如,适配器执行简单的加法合成,prefix tuning使用门控加法合成,而LoRA通过一个恒定的因子来缩放∆h,并将其添加到原始隐藏表示中

  其中,新增可训练参数结构形式为需要学习的部分(注:Prefix Tuning为经过转换后的格式);插入形式有串联或并联;模型修改的具体位置有Attention、FFN层。

  这个统一的框架使我们能够沿着这些设计维度研究参数有效的微调方法,确定关键的设计选择,并有可能在不同的方法之间转移设计元素。基于此,我们能够实现新的参数高效微调方法MAM Adapters,其微调的参数比先前方法少,同时更加有效,在所有四个任务上实现了与微调所有参数相当的结果。

6.2.4 转移设计元素

  在图3中及表1中,我们设计了几个新的方法,这些方法可以通过我们上面的统一观点,在不同的方法之间转移设计元素而得到:

  • Parallel Adapteris:通过将prefix tuning的平行插入转移到适配器的变体。 有趣的是,虽然我们因其与prefix tuning的相似性而提出了Parallel Adapteris,但同时进行的工作独立地提出了这个变体并对其进行了经验研究
  • Multi-head Parallel Adapter:使适配器与prefix tuning更加相似的进一步措施:我们应用Parallel Adapteris来修改头的注意力输出,作为prefix tuning。
  • Scaled Parallel Adapter:通过将LoRA的组成和插入形式转移到适配器中的变体,如图3e所示。

6.2.5 MAM Adapters

作者对Adapter的放置和soft prompt进行了详细的调查。得出如下结论(详见论文实验部分):

  • 缩放并行适配器(Scaled parallel adapter )是修改FFN的最佳变体。并行放置的Adapter优于顺序放置的Adapter,与 FFN 并行放置的Adapter优于与多头注意力(MHA)并行放置的Adapter(如下图中所示,蓝色表示修改Attention、红色表示修改FFN)。
  • 当参数预算非常小的时候,修改head attention显示出最好的结果,而FFN在较大的容量下可以更好地利用修改。
  • soft prompt(例如 prefix tuning)可以通过仅更改 0.1% 的参数来实现强大的性能。

在这里插入图片描述

图5:在XSum(左图)和en-ro(右图)上的结果。PA表示并行适配器。蓝色和红色标记分别在注意力和FFN子层应用修改

  基于此,作者提出了MAM(mix-and-match),最终模型 MAM Adapter 是用 FFN 层的并行Adapter和软提示的组合。具体而言,我们在注意力子层使用具有较小瓶颈维度(l=30)的前缀调整,并将更多的参数预算分配给使用缩放并行适配器(r=512)修改FFN表示。

  在表6中,我们将MAM适配器与各种参数高效调整方法进行了比较。为了完整起见,我们还在表6中展示了其他组合版本的结果:同时在注意力和FFN层使用并行适配器,并将前缀调整(attn)与LoRA(ffn)相结合——这两种组合版本都可以改进各自的原型

在这里插入图片描述

表6:各种参数高效调整方法及其提出的变种的比较。对于最高性能的方法,我们使用3个随机种子运行,并报告均值和标准差。

  通过上图实验结果,可以看到 MAM Adapter 在仅用了6.7%参数量(相比全量微调)的情况下,在Xsum和MT这两个任务上达到了和全量微调相近的效果,并且该方法大大优于 BitFit 和 Prompt Tuning,并始终优于 LoRA、Adapter 和 Prefix Tuning。

6.3 UniPELT(2021.10)

《UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning》

6.3.1 背景

  近年来,涌现出了许多针对语言模型的参数高效微调(PELT)方法,在模型训练参数极大的减少的情况下,模型效果与全量微调相当。但是不同的PELT方法在同一个任务上表现差异可能都非常大,这让针对特定任务选择合适的方法非常繁琐。

  基于此,作者提出了UniPELT方法,将不同的PELT方法作为子模块,并通过门控机制学习激活最适合当前数据或任务的方法。

6.3.2 模型结构

UniPELT是 LoRA、Prefix Tuning和Adapter的门控组合,其中:

  • LoRA:通过低秩分解,将优化预训练参数 W 0 W_0 W0转换为优化外挂层 W d o w n , W u p W_{down},W_{up} Wdown,Wup的参数矩阵 W B , W A W_B,W_A WB,WA
  • Prefix Tuning:在每个层的多头注意力中,在key和value的前面添加了l个可调节的前缀向量。具体来说,两组前缀向量 P k , P v ∈ R l × d P^{k},P^{v}\in \mathbb{R}^{l\times d} Pk,PvRl×d与原始键K和值V进行连接。然后在新的前缀键和值上执行多头注意力计算。
  • Adapter:在Transformer块的feed-forward子层之后添加Adapter模块

  然后组合这三个模块,每个模块使用门控机制(实现为线性层)来控制,即通过GP参数控制Prefix-tuning方法的开关,GL控制LoRA方法的开关,GA控制Adapter方法的开关。所有可训练参数(图中蓝颜色部分)包括 LoRA 的重参数化矩阵 W B , W A W_B,W_A WB,WA,提示调优参数 P k , P v P_k,P_v Pk,Pv、Adapter参数和门函数权重。整个结构如下图所示:
在这里插入图片描述

6.3.3 实验

  1. 低数据性能对比
    UniPELT 仅用 100 个示例就在低数据场景中展示了相对于单个 LoRA、Adapter 和 Prefix Tuning 方法的显著改进。在更高数据的场景中,UniPELT 的性能与这些方法相当或更好。

在这里插入图片描述

表格1:在GLUE基准测试中使用K = {100,500,1000}个训练样本的结果。评估指标为CoLA的Matthew’s相关性、MRPC和QQP的F1值、STS-B的Spearman’s相关性以及其余任务的准确率。对于MNLI,我们在匹配数据集上进行评估。我们报告了在五个随机种子上的平均性能,标准差作为下标。在每个设置下,最佳和次佳方法使用粗体和下划线标注。

  1. 高数据对比
    • 表3列出了使用所有训练样本时,不同方法的性能,UniPELT整体上依旧是最佳的,但是优势没有低资源环境下那么高。这也是可以理解的,因为现有的PELT方法在充足的训练数据和改进潜力的情况下通常与全量精调性能相当。
    • 此外,仅仅组合多个PELT方法而不使用门控机制(UniPELT-NoGate),在高资源环境下效果不佳(平均比UniPELT低了0.89)。

在这里插入图片描述

表3:使用所有训练样本时在GLUE基准测试上的结果

  1. 训练参数量、训练/推理时间对比
    • 训练参数量:LoRA,BitFit,Prefix-tuning都比较小,UniPELT参数量相对会多一些。
    • 训练速度:UniPELT比之前微调的方法多一些,但是还在能接受的范围,
    • 推理速度:BitFit方法增加的最少,UniPELT方法时间增加了27%。
      在这里插入图片描述
      表格4:各种PEFT方法相对于fine-tuning的可训练参数数量和训练/推断时间对比

6.4 Compacter(略)

6.5 S4(略)

七 、RLHF(有空再补)

目前最好的端到端实现是微软的DeepSpeedChat

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

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

相关文章

Selenium自动化工具集 - 完整指南和使用教程

文章目录 Selenium 的概述&#xff1a;Selenium 的安装与环境配置&#xff1a;Selenium WebDriver 的基本概念&#xff1a;定位元素的方法&#xff1a;常用操作方法&#xff1a;获取所有的 cookie&#xff1a;获取指定名称的 cookie&#xff1a;添加 cookie&#xff1a;删除指定…

JavaFX应用开发教程——基于JDK9与NetBeans实现

ISBN: 978-7-302-61499-9 作者&#xff1a;宋波 页数&#xff1a;257页 阅读时间&#xff1a;2023-06-18 推荐指数&#xff1a;★★★★★ 《JavaFX应用开发教程——基于JDK9与NetBeans实现》 是目前市面上讲解Java桌面开发为数不多的教材 &#xff08;JavaFX是Java语言的下一代…

Flutter系列(十二)实现购物车和提交订单页

基础工程&#xff1a; Flutter系列&#xff08;十一&#xff09;实现商城首页和商品详情页_摸金青年v的博客-CSDN博客 Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 一、前言 本文用flutter实现购物车和提交订单页&#x…

【裸机开发】认识中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断&#xff0c;也就不包含中断的初始化。如果程序包含了中断&#xff0c;我们应还需要初始化哪些内容&#xff1f;要解决这个问题&#xff0c;我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表&#xff1a;描述中断对应的中断服务函数&#xf…

数据结构——栈的实现(动态增长版本)

堆栈&#xff08;stack&#xff09;又称为栈或堆叠&#xff0c;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和移除数据&#xff08;pop&…

【软件架构】流水线设计模式

流水线模式 流水线模式是一种软件设计模式&#xff0c;它提供了构建和执行一系列操作的能力。 此模式最好与插件模式结合使用&#xff0c;以便在应用程序启动时动态构建流水线。 顺序 流水线的最基本实现是一个简单的操作序列。 public interface IOperation<T>{void …

【学习笔记】关于transformer

1.Embedding 一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 - 知乎 one-hot编码当矩阵过于稀疏时计算开销大&#xff0c;于是加上Embedding层&#xff0c;通过Embedding层&#xff08;矩阵乘法&#xff09;实现降维。 Embedding层将一个一个词&#xff08;词源…

Spring Boot 如何使用 Spring Security 进行认证和授权

Spring Boot 如何使用 Spring Security 进行认证和授权 在 Web 应用程序中&#xff0c;认证和授权是非常重要的功能。Spring Security 是一个基于 Spring 框架的强大的安全框架&#xff0c;它提供了完整的认证和授权解决方案&#xff0c;并且可以轻松地集成到 Spring Boot 应用…

gtk_table_attch与gtk_grid_attach的区别

gtk_table_attch与gtk_grid_attach的区别 button gtk_button_new_with_label (“Short fat button”); gtk_table_attach (GTK_TABLE (table), button, 0, 2, 3, 4, xoptions, yoptions, 0, 0); 0—2–3—4 左 右 上 下 /* 横线从左边的0移到右边的2&#xff0c;竖线从上边的…

3 python进阶篇

文章目录 面向对象类属性和类方法类属性类方法静态方法 单例模式__new__ 方法类实现单例模式 异常 、模块和包异常自定义异常 模块和包模块的搜索顺序包的init文件发布模块&#xff08;了解&#xff09; 文件seek文件/目录的常用管理操作eval函数 补充性知识位运算小技巧 参考我…

软考A计划-系统集成项目管理工程师-一般补充知识-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【LeetCode热题100】打卡第27天:二叉树的前序、中序、后序遍历

文章目录 【LeetCode热题100】打卡第27天&#xff1a;二叉树的前序、中序、后序遍历⛅前言&#x1f4d5;二叉树的前序遍历&#x1f512;题目&#x1f511;题解 &#x1f4d5;二叉树的中序遍历&#x1f512;题目&#x1f511;题解 &#x1f4d5;二叉树的后序遍历&#x1f512;题…

(万字长文)React 18 源码与原理解读 —— 看这一篇就够了

写在专栏开头&#xff08;叠甲&#xff09; 作者并不是前端技术专家&#xff0c;也只是一名喜欢学习新东西的前端技术小白&#xff0c;想要学习源码只是为了应付急转直下的前端行情和找工作的需要&#xff0c;这篇专栏是作者学习的过程中自己的思考和体会&#xff0c;也有很多参…

django中模板的使用

django中模板的使用 第一步 创建模板文件夹第二步 把模板存放进去第三步 把模板路径 加入到setting.py第四步 在视图函数处理第五步 路由挂载第六步 网页访问 第一步 创建模板文件夹 在项目的同层级下 新建模板文件夹 第二步 把模板存放进去 index.html <!DOCTYPE html&…

【Docker】一文了解Docker

文章目录 什么是Docker?为什么要使用Docker&#xff1f;与虚拟机的比较Docker架构Docker使用场景Docker安装阿里云镜像加速器1、登录阿里云2、找到镜像加速器3、配置使用 如今Docker的使用已经非常普遍&#xff0c;特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩…

C++ 自己动手实现简单的文件操作 (2023.6.23)

C 自己动手实现简单的文件操作 2023.6.23 引言1、文件简介2、各式各样的文件格式2.1 不同类型文件的扩展名2.1.1 文本文件2.1.2 数据文件2.1.3 音频文件2.1.4 视频文件2.1.5 电子书文件2.1.6 3D图像文件2.1.7 位图文件2.1.8 矢量图文件2.1.9 相机原始文件2.1.10 页面布局文件2.…

自监督对比学习框架SimCLR原理

目录 一、前言 人工智能发展近况 对比学习 二、数据集介绍 STL-10数据集 三、无监督图像表征对比学习 SimCLR SimCLR算法基本原理 数据增强与正负样本匹配 编码器 损失函数 对比学习全过程 四、有监督的图像下游任务迁移 替换下游任务网络层 有监督训练 五、实…

环境配置 | Git的安装及配置[图文详情]

Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从小到大的项目版本管理。下面介绍了基础概念及详细的用图文形式介绍一下git安装过程. 目录 1.Git基础概念 2.Git的下载及安装 3.常见的git命令 Git高级技巧 Git与团队协作 1.Git基础概念 仓库&#…

Charm-Crypto在Anaconda虚拟环境下的安装教程--基于Ubuntu20.04

第零步 VMware虚拟机设置和安装Anaconda虚拟环境 因为后面要编译源码&#xff0c;所以最好把CPU设置为最大&#xff0c;例如我的电脑是4核8线程&#xff0c;则&#xff1a; 关于Anaconda虚拟环境&#xff0c;这里不再赘述&#xff0c;后面都假设已经安装好虚拟环境&#xff0c;…

包装类--Math 类--Arrays 类--System 类

包装类–Math 类–Arrays 类–System 类 包装类 包装类的分类 包装类和基本数据的转换 演示包装类和基本数据类型的相互转换&#xff0c;这里以int和Integer演示。 1&#xff09;jdk5前的手动装箱和拆箱方式&#xff0c;装箱&#xff1a;基本类型&#xff0d;>包装类型&…