论文link:https://arxiv.org/pdf/2106.09685
code:https://github.com/microsoft/LoRA
LoRA:Low-Rank Adaptation of Large Language Models
Abstract
自然语言处理的一个重要范例是对通用领域数据进行大规模预训练,并适应特定任务或领域。随着我们对更大的模型进行预训练,完全微调(重新训练所有模型参数)变得不太可行。以 GPT-3 175B 为例 - 部署经过微调的模型的独立实例(每个实例具有 175B 个参数)的成本过高。我们提出了低秩自适应(LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入 Transformer 架构的每一层,大大减少了下游任务的可训练参数数量。与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数的数量减少 10,000 倍,并将 GPU 内存需求减少 3 倍。尽管 LoRA 的可训练参数更少、训练吞吐量更高,并且与适配器不同,没有额外的推理延迟,但其在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量表现与微调相当或更好。我们还对语言模型自适应中的秩缺陷进行了实证研究,这揭示了 LoRA 的有效性。我们发布了一个软件包,以促进 LoRA 与 PyTorch 模型的集成,并在 https://github.com/microsoft/LoRA 上提供了我们对 RoBERTa、DeBERTa 和 GPT-2 的实现和模型检查点。
1 INTRODUCTION
自然语言处理中的许多应用都依赖于将一个大规模、预训练的语言模型适配到多个下游应用。这种适配通常通过微调来完成,微调会更新预训练模型的所有参数。微调的主要缺点是新模型包含的参数与原始模型一样多。由于每隔几个月就要训练一次更大的模型,这从 GPT-2(Radford 等人,b)或 RoBERTa large(Liu 等人,2019)的单纯“不便”变成了 GPT-3(Brown 等人,2020)的关键部署挑战,该模型拥有 1750 亿个可训练参数。1 许多人试图通过仅调整一些参数或为新任务学习外部模块来缓解这种情况。这样,除了每个任务的预训练模型之外,我们只需要存储和加载少量特定于任务的参数,从而大大提高部署时的运行效率。然而,现有技术通常会通过扩展模型深度或减少模型的可用序列长度(Li & Liang,2021;Lester 等人,2021;Hambardzumyan 等人,2020;Liu 等人,2021)(第 3 节)来引入推理延迟(Houlsby 等人,2019;Rebuffi 等人,2017)。更重要的是,这些方法往往无法匹配微调基线,导致效率和模型质量之间的权衡。 我们从 Li 等人(2018a);Aghajanyan 等人(2020)那里获得灵感,他们表明学习到的过度参数化模型实际上存在于较低的内在维度上。我们假设模型适应过程中权重的变化也具有较低的“内在秩”,从而导致我们提出的低秩适应(LoRA)方法。 LoRA 允许我们通过优化适应过程中密集层变化的秩分解矩阵来间接训练神经网络中的某些密集层,同时保持预训练的权重不变,如图 1 所示。以 GPT-3 175B 为例,我们表明,即使满秩(即 d)高达 12,288,非常低的秩(即图 1 中的 r 可以是一或二)也足够了,这使得 LoRA 既具有存储效率,又具有计算效率。
LoRA 具有几个关键优势。
• 预先训练的模型可以共享,并用于为不同任务构建许多小型 LoRA 模块。我们可以通过替换图 1 中的矩阵 A 和 B 来冻结共享模型并有效地切换任务,从而显著降低存储要求和任务切换开销。
• 使用自适应优化器时,LoRA 使训练效率更高,并将硬件进入门槛降低多达 3 倍,因为我们不需要计算梯度或维护大多数参数的优化器状态。相反,我们只优化注入的、小得多的低秩矩阵。
• 我们的简单线性设计允许我们在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,通过构造不会引入推理延迟。
• LoRA 与许多先前的方法正交,可以与其中许多方法结合使用,例如前缀调整。我们在附录 E 中提供了一个示例。
2. PROBLEM STATEMENT
第二部分“问题陈述”讨论了大型预训练语言模型适应下游任务的问题。
传统的全面微调方法存在缺点:对每个任务学习的参数规模与原始模型相同,导致存储和部署挑战,尤其是对于像GPT-3这样拥有1750亿参数的大型模型。
3.现有方法的不足
现有方法的2个不足:
首先,添加适配器层(adapters)的策略虽然参数少,但会在推理阶段引入延迟(参考下表 Table 1),特别是在大规模和对延迟敏感的生产环境中。
其次,直接优化输入层激活的方法(prefix)在训练参数方面存在非单调变化,且通过预留部分序列长度用于适应,降低了处理下游任务的序列长度。
这些方法通常无法达到微调基准,存在效率和模型质量之间的权衡。论文通过这些分析指出,尽管现有方法在参数和计算效率方面做出了努力,但在大规模模型的适应中仍面临诸多挑战,包括增加推理延迟和降低模型性能等问题。
4 研究方法
在论文的第四部分“我们的方法”,作者介绍了LoRA(低秩适应)的设计和应用。
4.1节 低秩参数化更新矩阵 、
讨论了如何通过低秩分解更新预训练模型的权重矩阵。这种方法通过在预训练权重矩阵上加入低秩矩阵B和A,从而实现对模型的微调,同时保持预训练权重冻结。这种设计在训练时只需优化低秩矩阵,大大减少了可训练参数的数量。
基于此,LoRA 可以成功地外推至全参微调:
Adapters 和 prefix 都无法维持原有架构;
而 LoRA 只是增加了 delta W,可以维持原有架构。
论文中的说明:LoRA(低秩适应)走得更远,不要求在适应期间累积梯度更新到权重矩阵必须是满秩的。这意味着,当我们将LoRA应用于所有权重矩阵并训练所有偏差时,我们大致上通过将LoRA的秩r设置为预训练权重矩阵的秩,恢复了完全微调的表达能力。换句话说,随着我们增加可训练参数的数量,训练LoRA大致上收敛于训练原始模型,而基于适配器的方法收敛于一个多层感知机(MLP),基于前缀的方法则收敛于一个不能处理长输入序列的模型。
4.2节“将LoRA应用于Transformer”中,作者具体说明了如何将LoRA应用于Transformer架构中。特别地,只对自注意力模块中的权重矩阵Wq和Wv进行适应,而保持MLP模块不变。这种方法不仅降低了内存和存储需求,还允许在部署时快速切换不同的下游任务,同时保持高效的训练和无额外推理延迟。
LoRA 的优势:最显著的好处来自于内存和存储使用量的减少。对于使用Adam训练的大型Transformer,如果r ≈ dmodel,我们可以将VRAM使用量减少多达2/3,因为我们不需要为冻结的参数存储优化器状态。在GPT-3 175B上,我们将训练期间的VRAM消耗从1.2TB减少到350GB。当r = 4并且只有查询和值投影矩阵被调整时,检查点大小大约减少了10,000倍(从350GB减少到35MB)。这使我们能够使用显著更少的GPU进行训练,并避免I/O瓶颈。另一个好处是,我们可以在部署时以更低的成本在任务之间切换,只需更换LoRA权重而不是所有参数。这允许创建许多定制模型,可以在存储预训练权重的机器上即时切换。我们还观察到在GPT-3 175B上训练时比完全微调快了25%,因为我们不需要为绝大多数参数计算梯度。
LoRA 的局限:例如,如果选择将A和B并入W以消除额外的推理延迟,则将不同任务的输入分批到单个前向传递中并不直接。虽然在延迟不是关键的情况下,可以选择不合并 A 和 B,并动态选择一批样本中要使用的LoRA模块。(有些训练方法中,我们需要自己手动把训练好的权加到原模型)
5.研究结果
第五部分《我们的方法》详细介绍了LoRA(低秩适应)的具体实现和优势。主要内容包括:
5.1 低秩参数化更新矩阵:介绍了LoRA如何通过低秩矩阵实现对预训练模型的微调,以减少训练参数和计算资源的需求。
LoRA 的表现说明:大模型确实是低秩的,训练中的很多噪音可以通过降维去掉。
5.2 在Transformer中应用LoRA:讨论了LoRA如何适用于Transformer架构,特别是对自注意力模块的权重矩阵进行低秩适应。
5.3 理解低秩更新:分析了LoRA中低秩矩阵的特性,说明了为什么这种方法能有效减少所需的参数数量。
5.4 哪些权重矩阵应该应用LoRA:探讨了在Transformer架构中应用LoRA的最佳实践,包括选择哪些权重矩阵进行调整。
5.5 LoRA的最优秩r是多少:讨论了如何选择LoRA中低秩矩阵的最佳秩,以平衡模型性能和效率。**
**
Figure 2 关键解读:
- Prefix 很省内存,但是性能最差
- LoRA 也很省内存,但表现最佳
整体上,这一部分详细阐述了LoRA的理论基础、实施细节及其在不同应用场景下的适用性和效能。
6 相关研究
第六部分“相关工作”总结了几个与LoRA相关的研究领域:
1) Transformer语言模型:自Transformer架构提出以来,基于它的语言模型在NLP中取得了显著成绩。
2) 提示工程与微调:GPT-3展示了通过少量训练样本进行行为适应的能力,但这依赖于输入提示的精确构造。
3) 参数高效适应:许多研究提出了在现有神经网络层之间插入适配器层,LoRA使用类似的低秩约束来更新权重。
4) 深度学习中的低秩结构:在机器学习问题中,许多问题具有内在的低秩结构,且训练后的深度学习网络往往展示出低秩属性。
LoRA的提出得到了这些文献的支持。
7 理解低秩更新 UNDERSTANDING THE LOW-RANK UPDATES
第七部分“理解低秩更新”中,文章探讨了LoRA(低秩适应)更新过程的原理和效果。
论文分析了在Transformer模型中应用LoRA的效果,说明了低秩更新如何在保持预训练模型权重不变的同时,有效地适应下游任务。
此外,本部分还探讨了在不同的Transformer权重矩阵中应用LoRA的效果,并讨论了LoRA中低秩矩阵的最优秩。
通过实验,文章展示了LoRA在减少可训练参数数量的同时,能够在各种任务上达到与完全微调相当甚至更好的性能。
8 研究结论和展望 CONCLUSION AND FUTURE WORK
微调巨大的语言模型,在硬件需求和为不同任务托管独立实例的存储/切换成本方面成本高昂。我们提出了LoRA,这是一种高效的适应策略,既不引入推理延迟,也不减少输入序列长度,同时保持高模型质量。
重要的是,它允许在作为服务部署时快速切换任务,因为它共享了大部分模型参数。虽然我们主要关注Transformer语言模型,但提出的原则通常适用于任何带有密集层的神经网络。
未来的研究方向有很多。
- LoRA可以与其他高效适应方法结合,可能提供正交改进。
- 微调或LoRA背后的机制尚不清楚 - 预训练期间学到的特征如何转化为在下游任务上表现良好?我们相信,与全面微调相比,LoRA使回答这个问题更容易。
- 我们大多依赖启发式方法来选择应用LoRA的权重矩阵。有没有更原则性的方法呢?
- 最后,∆W的秩不足表明W也可能是秩不足的,这也可以为未来的研究提供灵感。