LoRA: 一种资源高效的大模型微调方法

释放双眼,带上耳机,听听看~!
本文介绍了一种名为LoRA的资源优化技术,可以在资源不富裕的情况下进行大模型微调,提高存储和计算效率。

导语

本文介绍了学术界在资源不富裕的情况下能够玩得起大模型的一种方式:LoRA,该技术可以大大优化大模型Fine-tune所需的算力资源,最近颇受关注。

1 简介

自然语言处理中的应用通常需要使用大规模预训练的语言模型,并通过微调来适应不同的下游任务。微调更新了预训练模型的所有参数,但其缺点是导致新模型与原始模型一样庞大。一些方法尝试通过调整参数或学习外部模块来减少存储和加载任务特定的参数,以提高部署时的效率。然而,这些方法通常会引入推理延迟,并且无法与微调Baseline相匹配。

受到之前的研究启发,本文提出了一种低秩适应(LoRA)方法,假设在模型适应过程中权重变化具有较低的内在秩。LoRA允许我们通过优化在适应过程中变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预训练权重不变。例如,在GPT-3 175B上,我即使在全秩很高时,非常低的秩也足够,这使得LoRA具有存储和计算效率。

LoRA: 一种资源高效的大模型微调方法

LoRA具有几个关键优势。

  • 预训练的模型可以共享,并用于为不同的任务构建许多小型LoRA模块。可以通过替换图1中的矩阵A和B来冻结共享模型并有效地切换任务,从而显著降低存储需求和任务切换开销。
  • LoRA使训练更有效,并且在使用自适应优化器时将硬件进入门槛降低了3倍,因为不需要计算梯度或维护大多数参数的优化器状态。相反,只优化注入的小得多的低秩矩阵。
  • 简单的线性设计允许在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,通过构建不会引入推理延迟。
  • LoRA与许多先前的方法正交,并且可以与其中许多方法组合,例如prefix-tuning。附录E中提供了一个例子。

2 问题陈述

虽然LoRA与训练目标无关,但本文将重点放在语言建模上,作为代表用例。下面是对语言建模问题的简要描述,特别是在给定特定任务提示的情况下最大化条件概率。

假设一个预训练的自回归语言模型P,参数为Φ。例如,PΦ(y | x)可以是通用的多任务学习器,如GPT。模型应用于下游条件文本生成任务,如摘要、机器阅读理解和自然语言转换为SQL时,每个下游任务由context-target对的训练数据集表示:Z = {(xi, yi)} i=1,…,N,其中xi和yi都是token序列。在Full Fine-tuning过程中,将模型初始化为预训练的权值Φ0,并通过反复跟随梯度将模型更新为Φ0 +∆Φ,使条件语言建模目标最大化:

LoRA: 一种资源高效的大模型微调方法

这里的Full Fine-tune就是传统意义上的Fine-tuning,但是它的主要缺陷在于对于每一个任务,都需要学一个和原来参数量规模相同的∆Φ,因此,如果预训练模型很大(如GPT-3, | Φ0 |≈1750亿),存储和部署许多独立的微调模型实例可能是具有挑战性的。

本文提出一种更加parameter-efficient的方法,即用一个小得多的参数Θ来编码∆Φ,那么这个任务就变成了优化参数Θ:

LoRA: 一种资源高效的大模型微调方法

在随后的内容中,本文提出使用低秩表示(low-rank representation)来编码∆Φ,这既节省计算又节省内存。当预训练模型为GPT-3 175B时,可训练参数的个数可小至原参数的0.01%。

3 现有方法不足

本文解决的问题并不新鲜。在迁移学习中,已经有很多尝试使模型更适应参数和计算效率。例如,语言建模领域有两种主要策略:添加适配器层(Adapters)和优化输入层激活。然而,这些策略都存在局限性,尤其在大规模和延迟敏感的生产场景中。适配器层引入了推理延迟并可能增加延迟,而前缀调整(Prefix-Tuning)面临性能非单调变化和减少序列长度对下游任务处理的挑战。对任务执行的研究将在第5节进行讨论。

4 方法

4.1 Low-Rank-Parametrized Update Matrices

神经网络中的Dense Layer通常包含许多矩阵乘法。先前的研究表明,在适应特定任务时,PLM可能具有较低的”内在维度”,即使投射到较小的子空间,也可以有效地进行学习。受此启示,作者假设权重更新过程中也具有较低的”内在排名(intrinsic rank)”。作者使用低阶分解的方式表示预训练的权重矩阵W0的更新,即W0 + ∆W = W0 + BA,其中B为d×r的矩阵,a为r×k的矩阵,秩R≪min(d, k)。在训练期间,W0保持不变,不接受梯度更新,而A和B包含可训练的参数。当h=w0x时,修正后的前向传播变为:

LoRA: 一种资源高效的大模型微调方法

图1中展示了这种重新参数化的方式。对A使用随机高斯初始化,对B使用零初始化,因此∆W = BA在训练开始时为零。然后,将∆Wx乘以α/r,其中α是r中的常数。

LoRA的推广形式允许训练预训练参数的子集,即在适应下游任务过程中权重矩阵的累积梯度更新不必具有全秩。这意味着Full Fine-tuning实际上是LORA的一种全秩的特殊情况。换句话说,当增加可训练参数的数量时,训练LoRA会大致收敛于训练原始模型,而Adapter的方法会收敛于MLP,Prefix-tuning的方法会收敛于不能处理长输入序列的模型。

LoRA在推理过程中没有额外的延迟。在部署到生产环境中时,我们可以显式地计算和存储W = W0 + BA,并像往常一样进行推理。当需要切换到另一个下游任务时,我们可以通过减去BA,然后添加另一个B’和a’来恢复W0,这是一种内存开销较小的快速操作。并且在推理时通过合并权重得到和Full Fine-tuning一样的延迟。

