大语言模型 LoRA 技术综述:原理、变体与应用前景
本文系统综述了低秩适应(LoRA)技术在大型语言模型中的应用。LoRA 通过冻结预训练权重并注入可训练的低秩矩阵实现参数高效微调,显著降低计算成本。文章详细阐述了 LoRA 的数学原理、主流变体如 AdaLoRA 和 DoRA、跨任务泛化方法以及在联邦学习中的隐私保护应用。此外,还探讨了 LoRA 在生成即服务(GaaS)和自主代理领域的未来潜力,并提供了基础代码示例,为开发者理解与部署提供全面指导。

本文系统综述了低秩适应(LoRA)技术在大型语言模型中的应用。LoRA 通过冻结预训练权重并注入可训练的低秩矩阵实现参数高效微调,显著降低计算成本。文章详细阐述了 LoRA 的数学原理、主流变体如 AdaLoRA 和 DoRA、跨任务泛化方法以及在联邦学习中的隐私保护应用。此外,还探讨了 LoRA 在生成即服务(GaaS)和自主代理领域的未来潜力,并提供了基础代码示例,为开发者理解与部署提供全面指导。

低秩适应(Low-Rank Adaptation,LoRA)通过可插拔的低秩矩阵更新密集神经网络层,是当前参数高效微调范式中表现最佳的方法之一。此外,它在跨任务泛化和隐私保护方面具有显著优势。因此,LoRA 最近受到了广泛关注,相关文献的数量呈指数增长。
预训练语言模型参数规模的迅速增加提升了它们的泛化能力,并带来了新的能力。近年来,预训练语言模型的参数规模增加了数千倍(例如,从具有 3.3 亿参数的 BERT 到具有 5400 亿参数的 PaLM)。这些具有大参数规模的预训练语言模型被称为大语言模型(LLMs)。然而,由于 LLMs 的知识边界,它们在某些下游任务中的能力仍然有限。为了扩展知识边界,仍然有必要在下游任务上微调 LLMs。
然而,对 LLM 进行全参数微调(即全量微调)计算开销极其巨大。例如,对 LLaMA2-7B 模型进行全量微调需要大约 60GB 的内存,超出了普通消费级 GPU 的容量。为了减少计算成本,提出了各种参数高效微调(PEFT)方法。这些方法通过只微调少量(额外的)模型参数来使 LLMs 适应下游任务。从是否涉及额外参数的角度来看,PEFT 方法可以分为两类:额外参数方法和内部参数方法。
额外参数方法冻结 LLM 的所有原始参数,并插入一组可学习的参数来优化模型输入或模型层,如适配器调优和提示调优。相比之下,内部参数方法冻结 LLM 的大部分原始参数,只微调 LLM 的一小部分参数,如 BitFit、LISA 和 LoRA。
在无法修改模型架构的情况下,内部参数方法是理想的。在内部参数方法中,LoRA 是使用最广泛的方法,因为它在多个下游任务上可以实现与全量微调相当或更好的下游适应性能,且易于实施。此外,还提出了许多变体,以进一步提高 LoRA 在更具挑战性的下游任务中的适应能力。

