大预言模型LoRA综述

前言

在应用预训练模型解决常见的问题时,通常都需要对相关的模型进行微调。而如今常见预训练模型的规模变得越来越大,想要完全微调变得不太现实,而LoRA是一种常见的高效微调方法,在微调模型时将模型绝大部分的参数给进行冻结,在训练的时候只训练插入的相关模块,这部分模块的参数与模型整体比较起来非常小。同时在跨任务和隐私保护方面也有着非常明显的优势,因此LoRA近期备受关注。浙江大学对常见的LoRA方法进行了总结,对应的内容如下所示:
论文链接: A Survey on LoRA of Large Language Models
github链接:https://github.com/ZJU-LLMs/Awesome-LoRAs

摘要

低秩自适应(LoRA)是一种利用可插拔的低秩矩阵更新密集神经网络的方法,是参数效率最高的微调方法之一。此外,它在跨任务和隐私保护方面也有着显著的优势。因此,LoRA近来备受关注,相关文献数量成指数级增长。这篇论文从以下几个方面对相关的内容进行了分类和回归:

  • 下游适应改进变量,可提高LoRA在下游任务中的性能;
  • 跨任务泛化方法,混合多个LoRA插件以实现跨任务泛化;
  • 效率改进方法,提高LoRA计算效率的方法;
  • 在联合学习中使用LoRA的数据隐私保护方法;
  • 应用。

此外,这篇论文还讨论了这个领域的未来发展方向。

引言

增加预训练语言模型的参数量可以提高其泛化能力,并带来涌现能力。过去几年,预训练语言模型的参数量已经增加了上千倍。这些具有较大参数的预训练模型被称为大语言模型(LLM)。然而,由于LLM的知识边界,它们在一些下游任务上的能力仍然有限。为了扩展知识边界,仍然有必要对下游任务上的LLM进行微调。
然而,对LLM的全部参数进行微调(即完全微调)的计算成本是极其昂贵。为了降低计算成本,提出了各种参数高效微调(PEFT)的方法,这些方法只需要微调少量(额外)模型参数,就能使LLM适应下游任务。从是否涉及额外参数的角度来看,PEFT方法可以分为两类:参数外方法和参数内方法。参数外方法冻结LLM的所有原始参数,并插入一组可学习的参数来优化模型输入或模型层,如Adapter TuningPrompt Tuning。相比之下,参数内方法会冻结LLM的大部分原始参数,只调整LLM的少量参数,如BitFitLISALoRA
当无法修改模型结构时,就需要采用参数内方法。在参数内方法中,LoRA是应用最广泛的一种,因为它可以在一系列下游任务中实现与完全微调相当或更好的下游适应性能,而且易于实现。此外,人们还提出了许多变体,以进一步提高LoRA在更具挑战性的下游任务上的下游适应能力。
LoRA可以通过使用可插拔的低秩矩阵更新LLM的密集神经网络层来实现参数效率。这些矩阵(又称LoRA插件)独立于LLM,可以存储并在其他相关的下游任务中重复使用。此外,这些LoRA插件可以组合起来实现跨任务泛化,从而促进多任务学习、领域适应和持续学习。
随着LoRA模块的积累,管理LoRA模块的计算成本也在增加。虽然LoRA的计算效率很高,但管理大量LoRA模块的计算成本是不可忽视的,需要进一步提高LoRA的计算效率。这种改进可以降低单个LoRA模块的计算成本,加快多个模块的可扩展服务。它可以促进LoRA在现实世界用例中的应用,如生成即服务(Gaas)云产品。
在某些情况下,训练数据由多个客户私人拥有,无法集中管理。为了是LLM与分布式训练数据相适应,可以采用联合学习来保护每个客户端的数据隐私。然而,联合学习的通信和计算成本很高。为了降低成本,LoRA是一个很自然的选择,它的参数效率高的特性有助于降低每个客户端的计算成本和客户端之间共享参数的通信成本。此外,LoRA的可插拔功能支持个性化参数的本地化或加密,从而加强了联合学习中的隐私保护。因此,LoRA具有保护隐私的巨大潜力。
这篇论文对LoRA方法的研究进展进行了全面的概述,主要从以下这几个方面进行:

  • 提高LoRA的下游自适应能力;
  • 混合LoRA模块以实现任务泛化;
  • 提高LoRA的计算效率;
  • 在联合学习中采用LoRA。
    此外,还简要介绍了LoRA的应用。与LoRA相关的方法分类如下图所示。这篇调查旨在为我们提供全面的背景知识、研究趋势和技术见解。
    在这里插入图片描述

低秩自适应(LoRA)

低维内在维度假说提出,参数过多的模型存在较低的内在维度上,这表明我们只需要更新与内在秩相关的参数,就能获得适当的学习效果。基于这一假设,LoRA提出适应低秩矩阵更新模型中的密集层。它既能提高参数效率,又能提高计算效率。

LoRA

