ADALORA: ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING

文章汇总

LoRA: W = W ( 0 ) + Δ = W ( 0 ) + B A W=W^{(0)}+\Delta =W^{(0)}+BA W=W(0)+Δ=W(0)+BA
AdaLoRA:$W=W^{(0)}+\Delta =W^{(0)}+P\Lambda Q$
AdaLoRA的做法是让模型学习SVD分解的近似。在损失函数中增加了惩罚项(4),防止矩阵 P P P Q Q Q偏离正交性太远,以实现稳定训练。
R ( P , Q ) = ∥ P T P − I ∥ F 2 + ∥ Q T Q − I ∥ F 2   ( 4 ) R(P,Q)=\|P^TP-I\|^2_F+\|Q^TQ-I\|^2_F\ (4) R(P,Q)=PTPIF2+QTQIF2 (4)

摘要

在下游任务上对大型预训练语言模型进行微调已经成为自然语言处理的一个重要范例。然而,通常的做法是对预训练模型中的所有参数进行微调,当存在大量下游任务时,这变得令人望而却步。因此,提出了许多微调方法,以参数有效的方式学习预训练权值的增量更新,例如低秩增量。这些方法通常在所有预训练的权重矩阵上均匀地分配增量更新预算,而忽略了不同权重参数的不同重要性。因此,调优性能不是最优的。为了弥补这一差距,我们提出了AdaLoRA算法,该算法根据权重矩阵的重要性评分自适应地在权重矩阵之间分配参数预算。特别是,AdaLoRA以奇异值分解的形式将增量更新参数化。这种新颖的方法使我们能够有效地修剪不重要更新的奇异值,这本质上是为了减少它们的参数预算,但避免了密集的精确SVD计算。我们在自然语言处理、问答和自然语言生成方面对几个预训练模型进行了大量实验,以验证AdaLoRA的有效性。结果表明,AdaLoRA在基线上表现出显着的改善,特别是在低预算设置下。我们的代码可在https://github.com/QingruZhang/AdaLoRA公开获取。

1 介绍

