尽管像LoRA、适配器(Adapters)或提示微调(Prompt Tuning)等单一的参数高效微调(PEFT)方法相比于完全微调有很大益处,但它们各有优缺点。LoRA普遍应用低秩更新,可能缺乏针对特定层的精细度。适配器提供有针对性的修改,但会引入顺序处理步骤。基于提示的方法擅长输入条件化,但可能无法完全调整内部表示。鉴于这些不同的特点,一个主要问题随之浮现:我们能否通过组合不同的PEFT策略,或将它们与量化和剪枝等其他优化技术一同使用,从而获得更优的性能或效率?组合PEFT方法旨在发挥它们互补的优势,相比单一方法,可能在参数效率、任务表现和计算开销之间取得更好的平衡。此外,将PEFT与在其他章节讨论的技术(例如量化(第2章)和剪枝(第3章))一同使用,可以进一步提升大型语言模型(LLM)的效率上限。不同PEFT方法间的配合效果在同一模型中组合多种PEFT技术,需要仔细考量它们的参数如何相互影响并作用于模型的前向传播。LoRA与适配器一种常见做法是使用LoRA调整注意力机制的查询($Q$)和值($V$)投影,同时在前馈网络(FFN)中插入适配器模块。原理: 注意力机制对于调整以适应新数据模式通常很重要,使得LoRA的低秩更新很适合。FFN可能更能从适配器提供的局部、非线性变换中获益。这种混合方法允许进行有针对性的调整,每种方法都应用于理论上最适合的组件。实现方式: 这通常涉及修改模型架构,以包含LoRA层(与现有权重并行应用)和适配器层(顺序插入)。像Hugging Face的peft库这样的框架,提供了在单一模型中管理多种适配器类型的功能。权衡: 尽管可能提供更细致的控制,但这相比仅使用LoRA或适配器,会增加可调参数的数量。它还增加了模型架构和微调过程的复杂性。需要仔细的消融研究来确定这种组合是否比更简单的方法提供实际益处。digraph G { rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", color="#ced4da", fillcolor="#e9ecef"]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_0 { label = "Transformer模块"; style=filled; color="#dee2e6"; Input [label="输入激活", shape=ellipse, fillcolor="#a5d8ff"]; Attn [label="多头注意力\n(Q, V上带LoRA)", fillcolor="#bac8ff"]; AddNorm1 [label="加和归一化", fillcolor="#ced4da"]; Adapter1 [label="适配器模块", fillcolor="#fcc2d7"]; FFN [label="前馈网络", fillcolor="#bac8ff"]; AddNorm2 [label="加和归一化", fillcolor="#ced4da"]; Output [label="输出激活", shape=ellipse, fillcolor="#a5d8ff"]; Input -> Attn; Attn -> AddNorm1 [label="残差"]; Input -> AddNorm1 [label="跳跃连接"]; AddNorm1 -> FFN; FFN -> Adapter1; // 适配器插入在FFN之后 Adapter1 -> AddNorm2 [label="残差"]; AddNorm1 -> AddNorm2 [label="跳跃连接"]; AddNorm2 -> Output; } }示意图展示了在Transformer模块内,将LoRA应用于注意力机制以及将适配器模块置于FFN之后。LoRA与提示/前缀微调将LoRA与前缀微调(Prefix Tuning)或提示微调(Prompt Tuning)等基于提示的方法相结合,提供了另一种途径。原理: 基于提示的方法修改输入嵌入或添加可调前缀向量,以影响模型行为而不触及内部权重。LoRA则调整内部权重。组合它们可以实现输入层级的任务条件化(通过提示)和内部表示调整(通过LoRA)。这可能对需要输入理解和处理方式都发生显著转变的任务有利。实现方式: 这涉及在输入层添加可调提示嵌入/前缀,同时对选定的权重矩阵(例如$W_q, W_v$)应用LoRA更新。权衡: 主要挑战在于潜在的冗余或干扰。用LoRA调整内部权重是否会减少对精细提示微调的需求,反之亦然?提示向量与LoRA更新权重之间的相互影响需要仔细的实证评估。微调变得更复杂,涉及提示长度/初始化和LoRA秩/alpha值。将PEFT与量化和剪枝一同使用PEFT方法侧重于高效微调,而量化和剪枝(在第2章和第3章讨论)主要针对高效推理。组合这些做法可以得到既易于调整又部署高效的模型。PEFT与量化之前讨论的QLoRA,代表着一种紧密结合,其中量化(特别是NF4)在PEFT过程中使用,以大幅减少内存需求。然而,其他组合也是可能的:先量化基础模型,再PEFT: 首先对基础大型语言模型(LLM)应用训练后量化(PTQ)或量化感知训练(QAT)。然后,再对量化模型应用LoRA或适配器等PEFT方法。这可能具有挑战性,因为基础模型中的量化误差可能会阻碍PEFT参数的有效调整。PEFT参数本身在训练期间通常保持较高精度(例如FP16或FP32)。先PEFT,再量化: 使用标准PEFT方法(例如,基础权重和LoRA权重均为FP16的LoRA)对模型进行微调。之后,对组合模型(基础权重与PEFT权重合并)应用PTQ,或者仅对基础权重应用PTQ,同时保持PEFT参数为较高精度。量化少量的PEFT参数通常收益很小,因此重点通常是在调整后量化冻结的基础模型权重。在LoRA微调后应用PTQ是一种常见做法。PEFT与剪枝将PEFT与剪枝一同使用可以创建稀疏、可调整的模型。先剪枝基础模型,再PEFT: 从一个预训练的大型语言模型(LLM)开始,并应用结构化或非结构化剪枝以减小其大小和计算成本。然后,使用PEFT方法对剪枝后的模型进行微调以完成下游任务。这里一个重要问题是,剪枝后的模型是否保留了足够的容量和可塑性,以便通过PEFT进行有效调整。研究表明,适度的剪枝水平通常允许成功的PEFT调整。先PEFT,再剪枝: 使用PEFT进行微调,将PEFT参数合并到基础模型权重中(如果适用,如LoRA),然后对所得模型进行剪枝。或者,也可以尝试剪枝PEFT参数本身,尽管参数数量已经很小,这可能限制了稀疏性带来的收益。调整后剪枝基础模型可能更有效,但需要仔细处理以保留学到的任务特定知识。同时进行剪枝和PEFT: 更高级的技术可能涉及在PEFT训练的同时调整剪枝掩码,可能允许出现稀疏模式,以补充任务调整。这仍然是一个活跃的研究方向。实现上的挑战与考量组合PEFT方法或将它们与其它优化技术一同使用,引入了一些实际挑战:复杂性增加: 在单一模型中管理多种类型的修改(例如,LoRA矩阵、适配器权重、量化尺度、剪枝掩码)增加了实现和调试的复杂性。超参数调优: 最佳超参数的搜索空间显著扩大。LoRA秩、适配器瓶颈维度、量化比特、剪枝稀疏度、学习率和调度之间的相互影响需要仔细调优,通常需要大量实验。框架支持: 尽管像Hugging Face peft这样的库正在迅速发展,但对任意组合技术的支持可能需要自定义实现或修改。不同优化库(例如,量化工具包、剪枝库、PEFT框架)之间的兼容性也可能是一个问题。评估严谨性: 证明组合策略的有效性需要全面评估。仅展示在一个任务上的改进是不够的;分析应包括在多个基准测试上的表现、参数数量、内存使用(训练和推理)以及推理延迟,并与强大的单一方法基线进行比较。组合PEFT方法并将其与量化和剪枝一同使用,提供了一条实现高效且可调整的大型语言模型(LLM)的有前景的道路。然而,这些高级策略需要深厚的专业知识、仔细的实现和严谨的实证验证,以证明其相比于更简单的单一方法而言增加的复杂性是合理的。随着研究的进展,我们可以期待出现更精细和标准化的技术,用于协作应用多种优化策略。