给定一个参数为 W 0 ∈ R d × k W_0 \in \mathbb{R} ^{d\times k} W0Rd×k的密集神经网络层,为使其适应下游任务,使用 Δ W ∈ R d × k \Delta W \in \mathbb R^{d\times k} ΔWRd×k对其进行更新,得到一个参数为 W = W 0 + Δ W W = W_0 + \Delta W W=W0+ΔW的更新层。对于全面微调, Δ W \Delta W ΔW是根据层的所有 d × k d\times k d×k的梯度来计算的,计算成本很高,并且LLM需要大量的GPU内存。为了提高计算效率,LoRA将 Δ W \Delta W ΔW分解成两个小矩阵 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,即
W = W 0 + α B A W = W_0 + \alpha BA W=W0+αBA
其中, r ≪ m i n { d , k } r\ll min {\{d, k\}} rmin{d,k},B和A分贝以随机高斯分布和零初始化, α \alpha α代表控制更新强度的缩放因子。下图对比了完全微调和LoRA的结构。
在这里插入图片描述
LoRA具有很高的参数效率,因为它只更新一部分模型参数,这就减少了微调所需的内存和计算量,而不会增加推理演出。此外,通过从地址矩阵扩展到低秩向量或与Kronecker分解相结合,可以进一步提高参数效率。除了参数效率以外,LoRA的参数也是可以在训练后从模型中分离出来。LoRA的可插拔特性使其能够被多个用户共享和重复使用。当拥有多个任务的LoRA模块时,就可以将这些模块组合起来,并期望获得适当的跨任务泛化性能。此外,LoRA的低秩机制与其他参数高效方法兼容,如常见的适配器(PaFi-HiWiCOMPACTER)。此外,LoRA还能再各种下游任务中实现适当的下游适应性能。如在MMLU基准测试上,与完全微调相比,使用LoRA微调可以在57项任务中获得类似甚至更好的性能。
在实践中,对于基于Transformer的LLM,密集层通常由两种权重矩阵组成:注意力模块中的投影矩阵和前馈神经(FFN)模块。上述实验是基于最初的LoRA设置进行的,将其应用于注意力模块中的查询和值权重矩阵。值得一提的是,后续工作表明,将其应用于FFN层可以进一步提高模型性能。

理论分析

为了理解为什么LoRA是有效的,以及LoRA如何可以更有效,一些工作已经从不同的方面进行了理论分析。为了回答LoRA为何有效,Malladi等人从内核角度分析了LoRA的微调动态,并证明在懒惰状态下,LoRA微调几乎等同于完全微调。此外,Zeng等人对全连接网络(FNN)和Transformer网络(TFN)的LoRA表达能力进行了理论分析。他们证明,如果 L o R A − r a n k ≥ ( f 的宽度 ) × f ˉ 的深度 f 的深度 LoRA-rank \ge (f的宽度) \times \frac{\bar f 的深度}{f的深度} LoRArank(f的宽度)×f的深度fˉ的深度,那么在一个温和的假设条件下,LoRA可以使任何模型f准确代表任何小目标模型 f ˉ \bar f fˉ,其中深度和宽度分别是层数和神经元数量最多的层的神经元数量。此外,他们还量化了LoRA-rank低于该临界值时的近似误差。关于TFN,他们表明,任何模型都可以通过 r a n k − ( e m b e d d i n g   s i z e 2 ) rank - (\frac{embedding~size}{2}) rank(2embedding size)来适应同等大小的目标模型。此外,Koubbi等人利用Transformer数学框架研究了注意力参数的低秩扰动如何影响注意力。
至于LoRA如何才能更有效的问题,Jang等人分析了在NTK框架内,当有N个数据点时,如何对LoRA进行微调。他们证明,在LoRA中使用秩 r ≥ N r\ge \sqrt{N} rN 有助于避免虚假的局部最小值,并有利于发现具有良好泛化能力的低秩解决方案。Zhu等人发现,“项目-下”矩阵A用于从输入中提取特征,而“项目-上”矩阵B则利用这些特征创建所需要的输出。基于这个观察结果,他们证明,与同时调整两个矩阵相比,冻结矩阵A并且只调整矩阵B可以带来更好的泛化效果,此外还能够减少2倍的参数。

实践中的效率

LoRA 的计算效率明显高于完全微调。以微调 LLaMA2-7B 中第一个 FFN 层的密集权重矩阵为例,完全微调需要微调 11 , 008 × 4 , 096 = 45 , 088 , 768 11, 008 × 4, 096 = 45, 088, 768 11,008×4,096=45,088,768 个参数,而当 r = 4 r = 4 r=4时,LoRA 只需要调整 ( 11 , 008 × 4 ) + ( 4 × 4 , 096 ) = 60 , 416 (11, 008 × 4) + (4 × 4, 096) = 60, 416 (11,008×4)+(4×4,096)=60,416个参数。对于这一层,与完全微调相比,LoRA 只需调整近千分之一的参数。
LoRA可以显著降低LLM的内存使用,主要可以分为以下四个部分:

  • 权重内存:储存模型权重所需的内存;
  • 激活内存:正向传播过程中中间激活所占用的内存。主要取决于批量大小和序列长度等因素;
  • 梯度内存:反向传播过程中存储梯度所需要的内存。这些梯度只针对可训练参数进行计算;
  • 优化内存:用于存储优化器状态的内存。如Adam优化器存储可训练参数的“第一时刻”和“第二时刻”。
    LoRA大幅减少了内存的使用量。具体来说由于可训练参数减少,优化内存和梯度内存可以大幅减少。另一方面,虽然LoRA引入了额外的“增量参数”,导致激活内存和权重内存略有增加,但考虑到内存的整体减少,这种增加可以忽略不计。此外,内存的减少还带来了前向传播的加速。与完全微调相比,LoRA的速度提高了1.9倍。

微调之外

除了微调,LoRA还可以用于其他的学习范式,如预训练和持续训练。在预训练方面,ReLoRAMoRA提出使用低阶更新训练高阶网络;此外,LTE提出在计算节点间执行多个低阶投的 并行训练,以尽量减少频繁同步的需要,这有利于在预训练中利用LoRA。至于持续训练,提出的方法是为了解决灾难性遗忘问题的。如InfLoRA通过在子空间中使用最小参数及对预先训练的权重进行重新参数化来解决灾难性遗忘问题。GSLoRA利用组稀疏正则化自动选择特定的LoRA组,同时将其他组归零,以减轻灾难性遗忘效应。I-LoRA利用双内存经验重放结合LoRA参数差值来对抗灾难性遗忘。
此外,LoRA还可用于克服LLM上下文大小有限的问题。如LongLoRA通过将LoRA与以为稀疏注意力相结合,成功地将LLaMA2-7B的上下文窗口从4k扩展到100k。然而,LongLoRA由于注意头结构的混乱和标记组之间不必要的信息交换,其效率无法与普通注意力机制项匹配。为了解决这些问题,SinkLoRA引入了Sink Fixed Attention(SF-Attn),按比例将周期性转移的注意力组返回到未转移状态,并取得了不错的性能。