预训练语言模型(PLMs)在各种自然语言处理任务中表现出优越的性能(Devlin等人,2019;Liu et al ., 2019;He et al ., 2021b;Radford等人,2019;Brown et al, 2020)。使预训练模型适应下游任务的最常见方法是微调所有参数(full fine-tuning, Qiu et al (2020);拉斐尔等人(2020))。然而,预训练模型通常会占用大量内存。例如,BERT模型(Devlin et al, 2019)由多达3亿个参数组成;T5 (rafael et al, 2020)包含多达110亿个参数,GPT-3 (Brown et al, 2020)包含多达1750亿个参数。当在这些预训练模型上构建NLP系统时,我们通常会处理同时到达的多个任务(Radford et al, 2019)。给定大量的下游任务,完整的微调要求每个任务维护大型模型的独立副本。由此产生的内存消耗非常昂贵。
为了解决这个问题,研究人员提出了两个主要的研究方向,以减少微调参数,同时保持甚至提高PLM的性能。具体来说,**一条研究路线侧重于在PLM中添加小型神经模块,并针对每个任务仅对这些模块进行微调——基本模型保持冻结并在任务之间共享。**这样,只需要引入和更新少量特定于任务的参数,大大增强了大型模型的实用性。例如,适配器调谐(Houlsby等人,2019;Rebuffi et al ., 2017;Pfeiffer et al, 2020;他等人,2022)在基本模型的层之间插入称为适配器的小神经模块。前缀调优(Li & Liang, 2021)和提示调优(Lester et al, 2021)将额外的可训练前缀令牌附加到基础模型的输入层或隐藏层。这些方法已经被证明可以达到与完全微调相当的性能,同时只更新不到1%的原始模型参数,显著地释放了内存消耗。
另一项研究建议在不修改模型架构的情况下,以参数有效的方式对预训练权重的增量更新进行建模(Zaken等人,2021;郭等,2020;Hu et al ., 2022)。例如,给定一个预训练的权重矩阵 W ( 0 ) W^{(0)} W(0), diff剪枝(Guo et al, 2020)将其增量更新 △ \triangle 建模为一个稀疏矩阵。Diff修剪将 △ \triangle 初始化为与 W ( 0 ) W^{(0)} W(0)相同的维度,然后根据条目的大小逐个修剪 △ \triangle 。因此,diff剪枝可以自适应地保留重要的更新并剪枝不重要的更新,从而大大提高参数效率。尽管如此,diff修剪有几个限制。首先,它依赖于底层实现来加速非结构化稀疏矩阵的计算,这是现有深度学习框架不支持的。因此,在训练过程中,我们需要将 △ \triangle 存储为一个密集矩阵。其次,它需要用 △ \triangle 的梯度更新每个条目,然后对它们进行修剪。这导致了与完全微调相似的计算成本(Guo et al, 2020)。
为了克服这些缺点,Hu等人(2022)提出了一种名为LoRA的方法,通过两个小得多的矩阵的乘积将 △ \triangle 参数化为低秩矩阵:
W = W ( 0 ) + △ = W ( 0 ) + B A W=W^{(0)}+\triangle =W^{(0)}+BA W=W(0)+=W(0)+BA
式中 W ( 0 ) , △ ∈ R d 1 × d 2 , B ∈ R d 1 × r , A ∈ R r × d 2 , r ≪ m i n ( d 1 , d 2 ) W^{(0)},\triangle\in \mathbb{R}^{d_1\times d_2},B\in \mathbb{R}^{d_1\times r},A\in \mathbb{R}^{r\times d_2},r \ll min(d_1,d_2) W(0),Rd1×d2,BRd1×r,ARr×d2,rmin(d1,d2)。在微调期间,只更新 A A A B B B。选择rank r r r远小于 W W W的维数(例如,当 d 1 = d 2 = 1024 d_1 = d_2 = 1024 d1=d2=1024时, r = 8 r = 8 r=8)。与完全微调相比,使用不到0.5%的额外可训练参数,训练开销可以减少多达70%。然而,LoRA实现了与完全微调相当甚至更好的性能(Hu et al, 2022)。同时,在差分剪枝中,两个小矩阵的乘积比非结构化稀疏矩阵更易于实现和部署
image.png
图1:给定总可训练参数为0.28M,我们仅对DeBERTaV3-base的选定权重矩阵(左)或选定层(右)应用LoRA,并比较MNLI-m上的微调性能。图1a:我们只对每一层transformer的一个选定类型的权重矩阵进行微调,包括自关注中的查询/键/值投影 ( W q , W k , W v ) (W_q,W_k,W_v) (Wq,Wk,Wv),输出投影 ( W o ) (W_o) (Wo),两层ffn中的两个权重矩阵 ( W f 1 , W f 2 ) (W_{f_1}, W_{f_2}) (Wf1,Wf2)。在图1b中,我们将LoRA应用于所选层的每个权重矩阵。
LoRA仍然有其局限性,因为它预先规定了每个增量矩阵 △ \triangle 的秩 r r r相同。这忽略了这样一个事实,即在微调预训练模型时,权重矩阵的重要性在模块和层之间存在显著差异。为了说明这一点,我们在图1中给出了一个具体的示例。我们比较了使用相同数量的可训练参数微调特定模块或层时LoRA的性能。图1a显示,微调前馈网络(FFN)比自关注模块实现了更好的性能。此外,从图1b可以看出,顶层的权重矩阵比底层的权重矩阵更重要
向关键权重矩阵中添加更多可训练参数可以提高模型性能。相反,向那些不太重要的权重矩阵添加更多的参数只会产生非常小的收益,甚至会损害模型的性能。给定参数预算,即总可训练参数的数量,我们总是倾向于为那些重要的模块分配更多的参数。将预算均匀地分配给所有权重矩阵/层,如LoRA和其他方法(例如,适配器和前缀调优),通常会产生次优性能。为此,一个自然的问题是:
如何根据模块的重要性自适应地分配参数预算,以提高参数高效微调的性能?
为了解决这个问题,我们提出了一种新的方法——AdaLoRA (Adaptive Low-Rank Adaptation),它在类似lora的微调过程中动态地在权重矩阵之间分配参数预算。具体来说,AdaLoRA通过调整增量矩阵的秩来控制它们的预算。关键增量矩阵被赋予较高的等级,这样它们可以捕获更细粒度和特定于任务的信息。为了防止过拟合,节省计算预算,对不重要的部分进行了排序。在现有的矩阵逼近文献中有一些控制矩阵秩的方法(Cai et al ., 2010;Koltchinskii et al, 2011;Toh & Yun, 2010)。它们大多直接计算矩阵的奇异值分解(SVD),然后截断最小的奇异值。这样的操作可以显式地操作秩,更重要的是,可以最小化结果矩阵与原始矩阵之间的差异。然而,对于微调大型模型,迭代地对大量高维权重矩阵应用SVD变得非常昂贵。因此,我们不需要精确计算 S V D SVD SVD,而是将 △ \triangle 参数化为 △ = P Λ Q \triangle=P\Lambda Q =PΛQ来模拟 S V D SVD SVD。对角矩阵 Λ \Lambda Λ包含奇异值,正交矩阵 P P P Q Q Q表示 △ \triangle 的左/右奇异向量。为了正则化 P P P Q Q Q的正交性,在训练损失中增加了一个额外的惩罚。这种参数化避免了 S V D SVD SVD的密集计算。此外,该方法的另一个优点是在保持奇异向量的同时,只需要去掉不重要的奇异值。这保留了将来恢复的可能性,并稳定了训练。请参阅第3节中与LoRA的详细比较。
基于我们的 S V D SVD SVD参数化,AdaLoRA通过重要性评分动态调整 △ = P Λ Q \triangle=P\Lambda Q =PΛQ的排名。具体来说,我们将增量矩阵 P Λ Q P\Lambda Q PΛQ划分为三元组,其中每个三元组 G i G_i Gi包含第 i i i个奇异值和对应的奇异向量。为了量化三元组的重要性,我们提出了一种新的重要性度量,它考虑了 G i G_i Gi中每个条目对模型性能的贡献(Sanh等人,2020;Liang等,2021;Zhang et al, 2022)。具有低重要性分数的三元组被授予低优先级,因此奇异值被归零。保留高重要性的三联体用于微调。此外,我们还提出了一个全局预算调度程序,以方便训练。具体来说,我们从一个初始参数预算开始,这个预算略高于最终预算,然后逐渐减少,直到与目标相匹配。这样的调度程序可以提高训练的稳定性和模型的性能。关于我们的重要性度量和预算调度器的详细描述,请参见第3节。
我们在广泛的任务和模型上进行了大量的实验,以证明AdaLoRA的有效性。具体来说,我们使用DeBERTaV3-base (He等人,2021a)在自然语言理解(GLUE, Wang等人(2019))和问答(SQuADv1, Rajpurkar等人(2016)和SQuADv2, Rajpurkar等人(2018))数据集上评估性能。我们还将我们的方法应用于BART-large (Lewis等人,2019),并评估自然语言生成(XSum, Narayan等人(2018)和CNN/DailyMail, Hermann等人(2015))任务的性能。我们显示AdaLoRA始终优于基线,特别是在低预算设置下。例如,与最先进的方法相比,AdaLoRA在SQuAD2.0数据集上使用不到0.1%的可训练参数进行全面微调,实现了1.2%的F1改进。

