自然语言处理 (NLP) 的世界已经被像 GPT-3 这样的大型预训练语言模型彻底改变。这些在海量互联网数据上训练出的庞大模型,开箱即用便能执行一系列惊人的任务。但要为特定应用——无论是客服聊天机器人、法律文档摘要器,还是代码生成器——释放它们的全部潜力,我们需要对它们进行调整。这个过程被称为**微调 **(fine-tuning) 。

传统方法,即**全量微调 **(full fine-tuning) ,会更新模型中的每一个参数。对于 GPT-3 来说,这意味着要修改 1750 亿个参数。想象一下,为每一个任务都需要存储和部署一个独立的 350GB 模型副本。对于 100 个定制应用,你就需要 35TB 的存储空间。在硬件、内存与运维复杂性上的成本,使得这种方法在许多现实场景中都不可行。

微软研究人员的一篇开创性论文正是为了解决这个问题。在 《LoRA: Low-Rank Adaptation of Large Language Models》 一文中,他们介绍了一种极其简单而有效的技术,能够在不牺牲性能的情况下大幅削减微调成本。LoRA——低秩适配 (Low-Rank Adaptation) ——可以将可训练参数数量减少高达 10,000 倍,并将 GPU 显存需求降低 3 倍。最棒的是,它在实现这些的同时,性能上能媲美甚至超越全量微调,并且不增加任何额外的推理延迟

让我们来深入了解 LoRA 的工作原理,以及为什么它已成为现代大语言模型定制化的基石。


微调巨型模型的难题

微调从模型的预训练权重 (表示为 \(\Phi_0\)) 开始。我们将这些权重调整以适应目标任务,得到 \(\Phi_0 + \Delta\Phi\)。标准的全量微调会更新所有参数,使得 \(\Delta\Phi\) 的规模与 \(\Phi_0\) 完全相同。

每面对一个新任务,我们都会生成一个巨大且独特的 \(\Delta\Phi\)。这会导致几个主要问题:

  1. 存储: 为多个任务分别存储一个完整的 GPT-3 模型很快变得不切实际——100 个任务需要约 35TB。
  2. 计算: 训练需要巨大的显存来存放所有参数的权重、梯度和优化器状态。
  3. 任务切换: 在生产环境中,切换任务意味着需要将一个全新的 350GB 模型加载到 GPU 内存中——既缓慢又昂贵。

为了解决这些问题,研究人员探索了参数高效微调 (PEFT) 方法: 冻结 \(\Phi_0\) 的大部分参数,仅训练一小部分任务特定的参数 \(\Theta\)。但现有的 PEFT 方法各有取舍:

  • 适配器层 (Adapter Layers) : 在 Transformer 层之间插入小型模块。这减少了可训练参数,但引入了额外的顺序计算,增加了明显的推理延迟——尤其是在低批量、实时场景中。

表1显示,适配器层会增加显著的推理延迟,尤其是在小批量和短序列的情况下,速度下降可达30%以上。

  • 前缀微调 (Prefix-Tuning) : 保持模型冻结,学习一个附加在输入前的简短连续“前缀”。这种方法可能难以优化,并且会占用一部分序列长度,从而减少实际任务数据的空间。

问题是: 我们能否在获得全量微调质量的同时,兼具 PEFT 的高效性,并且没有延迟?


核心思想: 低秩适配 (LoRA)

LoRA 的灵感来源于一个观察: 在模型适配过程中,权重的变化通常具有较低的*内在秩 *(intrinsic rank) 。

在线性代数中,秩衡量一个矩阵所包含的独立方向的数量。一个低秩矩阵可以表示为两个小得多的矩阵的乘积。作者假设,对于一个权重矩阵 \(W\),其巨大的更新矩阵 \(\Delta W\) 可以用这种方式很好地近似。

LoRA 冻结原始权重矩阵 \(W_0\),并将其更新表示为 \(\Delta W = BA\),其中:

  • \(B \in \mathbb{R}^{d\times r}\)
  • \(A \in \mathbb{R}^{r\times k}\)

这里,\(r\) (秩) 远小于 \(d\) 和 \(k\)。在训练期间,只有 \(A\) 和 \(B\) 会被更新。前向传播过程则变为:

\[ h = W_0 x + \Delta W x = W_0 x + BAx \]

图1展示了LoRA的重参数化过程。大型的预训练权重矩阵 W被冻结。更新由两个小的、可训练的矩阵 A 和 B 表示,它们相乘得到最终的更新量。

这种方法极大地减少了参数数量。例如,GPT-3 的某个注意力矩阵可能是 \(12,\!288\times 12,\!288\),拥有约 1.5 亿个参数。如果使用 \(r=8\),LoRA 对该层仅需约 20 万个参数——减少了超过 750 倍。


“零延迟”的优势

LoRA 通过在训练后将学得的更新合并回原始权重中,避免了适配器式的额外开销:

\[ W = W_0 + BA \]