4.2 将LoRA应用于Transformer

在Transformer中使用LoRA可以将其应用于权矩阵的子集,从而减少可训练参数的数量。具体来说,在Self-attention模块中有四个权重矩阵(wq、wk、wv、wo),MLP模块中有两个权重矩阵。可以将适应下游任务的注意力权重限制在自关注模块中,并冻结MLP模块,以简化和提高参数效率。

对于实际的好处主要体现在内存和存储使用上。对于经过Adam训练的大型Transformer,当r≪d时,可以将VRAM使用量减少多达2/3,因为不需要存储冻结参数的优化器状态。例如,在GPT-3 175B上,训练期间的VRAM消耗从1.2TB减少到350GB。当r=4,并且只调整查询和值投影矩阵时,checkpoint大小减少了大约10,000倍(从350GB减少到35MB)。这样可以使用更少的GPU进行训练,并避免I/O瓶颈。

此外,LoRA还允许在部署时低成本地在任务之间切换,只需交换LoRA权重,而不是所有参数,从而创建许多定制模型,可以在将预训练的权重存储在VRAM中的机器上动态交换。作者观察到,在GPT-3 175B的训练过程中,与完全微调相比,速度提高了25%,因为不需要计算绝大多数参数的梯度。然而,LoRA也有局限性,例如在单个前向传递中批量处理具有不同A和B的不同任务的输入时可能会面临推理延迟的问题。虽然对于不重要延迟的场景,可以不合并权重并动态选择LoRA模块来用于批量示例。

5 实验

选取RoBERTa、DeBERTa作为Baseline进行Full-tuning、Adapter和LORA的对比实验,结果如下:

LoRA: 一种资源高效的大模型微调方法

为了展示方法的普遍性,作者也使用GPT-2作为Baseline进行对比,

LoRA: 一种资源高效的大模型微调方法

LoRA: 一种资源高效的大模型微调方法

作为LoRA的最终压力测试,我们将GPT-3扩展到1750亿个参数,如表4所示。注意,并不是所有的方法都单调地受益于更多可训练的参数,如图2所示。可以观察到,当使用超过256个特殊token进行前缀嵌入调优或使用超过32个特殊token进行前缀层调优时,性能会显著下降。

LoRA: 一种资源高效的大模型微调方法

6 相关工作

7 理解Low-Rank更新

鉴于LoRA的经验优势,作者进行了一系列的实证研究来回答以下问题:

  1. 给定一个参数预算约束,我们应该适应预训练的Transformer中权重矩阵的哪个子集以最大化下游性能?
  2. “最优”适应矩阵∆W是否真的秩不足?如果有的话,在实践中使用什么等级比较好呢?
  3. ∆W与W有什么联系?∆W与W高度相关吗?∆W相对于W有多大?

对于问题1,作者在GPT-3 175B上设置了18M的参数预算(如果存储在FP16中,则大约为35MB),如果只适应一种类型的注意力权重,则对应于r = 8,如果适应两种类型,则对应于r = 4,对于所有96层。结果如表5所示。

LoRA: 一种资源高效的大模型微调方法

请注意,将所有参数都放在∆wq或∆wk中会导致性能显著降低,而同时调整wq和wv会产生最佳效果。这表明,即使是4个秩在∆W中捕获了足够的信息,使得适应更多的权重矩阵比适应具有较大秩的单一类型的权重更好。

LoRA: 一种资源高效的大模型微调方法

对于问题2,表6显示LoRA在非常小的r下已经具有竞争力了。这表明更新矩阵∆W可能具有非常小的“内在秩”。为了进一步支持这一发现,作者检查了由不同r选择和不同随机种子学习的子空间的重叠。作者认为增加r并不能覆盖更有意义的子空间,这表明一个低秩适应矩阵是足够的。

LoRA: 一种资源高效的大模型微调方法

对于问题3,表7可以得出几个结论。首先,与随机矩阵相比,∆W与W的相关性更强,说明∆W放大了W中已经存在的一些特征。其次,∆W并没有重复W的最上面的奇异方向,而是只放大了W中没有强调的方向。第三,放大系数非常大:当r = 4时,放大系数为21.5≈6.91/0.32。这表明低秩适应矩阵潜在地放大了特定下游任务的重要特征,这些特征是在一般预训练模型中学习到的,但没有被强调。

8 总结与展望

就所需的硬件和为不同任务托管独立实例的存储/切换成本而言,对庞大的语言模型进行微调是非常昂贵的。本文提出LoRA,一种有效的自适应策略,既不引入推理延迟,也不减少输入序列长度,同时保持高模型质量。重要的是,通过共享绝大多数模型参数,它允许在作为服务部署时快速切换任务。虽然本文关注的是Transformer语言模型,但所提出的原则通常适用于任何具有密集层的神经网络。

未来的工作有很多方向。

  1. LoRA可以与其他有效的自适应方法相结合,有可能提供正交改进。
  2. 微调或LoRA背后的机制尚不清楚——如何将预训练期间学习到的特征转化为下游任务?
  3. 本文主要依靠启发式方法来选择LoRA应用的权重矩阵。有没有更有原则的方法?
  4. ∆W的rank-deficiency表明W也可能是rank-deficient,这也可以作为未来工作的灵感来源。
本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

红睡袍(RedPajama):开源AI语言模型的新篇章

2023-12-10 10:07:14

AI教程

如何在AWS Sapphire Rapids集群上加速PyTorch训练任务

2023-12-10 10:13:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索