论文阅读:LORA: LOW-RANK ADAPTATION OF LARGE LAN GUAGE MODELS

NLP经典论文LORA解读,当下大模型低资源微调大模型重要方法之一

Abstract

自然语言处理的一个重要范例包括对一般领域数据的大规模预训练和对特定任务或领域的适应。当我们预训练更大的模型时,重新训练所有模型参数的完全微调变得不太可行。以GPT-3 175 B为例,部署微调模型的独立实例,每个实例都有175 B参数,这是非常昂贵的。我们提出了低秩自适应(Low-Rank Adaptation,简称LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了下游任务的可训练参数数量。与使用Adam微调的GPT-3 175 B相比,LoRA可以将可训练参数的数量减少10,000倍,并将GPU内存需求减少3倍。LoRA在RoBERTa、DeBERTa、GPT-2和GPT-3上的模型质量与微调相当或更好,尽管可训练参数更少,训练吞吐量更高,而且与适配器不同,没有额外的推理延迟。我们还提供了一个实证调查排名不足的语言模型适应,揭示了LoRA的功效。

INTRODUCTION

自然语言处理中的许多应用依赖于使一个大规模的、预先训练的语言模型适应于多个下游应用。这种自适应通常是通过微调来完成的,微调更新了预训练模型的所有参数。

  1. 许多人试图通过仅调整某些参数或学习外部模块来减轻这种情况。⇒这样,除了每个任务的预训练模型外,我们只需要存储和加载少量的特定于任务的参数,从而大大提高了部署时的操作效率。
  2. 问题:经常引入推理延迟(Houlsby等人,2019年; Rebuffi等人,2017)通过扩展模型深度或减少模型的可用序列长度(Li & Liang,2021; Lester等人,2021年; Hambardzumyan等人,2020; Liu等人,(第3节)。更重要的是,这些方法往往无法匹配微调基线,造成效率和模型质量之间的权衡。

“许多人试图通过仅调整某些参数或学习外部模块来减轻这种情况。⇒这样,除了每个任务的预训练模型外,我们只需要存储和加载少量的特定于任务的参数,从而大大提高了部署时的操作效率。”
这是在说:参数高效微调(PEFT)方法 的一个好处是你只需要保存少量新参数(比如 LoRA 的参数),大模型本身是共享的。
“问题:经常引入推理延迟(Houlsby等人,2019年; Rebuffi等人,2017)通过扩展模型深度或减少模型的可用序列长度…”
早期参数高效微调方法(如 Adapter、Prompt-Tuning)通常会增加模型推理延迟。例如:

  • Adapter 模型(Houlsby et al.)是在每一层插入新的 adapter 模块,增加模型深度 ⇒ 增加了推理所需的前向传播步骤。
  • Prefix / Prompt tuning 通过添加前缀 token、虚拟 embedding 等方式,增加了输入长度(如加 20 个虚拟 token)⇒ 增加了 Transformer 中的 attention 计算复杂度。

这些方法往往无法匹配微调基线,造成效率和模型质量之间的权衡。
说明这些方法虽然参数量少,但既增加了推理延迟,又精度略低于 full fine-tuning,因此不是理想选择。

我们从Li et al.(2018 a); Aghajanyan et al.(2020)中获得灵感,这些发现表明,学习的过度参数化模型实际上存在于低内在维度上。我们假设模型自适应过程中权重的变化也具有较低的“内在秩”,从而导致我们提出的低秩自适应(LoRA)方法。

LoRA允许我们在神经网络中间接训练一些密集层,方法是在适应过程中优化密集层变化的秩分解矩阵,同时保持预训练的权重冻结,如图1所示。
在这里插入图片描述
LORA的关键优势

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

我们将Transformer层的输入和输出维度大小称为 d m o d e l d_{model} dmodel。我们用Wq、Wk、Wv、Wo来指代自关注模块中的查询/键/值/输出投影矩阵。W或W0为预训练权矩阵,∆W为适应过程中累积的梯度更新。 我们用r来表示LoRA模块的秩。

Problem statement

假设我们有一个预训练的自回归语言模型PΦ(y|x),参数化为Φ。 例如,PΦ(y|x)可以是通用的多任务学习器,如GPT (Radford et al., b; Brown et al., 2020)基于Transformer架构(Vaswani et al., 2017)。考虑将此预训练模型应用于下游条件文本生成任务,例如摘要、机器阅读理解(MRC)和自然语言转换为SQL (NL2SQL)。每个下游任务由上下文-目标对的训练数据集表示:Z = {(xi, yi)}i=1,… ,N,其中xi和yi都是记号序列。例如,在NL 2SQL中,xi是自然语言查询,yi是相应的SQL命令;对于摘要,xi是文章的内容,yi是摘要。在完全微调期间,模型被初始化为预先训练的权重Φ0,并通过重复遵循梯度来更新为Φ0 + ∆Φ ,以最大化条件语言建模目标:
在这里插入图片描述
完全微调的主要缺点之一是,对于每个下游任务,我们学习一组不同的参数∆Φ,其维度|∆Φ|等于|Φ0|。 因此,如果预训练模型很大(如GPT-3, |Φ0|≈1750亿),存储和部署许多独立的微调模型实例可能是具有挑战性的。

在本文中,我们采用了一种更有效的参数方法,其中特定于任务的参数增量∆Φ =∆Φ(Θ)由一个更小的参数集Θ与|Θ|< |Φ0|进一步编码。 因此,寻找∆Φ的任务变成了对Θ的优化:
在这里插入图片描述
在随后的章节中,我们建议使用低秩表示来编码∆Φ,这既节省计算又节省内存。 当预训练模型为GPT-3 175B时,可训练参数|Θ|的个数可以小到|Φ0|的0.01%。

AREN’T EXISTING SOLUTIONS GOOD ENOUGH?

我们着手解决的问题绝不是什么新问题。 自从迁移学习开始以来,已经有几十项工作试图使模型适应更具有参数和计算效率。 关于一些著名作品的概览,见第6节。 以语言建模为例,在有效适应方面有两种突出的策略:添加适配器层(Houlsby等人,2019; Rebuffi et al., 2017; Pfeiffer et al., 2021; R¨uckl ’ e等人,2020)或优化某些形式的输入层激活(Li & Liang, 2021; Lester et al., 2021; Hambardzumyan et al., 2020; 刘等人,2021)。 然而,这两种策略都有其局限性,特别是在大规模和对延迟敏感的生产场景中。

Adapter Layers Introduce Inference Latency

适配器有许多变体。 我们专注于Houlsby等人(2019)的原始设计,每个Transformer块有两个适配器层,Lin等人(2020)的最新设计,每个块只有一个适配器层,但有一个额外的LayerNorm (Ba等人,2016)。 虽然可以通过修剪层或利用多任务设置来减少总体延迟(R¨uckl ’ e等人,2020; Pfeiffer等人,2021),没有直接的方法可以绕过适配器层中的额外计算。 这似乎不是问题,因为适配器层被设计为具有很少的参数(有时<原始模型的1%),通过具有较小的瓶颈维度,这限制了它们可以添加的flop。然而,大型神经网络依赖硬件并行性来保持低延迟,并且适配器层必须顺序处理。 这在批处理大小通常小于1的在线推理设置中会产生差异。 在没有模型并行性的通用场景中,例如在单个GPU上运行GPT-2 (Radford等人,b)介质上的推理,我们看到使用适配器时延迟明显增加,即使瓶颈维度非常小(表1)。
在这里插入图片描述
“|Θ|”表示适配器层中可训练参数的个数。 AdapterL和AdapterH是适配器调优的两个变体,我们将在5.1节中描述。 在在线、短序列长度的场景中,适配器层引入的推理延迟可能非常大。 详见附录B的完整研究。

Adapter是一种高效的微调方法,有人提出通过剪枝(减少 Adapter 层)或共享 Adapter 来减少“整体延迟”但每次推理时,仍然需要执行 Adapter 层的额外计算,无法避免
理论计算量(FLOPs)上看,Adapter 增加不多,因为它用的是低维瓶颈(比如从 768 → 64 → 768)。参数也很少
但是,大模型之所以推理快,是因为 GPU 并行计算充分(比如一次执行整个 Attention Block)但 Adapter 模块是一个新的子网络(通常是两个 Linear + 激活),插在中间不能和主干融合,也不能并行计算(因为它依赖主干输出),所以在实际推理中,它必须顺序执行 → 阻塞计算流

  • 如果是在线系统(例如对话机器人、问答系统),batch size 常常是 1 或小于 1(token streaming);
  • Adapter 的顺序执行特性在这种设置下会更明显地拖慢整体推理速度。

总结:即使 Adapter 参数量小、计算量小,但由于其**“不能融合 + 不能并行 + 顺序执行”**的结构特点,在实际推理中(特别是小 batch),导致明显延迟增加,这在他们的实验(表1)中有定量体现LoRA 的关键优势在于它可以合并权重后部署,避免 Adapter 那种结构性“延迟瓶颈”

Directly Optimizing the Prompt is Hard

另一个方向,如前缀调优(Li & Liang, 2021),面临着不同的挑战。 我们观察到前缀调优很难优化,其性能在可训练参数中呈非单调变化,证实了原论文的类似观察结果。 更根本的是,为自适应保留一部分序列长度必然会减少用于处理下游任务的序列长度,我们怀疑与其他方法相比,这使得调整提示的性能降低。 我们把对任务执行的研究推迟到第5节。

  • 前缀调优难以训练(optimization is hard)
  • 前缀调优占用输入长度(reduces usable context length)

直接优化“提示(prompt)”向量是一件困难的事情。Prefix Tuning 是一种参数高效微调(PEFT)方法,主要应用在 NLP 任务中,如文本生成、问答等。

  • 所谓“非单调变化”是指:
    • 可训练参数数量增多 ≠ 性能提升;
    • 有时加多了反而变差,说明优化不稳定;
  • 这种现象也在 Li & Liang 原论文中被观察到(即原作者也提到过这个问题)。

结论:Prefix Tuning 即使参数少,但训练难度不低。

  • Prefix Tuning 的做法是:
    - 在真实输入前面加一段可训练的“虚拟 token embedding”,比如加 20 个向量;
    - 这段不参与输入,但会影响 attention 层,起到“提示”作用;
    - 但问题是:Transformer 的 输入长度是固定的(比如 512、1024、2048)。

加了 prompt,就意味着真正任务的输入空间被压缩了。这在 输入比较长的任务(如摘要、长文本问答)中,会带来精度下降。例如,模型输入限制512tokern,prompt50tokens,实际任务可用长度462tokens

Our Method

上面也引出了LoRA的有点:容易训练、不增加推理延迟、不占用输入长度、参数可合并、表现稳定性

低秩参数化更新矩阵(LOW-RANK-PARAMETRIZED UPDATE MATRICES)

神经网络包含许多执行矩阵乘法的密集层。 这些层中的权矩阵通常是全秩的。 在适应特定任务时,Aghajanyan等人(2020)表明,预训练的语言模型具有较低的“内在维度”,尽管随机投射到较小的子空间,但仍然可以有效地学习。受此启发,我们假设权重的更新在适应过程中也具有较低的“内在排名”。对于预训练的权重矩阵W0∈Rd×k,我们通过用低秩分解W0 +∆W = W0 + BA表示后者来约束其更新,其中B∈Rd×r, A∈Rr×k,秩r<<min(d, k)。在训练过程中,W0被冻结,不接受梯度更新,而A和B包含可训练参数。 注意,W0和∆W = BA都用相同的输入相乘,它们各自的输出向量按坐标求和。 当h = W 0 x W_0x W0x时,修正后的正向传递收益率为:
在这里插入图片描述
我们在图1中说明了我们的重新参数化。 我们对A使用随机高斯初始化,对B使用零初始化,因此∆W = BA在训练开始时为零。 然后,我们将∆Wx乘以α /r ,其中α是r中的常数。当使用Adam进行优化时,如果我们适当地缩放初始化,则调整α与调整学习率大致相同。 因此,我们简单地将α设置为我们尝试的第一个r,而不调整它。 当我们改变r时,这种缩放有助于减少重新调整超参数的需要(Yang & Hu, 2021)。

“内在维度”是指:虽然权重看起来高秩、很大维,但模型学习任务相关的知识,只需要落在低维子空间中。这启发我们:也许微调时,不需要改动全部参数,只改动一个 低秩空间内的小扰动 就够了。
LoRA的核心假设:参数更新(ΔW)不需要是全秩的,而可以表示为一个低秩矩阵
W0 +∆W = W0 + BA 我们不更新 W₀,而是添加一个低秩扰动 BA(秩为 r)r秩远小于原始秩,只优化A和B
Forward注意,W₀ 和 ΔW = BA 都用相同的输入相乘,它们各自的输出向量按坐标求和。 output = W₀ x + ΔW x = W₀ x + B (A x),和原模型的结构一致,只是加了一项,方便融合或部署
初始化:A ∼ 𝒩(0,1):正常初始化;B = 0:确保初始时 ΔW = 0,不破坏预训练模型行为,这样可以 平稳过渡,不会一开始就打乱模型。
然后,我们将 ΔW x 乘以 α / r,r是超参数秩,为什么缩放?因为 r 越大,BA 参数量越多,导致更新变大,所以要除以 r,让不同 r 值下的模型表现接近、稳定
α/r:
r 越大,模型可调参数越多,容量更强;
r 越小,效率更高、参数更少,但拟合能力也弱些。
α 是 LoRA 中的缩放因子,也是你设定的超参数
why α/r :
BA 是你新引入的矩阵更新,它一开始被初始化成比较小的值。
不同的 r(秩)值,会造成 BA 的大小分布不同:
r 越大,参数越多,总输出就会变得更大;
r 越小,参数越少,输出值也小。
用一个缩放因子 α / r 来标准化 BA 的输出大小,让 BAx 大小跟 r 无关,始终落在类似的数值范围。
这样可以确保:
你用 r=2、r=4、r=8 的时候,不需要重新调学习率或其他超参;
训练稳定、行为一致;
简化了训练 LoRA 时的调参工作量。
总体 forward 逻辑:h = W0x+ (α/r )BAx,α / r 是 LoRA 中的缩放因子,用于控制 LoRA 的更新量 ΔW 不因 r 的变化而放大或缩小,保持训练稳定和行为一致。

  • 全微调的推广(A Generalization of Full Fine-tuning.)

更一般的微调形式允许训练预训练参数的子集。 LoRA更进一步,在适应过程中不要求权重矩阵的累积梯度更新具有全秩。 这意味着当将LoRA应用于所有权重矩阵并训练所有偏差时,通过将LoRA秩r设置为预训练的权重矩阵的秩,我们大致恢复了完全微调的表达性。 换句话说,当我们增加可训练参数的数量时,训练LoRA大致收敛于训练原始模型,而基于适配器的方法收敛于MLP,基于前缀的方法收敛于不能接受长输入序列的模型。

训练时参数数量大幅减少(从 d×k 减少为 r×(d+k))
LoRA 是一种对“全微调”的低秩泛化形式,当 r 足够大,它可以完全等效地逼近 full fine-tuning 的表现。

  • 没有额外的推理延迟。(No Additional Inference Latency.)

存储W = W0 + BA,并像往常一样执行推理。 注意,W0和BA都在Rd×k中。 当我们需要切换到另一个下游任务时,我们可以通过减去BA然后添加不同的B’ A’来恢复W0,这是一个内存开销很小的快速操作。保证在推理期间,至关重要的是,通过构造进行微调的模型相比,我们不会引入任何额外的延迟。

lora在trainsformer中的应用(APPLYING LORA TO TRANSFORMER)

原则上,我们可以将LoRA应用于神经网络中权矩阵的任何子集,以减少可训练参数的数量。 在Transformer体系结构中,自注意力模块中有四个权重矩阵(Wq、Wk、Wv、Wo), MLP模块中有两个权重矩阵。 我们将Wq (orWk, Wv)视为维度dmodel ×dmodel的单个矩阵,尽管输出维度通常被切成注意头。 为了简单和参数效率,我们将研究限制为仅适应下游任务的注意力权重,并冻结MLP模块(因此它们不接受下游任务的训练)。 在7.1节中,我们进一步研究了在变压器中适应不同类型的注意力权重矩阵的影响。 我们把适应MLP层、LayerNorm层和偏差的实证调查留给未来的工作。

LoRA也有其局限性。 例如,如果选择将A和B吸收到w中以消除额外的推理延迟,则在单个前向传递中批量处理具有不同A和B的不同任务的输入是不直接的。 尽管对于延迟不重要的场景,可以不合并权重并动态选择用于批量示例的LoRA模块。

EMPIRICAL EXPERIMENTS

7.1 transformer中的哪些权矩阵我们应该应用lora ?

给定有限的参数预算,我们应该采用哪种类型的权重来适应LoRA以获得下游任务的最佳性能? 如第4.2节所述,我们在自关注模块中只考虑权矩阵。 我们在GPT-3 175B上设置了18M的参数预算(如果存储在FP16中,则大约为35MB),如果我们适应一种类型的注意力权重,则对应于r = 8,如果我们适应两种类型,则对应于r = 4,对于所有96层。 结果如表5所示。

在这里插入图片描述
表5:在给定相同数量的可训练参数的情况下,对GPT-3中不同类型的注意力权重应用LoRA后,WikiSQL和MultiNLI上的验证精度。 同时调整Wq和Wv可以提供最佳的整体性能。 我们发现,对于给定的数据集,随机种子之间的标准差是一致的,我们在第一列中报告了这一点。

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

  • 将所有微调参数都放到ATTENTION的某一个参数矩阵的效果并不好,将可微调参数平均分配到和的效果最好WqWk
  • 即使是秩仅取4也能在中获得足够的信息ΔW
  • 因此在实际操作中,应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵

7.2 LoRA最优秩是多少
在这里插入图片描述
表6:不同rank r的WikiSQL和MultiNLI上的验证精度。令我们惊讶的是,一个小到1的rank就足以在这些数据集上同时适应Wq和Wv,而单独训练Wq则需要更大的r。我们在H.2节中对GPT-2进行了类似的实验。

这表明更新矩阵∆W可能具有非常小的“内在秩” 为了进一步支持这一发现,我们检查了由不同r选择和不同随机种子学习的子空间的重叠。 我们认为增加r并不能覆盖更有意义的子空间,这表明一个低秩适应矩阵是足够的

不同r之间的子空间相似度。鉴于 A r = 8 A_{r=8} Ar=8 A r = 64 A_{r=64} Ar=64的自适应矩阵r = 8和64年使用相同的pre-trained模型,进行奇异值分解,得到right-singular酉矩阵UAr = 8和UAr = 64。我们希望:UAr=8(对于1≤i≤8)中top i个奇异向量的子空间中有多少包含在UAr=64(对于1≤j≤64)中top j个奇异向量的子空间中? 我们使用基于Grassmann距离的标准化子空间相似性来测量这个量(参见附录G以获得更正式的讨论)。如下
在这里插入图片描述
在这里插入图片描述
图3:∆Wq和∆Wv的列向量Ar=8和Ar=64之间的子空间相似性。 第三和第四个图形放大了前两个图形中左下角的三角形。 r = 8中的上方向包含在r = 64中,反之亦然。
在Ar=8和Ar=64之间,顶奇异向量对应的方向重叠显著,而其他方向则不重叠。 具体地说,∆Wv (p。 ∆Wq (r =8)和∆Wv (r =8)。 Ar=64的∆Wq与归一化相似度> 0.5共享一个维数为1的子空间,这解释了为什么r= 1在GPT-3的下游任务中表现相当好。
由于Ar=8和Ar=64都是使用相同的预训练模型学习的,图3表明Ar=8和Ar=64的顶部奇异向量方向是最有用的,而其他方向可能包含在训练过程中积累的大部分随机噪声。 因此,适应矩阵确实可以有很低的秩。

7.3 ∆w与w相比如何?

作者还研究∆W与W高度相关吗? (或者从数学上讲,∆W是否主要包含在W的最上面的奇异方向上?) 同时,∆W相对于它在W中的对应方向有多大? 这可以揭示适应预训练语言模型的潜在机制。

在这里插入图片描述
从上图的对比结果,作者发现三个现象:

  • 相比于随机矩阵,ΔW和W有强关联。从表中的可以看出0.32≫0.02说明∆W放大了W中已经存在的一些特征。
  • 其次,∆W并没有重复W的最上面的奇异方向,而是只放大了W中没有强调的方向。
  • 第三,放大系数非常大:当r = 4时,放大系数为21.5≈6.91/0.32。 r = 64的放大系数较小的原因请参见H.4节。
  • 我们还在第H.3节中提供了一个可视化,说明当我们从Wq中加入更多的顶级奇异方向时,相关性是如何变化的。 这表明低秩适应矩阵潜在地放大了特定下游任务的重要特征,这些特征是在一般预训练模型中学习到的,但没有被强调。

总结

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

未来的工作有很多方向。 1) LoRA可以与其他有效的自适应方法相结合,有可能提供正交改进。 2)微调或LoRA背后的机制尚不清楚——如何将预训练期间学习到的特征转化为下游任务? 我们相信LoRA比full fine更容易回答这个问题。3)我们主要依靠启发式方法来选择LoRA应用的权重矩阵。 有没有更有原则的方法? 4)最后,∆W的rank-deficient表明W也可能是rank-deficient,这也可以作为未来作品的灵感来源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值