改善下游适应能力

虽然LoRA可以在某些下游任务上实现不错的性能,但在许多下游任务(如数学推理)上,LoRA与完全微调之间仍存在性能差距。为了弥补这一差距,已经提出了许多方法来进一步提高LoRA的下游适配性能。通常,现有方法可从以下几个方面来改善下游的适应性能:

  • 打破低秩瓶颈,参见下图左;
  • 自适应分配不同LoRA模块的等级,参加下图右;
  • 优化LoRA的学习过程;
  • 与其他学习范式相结合。
    在这里插入图片描述

打破低秩瓶颈

低秩更新使LoRA具有参数效率,但却限制了LLM对下游知识的记忆能力和对下游任务的泛化能力。这种低秩限制导致LoRA在知识和技能密集型领域的性能交叉,如代码和数学。有研究表明,完全微调的登记比LoRA要高出很多(10-100倍),提高LoRA更新的登记可以缩小LoRA和完全微调之间的性能差距。为了提高LoRA的等级和改善其性能,通常是按照如下的方法来提升对应等级的。

沿微调方向堆叠LoRA

矩阵的秩是次可加性的,即对于大小相同的矩阵M1和M2, r a n k ( M 1 + M 2 ) ≤ r a n k ( M 1 ) + r a n k ( M 2 ) rank(M_1+M_2)\le rank(M_1) + rank(M_2) rank(M1+M2)rank(M1)+rank(M2)。基于次可加性,可以将多个LoRA模块聚合在一起,从而提高秩,打破低秩瓶颈。按照这一思路,ReLoRA为LoRA提出了一个合并和重新初始化程序,该程序会定期将LoRA模块合并到LLM,然后在微调期间重新初始化LoRA模块。这相当于将多个LoRA模块堆叠在一起并进行微调,可以提高整体更新的级别。同样,COLA基于Frank-Wolfe算法提出了另一种合并与重置的方法。不过MELoRA指出,合并和重启程序并不一定能保证等级的提高,因为在微调过程中,LoRA模块系列之间可能会出现重叠。为了解决这个问题,MELoRA建议将LoRA模块分解为更小的小型LoRA,然后并行堆叠这些小型LoRA,在理论上验证了其在提高秩方面的有效性。

更新为梯度压缩器

上述方法打破了参数空间的低秩瓶颈。作为补充,FLoRA发现 LoRA 执行固定随机投影来压缩梯度,并限制总权重矩阵变化为低秩。为了克服梯度空间的低秩瓶颈,FLoRA 提出对随机投影进行重新采样,结果表明这在很大程度上恢复了全矩阵 SGD 的性能。

共同更新LLM和LoRA

上述两种方法都侧重于提高 LoRA 本身的表示能力。与之不同,Delta-LoRA提出联合更新 LLM 和 LoRA 模块,直接更新高阶 LLM,比独立更新 LoRA 获得更好的表示能力。它根据连续两次迭代的两个 LoRA 模块之间的差值来更新 LLM,因此无需额外内存即可更新 LLM。

动态等级分配

对于LoRA的等级并不是越高越好。LoRA的等级过高可能会导致性能和效率下降。此外,在微调过程中,权重在Transformer模型不同层的重要性可能会有所不同,因此需要为每一层设置不同的等级。因此,为不同层的 LoRA 模块分配相同的等级并非最佳选择。更好的办法是为不同层的 LoRA 模块自适应地分配等级。现有方法从以下角度为 LoRA 模块自适应分配等级:

基于SVD的方法

利用奇异值分解(SVD)对矩阵进行分解,并有选择地截断其奇异值是控制矩阵秩的有效方法。受SVD的启发,我们可以将LoRA参数矩阵BA分解为SVD形式,即 P ∧ Q P\wedge Q PQ,其中P和Q为正交矩阵, ∧ \wedge 为非负对角矩阵。通过控制 ∧ \wedge 可以控制BA的秩,并未LoRA模块分配等级。在此基础上,有几种秩分配方法近似于BA的SCD分解,并通过过滤对角矩阵来分配秩。AdaLoRA通过正则化P和Q的正交性来近似SVD分解。然后根据莘的重要性评分方法去掉不重要的奇异值。SaLoRA也为P和Q引入了正交正则化;但该方法根据L0范数丢掉了不重要的奇异值。然而上述方法效率不够高,因为它们一开始的秩比较高,然后迭代降低秩,这就带来了预定义的预算。为了解决这个问题,IncreLoRA提出从单一秩开始,然后根据启发式的重要性评分自动增加秩,其中也涉及正交正则化,同时不要求 ∧ \wedge 中的元素为非负。

基于SRD的方法

正交正则化会给LoRA带来难以承受的计算成本,并降低其效率。为了解决这个问题,有几种方法省略了SVD的正交性要求 ,直接将BA分解为单秩分量。然后通过选择合适的组件来分配等级。DoRA(动态低秩自适应)提出将LoRA参数矩阵BA分解为单秩分量,并根据启发式重要性评分对分量进行修剪。AutoLoRA也将LoRA参数矩阵分解为单秩分量,但它是基于元学习对分量进行裁剪的。SoRA取消了正交正则化,直接通过控制对角矩阵来过滤P和Q的列和行(它们的组合可以看做是单秩分量)。是通过将对角矩阵表示为一组可学习的门控单元来控制对角矩阵,并在微调程序中对这些单元进行更新。ALoRA也是通过门控单元来过滤组件,相比之下,它是基于神经结构搜索来学习门控单元的。

