LoRA: Low-Rank Adaptation of Large Language Models
作者:Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen
单位:Microsoft Corporation
会议:ICLR 2022 Poster
链接:https://arxiv.org/abs/2106.09685, OpenReview, Code
研究动机
1.大模型微调真正贵的地方,不只是一次训练的算力,而是每个下游任务都要保存和部署一整份模型权重。
以 GPT-3 175B 为例,论文把全量微调后的单任务模型存储开销估计为约 350GB。如果一个服务要支持很多任务,每个任务都保存一份完整模型,部署、切换、I/O 和显存都会变成系统瓶颈。
2.已有参数高效方法解决了“训练参数少”的一部分问题,但留下了新的部署代价。
Adapter 在 Transformer 层里串联额外模块,会增加推理深度,因此在线小 batch 场景下可能带来明显延迟;Prefix Tuning / Prompt Tuning 把可训练 token 塞进输入侧或中间层,会占用可用序列长度,并且性能不一定稳定接近全量微调。

Table 1 是论文动机里很关键的一张表:在 GPT-2 medium 上,adapter 的延迟并不是抽象问题。batch size 为 1、sequence length 为 128 时,AdapterH 相比 Fine-Tune/LoRA 慢约 30.3%。这解释了为什么 LoRA 不只追求参数量少,还特别强调“不增加推理延迟”。
3.论文的核心问题可以概括为:
能否只训练很小的任务特定参数,同时保留全量微调的质量、避免 adapter 的推理延迟,并让任务切换只需要替换很小的权重增量?
LoRA 的回答是:不要直接更新完整权重矩阵,而是假设微调所需的权重变化 $\Delta W$ 具有低内在秩,用两个低秩矩阵来参数化这个变化。
核心方法

1.冻结预训练权重,只训练低秩增量。
对于预训练权重 $W_0 \in \mathbb{R}^{d \times k}$,全量微调会直接学习一个完整的 $\Delta W$。LoRA 把这个更新限制为低秩分解:
其中 $B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,且 $r \ll \min(d,k)$。前向传播写成:
实际实现里还会使用缩放项:
这里的 $r$ 是 LoRA rank,$\alpha$ 是缩放系数。论文采用 $A$ 随机高斯初始化、$B$ 零初始化,因此训练开始时 $BA=0$,模型初始行为与原预训练模型一致。
2.LoRA 是并联增量,不是串联模块。
Adapter 的额外层在原网络路径之后串联执行,而 LoRA 的 $BAx$ 与原来的 $W_0x$ 是并联相加。因此部署时可以把 $BA$ 合并进 $W_0$:
合并后推理仍然是一次普通线性层乘法,所以不会像 adapter 那样增加额外层深度。训练时也只需要保存 LoRA 参数,任务切换时替换 $A,B$ 即可。
3.在 Transformer 里,论文主要把 LoRA 加到注意力投影矩阵上。
论文实验主要考虑 self-attention 中的 $W_q, W_k, W_v, W_o$。在大多数主实验里,作者选择适配 $W_q$ 和 $W_v$,这是一个经验上效果和参数量比较均衡的配置。它不是理论上唯一正确的位置,而是论文通过后续消融得出的实用选择。

Table 5 的信息量在于:固定可训练参数量为 18M 时,只适配 $W_q$ 或 $W_k$ 效果较弱,同时适配 $W_q$ 和 $W_v$ 在 WikiSQL 与 MultiNLI 上整体最好。这说明低秩更新不是随便插在哪个矩阵都一样,注意力子模块内部的位置选择会影响最终收益。
4.低秩假设来自“微调更新可能只需要一个小子空间”。
LoRA 并不声称预训练权重本身低秩,而是假设下游任务需要的更新 $\Delta W$ 低秩。换句话说,模型已经在预训练阶段学到了大量通用能力,下游任务只是在若干方向上重新组合或放大这些能力。这个假设是 LoRA 成立的核心,也是论文后半部分用 rank 和子空间分析反复验证的对象。