2 背景

基于Transformer的模型

典型的Transformer模型由 L L L个堆叠块组成,其中每个块包含两个子模块:多头注意(MHA)和完全连接的FFN。给定输入序列 X ∈ R n × d X\in \mathbb{R}^{n\times d} XRn×d, MHA以并行 h h h头执行注意函数:
image.png
其中, W 0 ∈ R d × d W_0\in \mathbb{R}^{d\times d} W0Rd×d为输出投影, W q i , W k i , W v i W_{q_i},W_{k_i},W_{v_i} Wqi,Wki,Wvi为头部 i i i的查询投影、键投影、值投影。 d h d_h dh一般设为d/h。另一个重要的模块是一个FFN,它由两个线性变换组成,中间有一个ReLU激活: F F N ( X ) = R e L U ( X W f 1 + b 1 ) W f 2 + b 2 FFN(X) = ReLU(XW_{f_1} + b_1)W_{f_2} + b_2 FFN(X)=ReLU(XWf1+b1)Wf2+b2,其中 W f 1 ∈ R d × d m , W f 1 ∈ R d m × d W_{f_1}\in \mathbb{R}^{d\times d_m},W_{f_1}\in \mathbb{R}^{d_m\times d} Wf1Rd×dm,Wf1Rdm×d。最后,使用残差连接,然后进行层归一化(Ba et al, 2016)。

