本文介绍了PEFT中Selective Methods的DiffPruning、 BitFit;重参数化方法中的LoRA和AdaLoRA;以及混合方法中的MAM Adapters和UniPELT。分类方法见PEFT综述论文《Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning》
参考论文《Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning》
选择性方法是对模型的现有参数进行微调的一种方法。可以根据层的深度、层的类型,甚至是某个参数进行选择。
- 论文《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
向量,本质上是一样的。
- 论文《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训练前后的参数,发现只有计算query以及FFN层的第一层(特征维度从N放大到4N)的bias参数变化最为明显,只更新这两类bias参数也能达到不错的效果,反之,固定其中任何一者,模型的效果都有较大损失。
FAR(Vucetic等人,2022年)选择参数矩阵的列进行剪枝,并将线性层重新配置为可训练和冻结的状态。该方法分为两个阶段。
整个方法伪代码如下:
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%的参数,并实现了与微调相似的性能。
《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》
虽然预训练语言模型可以通过微调在广泛的语言理解任务中产生最先进的结果,但这一过程的动态性尚不完全了解,特别是在低数据情况下。为什么我们可以使用相对传统的梯度下降算法(例如,没有强正则化)来微调具有数亿参数的模型,并仅使用数百或数千个标记示例的数据集?
在Aghajanyan等人(2020年)的工作中,他们证明了常见的预训练模型具有非常低的内在维度,故存在一种低维度的重新参数化方式,使微调效果媲美fine-tuning
。
具体而言,他们使用Fastfood变换重新参数化模型权重的更新。他们的结果表明,与较小的模型相比,较大的模型需要在较低秩子空间中进行变化才能达到相同的微调性能。这个观察结果激发了对大型模型和参数效率微调的关注
虽然可以优化的参数数量较低,但Fastfood的内存复杂度以及对所有模型参数的更新使得Intrinsic SAID在微调大型网络方面不实用。
《LoRA: Low-Rank Adaptation of Large Language Models》、Microsoft/LoRA、stanford_alpaca
神经网络包含许多稠密层,这些层执行矩阵乘法。这些层中的权重矩阵通常具有满秩。Intrinsic SAID的研究表明,尽管预训练模型的参数量很大,但每个下游任务对应的Intrinsic Dimension
(本征维度)并不大,即使在随机投影到较小子空间时,仍然可以有效学习。换句话说,理论上我们可以微调非常小的参数量,就能在下游任务取得不错的效果。
受此启发,我们假设权重的更新在适应过程中也具有较低的intrinsic rank
(内在秩)。对于一个预训练的权重矩阵 W 0 ∈ R d × k W_{0}\in \mathbb{R}^{d\times k} W0∈Rd×k,我们不直接微调 W 0 W_{0} W0,而是微调一个增量 Δ W \Delta W ΔW来更新模型。
具体来说,在原始的预训练模型PLM旁边增加一个新的通路(相当于一个外挂),通过前后两个矩阵A,B
相乘,来模拟本征秩。外挂层和预训练模型层维度都为d
,第一层会先将维度d
通过全连接层降维至r
,第二层再从r
通过全连接层映射回d
维度,其中,r<
这里的r
是矩阵的秩,这样矩阵计算就从d x d
变为d x r + r x d
,参数量减少很多,这一步就叫做低秩分解。
添加外挂层后,前向传播用公式来表示就是:
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} W0∈Rd×k, B ∈ R d × r B\in \mathbb{R}^{d\times r} B∈Rd×r, A ∈ R r × k A\in \mathbb{R}^{r\times k} A∈Rr×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即可,对于推理来说,不会增加额外的计算资源。
Transformer的权重矩阵包括:
LoRA只应用于Attention模块中的4种权重矩阵,而且通过消融实验发现同时调整 W q W_q Wq 和 W v W_v Wv 会产生最佳结果。
另外,保证权重矩阵的种类的数量比起增加隐藏层维度r更为重要,增加r并不一定能覆盖更加有意义的子空间。
3. 秩的选择,通常选4、8、16即可。
论文《Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning》、QingruZhang/AdaLoRA
之前的Adapter tuning方法和下游任务增量的方法都存在一些问题:
基于以上问题进行总结:
为了弥补这一差距,作者提出了AdaLoRA,它根据权重矩阵的重要性得分,在权重矩阵之间自适应地分配参数预算。
AdaLoRA
是对LoRA的一种改进,它根据重要性评分动态分配参数预算给权重矩阵。具体做法如下:
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} P∈Rd1×r, Q ∈ R r × d 2 Q\in \mathbb{R}^{r\times d_{2}} Q∈Rr×d2,表示 Δ \Delta Δ的左/右奇异向量。对角矩阵 Λ ∈ R r × r \Lambda \in \mathbb{R}^{r\times r} Λ∈Rr×r。
通过实验证明,AdaLoRA 实现了在所有预算、所有数据集上与现有方法相比,性能更好或相当的水平。 例如,当参数预算为 0.3M 时,AdaLoRA 在RTE数据集上,比表现最佳的基线(Baseline)高 1.8%。
- 论文《Towards a Unified View of Parameter-Efficient Transfer Learning》
- 参考《论文阅读:对参数高效迁移学习的统一看法》、知乎《大模型参数高效微调技术原理综述(六)-MAM Adapter、UniPELT》
最近的研究提出了多种参数高效的迁移学习方法,只微调少量(额外的)参数即可达到强大的性能。尽管这些方法有效,但对于成功的关键因素以及各种方法之间的联系了解甚少。
例如下图展示了不同的微调方法,在Xsum数据集上做英文文本摘要任务的效果(ROUGE-2是该任务的评价指标(越大越好))以及其他高效微调方法参数量相对于全参数微调参数量的百分比。图中的左上角的位置是理想化的方法,从图中发现,Adapter,Prefix Tuning,LoRA
都是性能比较好的方法。
图1:展示了Transformer架构和一些最先进的参数高效调整方法。我们使用带虚线边界的块来表示这些方法添加的模块。 | 图2:不同方法在XSum摘要任务上的性能。 |
这三种方法的数学表示整理如下:
为什么看起来Adapter,Prefix Tuning,LoRA
(在结构上和公式上)都不太一样,尤其是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,Pv∈Rl×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} h←h+f(h⋅Wdown)⋅Wup非常相似,只是前缀调整执行的是加权相加,而适配器不进行加权。图3b展示了从这个视角看前缀调整的计算图,它允许将前缀调整抽象为类似适配器的插件模块。
此外,我们注意到当l
很小时, W 1 ∈ R d h × l W_1∈\mathbb{R}^{d_h×l} W1∈Rdh×l和 W 2 ∈ R l × d h W_2∈\mathbb{R}^{l×d_h} W2∈Rl×dh是低秩矩阵,因此它们在功能上与适配器中的 W d o w n W_{down} Wdown和 W u p W_{up} Wup矩阵类似。这种观点还表明,前缀向量的数量l
在适配器中扮演类似瓶颈维度r
的角色:它们都表示修改向量∆h计算时的秩限制。因此,我们将l
也称为瓶颈维度。
秩限制意味着对于任何x,∆h都是同样的l(或≤l)个基向量的线性组合。
上一节,通过对Prefix Tuning
变换,发现Prefix Tuning
和Adapters
的公式高度相似。进一步的 ,作者对最先进的PEFT方法进行了解构,并提出了一个统一的框架来建立它们之间的联系。具体而言,我们将它们重新定义为对预训练模型中特定隐藏状态的修改(修改∆h),并定义了一组设计维度,包括计算修改的函数和应用修改的位置等,这些维度在不同方法之间存在变化。
下图分析不同微调方法的内部结构和结构插入形式的相似之处。下图展示了高效微调方法Adapter、Prefix Tuning、LoRA以及新变体(通过更换一些元素,设计了前人的工作里没有的变体) Parallel Adapter、 Scaled PA的结构。
下表展示了高效微调方法Adapter、Prefix Tuning、LoRA以及新变体在各个维度的对比。
∆h functional form
:计算∆h的具体函数,这部分是需要学习的部分。所有这些方法的函数形式都类似于projdown→nonlinear→projup
架构,而 nonlinear
在LoRA
中退化为特征函数。Insertion form
:添加模块的结构插入形式modified representation
:新增结构在PLM修改的具体位置composition function
:指修改后的向量∆h如何与原始的隐藏表达h组成,以形成新的隐藏表达。例如,适配器执行简单的加法合成,prefix tuning使用门控加法合成,而LoRA通过一个恒定的因子来缩放∆h,并将其添加到原始隐藏表示中其中,新增可训练参数结构形式为需要学习的部分(注:Prefix Tuning为经过转换后的格式);插入形式有串联或并联;模型修改的具体位置有Attention、FFN层。
这个统一的框架使我们能够沿着这些设计维度研究参数有效的微调方法,确定关键的设计选择,并有可能在不同的方法之间转移设计元素。基于此,我们能够实现新的参数高效微调方法MAM Adapters
,其微调的参数比先前方法少,同时更加有效,在所有四个任务上实现了与微调所有参数相当的结果。
在图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所示。作者对Adapter的放置和soft prompt进行了详细的调查。得出如下结论(详见论文实验部分):
基于此,作者提出了MAM
(mix-and-match),最终模型 MAM Adapter
是用 FFN 层的并行Adapter和软提示的组合。具体而言,我们在注意力子层使用具有较小瓶颈维度(l=30
)的前缀调整,并将更多的参数预算分配给使用缩放并行适配器(r=512
)修改FFN表示。
在表6中,我们将MAM适配器与各种参数高效调整方法进行了比较。为了完整起见,我们还在表6中展示了其他组合版本的结果:同时在注意力和FFN层使用并行适配器,并将前缀调整(attn)与LoRA(ffn)相结合——这两种组合版本都可以改进各自的原型
通过上图实验结果,可以看到 MAM Adapter 在仅用了6.7%参数量(相比全量微调)的情况下,在Xsum和MT这两个任务上达到了和全量微调相近的效果,并且该方法大大优于 BitFit 和 Prompt Tuning,并始终优于 LoRA、Adapter 和 Prefix Tuning。
《UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning》
近年来,涌现出了许多针对语言模型的参数高效微调(PELT)方法,在模型训练参数极大的减少的情况下,模型效果与全量微调相当。但是不同的PELT方法在同一个任务上表现差异可能都非常大,这让针对特定任务选择合适的方法非常繁琐。
基于此,作者提出了UniPELT
方法,将不同的PELT
方法作为子模块,并通过门控机制学习激活最适合当前数据或任务的方法。
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,Pv∈Rl×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参数和门函数权重。整个结构如下图所示:
UniPELT
仅用 100 个示例就在低数据场景中展示了相对于单个 LoRA、Adapter 和 Prefix Tuning 方法的显著改进。在更高数据的场景中,UniPELT 的性能与这些方法相当或更好。UniPELT
整体上依旧是最佳的,但是优势没有低资源环境下那么高。这也是可以理解的,因为现有的PELT方法在充足的训练数据和改进潜力的情况下通常与全量精调性能相当。UniPELT-NoGate
),在高资源环境下效果不佳(平均比UniPELT
低了0.89
)。目前最好的端到端实现是微软的DeepSpeedChat
。