基于秩采样的方法

在基于SVD参数化和组件级分解的方法中,需要花费额外的计算成本来搜索合适的秩。为了避免额外的成本。DyLoRA指出,可以通过随机抽样直接分配秩。在每个训练步骤中,它会从预定义的离散分布中抽取一个值b作为秩。然后将矩阵A和矩阵B截断为秩b。在微调过程中只有A的第b行和B的第b列上的参数是可调的,其他参数则被冻结。此外,还可以根据用户的偏好来定义分布。

优化学习程序

在实践中,LoRA的收敛速度比完全微调慢。此外,它对超参数也很敏感,并存在过拟合的问题。这些问题影响了LoRA的效率,阻碍了其下游的适应性能。为了解决这些问题,现在常见的优化LoRA学习程序的方法有如下三种类型。

初始化改进

LoRA通常使用高斯噪声和零分别初始化参数矩阵A和B。有两种简单的方法:第一种方法是将矩阵B设为零,并随机初始化矩阵A;第二种方法则相反。这篇文献比较了这两种方案,通过理论分析得到方法一效果更好。它表明,方法一允许使用更大的学习率而不会导致不稳定,从而使学习过程更加高效。然而,即使使用方法一,这种随机初始化方法仍然会导致初始梯度较小,从而导致收敛速度较慢。为了解决这个问题,PiSSA使用预先训练好的矩阵的主奇异成分对LoRA进行初始化。由于主奇异成分代表矩阵中最重要的方向,因此将初始权重与这些成分对齐可以加快收敛速度并提高性能。相比之下,MiLoRA使用次要的奇异成分对LoRA进行初始化。考虑到低秩矩阵的随机初始化可能会干扰预训练矩阵中学习到的重要特征,它减少了这种干扰,从而在适应新任务的同时提高了整体性能。

梯度更新优化

为了进一步提高LoRA的收敛性和可靠性,一些研究从梯度更新的角度提出了改进建议。这篇文献介绍了一种基于黎曼优化的缩放梯度法,该方法在梯度更新步骤中加入了一个 r × r r\times r r×r的预处理项,以提高LoRA的收敛性和超参数鲁棒性。通过理论分析,LoRA+发现需要为矩阵A和B设置成一个成比例的学习率,已实现稳定的特征学习和加速收敛。ResLoRA将残差链接引入LoRA,以优化梯度传播路径,加快训练收敛速度,提高模型性能。SIBO通过项LoRA的输入中注入初始标记标记表征的残差链接来减轻过度平滑。此外,为了进一步减少计算资源,该方法采用了无梯度优化方法(如CMA-ES和FWA)来优化LoRA,在少样本NLU任务中表现出了极具竞争力的性能。此外,DoRA对梯度更新进行了限制,重点关注参数的方向性变化。它将预训练的权重分解为方向和幅度两个部分,并只对方向部分应用LoRA,以提高训练的稳定性。

减少过拟合

虽然与完全微调相比,LoRA有效地减少了可训练参数的数量,但有相关研究表明LoRA也容易造成过拟合,这与之前的观点有矛盾。为了解决这个问题,BiLoRA采用了双层优化策略,在不同的训练数据子集上交替训练低秩增量矩阵的奇异向量和奇异值。该方法避免了在单一数据集上同时哟计划不同层次的参数,从而减轻了过拟合。此外,还可以使用Drop来减少过拟合,而HiddenKey对注意力层采用了列式滤除,对前馈层采用了元素式滤除。

结合其他学习范式

LoRA可以与其他学习范式相结合,如贝叶斯学习、上下文学习和主动学习等。将LoRA与这些学习范式相结合,可以解决损害下游适应性能的问题。如与结合贝叶斯学习相结合的Laplace-LoRA可以缓解下游适应过程中出现的过度自信的问题。PILLOW与上下文学习相结合,旨在解决某些下游任务中存在的低资源困境。与主动学习相结合的STAR可以有效提高数据效率。

跨任务泛化

LoRA的可插拔性使用户可以为不同任务积累LoRA插件。在Huggingface平台上,有超过20,000个LoRA插件,这些插件可与用于不同任务的各种LLM兼容。这些积累起来的LoRA不仅可以独立使用,还可以混合使用,意识吸纳跨任务泛化。将多个LoRA插件混合在一起,即LoRA混合,已被广泛应用于需要跨任务泛化的领域,如多任务学习、领域适应和持续学习等。现有的LoRA混合方法可以分为人工设计权重的混合、使用学习权重的混合、LoRA专家的混合,具体的方法可以参照下图。
在这里插入图片描述

人工设计权重的混合

早期的LoRA混合方法试图将不同的LoRA模块与人工设计的权重进行线性组合。一些研究表明可以通过简单的平均LoRA模块或其相关输出就可以实现不错的跨任务泛化能力。此外,还提出了几种方法,通过采用人工设计的权重来进一步提高LoRA混合的性能,如ControlPEPEMs将权重系数设为超参数,通过使用超参数搜索来确定两个LoRA模块的最佳组合。此外,Token-level Adaptation利用输入特征与适配器数据集中心之间的余弦相似度作为权重因子,而BYOM则采用了任务算法、Fisher合并和Regmean等基本模型融合方法。使用人工设计的权重进行混合可以快速混合多个LoRA,而无需额外的训练,这体现了简单性和计算效率。但往往无法找到最佳权重,导致性能不稳定,泛化能力有限。随后,研究人员探索了使用基于学习的方法来更精确和自适应的混合。

使用学习权重的混合