3 ADALORA 方法

3.1基于SVD的适配

如第1节所述,我们提出以奇异值分解的形式参数化预训练权矩阵的增量更新:
W = W ( 0 ) + Δ = W ( 0 ) + P Λ Q   ( 3 ) W=W^{(0)}+\Delta =W^{(0)}+P\Lambda Q\ (3) W=W(0)+Δ=W(0)+PΛQ (3)
式中 P ∈ R d 1 × r P\in \mathbb{R}^{d_1\times r} PRd1×r P ∈ R r × d 2 P\in \mathbb{R}^{r\times d_2} PRr×d2表示 Δ \Delta Δ的左右奇异向量,对角矩阵 Λ ∈ R r × r \Lambda \in \mathbb{R}^{r\times r} ΛRr×r包含奇异值 { λ i } 1 ≤ i ≤ r \{\lambda_i\}_{1\le i \le r} {λi}1ir,且 r ≪ m i n ( d 1 , d 2 ) r \ll min(d_1,d_2) rmin(d1,d2)。进一步将 G i = { P ∗ i , λ i , Q i ∗ } G_i=\{P_{*i},\lambda_i,Q_{i*}\} Gi={Pi,λi,Qi}表示为包含第 i i i个奇异值和向量的三元组。实际上,因为 Λ \Lambda Λ是对角的,我们只需要把它保存为 R r \mathbb{R}^{r} Rr中的一个向量。 Λ \Lambda Λ初始化为零, P P P Q Q Q采用随机高斯初始化,以保证训练开始时 Δ = 0 \Delta=0 Δ=0。为了实现 P P P Q Q Q的正交性,即 P T P = Q Q T = I P^TP=QQ^T=I PTP=QQT=I,我们利用以下正则化器:
R ( P , Q ) = ∥ P T P − I ∥ F 2 + ∥ Q T Q − I ∥ F 2   ( 4 ) R(P,Q)=\|P^TP-I\|^2_F+\|Q^TQ-I\|^2_F\ (4) R(P,Q)=PTPIF2+QTQIF2 (4)
在我们的方法中, Λ \Lambda Λ被迭代修剪以在每个梯度体面步骤之后调整秩。如第1节所述,可以直接计算每个 Δ \Delta Δ的SVD来处理奇异值。然而,计算复杂度是 O ( m i n ( d 1 , d 2 ) d 1 d 2 ) O(min(d_1,d_2)d_1d_2) O(min(d1,d2)d1d2)。迭代地对大量高维增量矩阵应用奇异值分解变得非常昂贵。相比之下,我们的参数化避免了密集的SVD计算,极大地释放了计算开销。
我们注意到,人们也可以对LoRA应用结构化剪枝来控制秩(即,在(1)中双修BA),然而它有以下缺点。首先,当一件上衣被认为不重要时,我们必须删减它的所有元素。这使得几乎不可能重新激活修剪的双元,因为它们的条目都被归零并且没有经过训练。相比之下,**AdaLoRA仅掩盖了基于(3)的奇异值,而始终保持奇异向量。**它保留了未来可能恢复的三胞胎的错误。其次,LoRA的A和B不是正交的,这意味着双偶可以相互依赖。与截断最小的奇异值相比,丢弃重态会引起与原始矩阵更大的变化。因此,在每一步的秩分配之后,增量矩阵往往会发生巨大的变化,从而导致训练不稳定,甚至损害泛化。为了证明这一点,我们在第4.4节中提出了一项消融研究,比较了AdaLoRA与LoRA的结构化修剪。

