一、结论写在前面
论文标题:A Survey on LoRA of Large Language Models
论文链接:https://arxiv.org/pdf/2407.11046
低秩适应(Low-Rank Adaptation, LoRA)通过更新密集神经网络层的可插拔低秩矩阵,是表现最佳的参数高效微调范式之一。此外,它在跨任务泛化和隐私保护方面具有显著优势。因此,LoRA近期备受关注,相关文献数量呈指数级增长。有必要对LoRA的当前进展进行全面综述。
论文从以下几个方面对进展进行分类和评述:(1)下游适应改进变体,这些变体提高了LoRA在下游任务上的性能;(2)跨任务泛化方法,这些方法混合多个LoRA插件以实现跨任务泛化;(3)效率提升方法,这些方法提升了LoRA的计算效率;(4)数据隐私保护方法,这些方法在联邦学习中使用LoRA;(5)应用。此外,本综述还讨论了该领域的未来方向。
论文列出三个未来方向,LoRA将在这些方向中不可或缺。
LoRA for GaaS:在生成即服务(Generative-as-a-Service, GaaS)中,基于云的平台为用户提供生成式人工智能(AGI)服务。GaaS使用户无需部署本地计算资源即可享受AGI。
用于持续预训练的LoRA:在持续预训练中,基础模型通过未标记的用户数据进行连续训练,以适应特定领域。通常,自监督训练目标与预训练相同,且学习率远小于预训练时的学习率。
用于自主agent的LoRA:在基于大型语言模型(LLM)的自主agent中,agent被赋予特定角色。基于这些角色和环境,agent执行动作以响应用户或其他agent的请求。
二、论文的简单介绍
2.1 论文的背景
由于LLMs的知识边界,它们在某些下游任务上的能力仍然有限。为了扩展知识边界,仍然需要在下游任务上对LLMs进行微调。然而,对大型语言模型(LLM)的所有参数进行微调,即全面微调,在计算上极为昂贵。例如,全面微调一个LLaMA2-7B[3]模型大约需要60GB的内存,这超出了普通消费级GPU[4]的容量。为了降低计算成本,多种参数高效微调(PEFT)方法被提出。这些方法通过仅微调少量(额外)模型参数来使LLM适应下游任务。
从是否涉及额外参数的角度来看,PEFT方法可分为两类:额外参数方法和内部参数方法。额外参数方法会冻结LLM的所有原始参数,并插入一组可学习参数以优化模型输入或模型层,如适配器调优[6]和提示调优[7]。相比之下,内部参数方法会冻结LLM的大部分原始参数,仅微调LLM的少量参数,如BitFit[8]、LISA[4]和LoRA[9]。
当论文无法修改模型架构时,内部参数方法更为可取。在内部参数方法中,LoRA是最广泛使用的,因为它能在多种任务上实现与全面微调相当或更优的下游适应性能,并且易于实施。此外,已有许多变体被提出,以进一步提高LoRA在更具挑战性的下游任务上的适应能力。
LoRA通过更新大型语言模型(LLM)中的密集神经网络层与可插拔的低秩矩阵,实现了参数效率。这些矩阵(又称LoRA插件)独立于LLM,可以存储并在其他相关下游任务中重复使用。此外,这些LoRA插件可以组合以实现跨任务泛化,这有助于多任务学习、领域适应和持续学习。
随着LoRA插件的积累,管理这些插件的计算成本逐渐增加。尽管LoRA在计算上高效,但管理更多LoRA插件的计算成本不容忽视。因此,有必要进一步提升LoRA的计算效率。改进可以从降低单个LoRA插件的计算成本和加速多个插件的可扩展服务入手。这将推动LoRA在现实应用中的应用,例如生成即服务(GaaS)云产品。
在某些情况下,训练数据由多个客户端私有,无法集中。为了适应分布式训练数据的LLM,论文可以采用联邦学习来保护每个客户端的数据隐私。然而,联邦学习面临高昂的通信和计算成本。为了降低成本,LoRA是一个自然的选择。其参数效率特性有助于减少每个客户端的计算成本和跨客户端共享参数的通信成本。此外,LoRA的可插拔特性有助于在联邦学习中保护每个客户端的参数隐私。因此,LoRA在隐私保护方面具有巨大潜力。
2.2 低秩适应(LoRA)
低维内在维度假设(Low-dimensional intrinsic dimensionality hypothesis )提出,过度参数化的模型存在于一个较低的内在维度上,这表明论文仅通过更新与内在秩相关的参数即可实现适当的学习性能。基于这一假设,LoRA[9]提出使用低秩矩阵更新模型中的密集层,从而实现参数和计算效率的双重提升论文首先介绍LoRA的详细信息,然后介绍专注于LoRA理论分析的现有工作。此外,论文展示了LoRA在实践中的效率。最后指出LoRA除了微调外还可用于其他场景。
2.2.1 LoRA
给定一个由W_0 ∈ R^d x k参数化的密集神经网络层,为了适应特定任务,论文通过Delta W ∈R^d x k对其进行更新,得到一个由W = W_0 + Delta W参数化的新层。对于完全微调,Delta W是基于该层所有d x k参数的梯度计算的,这在计算上昂贵且需要大量GPU内存用于大型语言模型(LLMs)。为了提高计算效率,LoRA将Delta W分解为两个小矩阵B ∈ R^d x r和A ∈ R^r x k,即
其中r << m i n{d, k},B和A分别初始化为随机高斯分布和零,α表示控制更新强度的缩放因子。LoRA的参数数量为r x( d+k ),远少于d x k。图2(a)和(b)比较了完全微调和LoRA的结构。
LoRA因其仅更新模型参数的一小部分子集,从而在微调过程中减少了内存和计算需求,且不增加推理延迟而具有极高的参数效率。此外,通过将低秩矩阵扩展至低秩张量或结合Kronecker分解,其参数效率可进一步提高。除了参数效率外,LoRA还具有可插拔性,即训练后的LoRA参数可与模型分离。LoRA的可插拔特性使其能够被共享和重复使用于多个用户。当论文拥有针对多个任务的LoRA插件时,可以组合这些插件并期待适当的跨任务泛化性能。此外,LoRA的低秩机制与其它参数高效方法(如adapter)兼容。
在实践中,对于基于Transformer的大型语言模型(LLM),密集层通常包含两种类型的权重矩阵:注意力模块中的投影矩阵和前馈神经网络(FFN)模块中的矩阵。在原始研究中,LoRA被应用于注意力层的权重矩阵。后续工作表明,在FFN层中使用它可以进一步提高模型性能 。
图1 本文的分类体系
图2 展示了全量微调(a)、LoRA(b)及其改进下游适应的变体,包括打破低秩瓶颈(c)和动态秩分配(d)
2.2.2 理论分析
为了理解LoRA为何有效以及如何使其更有效,已有几项工作从不同方面提供了理论分析。为了回答LoRA为何有效的问题
•Maladi等人 [10] 从核函数的角度分析了LoRA的微调动态,并证明在惰性机制下,LoRA微调几乎等同于全量微调。
•此外,Zeng等人 [14] 对LoRA在全连接神经网络(FNNs)和Transformer网络(TFNs)中的表达能力进行了理论分析
•此外,Koubbi等人 [1] 利用了[195-197]建立的Transformer数学框架,研究了注意力参数中的低秩扰动如何影响。
关于LoRA如何能更高效的问题:
•Jang等人[12]在神经切线核(NTK)[198]框架内分析了LoRA的微调过程,表明采用秩 ( r >=sqrt N ) 的LoRA有助于避免虚假的局部最小值,并促进发现具有良好泛化能力的低秩解。
•此外,Zhu等人[13]观察到,降维矩阵 A\ 用于从输入中提取特征,而升维矩阵 B 则利用这些特征生成期望的输出。基于这一观察,他们证明,在仅调整升维矩阵 (\boldsymbolB) 的同时冻结降维矩阵 A,相比于同时调整两个矩阵,不仅能获得更好的性能,还能实现参数数量减少2倍的效果。
2.2.3 实践中的效率
LoRA的计算效率显著高于全量微调。以微调LLaMA2-7B中第一层前端网络(FEN)的密集权重矩阵为例,全量微调需要调整11,008 x 4,096 = 45,088,768个参数,而LoRA在 ( r=4 ) 时仅需要调整(11, 008 × 4) + (4 × 4, 096) = 60, 416。对于这一层,LoRA仅调整了全量微调参数的近千分之一。
LoRA能够显著降低微调大型语言模型(LLM)的内存使用,这可以分为四个部分:
(1)模型内存(权重内存:存储模型权重所需的内存;
(2)激活内存:前向传播过程中中间激活所占用的内存,主要取决于批次大小和序列长度等因素;
(3)梯度内存:反向传播过程中存储梯度所需的内存,梯度仅针对可训练参数计算;
(4)优化内存:存储优化器状态所用的内存。例如,Adam优化器存储可训练参数的“第一矩”和“第二矩”。
[4]提供了一个全面的实证比较,对比了在LLaMA2-7B模型上使用批次大小为1的完整微调与LoRA微调,利用单个NVIDIA RTX4090(24GB)GPU。根据这项研究,完整微调需要大约60GB的内存,超过了RTX4090 GPU的容量;相比之下,LoRA微调仅需要约23GB的内存。LoRA显著降低了内存使用,使得在单个NVIDIA RTX4090(24GB)GPU上微调LLaMA2-7B成为可能。具体来说,由于可训练参数减少,优化内存和梯度内存分别显著减少了约25GB和14GB。另一方面,虽然LoRA引入了额外的增量参数,导致激活内存和权重内存略有增加(总计约2GB),但考虑到整体内存的减少,这种增加可以忽略不计。此外,减少内存还带来了前向传播的加速。与完整微调相比,LoRA快了1.9倍。
2.2.4 超越微调
除了微调之外,LoRA还可以应用于其他学习范式,如预训练和持续训练。对于预训练,提出了ReLoRA[15]和MoRA[16],使用低秩更新来训练高秩网络;此外,LTE[17]提出在计算节点间并行训练多个低秩头,以最小化频繁同步的需求,这有助于在预训练中利用LoRA。至于持续训练,已有几种方法被提出以解决灾难性遗忘问题。
InfLoRA[18]通过在子空间中用最小参数集重新参数化预训练权重来解决灾难性遗忘问题。GS-LoRA[19]使用组稀疏正则化自动选择特定LoRA组,同时将其他组置零,以减轻灾难性遗忘效应。I-LoRA[20]利用双内存经验回放结合LoRA参数插值来对抗灾难性遗忘。
此外,LoRA还可用于克服LLMs的有限上下文大小问题[3,21]。例如,LongLoRA[3]通过将LoRA与移位稀疏注意力相结合,成功地将LLaMA2-7B[199]的上下文窗口从4k扩展到100k个令牌,且计算效率高。然而,LongLoRA由于注意力头结构的混乱以及令牌组之间不必要的信息交换,其效率不及传统的注意力机制。为了解决这些问题,SinkLoRA[21]引入了Sink固定注意力(SF-Attn),通过按比例将循环移位的注意力头组返回到未移位状态,从而实现了适当的性能。
2.3 下游适应性改进
尽管LoRA在一些下游任务上能够实现适当的适应性能,但在许多下游任务(如数学推理[200-202])中,LoRA与完全微调之间仍存在性能差距。为了填补这一差距,许多方法被提出以进一步提高LoRA在下游任务适应性方面的表现。现有方法通常从以下几个角度提升下游适应性能:(1)打破低秩瓶颈,参见图2©;(2)自适应分配不同LoRA模块的秩,参见图2(d);(3)优化LoRA的学习过程;(4)与其他学习范式结合。
2.3.1 打破低秩瓶颈
低秩更新使LoRA具有参数效率;然而,它限制了模型记忆下游知识和在下游任务上的泛化能力[16, 201-204]。这种低秩限制导致LoRA在知识密集型和技能密集型领域(如代码和数学)的性能不如完全微调。实验研究[202]表明,完全微调的秩显著(10至100倍)高于LoRA,并且增加LoRA更新的秩可以缩小LoRA与完全微调之间的性能差距。为了增加LoRA的秩并提升其性能,已经提出了几种方法[15,22,25,205],这些方法通常通过以下方式增加秩:(1)在学习迭代中堆叠LoRA;(2)作为梯度压缩器进行更新;(3)在微调过程中同时更新LLM和LoRA模块。
2.3.1.1 沿微调堆叠LoRA
矩阵秩是次可加的,即对于相同大小的矩阵 M_1 和 M_2,有 rank ( M_1+M_2 ) <= rank ( M_1 )+ rank(M2)。基于这种次可加性,论文可以将多个LoRA模块聚合在一起,以增加秩并打破低秩瓶颈。基于这一思想,ReLoRA [15] 提出了一个针对LoRA的合并-重新初始化过程,该过程在微调期间定期将LoRA模块合并到LLM中,然后重新初始化LoRA模块。这相当于在微调过程中堆叠多个LoRA模块,并且可以增加整体更新的秩。类似地,COLA [22] 提出了基于Frank-Wolfe算法 [206] 的另一种合并-重新初始化方法。然而,MELoRA [23] 指出,合并-重新初始化过程不一定能保证秩的增加,因为在微调过程中LoRA模块序列之间可能存在重叠。为了解决这个问题,MELoRA 提出将LoRA模块分解为更小的mini LoRA,然后并行堆叠这些mini LoRA,其增加秩的有效性在理论上得到了验证。
2.3.1.2 作为梯度压缩器的更新
上述方法在参数空间中打破了低秩瓶颈。作为补充,FLoRA [24] 发现LoRA执行固定随机投影以压缩梯度,并将总权重矩阵变化限制在低秩。
为了克服梯度空间中的低秩瓶颈,FLoRA 提出重新采样随机投影,这被证明可以大幅恢复全矩阵SGD的性能。
2.3.1.3 联合更新LLM和LoRA
上述两种方法侧重于提高LoRA自身的表示能力。与之不同,Delta-LoRA [25] 提出联合更新LLM和LoRA模块,该方法直接更新高秩LLM,能够获得比独立更新LoRA更好的表示能力。Delta-LoRA 根据两个连续迭代中两个LoRA模块之间的差异来更新LLM,这使得它无需额外内存即可更新LLM。
2.3.2 动态秩分配
对于LoRA的秩,并非越高越好。过高的LoRA秩可能导致性能和效率的双重退化。此外,在微调过程中,Transformer模型不同层的重要性可能各异,需要为每一层分配不同的秩。[26, 29, 31, 207]。因此,为不同层的LoRA模块分配相同的秩并非最优选择。更佳的做法是根据不同层的情况自适应地分配秩。现有方法从以下角度自适应地为LoRA模块分配秩:(1)奇异值分解(SVD);(2)单秩分解(SRD);(3)秩采样。
2.3.2.1 基于SVD的方法
通过奇异值分解(SVD)对矩阵进行分解并选择性截断其奇异值,是控制矩阵秩的有效方法。受SVD启发,论文可以将LoRA参数矩阵BA分解为SVD形式,即P Lambda Q,其中P和Q是正交的,Lambda是一个非负对角矩阵。通过控制Lambda中的元素,论文可以控制BA的秩并为LoRA模块分配秩。基于这一思路,几种秩分配方法近似实现了BA的SVD分解,并通过过滤对角矩阵来分配秩。例如,AdaLoRA [26]通过正则化P和Q的正交性来近似SVD分解,然后基于新颖的重要性评分方法丢弃不重要的奇异值。同样,SaLoRA [27]也引入了对P和Q的正交性正则化;相比之下,它基于L_0范数丢弃不重要的奇异值。然而,上述方法效率不足,因为它们从高秩开始,然后迭代地降低秩,这带来了预定义的预算[28]。为解决这一问题,In-creLoRA [28]提出从单秩开始,然后根据启发式重要性评分自动增加秩,其中也涉及正交性正则化,同时不要求Lambda中的元素为非负。
2.3.2.2 基于SRD的方法
然而,正交正则化给LoRA带来了不可忽视的计算成本,降低了其效率。为了解决这个问题,一些方法省略了SVD的正交性要求,直接将BA分解为单秩分量,然后通过选择合适的分量来分配秩。
DoRA(动态低秩适应)[29]提出将LoRA参数矩阵BA分解为单秩分量,并根据启发式重要性分数修剪这些分量。类似地,AutoLoRA [30]也将LoRA参数矩阵BA分解为单秩分量,但它是基于元学习来修剪分量。SoRA [31]消除了正交正则化,并通过直接控制对角矩阵来筛选P和Q的列和行(它们的组合可以视为单秩分量)。它通过对角矩阵来控制,将其形式化为一组在微调过程中更新的可学习门控单元。ALoRA [32]也通过使用门控单元来筛选分量;相比之下,它基于神经架构搜索[208]来学习门控单元。
2.3.2.3 基于秩采样的方法
在基于SVD参数化和分量分解的方法中,论文需要额外的计算成本来搜索合适的秩。为了避免这种额外成本,DyLoRA [33]指出,论文可以通过随机采样直接分配秩。在每个训练步骤中,它从预定义的离散分布中采样一个值b,并将b作为秩分配。然后,矩阵A和B被截断到秩b。在微调过程中,只有A的第b行和B的第b列的参数是可调的,而其他参数被冻结。此外,分布可以根据用户偏好定义。
2.3.3 优化学习过程
在实践中,LoRA的收敛速度比全量微调慢。此外,它对超参数敏感,并且容易过拟合。这些问题影响了LoRA的效率,并阻碍了其在下游适应性能。为了解决这些问题,研究人员开发了几种方法来优化LoRA的学习过程,这些方法可以分为以下三类:(1)初始化改进;(2)梯度更新优化;(3)过拟合缓解。
2.3.3.1 初始化改进
在LoRA中,参数矩阵A和B分别使用高斯噪声和零进行初始化。有两种简单的方案:Init[A],将矩阵B设为零并随机初始化矩阵A,以及Init[B],反之亦然。文献[34]比较了这两种方案,并通过理论分析得出Init[A]更优。研究表明,Init[A]允许使用更大的学习率而不导致不稳定,从而使学习过程更高效。然而,即使采用Init[A],这种随机初始化方法仍会导致初始梯度较小,进而减慢收敛速度。为解决这一问题,PiSSA[35]采用预训练矩阵的主奇异分量来初始化LoRA。由于主奇异分量代表矩阵中最重要的方向,将初始权重与这些分量对齐可以加速收敛并提升性能。相比之下,MiLoRA[36]则使用次要奇异分量初始化LoRA。考虑到低秩矩阵的随机初始化可能干扰预训练矩阵中已学习的重要特征,MiLoRA通过减少这种干扰来提高整体性能,同时适应新任务。
2.3.3.2 梯度更新优化
为进一步增强LoRA的收敛性和可靠性,多项研究从梯度更新角度提出改进措施。[37]基于黎曼优化引入了一种缩放梯度方法,该方法通过引入黎曼梯度步骤来改善LoRA的收敛性和超参数鲁棒性。通过理论分析,LoRA+[38]发现为矩阵A和\mathbfB设置比例学习率的必要性,以实现稳定的特征学习并加速收敛。ResLoRA[39]将残差连接引入LoRA以优化梯度传播路径,加快训练收敛并提升模型性能。类似地,SIBO[40]通过向LoRA的输入注入初始令牌表示的残差连接来缓解过度平滑问题。此外,为了进一步减少计算资源,文献[41]采用无梯度优化方法如CMA-ES和FWA来优化LoRA,在少样本自然语言理解任务中展现出竞争性能。另外,DoRA(权重分解低秩适应)[42]约束梯度更新,关注参数的方向变化。它将预训练权重分解为方向和大小两个分量,并仅对方向分量应用LoRA,以增强训练稳定性。
2.3.3.3 过拟合缓解
尽管LoRA有效地减少了与全量微调相比的可训练参数数量,但一些研究表明LoRA也容易出现过拟合[45],这与之前的观点相矛盾。为解决这一问题,BiLoRA[43]采用了一种双层优化策略。它交替在训练数据的不同子集上训练低秩增量矩阵的奇异向量和奇异值。这种方法避免了在单一数据集上同时优化不同层次的参数,从而减轻了过拟合问题。此外,[44]提出了对LoRA参数应用dropout以减少过拟合,而HiddenKey[45]则对注意力层采用列向量dropout,对前馈层采用元素级dropout。
2.3.4 与其他学习范式的结合
LoRA与其他学习范式如贝叶斯学习、情境学习(In-context Learning)和主动学习兼容。将LoRA与这些学习范式结合,可以解决影响下游适应性能的多个问题。例如,与贝叶斯学习结合,Laplace-LoRA[46]可以缓解下游适应中出现的过度自信现象。与情境学习结合,PILLOW[47]旨在解决某些下游任务中存在的低资源困境。与主动学习结合,STAR[48]能有效提高数据效率。
2.4 跨任务泛化
LoRA的可插拔特性使用户能够为不同任务积累LoRA插件。例如,在Hugging Face平台上,有超过300个与Flan-T5兼容的LoRA插件用于不同任务。这些积累的LoRA插件不仅可独立使用,还可混合以实现跨任务泛化[58]。将多个LoRA插件混合在一起,即LoRA混合,已在需要跨任务泛化的领域广泛应用,如多任务学习、领域适应和持续学习。现有的LoRA混合方法可分为(1)手动设计权重的混合;(2)学习权重的混合;(3)LoRA专家混合。z这里将分别介绍每种方法类别,如图3所示。
图3 LoRA混合方法示意图
2.4.1 手动设计权重的混合
早期的LoRA混合方法尝试通过手动设计的权重线性组合不同的LoRA插件。一些研究表明,通过简单地平均插件或其相关输出,论文可以实现适当的跨任务泛化能力[49-51]。此外,还提出了几种方法,通过采用手动设计的权重来进一步提高LoRA混合的性能。例如,ControlPE[52]、[53]和[54]将权重因子设置为超参数,ControlPE使用超参数搜索来确定两个LoRA插件的最佳组合。此外,Token-level Adaptation[55]利用输入特征与适配器数据集中心之间的余弦相似度作为权重因子,而BYOM[56]应用了基本模型融合方法,如任务算术、Fisher合并和RegMean。
手动设计权重的混合可以快速混合多个LoRA,无需额外训练,体现了简单性和计算效率。然而,它往往无法找到最优权重,导致性能不稳定和泛化能力有限。随后,研究人员探索使用基于学习的方法来实现更精确和自适应的混合。
2.4.2 学习权重的混合
为了学习最优混合权重,提出了几种方法,分别在任务级、实例级和令牌级满足不同需求。任务级方法侧重于增强任务可迁移性,可以是基于梯度的,如[57],或无梯度的,如LoRAHub[58]。LoRAHub采用了一种名为CMA-ES[209]的黑盒算法来优化LoRA插件的权重因子,简化了训练过程。后来,ComPEFT[59]和L-LoRA[60]使用LoRAHub混合量化LoRA插件,进一步提高了计算效率。
与任务级方法相比,实例级和令牌级方法能够为复杂输入提供灵活性和精确性。在多模态指令调优方面,MixLoRA [61] 根据输入实例动态选择适当的低秩分解向量,这些向量随后被集成到LoRA矩阵中进行训练。为了进行蛋白质力学分析和设计任务,X-LoRA [62] 开发了一种动态门控机制,以在令牌级别和层粒度上为LoRA插件分配权重。这些方法在特定任务或应用场景中展现出更好的性能。
2.4.3 LoRA专家混合体
当LoRA插件可训练时,论文可以联合学习混合权重和LoRA插件,从而进一步提高LoRA混合体的性能。为了联合学习混合权重和LoRA插件,LoRA专家混合体(LoRA MoE)是一个自然的选择,其中每个LoRA插件充当一个专家,而路由网络通常分配混合权重。LoRA MoE已被证明在许多任务中有效,例如持续学习[63, 64]、视觉-语言任务[65]和多任务医疗应用[66]。
现有方法从初始化、任务关系管理和效率等方面提升LoRA MoE的性能。在初始化方面,Mixture-of-LoRAs [7]首先分别训练多个LoRAs作为初始化,然后联合优化路由器和LoRAs。MultiLoRA [68]提出细化初始化以减少参数依赖,从而产生更平衡的单一子空间。在任务平衡方面,MLoRE [69]在MoE结构中添加了一个低秩卷积路径以捕捉全局任务关系。MITLoRA [70]采用任务无关和任务特定的LoRA模块来解决任务冲突。在效率方面,MoLA [71]自适应地为Transformer模型的不同层分配不同数量的LoRA专家以节省LoRA模块数量。LLaVA-MoLE [72]和SiRA [73]利用稀疏计算来降低计算成本。此外,Octavius [74]通过实例级指令稀疏激活独立的LoRA专家以缓解任务干扰并提高效率。Fast LoRA [75]允许小批次中的每个样本拥有其独特的低秩适配器,实现高效的批处理。
此外,一些方法虽非明确基于MoE,但遵循MoE的理念。例如,I-LoRA [76] 分别使用两个LoRAs来管理持续学习的长期和短期记忆。
2.5 效率提升
随着LLMs的普及,对训练和运行LoRA插件的需求迅速增长。这一增长带来了不可忽视的计算负担;因此,对于LoRA而言,越小、越快、越好。为了满足这一需求,现有方法从以下角度提高LoRA的计算效率:(1) 参数减少;(2) 参数量化;(3) 并行LoRA计算框架。
2.5.1 参数减少
LoRA显著减少了微调LLM的可调参数数量。然而,它仍需昂贵的激活内存来更新低秩矩阵。为了进一步降低内存成本,现有方法通过参数冻结、参数剪枝和参数共享来减少LoRA的可调参数数量。
2.5.1.1 参数冻结
参数冻结方法通过冻结部分参数来减少LoRA的可调参数数量。它们可分为两类:内部参数方法和外部参数方法。
内部参数方法在调整LoRA的部分参数的同时冻结其他参数。LoRA-SP [ / / ] 在微调过程中随机选择一半的LoRA参数进行冻结。LoRA-FA [78] 冻结了LoRA每一层的下投影权重,并更新上投影权重。AFLoRA [79] 构建了一个低秩可训练路径,并在训练LoRA的过程中逐步冻结参数。此外,DropBP [80] 通过在反向传播过程中随机丢弃一些LoRA梯度计算来加速训练过程。
相比之下,额外参数方法在冻结LoRA原有参数的同时引入并调整一组额外参数。大多数方法基于奇异值分解(SVD)提出。LoRA-XS [81] 在冻结的LoRA矩阵之间添加一个小型的 r x r 权重矩阵,这些矩阵是通过对原始权重矩阵进行SVD构建的;然后在微调过程中仅调整这些 r x r 权重矩阵。类似地,BYOM-LoRA [56] 采用SVD来压缩多任务模型的LoRA矩阵。
2.5.1.2参数剪枝
参数剪枝方法旨在在训练和推理过程中移除不重要的LoRA参数。它们通过独立剪枝LoRA或联合剪枝LoRA和大型语言模型(LLM)来实现。LoRA-drop [82] 利用每层LoRA的输出来评估参数的重要性并剪枝不重要的参数。相比之下,LoRAPrune [83] 基于LoRA的梯度联合剪枝LoRA矩阵和LLM参数。此外,论文还可以利用LoRA支持LLM的参数剪枝 [84, 85]。
2.5.1.3参数共享
参数共享方法通过在LLM的不同层或模块间共享参数来减少参数数量。VeRA [86] 和VB-LoRA是两个代表性的LoRA参数共享方法。具体而言,VeRA提出在所有层间共享一对冻结的随机矩阵,并通过“缩放向量”进行层级适应。相比之下,VB-LoRA提出了一种“分而治之”的范式,将LoRA的低秩分解通过一秩分解进行划分,并基于混合模型实现全局共享。
2.5.2 参数量化
量化,即减少参数的位宽(例如从32位浮点数到4位整数),可用于降低LoRA的内存和计算成本。现有的量化感知LoRA方法包括基于后训练量化(PTQ)的方法和基于量化感知训练(QAT)的方法 [92]。
2.5.2.1 基于PTQ的方法
在基于PTQ的方法中,论文首先对LLM进行量化,然后对量化后的模型进行微调,即量化和微调是按顺序进行的。QLoRA [88] 是首个基于PTQ的量化感知LoRA方法。在微调阶段,它首先将LLM量化为4位,然后,在更高的精度(如BFloat16或Float16)下对LoRA插件进行微调。在推理阶段,它将LLM反量化到与LoRA相同的精度,然后将LoRA的更新添加到LLM中。
图4 效率提升方法示意图
尽管QLoRA可以显著降低微调的内存成本,但它并未带来推理上的好处,因为它需要再次将LLM反量化到高精度。为了解决这个问题,提出了QA-LoRA [89],旨在同时降低微调和推理阶段的内存成本。QA-LoRA使用分组操作符来平衡LLM量化和微调的自由度,使其能够获得与量化LLM相同精度的LoRA插件。因此,它可以在不进行反量化的情况下进行推理。
2.5.2.2 基于QAT的方法
在基于QAT的方法中,论文联合量化和微调一个LLM,即量化和微调同时进行。这些方法可以缓解PTQ方法中观察到的量化差异。为了解决QLoRA的量化差异问题,LoftQ [90]在微调过程中交替应用量化和低秩近似,以最小化量化误差。然而,ApiQ [91]指出LoftQ忽略了跨层误差传播,并提出了激活保留初始化以避免误差传播。此外,L4Q [92]是另一种基于QAT的方法,具有先进的层设计。
2.5.3 并行LoRA计算框架
LoRA的参数高效特性使得论文能够在单个GPU或GPU集群上微调或推理多个插件,从而节省计算资源并提高LoRA的效率。这里分别介绍并行微调和并行推理框架。
2.5.3.1 并行微调
在单个GPU上并行微调多个LoRA插件可以减少GPU内存使用并提高计算效率。ASPEN [93]提出了一种高吞吐量的并行微调框架,该框架包括BatchFusion方法和自适应作业调度算法。具体而言,BatchFusion方法通过将多个输入批次融合为一个批次,支持在共享LLM上并行微调多个LoRA插件,而自适应作业调度算法则分配计算资源给微调作业。
2.5.3.2 并行推理
LoRA的并行推理框架不仅能提升计算效率,还能满足多租户服务的需求。Punica [94] 通过采用新的CUDA内核设计,批量处理不同LoRA插件的GPU操作。基于Punica,S-LoRA [95] 进一步通过引入统一的分页机制和新颖的张量并行策略,优化了并行推理框架,从而支持了数千个并发LoRA插件的服务。随后,基于Punica和S-LoRA,CARASERVE [96] 通过CPU-GPU协同和秩感知调度,降低了冷启动开销,进一步提升了服务效率和SLO(服务级别目标)达成率。
2.6 LoRA在联邦学习中的应用
当将LLMs适应到医疗、金融等垂直领域时,可用的训练数据可能由多个客户端私有拥有。在这种场景下,训练数据不集中,论文必须保持数据本地化的同时对LLMs进行微调,即联邦学习。在联邦学习中,客户端通常在本地计算权重更新,然后将这些更新与其他客户端共享,以全局更新LLM。这给客户端带来了通信和计算成本。幸运的是,LoRA具有参数效率高和可插拔的特点,能减少通信成本并降低计算资源需求。LoRA能提升联邦学习的整体效率和可扩展性。
然而,在联邦学习中采用LoRA并非易事,因为联邦学习面临数据异质性、设备异质性和模型异质性等挑战。为了解决这些问题,近期研究设计了多种方法来满足联邦学习对LoRA的多样化需求。此外,作为本地化参数组件,LoRA的可插拔特性使其能够支持联邦学习中的参数隐私保护。
2.6.1 数据异质性
数据异质性指的是客户端间数据分布的差异。在联邦学习中,不同客户端通常拥有不同的数据分布。数据分布的不一致性影响模型的整体性能。研究表明,在联邦学习中,随着用户数据多样性的增加,LoRA与全量微调之间的性能差距扩大 [97]。为解决这一问题,研究者提出了多种改进方法。
SLoRA [97] 引入了一种数据驱动的LoRA初始化方法。它首先进行稀疏联邦微调,然后应用LoRA,并通过SVD将累积的梯度更新分解为低秩矩阵以进行LoRA初始化。其目标是使LoRA模块更好地适应每个客户端的数据分布,从而更有效地将这些异构数据特征整合到全局模型中。FeDeRA [98] 采用了一种更简单的初始化方法。它直接对预训练权重应用SVD来初始化LoRA。保留预训练权重的主要成分,使得不同客户端之间的权重更新方向和大小保持一致,以处理数据异质性。此外,FFA-LoRA [99] 冻结一个低秩矩阵,仅微调另一部分。这减少了在服务器聚合LoRA梯度时的不一致性,缓解了由于非ID数据导致的优化不稳定问题。
图5 局部更新与联邦学习的示意图
2.6.2设备异质性
设备异质性指的是参与联邦学习的客户端在硬件能力、网络连接等方面的差异。传统的联邦学习方法常常遇到“木桶效应”,即系统的整体性能受限于能力最弱的客户端。具体来说,这些方法使用最小的LoRA秩来适应所有客户端,这使得许多资源丰富的客户端无法充分发挥其潜力。
为解决这一问题,可以采用动态参数分配策略。FedMS [100] 根据客户端的实时计算资源动态调整激活的LoRA矩阵数量。FlexLoRA [101] 使用动态参数分配策略,根据资源限制调整LoRA秩并重新分配全局LoRA权重的SVD组件。类似地,HETLORA [102] 为不同客户端分配不同的秩,但根据不同客户端更新信息的稀疏性进行加权聚合,比简单聚合更好地平衡了更新信息。
2.6.3 模型异质性
模型异质性表示客户端之间模型结构的差异。在传统的联邦学习中,客户端使用具有相同架构的本地模型,允许其参数在服务器上聚合为全局模型。然而,在实际应用中,客户端可能由于个人需求而偏好独特的本地模型架构,并且通常不希望披露模型细节。因此,有必要在不共享私有数据或揭示本地模型结构的情况下,在异构模型之间传递知识 [210]。
先前的工作采用了知识蒸馏、模型集成和相互学习来解决模型异质性问题。然而,这些方法存在局限性,如依赖公共数据集、增加通信成本和局部模型性能不佳。为了避免这些局限,pFedLoRA [103] 使用 LoRA 作为全局和局部知识的载体。它采用迭代训练策略来促进知识转移和整合,使得不同客户端的异构模型之间能够共享知识。
2.6.4 参数隐私
在联邦学习中,保护客户端特定的参数至关重要,因为确保这些参数的隐私也能间接保护客户端数据的隐私。作为一种调整个性化参数的模块化方法,LoRA 可以有效集成到联邦学习系统中,以实现参数隐私保护。
文献 [104] 提出了一种基于模型切片的分布式语言模型训练框架。他们在可信执行环境(TEE)中部署 LoRA,并使用一次性密码(OTP)加密在 GPU 和 TEE 之间传输特征,保护模型参数隐私。PrivateLoRA [105] 引入了一个基于 LoRA 的分布式系统。它在低秩矩阵 A 和 B 之间添加了一个方阵 M。不可训练的矩阵 A 和 B,以及大部分预训练权重,部署在全局服务器上以增强计算。同时,可训练的矩阵 M 作为个性化参数存储在客户端,从而确保参数隐私保护。
2.7 LoRA 的应用
在深度学习快速发展的领域中,LoRA 因其独特的优势而被广泛使用。研究人员利用 LoRA 对预训练模型进行微调,以适应各种下游任务,减少计算资源需求的同时提升性能。LoRA 的强大适应性和效率显著改善了多种应用。论文将介绍 LoRA 在以下场景中的应用:(1)语言任务;(2)视觉任务;(3)多模态任务。
2.7.1 语言任务
近年来,预训练语言模型,尤其是大型语言模型(LLMs)的快速发展,因其卓越的性能正在彻底改变语言任务的处理方式。然而,这些预训练模型是在大量通用数据上训练的,仍需在特定任务数据上进行进一步微调以适应下游任务。因此,使用LoRA来微调这些预训练语言模型是很自然的,因为它减少了计算资源需求。论文主要关注一些具有代表性的下游任务,包括传统的NLP任务、代码任务、模型对齐和垂直领域任务。
2.7.1.1 传统NLP任务
鉴于LLMs强大的指令遵循和上下文理解能力,一些研究将LoRA应用于这些模型以进行传统NLP任务的微调。例如,LoRA在LLaMA中被广泛应用于各种任务,如情感识别[106]、文本分类[107]和角色识别[108]。AutoRE[109]应用QLoRA于三个文档级关系抽取任务,在不同的LLMs上取得了优异的性能。一些研究[110-112]从不同角度利用LoRA来增强机器翻译任务中的模型能力。此外,LoRA还能提升BERT和T5等模型在文本理解任务中的性能[113, 114]。
2.7.1.2 代码任务
一些研究将LoRA应用于提高模型在各种代码相关任务中的性能。例如,使用LoRA微调的BERT风格模型适用于代码变更相关任务,特别是及时缺陷预测(JIT-DP)[115, 116]。类似地,使用LoRA训练CodeT5和PLBART可以增强它们对代码摘要和代码克隆检测的适应性[117]。对于仅解码器模型,RepairLLaMA[118]使用LoRA微调Llama以进行自动化程序修复(APR),而WizardCoder-15B则使用LoRA进行Text-to-SQL任务的微调[119]。此外,SteloCoder[120],作为StarCoder的微调版本,设计用于多语言到Python代码的翻译。
2.7.1.3 模型对齐任务
模型对齐任务专注于调整机器学习模型以符合人类的价值观和意图,通常使用如人类反馈的强化学习(RLHF)等技术。为了减少RLHF的内存需求,一些研究使用LoRA来微调奖励模型和策略模型[121-123]。此外,其他工作通过集成多个LoRA适配器来改进奖励模型。例如,DMoERM[124]将MoE与LoRA结合,将模型输入路由到多个LoRA专家,而另一项工作[125]也提出了一种基于LoRA的集成方法。这种集成还可以有利于奖励模型中不确定性的量化[126]。此外,文献[127]应用Laplace-LoRA[128]来训练贝叶斯奖励模型,缓解了奖励过度优化问题。
2.7.1.4 垂直领域任务
大型语言模型(LLMs)在垂直领域的表现往往不尽如人意,需要使用领域特定知识进行微调。一些工作应用LoRA来提升LLMs在特定领域任务上的表现。例如,一些研究使用LoRA在医学数据集上微调LLMs,以适应医学领域[129-131]。此外,其他研究改进了临床对话摘要[132]、断言检测[133]和医学问答任务[134, 135]等医学任务。类似地,多项研究使用LoRA在金融数据上微调LLMs,以解决金融新闻分析和情感分类等任务[136-139]。此外,LoRA还可用于提升数据库任务如查询重写和索引调优的性能[140]。
2.7.2 视觉任务
在视觉任务中,LoRA主要应用于图像生成和图像分割,显著提高了训练效率并优化了模型性能。
2.7.2.1 图像生成
图像生成任务在计算机视觉领域具有重要意义。近年来,扩散模型在图像生成任务中展现了卓越的性能。LoRA广泛应用于扩散模型,以解决各种图像生成任务同时减少计算资源。一些工作使用LoRA微调扩散模型进行图像风格转换[141-145],而其他工作则将其应用于文本到图像的生成[146-150]。
此外,研究人员设计了多种基于LoRA的方法以提升图像生成质量。例如,Smooth Diffusion [151] 利用LoRA在潜在空间中实现平滑性,从而在多种图像生成与编辑任务中表现更佳。Re-sAdapter [152] 采用LoRA学习分辨率先验,动态调整卷积层的感受野以适应不同分辨率。为专门增强文本到图像的质量,STAMIINA [153] 使用LoRA微调扩散模型以处理更长的概念序列。Dream-Sync [154] 和 StyleAdapter [155] 通过LoRA提高文本忠实度和图像质量。Mix-of-Show [156] 利用LoRA权重捕捉域外信息,高保真地融合多个定制概念,减少概念冲突。其他研究将LoRA与模型蒸馏结合,加速图像生成过程 [157, 158]。此外,LoRA还可应用于视频生成 [159-164] 和3D生成任务 [165-169]。
2.7.2.2 图像分割
图像分割是计算机视觉中的重要挑战,旨在将图像划分为多个有意义区域或对象。为此,SAM被提出作为图像分割的基础模型,并展示了卓越的泛化能力。为进一步提升其在特定垂直领域的性能,许多研究利用LoRA对其进行微调。例如,在车牌检测中,SamLP [170] 利用LoRA使SAM高效分割车牌。在结构损伤检测中,文献 [171] 使用LoRA微调SAM的编码器以执行实例分割任务。在医疗领域,众多研究也应用LoRA微调SAM,涉及核分割 [172]、OCTA图像分割 [173]、脑肿瘤分割 [174]、器官分割 [175] 和手术器械分割 [176] 等任务。此外,一些研究使用LoRA微调Vision Transformer (ViT) 进行视觉跟踪 [177] 和人脸伪造检测 [178]。
2.7.3 多模态任务
多模态大型语言模型(MLLMs)旨在将文本与音频、图像和视频等多种模态整合,通过统一的嵌入空间实现跨模态理解和推理。LoRA在NLP和视觉任务中的成功应用,引发了将其应用于MLLMs的广泛兴趣。
在多模态大型语言模型(MLLMs)中,LoRA不仅能提升训练效率,还能促进有效的模态对齐。在音频-文本任务中,SALM [179] 包含LoRA层、一个冻结的基于文本的LLM、一个音频编码器和一个模态适配器,用于处理语音输入和相应的任务指令。对于图像-文本任务,InternLM-XComposer2 [180] 通过将LoRA应用于图像令牌实现模态对齐,mPLUG-Owl [181] 冻结视觉模块同时联合微调LoRA和文本模块的抽象器,而CoLLaVO [182] 采用QLoRA保留对象级图像理解。在视频-文本任务领域,VSP-LLM [183] 使用QLoRA微调文本模块进行视觉语音处理,MolCA [184] 利用LoRA理解二维分子图和文本,而TPLLM [185] 通过集成序列和空间特征使用LoRA进行高效的交通预测。这些应用展示了LoRA在多模态任务中的多功能性和强大能力。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。