为了学习最佳混合权重,在任务级、实例级和token级别上提出了几种满足不同需求的方法。任务级的方法侧重于增强任务的可转移性,既可以是基于梯度的方法,也可以是无梯度的方法,如LoRAHub。该方法采用了名为CMA-ES的黑河算法来优化LoRA模块的权重因子,从而简化了训练过程。之后ComPEFTL-LoRA利用LoRAHub混合量化的LoRA模块,进一步提高了计算效率。
与任务级方法先比,实例级和token级方法可以为复杂输入提供灵活性和精确性。在多模态指令调整方面,MixLoRA可根据输入示例动态选择合适的低秩分解向量,然后将其整合到LoRA矩阵中进行训练。为了完成蛋白质力学分析和设计任务,X-LoRA开发了一种动态门控机制,在token级和层级力度上为LoRA模块分配权重。这些方法在特定任务或应用场景中表现出更好的性能。

LoRA专家的混合

如果LoRA模块时可训练的额,我们就可以共同学习混合权值和LoRA模块,从而进一步提高LoRA混合的性能。为了共同学习混合权值和LoRA模块,LoRA专家混合(LoRA MoE)是一个比较自然的选择,其中每个LoRA模块充当专家,而路由器网络通常是分配混合权重。LoRA MoE已经在很多任务上被证明都是有效的,如持续学习MoRALLoRAMoE,视觉语言任务MoCLE和多任务医疗应用MOELoRA
现有方法可以从初始化、任务关系管理和效率等方面提高LoRA MoE的性能。对于初始化,Mixture-of-LoRAs首先分别训练多个LoRAs作为初始化,然后联合优化路由器和LoRAs。MultiLoRA建议改进初始化以减少参数依赖性,从而产生更均衡的单元子空间。在任务平衡方面,MLoRE在MoE结构中添加了低秩卷积路径来捕捉全局任务关系。MTLoRA同时采用任务无关模块和任务特定的LoRA模块来解决任务冲突。为了提高效率,MoLA自适应地将不同数量的LoRA专家分配到Transformer模型的不同层,以节省LoRA模块的数量。LLaVAMoLESiRA利用系数计算来降低计算成本。此外,Octavius利用实例级指令稀疏地激活独立的LoRA专家,以减少任务干扰并提高效率。Fast LoRA允许小批量中的每个样本具有其独特的低等级适配器,从而实现高效批次处理。
此外,有些方法虽然没有明确基于MoE,但遵循了MoE的思想。例如I-LoRA使用两个LoRAs分别管理长时记忆和短时记忆,以实现持续学习。

提高效率

随着LLM的普及,训练和运行LoRA模块的需求迅速增加。这种不断增长的需求带来了难以忽略的计算负担。因此,对于LoRA而言,越小、越快、越好。为了满足这一需求,现有方法从以下几个方面提高了LoRA的计算效率。

减少参数

LoRA虽然大幅减少了用于微调类里面的可调参数数量。然而,他仍然需要昂贵的激活内存来更新低秩矩阵。为了进一步降低内存成本,现有方法通过参数冻结、参数剪枝和参数共享来减少LoRA的可调参数数量。

参数冻结

参数冻结法通过冻结LoRA的部分参数来减少其可调整参数的数量。这些方法可以分为参数内方法和参数外方法。
参数内方法通过调整LoRA的参数自己,同时冻结其他参数。LoRA-SP在微调过程中随机选择一半的LoRA参数进行冻结。LoRA-FA在LoRA的每一层冻结下投影权重并更新上投影权重。AFLoRA在训练LoRA的过程中构建低阶可训练路径并逐渐冻结参数。此外,DropBP通过在反向传播过程中随机放弃一些LoRA梯度计算来加速训练过程。
参数外方法是在冻结LoRA原始参数的同时,引入并调整一组额外的参数,其中大部分方法都是基于奇异值分解(SVD)提出的。LoRA-XS在冻结的LoRA矩阵之间添加了一个 r × r r\times r r×r的权重矩阵,该矩阵使用原始权重矩阵的SVD方法构建的;然后,它在微调时只调整 r × r r\times r r×r权重矩阵。同样,BYOMLoRA采用SVD压缩多任务模型的LoRA矩阵。

参数修剪

参数修剪方法旨在去除训练和推理过程不重要的LoRA参数。这些方法通过独立剪枝LoRA或联合剪枝LoRA和LLM来剪枝参数。LoRA-drop使用各层LoRA的输出来评估参数的重要性,并剪除不重要的参数。相比之下,LoRAPrune则根据LoRA的梯度联合剪枝LoRA矩阵和LLM参数。此外,还可以使用LoRA 支持LLM的参数剪枝LoRAShearLoRALPrun

参数共享

参数共享方法通过在LLM的不同层或模块之间共享参数来减少参数数量。VeRA提议在所有层之间共享一对冻结随机矩阵,并使用“缩放向量”进行分层适应。VB-LoRA提出了一种“分割-共享”范式,即通过秩分解对LoRA的地址分解进行分割,并基于混合模型实现全局共享。FourierFT不是在原始参数空间共享参数,而是利用傅里叶变换将增量矩阵 Δ W \Delta W ΔW转换到空间域。它共享所有层的频谱条目,只学习每一层的稀疏频谱稀疏,从而减少了可训练参数的数量。

参数量化

量化可以减少参数的位宽(如从32位浮点数到4位整数),从而降低LoRA的内存和计算成本。现有的量化感知LoRA方法包括基于训练后量化(PTQ)的方法和基于量化感知训练(QAT)的方法。

基于PTQ的方法

在基于PTQ的方法中,首先对LLM进行量化,然后对量化后的模型进行微调,即量化和微调一次进行。QLoRA是第一种给予PTQ的量化感知LoRA方法。在微调阶段,它首先将LLM量化为4位,然后在其上微调精度更高的LoRA模块,如BFloat16或Float16。在推理阶段,它将LLM去量化为与LoRA相同的精度,然后将LoRA更新添加到LLM中。
虽然QLoRA可以大大降低微调的内存成本,但它并不能为推理带来好处,因为它需要再次将LLM去量化以达到高精度。为了解决这个问题,提出了QA-LoRA,以降低微调和推理阶段的内存成本。该方法使用组级算子来平衡LLM量化和微调的自由度,使其能够获得与量化的LLM具有相同精度的LoRA模块。因此,可以在 不去量化的情况下执行推理。

