虽然低秩适应(LoRA)提供了一种强大且高效的微调大型语言模型(LLMs)的方式,但它主要通过低秩更新来修改现有权重矩阵。其他参数高效微调(PEFT)方法,例如适配器调优或前缀调优,以不同的方式干预模型的架构或激活路径。这引发了一个有趣的问题:将LoRA与其他PEFT技术结合使用,能否产生更好的结果,或与单独使用某一种方法相比,提供不同的权衡?结合这些方法的动机源于一个假设:不同的PEFT技术可能捕获任务适应的互补方面。LoRA侧重于调整现有层内的内在表示,而其他方法可能擅长注入新的计算路径(适配器)或引导模型的注意力机制(前缀/提示调优)。LoRA与适配器模块结合适配器调优包括在预训练Transformer模型的层内插入小型、可训练的神经网络模块(适配器),通常是在注意力或前馈子层之后。原始模型权重保持不变,只训练适配器参数。一种可能的结合方式是,将LoRA应用于标准权重矩阵(例如,注意力中的查询、键、值、输出投影以及前馈层),同时插入并训练适配器模块。架构:设想一个标准Transformer块。注意力机制的权重矩阵($W_q, W_k, W_v, W_o$)可以使用LoRA修改:$W_q \rightarrow W_q + \Delta W_q$,其中 $\Delta W_q = \alpha \frac{B_q A_q}{r}$。适配器模块可以插入到注意力块(及其层归一化)之后。同样,前馈网络的权重矩阵($W_{ffn1}, W_{ffn2}$)也可以接收LoRA更新。另一个适配器模块可以插入到前馈块(及其层归一化)之后。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_0 { style=filled; fillcolor="#f8f9fa"; label = "Transformer块"; node [shape=box, style=filled]; Input -> LN1 [label="x"]; LN1 -> MHA [label="norm(x)"]; MHA -> Add1 [label="Attn(norm(x))"]; Input -> Add1; Add1 -> Adapter1 [label="x + Attn(norm(x))"]; Adapter1 -> LN2 [label="AdapterOut_1"]; LN2 -> FFN [label="norm(AdapterOut_1)"]; FFN -> Add2 [label="FFN(norm(AdapterOut_1))"]; Adapter1 -> Add2; Add2 -> Adapter2 [label="AdapterOut_1 + FFN(...)"]; Adapter2 -> Output [label="Output"]; MHA [label="多头注意力\n(LoRA作用于Wq, Wk, Wv, Wo)", fillcolor="#a5d8ff"]; FFN [label="前馈网络\n(LoRA作用于W1, W2)", fillcolor="#a5d8ff"]; Adapter1 [label="适配器模块 1\n(可训练)", fillcolor="#b2f2bb"]; Adapter2 [label="适配器模块 2\n(可训练)", fillcolor="#b2f2bb"]; LN1 [label="LayerNorm"]; LN2 [label="LayerNorm"]; Add1 [shape=circle, label="+风流舞姿"]; Add2 [shape=circle, label="+风流舞姿"]; } Input [shape=plaintext]; Output [shape=plaintext]; }图示说明了LoRA(修改现有MHA和FFN层)和适配器模块在Transformer块内的集成。潜在优势:互补适应: LoRA可以为现有权重提供广泛的适应,而适配器则添加局部、可能非线性的计算,这些计算专门针对任务定制。灵活性: 允许调整LoRA的秩 $r$ 和缩放因子 $\alpha$,以及适配器的架构和参数,提供更多自由度。挑战:复杂性增加: 管理两组可调参数(LoRA矩阵 $A, B$ 和适配器权重)增加了实现和超参数调整的复杂性。参数预算: 尽管与完全微调相比仍然参数高效,但与仅使用LoRA或仅使用适配器相比,可训练参数的总数会增加。优化: 寻找同时适用于LoRA更新和适配器训练的最佳学习率和调度可能需要仔细的实验。训练期间两种更新类型之间可能存在干扰。LoRA与前缀调优或提示调优结合前缀调优和提示调优引入可训练参数,这些参数间接影响模型,通常通过在注意力层中向键和值状态添加连续向量(前缀),或者通过在输入序列前附加可调嵌入。将LoRA与这些方法结合意味着同时训练修改内部权重的LoRA矩阵($A, B$)和前缀/提示向量。联动:LoRA: 修改内部权重矩阵 $W_q, W_k, W_v, W_o, W_{ffn1}, W_{ffn2}$,如前所述。前缀调优: 在计算注意力分数之前,向注意力机制内计算出的键和值添加可训练的前缀向量 $P_k, P_v$。经LoRA修改的 $W_k, W_v$ 将处理原始输入以生成键/值,然后这些键/值与学到的前缀拼接。提示调优: 在它们进入第一个Transformer层之前,向输入序列嵌入添加可训练的提示嵌入 $E_{prompt}$。这些修改后的嵌入随后由LoRA适应的层处理。潜在优势:正交控制: LoRA调整模型内部处理信息的方式,而前缀/提示调优调整模型操作的有效输入或上下文。这种分离可能允许对适应进行更精细的控制。定向干预: 可以假设使用前缀/提示调优来引导模型的关注点或高级行为,而LoRA则微调较低级别的表示。挑战:训练动态: 同时优化低秩矩阵因子(LoRA)和连续向量嵌入(前缀/提示)可能具有挑战性。它们可能需要不同的学习率或优化策略。可解释性: 精确理解这两种方法如何共同作用以产生最终输出变得更加困难。回报递减: 存在一种可能性,即一种方法的优势可能盖过另一种,或者将它们结合并不能带来显著优于经过良好调优的单一PEFT方法的性能,同时还增加了复杂性。LoRA与量化结合(QLoRA)虽然QLoRA常被视为一种独特技术(并且之前已详细介绍),但从根本上,它可以看作是一种结合方式:量化: 基础模型的权重被大量量化(例如,到4位NormalFloat, $NF4$),以大幅减少内存占用。这是一种在微调之前应用的模型压缩技术。LoRA: 标准LoRA适配器(通常以BFloat16等更高精度进行训练)被添加到量化后的基础模型中。只训练LoRA参数。这种特殊的结合直接解决了微调大型模型的内存限制,使其非常实用。QLoRA的成功表明,即使底层基础权重的精度已显著降低,LoRA也能有效适应模型。这或许是涉及LoRA的最广泛采用和验证的结合方式。结合方法的一般考虑在考虑将LoRA与其他PEFT技术结合时,请记住以下几点:任务依赖性: 任何结合方式的有效性都可能取决于具体任务。某些任务可能通过增加非线性适配器能力获得更多好处,而其他任务可能对前缀调优与LoRA结合带来的上下文引导效果反应更好。超参数调优: 超参数的搜索空间显著扩大。需要协调地调整LoRA参数($r$, $\alpha$, 目标模块)、适配器参数(维度、激活函数)或前缀/提示参数(长度、初始化)。这需要仔细的方法,可能使用如序列优化或在结合超参数空间中搜索等技术。计算开销: 尽管参数数量保持较低,但训练期间的计算图可能变得更复杂,可能影响训练速度,具体取决于结合方式和实现。实证验证: 理论上的好处需要通过实证来验证。必须将结合方法与经过良好调优的基准PEFT方法(包括仅使用可能更高秩的LoRA)在相关评估指标上进行比较。将LoRA等PEFT方法与适配器或前缀调优结合是一个活跃的研究领域。这些结合方式虽然可能提供增强的灵活性和性能,但在实现、调优和分析方面增加了复杂性。QLoRA作为一种非常成功的结合方式脱颖而出,主要侧重于内存效率,证明了在修改(量化)后的基础模型上训练LoRA适配器的可行性。与许多先进技术一样,需要仔细的实验和评估来确定特定任务和计算预算的最佳方法。