Table 6 展示了一个很有代表性的现象:在 GPT-3 的 WikiSQL 和 MultiNLI 实验中,当同时适配 $W_q$ 和 $W_v$ 时,$r=1$ 已经能达到很有竞争力的结果。这里不能推出“所有任务 rank 1 都够”,但它支持了论文的主要判断:许多语言任务的适配更新确实可能集中在很低维的有效子空间里。

Figure 3 进一步看不同 rank 学到的子空间是否重叠。$r=8$ 与 $r=64$ 的顶部奇异向量方向高度重合,说明更大的 rank 并不是简单带来一批全新的有用方向,低 rank 已经捕捉到了最关键的适配方向。

Figure 4 把两个随机种子的 $r=64$ LoRA 子空间进行比较,并与随机高斯矩阵对照。左、中两幅热力图比随机基线有更强结构,说明 LoRA 学到的方向不是纯随机噪声,而与模型和任务存在稳定关系。

Table 7 讨论 $\Delta W$ 与原始 $W$ 的关系。论文的解释是:$\Delta W$ 并不是简单复制 $W$ 的最大奇异方向,而是在放大某些原权重中已经存在但没有被强烈强调的方向。这个视角比“参数少所以快”更深一层,它把 LoRA 的效果解释为对预训练表示空间的选择性增强。
数据集
1.NLU 评估使用 GLUE。
论文在 RoBERTa base、RoBERTa large 和 DeBERTa XXL 上评估 GLUE,包括 MNLI、SST-2、MRPC、CoLA、QNLI、QQP、RTE、STS-B 等任务。
2.NLG 评估使用 E2E、WebNLG、DART。
GPT-2 medium / large 的自然语言生成实验主要报告 E2E NLG Challenge,附录还给出 WebNLG 和 DART 的详细结果。
3.GPT-3 175B 的大模型实验使用 WikiSQL、MultiNLI 和 SAMSum。
WikiSQL 评估逻辑形式验证准确率,MultiNLI 使用 matched validation accuracy,SAMSum 使用 Rouge-1/2/L。这个组合覆盖了语义解析、自然语言理解和摘要三个方向,比只在一个 benchmark 上证明“参数少”更有说服力。
算力
论文明确说明所有主实验使用 NVIDIA Tesla V100。GPT-3 175B 实验涉及模型并行,但正文没有给出完整 GPU 数量。
值得记录的系统指标有三类:
1.训练显存:对于使用 Adam 的 GPT-3 175B,LoRA 将训练时 VRAM 从约 1.2TB 降到约 350GB,论文概括为约 3 倍显存节省。
2.模型存储:GPT-3 175B 的任务特定 checkpoint 从全量微调约 350GB 降到 LoRA 约 35MB,约为 10000 倍差异。
3.训练吞吐:在 GPT-3 175B 上,论文报告全量微调为 32.5 tokens/s per V100 GPU,LoRA 在相同 weight shard 数下为 43.1 tokens/s per V100 GPU。
此外,Table 1 的延迟测试使用 NVIDIA Quadro RTX8000,单次 forward pass 平均 100 次试验;附录给出 RoBERTa、DeBERTa、GPT-2、GPT-3 的 AdamW、batch size、epoch、learning rate、sequence length 等超参。
实验结果

1.GLUE 上,LoRA 用极少参数接近或超过全量微调。
Table 2 中 RoBERTa large 的 LoRA 只训练 0.8M 参数,平均分 89.0,与 355M 参数全量微调的 88.9 基本持平;DeBERTa XXL 的 LoRA 训练 4.7M 参数,平均分 91.3,略高于 1.5B 参数全量微调的 91.1。这个结果支撑了论文的第一层结论:低秩增量在 NLU 任务上不是明显牺牲质量的压缩技巧。

2.GPT-2 生成任务上,LoRA 也优于多种参数高效基线。
Table 3 的重点不是某一个指标的微小领先,而是 LoRA 在 GPT-2 medium / large 上用与 adapter、prefix tuning 相近甚至更少的参数,取得了更稳定的 BLEU、NIST、MET、ROUGE-L、CIDEr 表现。尤其是它没有 adapter 的额外推理层,也没有 prefix 方法占用输入长度的问题。