基于QAT的方法

在基于QAT的方法中,共同对LLM进行量化和微调。这些方法可以缓解在基于PTQ的方法中观察到的量化差异。为了解决QLoRA的量化差异,LoftQ在微调过程中交替使用量化和低秩近似,以最小化量化误差。而ApiQ提出LoftQ忽略了层与层之间的误差传播,并提出了激活保留的初始化来避免误差传播。L4Q是从层设计的方面来进行量化的。

并行LoRA计算框架

LoRA的参数效率特性使我们能够在单个GPU和GPU集群上对多个模块进行微调或推断,从而节省计算资源,提高LoRA的效率。这节将从并行微调和并行推理两个方面进行介绍。

并行微调

在单个GPU上并行微调多个LoRA模块可以减少GPU内存使用量并提高计算效率。ASPEN提出了一种针对LoRA的高吞吐量并行微调框架,该框架有BatchFusion方法和自适应作业调度算法组成。具体来时,BatchFusion方法通过将多个输入批次融合为一个批次,支持在共享LLM上并行微调多个LoRA模块,而自适应作业调度算法则为微调作业分配计算资源。

并行推理

用于LoRA的并行推理框架不仅能提高计算效率,还能支持多租户服务的需求。Punica使用新的CUDA内核设计为不同的LoRA模块批处理GPU操作。在Punica的基础上,S-LoRA通过引入统一的分页机制和新的张量并行策略,进一步优化了并行推理框架,从而能够为数千个并发LoRA模块提供服务。在Punica和S-LoRA的基础上,CARASERVE通过CPU-GPU合作和秩感知调度,降低了冷启动开销,进一步提高了服务效率和SLO(服务级目标)的实现率。

联合学习中的LoRA

在将LLM应用于医学和金融等垂直领域时,可用的训练数据可能被多个用户私有。这种情况下,训练数据不是集中的,因此必须在保持数据本地化的同时对LLM进行微调,即联合学习。在联合学习中,客户端通常在本地计算权重更新,然后与其他客户端共享这些更新,以全局更新LLM。这给用户带来了通信和计算成本。由于LoRA具有参数效率高和可插拔的特点,因此可以降低通信成本和计算资源需求。因此LoRA可以提高联合学习的整体效率和可扩展性。
然而,在联合学习中采用LoRA并不容易,因为联合学习面临着数据异构、设备异构和模型异构等挑战。为了解决这些问题, 最近的研究为LoRA设计了各种方法,以满足联合学习中的不同需求。此外,作为一个本地化的参数组件,LoRA的可插拔性使其能够支持联合学习中的参数隐私保护。

数据异构性

数据异构性是指客户端之间数据分布之间的差异。在联合学习中,不同额客户端通常由不同的数据分布。数据分布的不一致性会影响模型的整体性能。 在联合学习很重,随着用户数据变得越来越多样化,LoRA和完全微调之间的性能差距也在扩大。为了解决这个问题,研究人员提出了如下几种改进的方法。

  • SLoRA:为LoRA引入了一种数据驱动的初始化方法。首先在应用LoRA之前执行稀疏联合微调,然后执行SVD将累积梯度更新分解为低秩矩阵,用于LoRA初始化。目标是使LoRA模块能够更好地适应每个客户的数据分布,从而更有效地讲这些异构数据特征整合到全局模型中。
  • FeDeRA:使用了一种更简单的初始化方法。直接将SVD应用于预先训练的权重来初始化LoRA。保留预训练权重的主成分可以调整不同客户端权重更新的方向和幅度,从而处理数据异构问题。
  • FFA-LoRA:冻结一个低秩矩阵,只对另一个进行微调。这减少了服务器聚合LoRA梯度时的不一致性,缓解了非IID数据造成的优化不稳定性。

设备异构性

设备异构性是指参与联合学习的客户端在硬件能力和网络连接方面的差异。传统的联合学习方法经常会收到“水桶”效应,即系统的整体性能受限于功能最弱的客户端的能力。具体来说,这些方法使用最小的LoRA等级来满足所有客户的需求,这使得许多资源丰富的客户无法充分发挥其能力。
为了解决这个问题,可以采用动态参数分配策略。FedMS可根据客户端的实时计算资源动态调整激活的LoRA矩阵数量。FlexLoRA采用动态参数分配策略,根据资源限制调整LoRA的等级,并重新分配全局LoRA权重的SVD部分。HETLoRA为不同的客户端分配不同的等级,但是是根据来自不同客户端更新的稀疏程度来进行加权聚合,比简单聚合更能平衡更新信息。

模型异构性

模型异构性表示客户之间的模型结构出在差异。在传统的联合学习中,客户端使用相同结构的本地模型,允许将其参数汇总到服务器上的全局模型中。然而在实践过程中,由于个人需求,客户可能更喜欢使用不同的模型架构而且不愿意披露模型细节。因此有必要在异构模型之间传输知识,而不共享私人数据或泄露本地模型架构。
以前的工作采用了知识蒸馏、模型集成和相互学习等方法来解决模型的异构性问题。然而这些方法都有局限性,如依赖公共数据集、额外的通信成本和本地模型性能不佳。为了避免这些限制,pFedLoRA将LoRA作为全球和本地知识库的载体,采用迭代训练策略促进知识转移和整合,使不同客户的异构模型之间能够实现知识共享。

参数隐私性