3.3 全局预算调度器

如第1节所述,在低秩适应的情况下,调整秩自然是为了控制参数预算。因此,我们将预算 b ( t ) b^{(t)} b(t)定义为所有增量矩阵的总秩,即总奇异值的个数。回想一下,在微调期间迭代地执行预算分配。为了方便训练,我们提出了一个全局预算调度程序。具体来说,我们从略高于目标预算 b ( T ) b^{(T)} b(T)的初始预算 b ( 0 ) b^{(0)} b(0)开始(例如, b ( T ) b^{(T)} b(T)的1.5倍)。我们将每个增量矩阵的初始秩设为 r = b ( 0 ) / n r=b^{(0)}/n r=b(0)/n。我们将训练热身 t i t_i ti步,然后按照三次计划减少预算 b ( t ) b^{(t)} b(t),直到达到 b ( T ) b^{(T)} b(T)。最后,我们修正了最终的预算分布,并为 t f t_f tf步调整了模型。预算进度的确切公式见附录a。这允许AdaLoRA先探索参数空间,然后再关注最重要的权重。

5 结论

提出了一种参数高效的微调方法——AdaLoRA,根据重要性评分自适应分配参数预算。在AdaLoRA中,我们以奇异值分解的形式参数化权矩阵的增量更新。然后,我们根据一个新的重要度量,通过操纵奇异值,在增量矩阵之间动态分配参数预算。该方法有效地提高了模型性能和参数效率。我们在自然语言处理、问答和自然语言生成任务方面进行了广泛的实验。结果表明,AdaLoRA优于现有的方法。

参考资料

论文下载(ICLR(A) 2023)

https://arxiv.org/abs/2303.10512
image.png

代码地址

https://github.com/QingruZhang/AdaLoRA

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 力扣117. 填充每个节点的下一个右侧节点指针 II (抖音号:708231408)

给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。 初始状态下,所有 next 指针都…

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果: 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 (1)声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

干货下载 |《数据治理:数据中台建设与能力提升策略》

在当今这个信息爆炸的时代,数据已经成为企业最宝贵的资产之一。数据不仅能帮助企业洞察市场趋势,还能优化业务流程,提升运营效率,进而在激烈的市场竞争中占据优势地位。然而,如何有效地管理和利用这些数据,…

Centos: ifconfig command not found且ip addr查不到服务器IP