3.GPT-3 175B 是论文最关键的压力测试。
Table 4 显示,LoRA 在 WikiSQL、MNLI-m 和 SAMSum 上整体达到或超过全量微调及其他参数高效方法。例如 4.7M 参数 LoRA 在 MNLI-m 上达到 91.7,高于全量微调的 89.5;在 SAMSum 上 Rouge-1/2/L 为 53.8/29.8/45.9,也高于表中全量微调。

Figure 2 把性能和可训练参数量放在同一张图里看。LoRA 的点整体位于更好的效率区间:不是参数越多就一定越好,PrefixLayer 等方法会出现非单调变化,而 LoRA 在较小参数预算下仍保持较强性能。这张图支持了论文标题里的“Low-Rank Adaptation”不仅是压缩形式,也是一个适合大模型适配的可扩展设计。
优势与不足
优势
1.把训练、存储和推理三个问题同时纳入设计。
很多参数高效方法主要优化训练参数量,但 LoRA 进一步考虑推理延迟、任务切换和部署存储。能够把 $BA$ 合并回 $W_0$ 是它在工程上非常关键的优势。
2.方法足够简单,容易迁移到不同模型结构。
LoRA 本质上只替换或包装线性层,不依赖复杂控制流。官方代码也支持 nn.Linear、nn.Embedding、nn.Conv2d 等模块,这解释了它后来能快速扩展到语言模型、视觉模型和扩散模型等场景。
3.论文没有停留在“效果好”,而是分析了为什么低 rank 可能够用。
Table 6、Figure 3、Figure 4 和 Table 7 共同构成了一个相对完整的解释链:小 rank 能工作,不同 rank 的顶部方向有重叠,不同随机种子学到的方向有稳定结构,$\Delta W$ 更像是在放大预训练权重中已有但未充分强调的方向。
不足
1.低 rank 不是无条件成立。
论文自己也提醒,不应期待很小的 $r$ 对所有任务和数据集都有效。如果下游任务与预训练分布差异很大,例如语言、模态、领域或输出格式发生明显变化,所需更新可能不再集中于极低维子空间。
2.合并权重会带来多任务 batch 的工程折中。
如果为了零额外延迟把 $BA$ 合并进 $W_0$,同一个 batch 里混合多个任务的不同 LoRA 权重就不直接方便。可以选择不合并并动态选择模块,但这又会牺牲一部分延迟优势。
3.实验边界主要是当时的语言模型适配。
论文覆盖 RoBERTa、DeBERTa、GPT-2、GPT-3,已经很强,但任务仍集中在 NLU/NLG。对于后来的指令微调、长上下文、多模态、RLHF 后模型、检索增强系统等场景,LoRA 的 rank、插入位置和稳定性仍需要重新验证。
4.LoRA 降低了可训练参数和 optimizer 状态,但不等于训练完全便宜。
冻结大模型参数后,前向和反向仍要经过原模型主体,激活显存、模型并行、数据吞吐和序列长度仍然是大模型训练成本的重要部分。LoRA 解决的是“更新哪些参数”和“保存多少任务权重”,不是把大模型本身变小。
记忆点
1.LoRA 的一句话公式是:冻结 $W_0$,只训练 $\Delta W=BA$,其中 $r \ll d,k$。
2.LoRA 的工程价值来自“训练时低秩、部署时可合并”:训练只保存小矩阵,推理可以恢复成普通线性层。
3.适配 $W_q$ 和 $W_v$ 是论文中非常实用的经验配置,但不是所有任务的绝对最优答案。
4.rank 很小也可能有效,是因为下游适配更新可能集中在预训练模型表示空间中的少数关键方向。
5.LoRA 最值得借鉴的不是“低秩”这个数学形式本身,而是它把模型适配问题重新写成了一个可替换、可合并、可部署的权重增量问题。