在联合学习中,保护客户特定参数至关重要,因为确保这些参数的因此也能间接保护客户数据隐私。作为一种调整个性化参数的模块化方法,LoRA可以有效地集成到联合学习系统中,实现参数隐私保护。
文献提出了一种基于模型切片的安全分布式语言模型训练框架,在可信执行环境(TEE)中部署了LoRA,并使用OTP加密在GPU和TEE之间传输特征,从而保护了模型参数隐私。PrivateLoRA引入了一种基于LoRA的分布式系统,在低秩矩阵A和B之间添加了一个正方形矩阵M。不可训练的矩阵A和B以及大部分预训练的权重都部署在全局服务器上,以提高计算量。同时,可训练矩阵M作为个性化参数存储在客户端,从而确保了参数的隐私保护。
此外,最近的研究还将差异隐私(DP)技术与联合学习中的LoRA相结合,以增强数据隐私。DPLoRA通过在更新过程中为LoRA的权重更新添加高斯噪声来确保差分隐私。这种方法既能保护隐私,又能提高通信效率。为了解决在LoRA中应用差分隐私时的噪声放大问题。FFA-LoRA固定了矩阵A,避免了局部半二次问题,提高了鲁棒性和性能。

LoRA的应用

LoRA与其独特的优势得到了广泛的应用。研究人员在利用LoRA对下游任务的预训练模型进行微调,在提高性能的同时减少了计算资源的需求。LoRA强大的适应性和高效性改进了各种应用,这一块主要讨论以下几个方面的应用。

语言任务

由于近期预训练语言模型(特别是LLM)的发展非常迅速,由于其出色的性能,正在彻底改变语言任务的处理方法。然而,这些预训练模型是在大量通用数据上训练出来的,仍需要在特定任务数据上进一步微调,以适应下游任务。因此,使用LoRA对这些预训练的语言模型进行微调是很自然的,因为这样可以减少对计算资源的需求。这一块主要关注的是一些有代表性的下游任务,如传统NLP任务、代码任务、模型对齐和垂直领域的任务。

传统NLP任务

由于LLM具有很强的指令遵循能力和上下文理解能力,一些研究应用LoRA对这些模型进行微调,以完成传统的NLP任务。如情感识别文本分类角色识别AutoRE将QLoRA应用于三个文档级关系提取任务,在不同的LLM上取得了很好的性能。此外,下面这些研究Steering Large Language Models for Machine Translation with Finetuning and In-Context LearningFine-tuning Large Language Models for Domain-specific Machine TranslationAssessing Translation capabilities of Large Language Models involving English and Indian Languages从不同角度利用LoRA提高了模型在机器翻译任务中的能力。同时这两篇研究PLoRAy-Tuning表明LoRA还可以提高BERT和T5在文本理解任务中的性能。

代码任务

一些研究将LoRA用于提高各种代码相关任务的模型性能。如使用LoRA微调的BERT模型适用于代码变更相关任务,这两篇论文Empirical StudyEmpirical Study on JIT Defect Prediction在准时缺陷预测(JIT-DP)方面取得了很好的效果。同样,在论文Parameter-Efficient Finetuning of Transformers for Source Code中使用LoRA训练CodeT5和PLABRT可以增强它们在代码总结和代码克隆检测方面的适应性。至于纯解码器模型,RepairLLaMA使用LoRA对LLaMA进行了微调,以实现自动程序修复(APR),而WizardCoder-15B则使用LoRA对文本到SQL任务进行了微调。此外,SteloCoder是StarCode的微调版本,设计用于多语言到Python代码的翻译。

模型对齐任务

模型对齐任务重点是调整机器学习模型,使其与人类的价值观和意图相一致,通常使用的技术包括基于人类反馈的强化学习(RLHF)。为了减少RLHF的内存需求,PERLEfficient RLHFalpaca_farm_lora使用LoRA来微调奖励模型和策略模型。此外,还有一些研究通过整合多个LoRA适配器来改进奖励模型。例如,DMoERM将MoE和LoRA相结合,将模型输入路由到多个LoRA专家。研究Improving Reinforcement Learning from Human Feedback with Efficient Reward Model Ensemble也提出了一种基于LoRA的集合方法。Uncertainty-Penalized Reinforcement Learning from Human Feedback with Diverse Reward LoRA Ensembles这种整合也有利于奖励模型中不确定性的量化。此外,Bayesian Reward Models for LLM Alignment应用Laplace-LoRA来训练贝叶斯奖励模型,从而缓解了n次最佳采样中的奖励过度优化。

垂直领域任务

LLM通常在垂直领域中表现得不够理想,需要利用特定领域的专业知识进行微调。一些研究利用LoRA来提高LLM在特定领域任务中的性能。如BioInstructclinical-peftclinical camel利用LoRA对医疗数据集上的LLM进行了微调,使其适应医疗领域。此外还有一些研究改进了医疗任务,如临床对话总结断言检测和医疗质量保证任务IvyGPTSM70。同样,FinLlamaFinancial News Analytics Using Fine-Tuned Llama 2 GPT ModelFingpt利用LoRA对金融数据中的LLM进行了微调,以解决金融新闻分析和情感分类等任务。在下面这篇文章中Ra-cfgpt,LoRA还可以用于提高查询重写和索引调整等数据库任务的性能。

视觉任务

在视觉任务中,LoRA主要应用于图像生成和图像分割,可以显著提高训练效率并优化模型性能。

图像生成

图像生成任务在计算机视觉领域具有重要意义。近年来,扩散模型在图像生成任务中表现出了卓越的性能。LoRA被广泛应用于扩散模型中,以解决各种图像生成的任务,同时减少计算资源。一些研究利用LoRA对图像风格转换的扩散模型进行了微调如DiffStylerB-LoRAFacechainCalliffusionSTYLE TRANSFER USING STABLE DIFFUSION,还有研究将其应用于文本到图像的生成中,如Block-wise LoRAOMGSpace NarrativeGenerating coherent comic with rich story using ChatGPT and Stable DiffusionStitchDiffusion

