LoRA:大型语言模型的低秩自适应
Paper是Microsoft Corporation发表在ICLR 2022的工作
Paper Title:LoRA: Low-Rank Adaptation of Large Language Models
Code :地址
Abstract
自然语言处理的主导范式包括对通用领域数据进行大规模预训练,并适应特定任务或领域。 随着我们对更大的模型进行预训练,传统的微调(重新训练所有模型参数)变得不那么可行。以 GPT-3 175B 为例,部署许多独立的微调模型实例(每个实例有 175B 个参数)的成本极其高昂。我们提出了低秩自适应(LoRA),它冻结预训练的模型权重,并将可训练的秩分解矩阵注入 Transformer 架构的每一层,大大减少下游任务的可训练参数数量。对于 GPT-3,与完全微调相比,LoRA 可以将可训练参数的数量减少 10,000 倍,计算硬件要求减少 3 倍。尽管 LoRA 的可训练参数更少、训练吞吐量更高且没有额外的推理延迟,但在 GPT-3 和 GPT-2 上,其模型质量表现与微调相当或更好。我们还对语言模型适配中的秩缺陷进行了实证研究,这揭示了 LoRA 的有效性。
1 Introduction
自然语言处理中的许多应用都依赖于将一个大规模、预训练的语言模型适配到多个下游应用。这种适配通常通过微调来完成,微调会更新预训练模型的所有参数。微调的主要缺点是它需要存储与原始模型中一样多的参数。由于每隔几个月就要训练一次更大的模型,因此这从 GPT-2 [32] 或 BERT-large [9] 的“不便”变成了 GPT-3 [6] 的关键部署挑战,后者拥有 1750 亿个可训练参数。
许多研究人员试图通过仅调整一些参数或为新任务学习外部模块来缓解这种情况。这样,我们只需要为每个任务将少量特定于任务的参数加载到预训练模型中,从而大大提高了部署效率。然而,在实践中,现有技术要么通过扩展模型深度引入推理延迟 [15, 34],要么减少模型的可用序列长度 [14, 19, 21, 25]。更重要的是,这些先前的尝试有时无法匹配微调基线,从而在效率和模型质量之间造成权衡。
我们从 [1, 20] 中得到启发,这些研究表明,学习到的过度参数化模型实际上位于较低的内在维度上。我们假设语言模型自适应中的更新矩阵也具有较低的“内在秩”,从而导致了我们提出的低秩自适应 (LoRA) 方法。 LoRA 允许我们通过注入和优化密集层更新的秩分解矩阵来间接训练神经网络中的每个密集层,同时保持原始矩阵不变,如图 1 所示。以 GPT-3 175B 为例,我们表明,即使满秩(即 d)高达 12288,非常低的秩(即图 1 中的 r 可以是一或二)也足够了,这使得 LoRA 在空间和计算上都具有很高的效率。
图 1:我们的重参数化。我们仅训练 A 和 B。
LoRA 具有以下几个关键优势。
- 可以共享单个预训练模型,并用于为不同任务构建许多小型 LoRA 模块。我们可以将共享的原始模型保留在 VRAM 中,并通过替换图 1 中的矩阵 A 和 B 来有效地切换任务,从而显着降低存储要求和任务切换开销。
- 它使训练更加高效,并将硬件进入门槛降低了 3 倍,因为在使用自适应优化器时,我们不需要计算梯度或维护大多数模型参数的优化器状态。相反,我们只优化注入的低秩矩阵,这些矩阵的参数要少得多。
- 其简单的线性设计使我们能够在部署期间将更新矩阵与原始权重合并,不会引入推理延迟。
- LoRA 与先前的技术正交,可以与其中许多技术相结合(例如前缀调整)。我们在附录 D 中提供了一个示例。
术语定义 我们频繁提到Transformer架构,并使用其常见维度的术语。我们称其隐藏大小或激活大小为 d model d_{\text{model}} dmodel。我们使用 W q , W k , W v W_q, W_k, W_v Wq,Wk,Wv 和 W o W_o Wo 分别表示自注意力模块中的查询/键/值/输出投影矩阵。 W W W 或 W 0 W_0 W0 表示预训练的权重矩阵, Δ W \Delta W ΔW 表示其在适配过程中的更新。我们使用 r r r 表示LoRA模块的秩。
2 Problem Statement
尽管我们的方案对训练目标不具依赖性,但我们将语言建模作为主要的使用场景。以下简要描述了语言建模问题,特别是针对给定任务提示的条件概率的最大化。
假设我们有一个参数化为 Φ \Phi Φ 的预训练自回归语言模型 p Φ ( y ∣ x ) p_{\Phi}(y \mid x) pΦ(y∣x)。例如, p Φ ( y ∣ x ) p_{\Phi}(y \mid x) pΦ(y∣x) 可以是基于Transformer架构的通用多任务学习模型,如GPT-2 [32] 或 GPT-3 [6]。现在,考虑将此预训练模型适配到(可能多个)下游条件文本生成任务,例如摘要生成、机器阅读理解(MRC)以及自然语言到SQL(NL2SQL)。每个下游任务通过上下文-目标对的训练数据集表示为: Z = { ( x i , y i ) } i = 1 , … , N \mathcal{Z}=\left\{\left(x_i, y_i\right)\right\}_{i=1, \ldots, N} Z={(xi,yi)}i=1,…,N,其中 x i x_i xi 和 y i y_i yi 均为标记序列。例如,在NL2SQL任务中, x i x_i xi 是自然语言查询, y i y_i yi 是其对应的SQL命令;在摘要生成任务中, x i x_i xi 是文章内容, y i y_i yi 是其简短摘要。
在微调过程中,模型以预训练参数 Φ 0 \Phi_0 Φ0 初始化,并通过梯度优化更新到 Φ 0 + Δ Φ \Phi_0+\Delta \Phi Φ0+ΔΦ,以最大化条件语言建模目标:
max Φ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ log ( p Φ ( y t ∣ x , y < t ) ) \max _{\Phi} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(p_{\Phi}\left(y_t \mid x, y_{ < t}\right)\right) Φmax(x,y)∈Z∑t=1∑∣y∣log(pΦ(yt∣x,y<t))
全量微调的一个主要缺点是,对于每个下游任务,我们需要学习一组不同的参数 Δ Φ \Delta \Phi ΔΦ,其维度 ∣ Δ Φ ∣ |\Delta \Phi| ∣ΔΦ∣ 等于 ∣ Φ 0 ∣ \left|\Phi_0\right| ∣Φ0∣。因此,如果预训练模型规模较大(例如GPT-3, ∣ Φ 0 ∣ ≈ 175 \left|\Phi_0\right| \approx 175 ∣Φ0∣≈175 亿),存储和部署多个独立的微调模型实例将变得非常困难,甚至不可行。
在本文中,我们采用了一种参数高效的方法,其中任务特定的参数增量 Δ Φ = Δ Φ ( Θ ) \Delta \Phi=\Delta \Phi(\Theta) ΔΦ=ΔΦ(Θ) 被进一步编码为一组大小远小于 Φ 0 \Phi_0 Φ0 的参数 Θ \Theta Θ,满足 ∣ Θ ∣ ≪ ∣ Φ 0 ∣ |\Theta| \ll\left|\Phi_0\right| ∣Θ∣≪∣Φ0∣。因此,寻找 Δ Φ \Delta \Phi ΔΦ 的任务转化为对 Θ \Theta Θ 的优化问题:
max Θ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ log ( p Φ 0 + Δ Φ ( Θ ) ( y t ∣ x , y < t ) ) \max _{\Theta} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(p_{\Phi_0+\Delta \Phi(\Theta)}\left(y_t \mid x, y_{< t}\right)\right) Θmax(x,y)∈Z∑t=1∑∣y∣log(pΦ0+ΔΦ(Θ)(yt∣x,y<t))
正如后续章节将要介绍的,我们提出使用低秩表示来编码 Δ Φ \Delta \Phi ΔΦ,这在计算和内存方面均具有高效性。当预训练模型为 GPT-3 时,可训练参数的大小 ∣ Θ ∣ |\Theta| ∣Θ∣ 可以仅为 ∣ Φ 0 ∣ \left|\Phi_0\right| ∣Φ0∣ 的 0.01 % 0.01\% 0.01%。
3 Our Method
我们描述了 LoRA 的简单设计及其实际意义。这里概述的原则适用于深度学习模型中的任何密集层,尽管出于实际原因,我们在实验中仅关注 Transformer 中的某些权重。
对更新矩阵的低秩约束
典型的神经网络包含许多执行矩阵乘法的密集层,这些层中的权重矩阵通常允许具有满秩。然而,当适配到特定任务时,Aghajanyan等人[1]表明,预训练语言模型具有低“内在维度”,即使在低维度的重参数化下也可以高效学习。受到这一观察的启发,我们猜测在适配下游任务时,对权重的更新也可能具有低“内在秩”。对于一个预训练的权重矩阵 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0∈Rd×k,我们通过低秩分解约束其更新,使 W 0 + Δ W = W 0 + B A W_0+\Delta W=W_0+B A W0+ΔW=W0+BA,其中 B ∈ R d × r , A ∈ R r × k B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k} B∈Rd×r,A∈Rr×k,且秩 r ≪ min ( d , k ) r \ll \min (d, k) r≪min(d,k)。在训练过程中, W 0 W_0 W0 被冻结且不接收梯度更新,而 A A A 和 B B B 包含可训练参数。需要注意的是, W 0 W_0 W0 和 Δ W = B A \Delta W=B A ΔW=BA 均与相同的输入相乘,其输出向量按坐标逐项求和。对于 h = W 0 x h=W_0 x h=W0x,我们的修改前向传播公式为:
h = W 0 x + Δ W x = W 0 x + B A x h=W_0 x+\Delta W x=W_0 x+B A x h=W0x+ΔWx=W0x+BAx
我们在图1中展示了这种重参数化。我们对 A A A 使用随机高斯分布初始化,对 B B B 使用零初始化,因此在训练开始时 Δ W = B A \Delta W=B A ΔW=BA 为零。训练时,我们通过 1 r \frac{1}{r} r1 缩放 Δ W x \Delta W x ΔWx,以确保 Δ W x \Delta W x ΔWx 的坐标在训练后大约为 Θ ( 1 ) \Theta(1) Θ(1)。
对预训练权重的权重衰减
我们注意到,LoRA 中的权重衰减与完全微调的行为有所不同。具体而言,对 A A A 和 B B B 执行常规的权重衰减类似于衰减回预训练权重,这被认为是一种有效的正则化方法,可以减轻“灾难性遗忘” [16,18]。尽管单独研究这一效应的广泛实验超出了本文的范围,但我们认为这一点与受约束的参数空间结合起来,可能提供某些正则化优势。例如,在第5.3节和附录G.2节中可以看到,LoRA 在 r = d model = 1024 r=d_{\text{model}}=1024 r=dmodel=1024 时,在GPT-2 Medium上的表现优于完全微调。
无额外的推理延迟
在部署过程中,我们可以显式地计算 W = W 0 + B A W=W_0+B A W=W0+BA 并按常规方式进行推理。当需要切换到另一个下游任务时,我们可以通过减去 B A B A BA 并添加一个不同的 B ′ A ′ B^{\prime} A^{\prime} B′A′ 来恢复 W 0 W_0 W0。这仅会导致峰值内存使用量的轻微增加,并在模型切换时增加一个不超过单次前向传播的延迟。关键是,在推理过程中,我们不会因此引入任何额外的延迟。
3.1 Applying LoRA to Transformer
原则上,LoRA 可以应用于神经网络中的任意子集权重矩阵,以减少可训练参数的数量。在 Transformer 架构中,自注意力模块包含四个权重矩阵( W q , W k , W v , W o ) \left.W_q, W_k, W_v, W_o\right) Wq,Wk,Wv,Wo),MLP 模块中包含两个权重矩阵。尽管输出维度通常被切分为多个注意力头,我们将 W q W_q Wq(或 W k , W v W_k, W_v Wk,Wv)视为维度为 d model × d model d_{\text{model}} \times d_{\text{model}} dmodel×dmodel 的单个矩阵。
我们将研究范围限制为仅改变自注意力模块的权重以适配下游任务,同时冻结 MLP 模块(即在下游任务中不训练这些模块),因为将 LoRA 应用于 MLP 模块会使可训练参数的数量在相同秩 r r r 下增加 4 倍。我们在第 6.1 节进一步研究了在 Transformer 中适配不同类型权重矩阵的效果。
实际优势与局限性
最显著的优势是内存和存储使用的减少。对于 Transformer,如果 r ≪ d model r \ll d_{\text{model}} r≪dmodel,我们可以减少 2 / 3 2/3 2/3 的显存消耗,因为不需要跟踪冻结参数的优化器状态。此外,检查点的大小可以减少大约 d model 2 γ r \frac{d_{\text{model}}}{2 \gamma r} 2γrdmodel 倍,其中 γ \gamma γ 是我们应用 LoRA 的权重矩阵比例。在我们的应用场景 GPT-3 中,显存消耗从 1.2 TB 减少到 350 GB。当 r = 4 r=4 r=4 且 γ = 1 / 6 \gamma=1/6 γ=1/6 时,检查点大小减少约 10 , 000 × 10,000 \times 10,000×(从 350 GB 减少到 35 MB)。这使得我们可以使用显著更少的 GPU 进行训练,并避免 I/O 瓶颈。
另一个优势是部署期间可以以更低的成本在任务之间切换,只需交换 LoRA 权重(通常以 MB 为单位),而不是交换所有权重(350 GB)。这使得能够在存储预训练权重的机器上动态激活和停用许多定制化模型。此外,由于无需计算绝大部分参数的梯度,我们在训练中观察到约 25 % 25\% 25% 的速度提升。
另一方面,LoRA 也有其局限性。例如,在单次前向传播中对具有不同 A A A 和 B B B 的任务输入进行批处理并不简单,因为我们将 A A A 和 B B B 吸收到 W W W 中以避免额外的推理延迟。
4 Related Works
Transformer 语言模型。Transformer [36] 是一种大量使用自注意力机制的序列到序列架构。[31] 通过使用 Transformer 解码器堆栈将其应用于自回归语言建模。从那时起,基于 Transformer 的语言模型就主导了 NLP,在许多任务中取得了最先进的成果。BERT [9] 和 GPT-2 [32] 带来了一种新范式——两者都是在大量文本上训练的大型 Transformer 语言模型——在通用领域数据上进行预训练后,在特定于任务的数据上进行微调,与直接在特定于任务的数据上进行训练相比,可以显着提高性能。训练更大的 Transformer 通常可以获得更好的性能,并且仍然是一个活跃的研究方向。GPT-3 [6] 是迄今为止训练的最大的单个 Transformer 语言模型,具有 175B 个参数。
提示工程和微调。虽然 GPT-3 175B 只需几个额外的训练示例就可以调整其行为,但结果在很大程度上取决于输入提示 [6]。这需要一种编写和格式化提示的经验艺术,以最大限度地提高模型在所需任务上的性能,这被称为快速工程或快速黑客。微调将在一般领域进行预训练的模型重新训练到特定任务 [9,31]。它的变体包括只学习参数的子集 [8,9],但从业者通常会重新训练所有参数以最大限度地提高下游性能。然而,GPT-3 175B 的庞大使得以通常的方式进行微调变得具有挑战性,因为它产生的检查点很大,而且由于它的内存占用量与预训练相同,因此硬件进入门槛很高。
参数高效自适应。[15, 34] 建议在神经网络的现有层之间插入适配器层。我们的方法使用类似于 [15] 的瓶颈结构来对权重更新施加低秩约束。关键的功能差异在于,我们学习到的权重可以在推理过程中与主权重合并,因此不会引入任何延迟,而适配器层则不会。最近,[14, 19, 21, 25] 提出优化输入词嵌入来代替微调,类似于提示工程的连续和可微分泛化。我们在实验部分中与 [21] 进行了比较。然而,这一系列工作只能通过在提示中使用更多特殊标记来扩大规模,当学习位置嵌入时,这些标记会占用任务标记的可用序列长度。
深度学习中的低秩结构。低秩结构在机器学习中非常常见。 许多机器学习问题都具有某些内在的低秩结构 [7, 13, 23, 24]。此外,众所周知,对于许多深度学习任务,尤其是那些具有过度参数化的神经网络的任务,学习到的神经网络在训练后将具有低秩特性 [29]。一些先前的研究甚至在训练原始神经网络时明确施加了低秩约束,例如 [17, 30, 35, 38, 39],然而,据我们所知,这些研究都没有考虑低秩更新以适应下游任务。在理论文献中,众所周知,当底层概念类具有某些低秩结构 [2, 3, 11] 时,神经网络的表现优于其他经典学习方法,包括相应的(有限宽度)神经切线核 [5, 22]。[4] 中的另一个理论结果表明,低秩适应可用于对抗性训练。总之,我们相信我们提出的低秩适应更新是受到文献充分启发的。