前段时间部门新派发了服务器,让我过去使用U盘装机,装完后使用ifconfig查不到服务器IP地址,ip addr也是查不到 ifconfig:command not found (这两个图片先用虚拟机的替代一下) 在网上找资料(CSDN,博客园,知乎…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一,FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期,FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink (确实开源),为国产开源技术生态注入新活力。…

平安科技智能运维案例

平安科技智能运维案例 在信息技术迅速发展的背景下,平安科技面临着运维规模庞大、内容复杂和交付要求高等挑战。通过探索智能运维,平安科技建立了集中配置管理、完善的运营管理体系和全生命周期运维平台,实施了全链路监控,显著提…

Stable diffusion 3 正式开源

6月12日晚,著名开源大模型平台Stability AI正式开源了,文生图片模型Stable Diffusion 3 Medium(以下简称“SD3-M”)权重。 SD3-M有20亿参数,平均生成图片时间在2—10秒左右推理效率非常高,同时对硬件的需求…

Qt篇——-1: error: fatal error: no input files问题解决

有时在pro或pri中引用的文件被删除或重命名后,会导致pro或pri文件中自动出现两个连续的//,这将导致我们编译时提示:-1: error: fatal error: no input files。 这是因为qmake 语法里每增加一个源文件或一个配置用一个斜杠结束&#x…

SJ901-II安全网耐冲击贯穿测试仪

一、主要用途 依据GB5725-2009最新国家标准研发,主要用于检测安全网的耐冲击性能和贯穿性能。 二、仪器特征 1、测试架采用多模块设计理念,可以实现安全网和安全带的试验。后期如果您们上安全带整体动态和整体静态试验,把所需部件直接安装到…

多商户小程序开发步骤和方法

在当今的数字经济中,多商户小程序作为一种创新的商业平台,提供了一种新的商业模式,使多个商户能够在同一平台上展示和销售他们的产品或服务。这种模式不仅增强了消费者选择的多样性,也为商家提供了一个更广泛的销售渠道。以下是详…

数据防泄密知识集锦|5个有效防止数据泄露的方法,你知道吗?

以下是五个有效防止数据泄露的方法,它们涵盖了从加强员工意识到技术实施等多个方面。 1.部署数据安全防护系统:安企神软件 专业的企业数据防泄密软件能够全方位地保护企业数据的安全。 该系统通常具有强大的文件加密功能、实时监控和异常检测、灵活的权…

常见排序算法——插入排序(直接插入排序 希尔排序)

目录 直接插入排序 基本思想 代码实现 时间复杂度计算 特性总结 希尔排序(缩小增量排序) 基本思想 代码实现 时间复杂度计算 特性总结 直接插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#…

OpenCV读取图片

import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 cv.namedWindow(image, cv.WINDOW_NORMAL) #显示图像后,允许用户随意调整窗口大小 # 显示图像 cv.imshow(image, image) cv.waitKey(0)import cv2 as cv srccv.imread(…

【AI基础】概览

一、目的 主要梳理一下大模型的相关概念,并在此基础上,部署安装最基础的AI运行环境,以达到输出AI领域的helloworld。 总的来说如图: 按照从下往上的顺序来理解,也是从下到上的顺序来安装部署。 规则1 注意每个层级的…

defer+recover机制处理错误

问题:多个协程工作,其中一个协程出现panic,导致程序崩溃 解决办法:利用deferrecover捕获panic进行处理,即使协程出现错误,主线程仍然不受影响可以继续执行 package mainimport ("fmt""tim…

python的np.array()函数

1、创建数组 2、 与矩阵相关的函数 3、与排序相关的函数 4、 一元计算函数 5、 多元计算函数 6、 与文件读写相关的函数 7、与数组形状、属性相关的函数 8、 常用计算函数 9、 数组选取:切片和索引 10、np.random相关函数 Numpy常用的20个函数 一…

STM32CUBEIDE使用技巧

一、创建文件 二、菜单栏和工具栏说明 三、编译/下载/仿真调试 1、编译的两种模式 Debug模式和Release模式,Debug模式在调试阶段时使用,Release模式在项目完结发给客户时使用,Release模式不能使用单步调试功能。 2、下载方式 下载可以在ST…

【LeetCode滑动窗口算法】长度最小的子数组 难度:中等

我们先看一下题目描述&#xff1a; 解法一&#xff1a;暴力枚举 时间复杂度&#xff1a;o(n^3) class Solution { public:int minSubArrayLen(int target, vector<int>& nums){int i 0, j 0;vector<int> v;for (;i < nums.size();i){int sum nums[i];fo…

JWT工具【工具类】

一、JWT JSON Web Token (JWT)是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;定义了一种紧凑且自包含的方式&#xff0c;以JSON对象的形式在各方之间安全地传输信息。这种信息可以被验证和信任&#xff0c;因为它是数字签名的。具体来说&#xff0c;JWT是一种用…

[leetcode]swap-nodes-in-pairs

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new ListNode(0);dummyHead->next head;ListNode* temp dummyHead;while (temp->next ! nullptr && temp->next->next !…