此外,研究人员还设计了几种基于LoRA的方法来提高图像生成质量。如Smooth Diffusion利用LoRA在潜在空间中实现平滑性,从而在各种图像生成和编辑任务中获得更好的性能。ResAdapter采用LoRA学习分辨率先验,根据动态分配率调整卷积层的感受野。为了专门提高文本到图像的质量,STAMINA利用LoRA对较长概念序列的扩散模型进行微调。DreamSyncStyleAdapter利用LoRA提高文本保真度和图像质量。Mix-of-Show利用LoRA权重捕捉域外信息,以高保真方式结合多个用户自定义概念,减少概念冲突。LCM-LoRALoRA-Enhanced Distillation on Guided Diffusion Models将LoRA与模型提炼相结合,以加速图像生成。此外,LoRA还可应用于视频生成Customize-A-VideoDragvideoRerender A videoInfusionStable video diffusionAnimatedif和3D生成任务DreamControlX-DreamerBoosting3dAs-Plausible-As-PossibleDragTex

图像分割

图像分割是计算机视觉领域的一项重大挑战,其目的是将图像分割为多个有意义的区域或对象。为此,SAM被提出来作为图像分割的基础模型,并表现出了卓越的泛化能力。为了进一步提高其在特定垂直领域的性能,许多研究利用LoRA对其进行了微调。如在车牌检测中,SamLP利用LoRA对SAM进行调整,以高效分割车牌。在结构损伤检测中,SAM-based instance segmentation models for the automation of structural damage detection利用LoRA对SAM的编码器进行了微调,以完成实例分割任务。在医疗领域,许多研究也应用LoRA对SAM进行微调,以完成各种任务,如细胞核分割Segment Any Cell、OCTR图像分割SAM-OCTA、脑肿瘤分割Cheap Lunch for Medical Image Segmentation、器官分割SAMed和手术器械分割SAM Meets Robotic Surgery。此外,一些研究使用LoRA对视觉Transformer(ViT)进行微调,用于视觉跟踪Tracking Meets LoRA和人脸伪造检测Enhancing General Face Forgery Detection

多模态任务

多模态大语言模型(MLLM)旨在将文本与音频、图像和视频等多种模态整合在一起,通过统一的嵌入空间实现跨模态理解和推理。LoRA在NLP和视觉任务中取得的成功激发了人们将其应用于MLLM的浓厚兴趣。
在MLLM中,LoRA不仅能提高训练效率,还能促进有效的模态对齐。在音频-文本任务中,SALM包含LoRA层、基于文本的冻结LLM、音频编码器和模态适配器。用于处理语音输入和相应的任务指令。对于图像-文本任务,InternLM-XComposer2通过对图像标记应用LoRA来实现模态对齐;mPLUG-Owl在冻结视觉模块的同时,联合微调LoRA和文本模块的抽象器;CollaVO采用QLoRA来保持对象级图像理解。在视频-文本任务领域,VSP-LLM利用QLoRA对文本模块进行了微调,用于视觉语音处理;MolCA利用LoRA理解二维分子图和文本;而TPLLM则通过整合序列和空间特征,利用LoRA进行高效流量预测。这些应用证明了LoRA在MLLM任务中的多功能性和强大功能。

总结和未来发展方向

这篇文章从改善下游适应性、跨任务泛化、提高效率、联合学习和应用等方面系统回归了LoRA的最新进展。通过以上综述,我们可以发现LoRA具有参数高效、可插拔、兼容性强、易于实现跨任务泛化等特点,这使其称为LLMs应用中最重要的技术之一。最近的研究进展进一步提高了LoRA的通用性和效率,激发了它在更多场景中的应用潜力。在这里,作者列出了LoRA未来不可或缺的三个发展方向。

用于GaaS的LoRA

在生成即服务(GaaS)中,基于云平台为用户提供生成人工智能(AGI)服务。GaaS使用户无需部署 本地计算资源即可享受AGI。由于用户的需求多种多样,因此有必要为GaaS提供各种功能。为了实现各种功能,可以为每个功能构架一个LoRA模块。LoRA的参数效率和可插拔性有助于高效地构建和执行对应的功能。此外,GaaS平台上的服务会随着时间的推移而快速变化。为了跟上变化,我们可以训练由以前的LoRA模块组成初始化的新LoRA模块。LoRA的跨任务泛化能力有助于快速适应服务更新。

继续预训练的LoRA

在持续预训练中,基础模型会不断地使用未标记的用户数据进行训练,以使模型适应特定领域。通常情况下,自我监督训练的目标和预训练相同,学习了也比预训练小得多。持续预训练是构建垂直领域LLM的重要阶段。然而,它的计算成本很高,阻碍了垂直领域LLM的发展,尤其是对于计算资源有限的组织而言。加强LoRA以进行持续的预训练并降低其计算成本是值得探索的。

自主代理的LoRA

在基于LLM的自主代理中,代理被分配了特定的角色。根据角色和环境,代理采取行动来响应用户或其他代理的请求。这些行动够可以基于自我知识或为特地领域任务设计的工具。请求和行动都存储在内存中,以支持未来的请求。
在当前的代理中,角色通常是通过提示来分配的;然而,当角色复杂且相关数据较多时,提示可能无法提供全面的角色描述。利用从角色相关数据中训练出来的LoRA模块来分配角色可能是更好的选择。此外,代理工具可以是LoRA模块。此外,存储器通常会通过检索增强生成(RAG)来增强代理。但是,由于输入标记的限制和上下文学习的不足,基于RAG的支持可能不太有效。相比之下,我们可以使用基于LoRA的持续学习来构建记忆模块,从而解决RAG的问题。因此LoRA驱动的代理值得探索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nlp_xiaogui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值