这样得到的矩阵 \(W\) 与 \(W_0\) 的形状完全相同,这意味着推理过程与全量微调的模型完全一致——零额外延迟

任务切换同样高效: 只需将 \(W_0\) 保留在内存中,然后为每个应用切换小巧的 \(\Delta W\) 模块即可。


将 LoRA 应用于 Transformer

LoRA 可应用于任何全连接层。论文重点关注自注意力权重——\(W_q\)、\(W_k\)、\(W_v\)、\(W_o\)。在实践中,仅调整 \(W_q\) 和 \(W_v\) 通常就足以获得优异表现。MLP 前馈层保持冻结以进一步节省参数。


实验: LoRA 与其他方法的对比

RoBERTa 和 DeBERTa (GLUE 基准)

在 GLUE 基准上,LoRA 的表现始终与全量微调持平或更优,而可训练参数则少了几个数量级

表2展示了LoRA在GLUE基准测试上的性能。对于RoBERTa和DeBERTa,LoRA在可训练参数极少的情况下,性能始终与全量微调 (FT) 持平或更优。


GPT-2 (E2E NLG 挑战赛)

在文本生成任务上,LoRA 再次领先——即使在相同的参数预算下,其表现也优于适配器和前缀微调。

表3展示了在E2E NLG挑战赛上的结果。LoRA在各项指标 (BLEU、ROUGE-L 等) 上始终比适配器和前缀微调等其他参数高效方法得分更高。


GPT-3 175B (WikiSQL、MultiNLI、SAMSum)

在最大规模模型上的优势最为明显: 显存使用从 1.2TB 降到 350GB;任务特定的检查点大小从 350GB 缩减到 **35MB **(约小了 10,000 倍) 。

性能方面?LoRA 在所有测试任务上都优于全量微调。

表4突显了在GPT-3 175B上的惊人结果。LoRA 仅用 470 万可训练参数,就在多个基准测试中超越了全量微调。

准确率随参数数量变化的曲线显示,LoRA 随着参数增加而平稳提升,而前缀微调方法在超过某个规模后反而出现性能下降。

图2绘制了 GPT-3 上验证准确率与可训练参数数量的关系图。LoRA (紫色三角形) 呈现出清晰而稳定的上升趋势,表现优于其他方法,并展现了更好的可扩展性。


理解低秩更新

哪些权重最关键?

在固定参数预算下,同时调整 \(W_q\) 和 \(W_v\) 获得了最佳效果——表明优化模型如何关注并整合上下文信息至关重要。

表5显示,在固定的可训练参数数量下,将秩为 4 的 LoRA 同时应用于 Wq 和 Wv,在 WikiSQL 和 MultiNLI 上取得了最佳性能。


秩可以压到多低?

令人惊讶的是,对 GPT-3 来说,即便 \(r=1\) 也常常足够有效:

表6显示了秩 r 对性能的影响。对于在 GPT-3 上同时调整 Wq 和 Wv,仅 1 或 2 的秩就非常有效,这有力地支持了低秩假设。

子空间分析 (图 3) 显示,小秩模型几乎捕捉到了大秩模型的全部关键方向——额外增加的秩主要引入了噪声。

图3可视化了用 r=8 和 r=64 训练的 LoRA 矩阵之间的子空间相似性。左上角的强信号表明,小秩学到的最重要方向也是大秩学到的最重要方向。


比较不同随机种子下的结果表明,只有少数主方向被一致地学习到;其他方向则像随机噪声一样变化 (图4) 。

图4比较了使用不同随机种子的两次 LoRA 训练。两次运行都学到了相似的一小组重要方向 (左上角暖色区域) ,而其余方向不一致。与随机矩阵对比 (右图) 则没有显示出这种共享结构。


LoRA 学到了什么

将 \(W\) 投影到更新的子空间上发现,\(\Delta W\) 并没有复制 \(W\) 的主方向,而是放大了那些未被充分强调但相关的特征——在 \(r=4\) 时放大因子可达 20 倍


核心要点

LoRA 的优势包括:

  • 大幅减少参数: 可训练参数减少高达 10,000 倍。
  • 卓越性能: 与全量微调持平或更优。
  • 零推理延迟: 推理路径与全量微调模型完全一致。
  • 高效率: 显著降低显存与存储消耗。
  • 可扩展性: 随秩增加持续提升;在低数据场景下依旧稳健。

结论

LoRA 是一种简单而强大的方法,解决了适配大型语言模型的高昂成本问题。通过冻结大部分权重并训练小型低秩更新,它让定制化大语言模型在规模化应用中变得实用且高效。

除了工程上的优势,LoRA 还揭示了模型适配本质上是一种低秩现象: 微调实质上就是放大模型表示空间中已潜存的少数关键方向。

随着 LoRA 在学术界与工业界的广泛应用,未来将属于那些功能强大、任务专用且快速、廉价、人人可及的模型。