随着 LoRA 插件的累积,管理 LoRA 插件的计算成本也在增加。尽管 LoRA 计算效率高,但管理大量 LoRA 插件的计算成本不可忽视。因此,有必要进一步提高 LoRA 的计算效率。改进可以通过减少单个 LoRA 插件的计算成本和加速多个插件的可扩展服务来实现。这可以促进 LoRA 在现实世界中的应用,如生成即服务(GaaS)云产品。
在某些情况下,训练数据由多个客户端私有且无法集中。为了使用分布式训练数据使 LLMs 适应,我们可以采用联邦学习来保护每个客户端的数据隐私。然而,联邦学习会产生高昂的通信和计算成本。为了降低成本,LoRA 是一个自然的选择。其参数高效特性有助于降低每个客户端的计算成本和跨客户端共享参数的通信成本。此外,LoRA 的可插拔特性有助于在联邦学习中保留每个客户端的参数隐私。因此,LoRA 在隐私保护方面具有巨大潜力。
在本综述中,我们对 LoRA 的当前进展进行了全面概述,包括:提高 LoRA 下游适应性能的方法;混合 LoRA 插件以实现跨任务泛化的方法;提高 LoRA 计算效率的方法;在联邦学习中采用 LoRA 的方法。此外,还简要介绍了 LoRA 的应用。
低维固有维度假说提出,过度参数化模型存在于低固有维度上,这表明我们可以通过仅更新与固有秩相关的参数来实现适当的学习性能。基于这一假说,LoRA 提出用低秩矩阵更新模型中的密集层。它可以同时实现参数和计算效率。
LoRA 在参数上非常高效,因为它仅更新模型参数的一小部分,从而在不增加推理延迟的情况下减少了微调所需的内存和计算要求。此外,可以通过从低秩矩阵扩展到低秩张量或与克罗内克分解结合进一步提高参数效率。除了参数效率,LoRA 也是可插拔的,因为 LoRA 参数在训练后可以从模型中分离出来。LoRA 的可插拔特性使其可以被多个用户共享和重用。当我们拥有多个任务的 LoRA 插件时,可以组合这些插件,并期望获得适当的跨任务泛化性能。
在实践中,对于基于 Transformer 的 LLM,密集层通常由两种类型的权重矩阵组成:注意力模块中的投影矩阵和前馈神经(FFN)模块。在原始研究中,LoRA 应用于注意力层的权重矩阵。后续工作表明,在 FFN 层中使用它可以进一步提高模型性能。
假设预训练权重为 $W_0 \in \mathbb{R}^{d \times k}$,LoRA 将其分解为两个低秩矩阵 $A \in \mathbb{R}^{r \times k}$ 和 $B \in \mathbb{R}^{d \times r}$,其中 $r \ll \min(d, k)$。前向传播时,权重更新为:
$$ W' = W_0 + BA $$
在反向传播过程中,只有 $A$ 和 $B$ 被更新,$W_0$ 保持冻结。这种机制使得显存占用大幅降低,因为只需要存储梯度关于 $A$ 和 $B$ 的部分。
尽管 LoRA 在某些下游任务上可以实现适当的适应性能,但在许多下游任务上(如数学推理),LoRA 与全量微调之间仍存在性能差距。为填补这一差距,许多方法被提出以进一步提高 LoRA 在下游任务中的适应性能。
原始 LoRA 固定秩 $r$,这可能限制了模型表达能力。自适应分配不同 LoRA 模块的秩是解决此问题的关键方向。例如,AdaLoRA 根据权重的奇异值重要性动态调整秩,将预算分配给更重要的参数,从而在相同参数量下获得更好性能。
优化初始化策略和学习率调度也能提升效果。例如,DoRA(Weight-Decomposed Low-Rank Adaptation)将权重分解为幅度和角度两部分,分别进行 LoRA 微调,模拟了更完整的权重更新空间,显著提升了收敛速度和最终精度。
将 LoRA 与提示学习(Prompt Learning)或适配器(Adapter)结合,可以在特定场景下进一步释放潜力。例如,在少样本学习场景中,结合软提示和 LoRA 微调往往能取得 SOTA 结果。
LoRA 插件可以组合以实现跨任务泛化,从而促进多任务学习、领域适应和 LLMs 的持续学习。当我们需要在一个新任务上快速适配时,可以直接加载预训练的 LoRA 权重。
由于 LoRA 本质上是线性叠加($W' = W_0 + BA$),不同的 LoRA 插件可以在不重新微调基础模型的情况下进行合并。例如,可以将任务 A 的 LoRA 和任务 B 的 LoRA 按权重比例相加,得到一个新的混合 LoRA,用于处理多任务请求。这种方法极大地简化了部署流程,无需维护庞大的模型副本。
在持续学习场景中,模型需要不断学习新知识而不遗忘旧知识。利用 LoRA 的模块化特性,可以为每个新阶段训练独立的 LoRA 插件,并在推理时动态选择或融合这些插件,有效缓解灾难性遗忘问题。
在联邦学习框架下,数据不出本地,仅交换模型更新。LoRA 的天然属性使其成为联邦学习的理想候选者。
传统联邦学习需要传输整个模型或大部分参数,带宽消耗巨大。使用 LoRA 后,客户端只需上传低秩矩阵 $A$ 和 $B$,参数量通常仅为原模型的千分之一以下,显著降低了通信开销。
LoRA 的可插拔特性允许服务器聚合更新后的 LoRA 权重,而无需接触原始模型参数。结合差分隐私技术,可以进一步防止通过梯度反推原始数据的风险,确保每个客户端的数据隐私安全。
在 GaaS 中,基于云的平台为用户提供生成性人工智能服务。由于用户需求多样化,提供各种功能的 GaaS 是必要的。为了实现这些各种功能,我们可以为每个功能构建一个 LoRA 插件。LoRA 的参数效率和可插拔性可以促进高效的功能构建和执行。此外,GaaS 平台上的服务会随时间迅速变化。为了跟上这些变化,我们可以通过组合先前的插件来初始化新的 LoRA 插件。LoRA 的跨任务泛化能力可以促进服务更新的快速适应。
在基于 LLM 的自主代理中,代理被赋予特定角色。根据角色和环境,代理会采取行动来回应用户或其他代理的请求。这些行动可以基于自我知识或为特定领域任务设计的工具。这些请求和行动被存储在内存中,以支持未来的请求。
在当前的代理中,角色通常通过提示来分配;然而,当角色复杂且相关数据量大时,提示可能无法全面描述角色。通过从与角色相关的数据中训练 LoRA 插件来分配角色可能是更好的选择。此外,代理的工具也可以是 LoRA 插件。通常,内存通过检索增强生成(RAG)来增强代理;然而,由于输入令牌的限制和上下文学习的缺点,基于 RAG 的支持可能效果不佳。相比之下,我们可以使用基于 LoRA 的持续学习来构建内存插件,从而解决 RAG 的问题。因此,值得探索 LoRA 驱动的代理。
以下是使用 Hugging Face peft 库加载 LoRA 模型并进行微调的基础示例:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. 加载基础模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
torch_dtype=torch.float16
)
# 2. 配置 LoRA 参数
lora_config = LoraConfig(
r=16, # 秩
lora_alpha=32, # 缩放系数
target_modules=["q_proj", "v_proj"], # 目标层
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
# 3. 应用 LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 4. 训练... (此处省略具体训练循环)
在本综述中,我们系统地回顾了 LoRA 在下游适应性改进、跨任务泛化、效率提升、联邦学习和应用等方面的最新进展。从这一综述中,我们可以发现 LoRA 在参数效率、可插拔性、兼容性和实现跨任务泛化的简便性方面具有显著优势,使其成为 LLMs 应用中最重要的技术之一。最近的进展进一步提升了 LoRA 的泛化能力和效率,并激发了其在更多场景中应用的潜力。
以下列出了 LoRA 在未来将不可或缺的三个发展方向:
总之,LoRA 在生成即服务、持续预训练和自主代理等领域展现出巨大的潜力,未来的研究将进一步挖掘和扩展 LoRA 的应用,使其在越来越多的实际场景中发挥重要作用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online