下面我按论文 LoRA: Low-Rank Adaptation of Large Language Models 来系统讲。它的核心主张非常简单:

不要去直接改整个大模型的权重,而是把“需要改动的那一小部分”强行限制成低秩(low-rank)的形式来学。 这样既省参数、又省显存、又不增加推理延迟,而且实验上居然还能做到和全量微调(full fine-tuning)差不多,甚至更好。


1. 这篇论文到底要解决什么问题

大语言模型或大预训练语言模型的常见用法,是先在大规模通用语料上预训练(pre-training),再针对具体任务做适配(adaptation),最传统的方法就是 全量微调 :把模型里几乎所有参数都拿出来继续训练。论文指出,这在模型变大之后会越来越不现实。比如 GPT-3 175B,如果每个下游任务都保存一整份微调后的模型副本,部署和存储的成本会非常夸张。

所以问题可以表述成:

给定一个已经训练好的大模型参数 $\Phi_0$ ,对于新任务,我们并不想再学习一个和 $\Phi_0$ 一样大的增量 $\Delta \Phi$ ,而是希望用一个远小得多的参数集合 $\Theta$ 去表示这个增量,也就是把“如何改模型”这件事本身做压缩。论文在问题定义里把这个写成:不直接优化 $\Phi$ ,而是优化一个小参数集合 $\Theta$ ,通过它生成任务相关的参数增量 $\Delta\Phi(\Theta)$ 。

从直觉上说,作者的判断是: 从“通用能力”到“某个具体任务能力”的变化,未必需要在一个巨大参数空间里自由乱动;这个变化本身可能落在一个很低维、很低秩的子空间里。 这就是 LoRA 的出发点。


2. 论文为什么觉得现有 PEFT 方法还不够好

在 LoRA 之前,已经有很多参数高效微调(parameter-efficient fine-tuning, PEFT)方法。论文重点批评了两大类。

第一类是 adapter 。它的做法是:在原模型层与层之间,额外插入一些小模块,只训练这些小模块。问题在于,虽然参数量不大,但它 真的给网络增加了额外计算路径和额外层深 。对离线训练可能还好,但对在线推理,特别是 batch 很小、序列也不长的时候,这些新增模块是会实打实增加延迟的。论文在 GPT-2 medium 上测到,adapter 在短序列、batch=1 的场景下,前向延迟会明显上升,而 LoRA 因为可以并回原权重,所以没有这个问题。

第二类是 prefix/prompt tuning 。这类方法不是去改模型内部权重,而是去学习一些特殊的输入前缀、前缀层表示等。论文认为它的问题有两个:一是 优化不稳定 ,性能不一定随着可训练参数增多而单调变好;二是你占用了序列位置来放“可学习前缀”,就等于减少了模型真正处理任务输入的可用上下文长度。论文在 GPT-3 的实验里也确实看到 prefix 类方法在参数变多时不一定更好,甚至会掉性能。

所以 LoRA 想同时做到三件事:

  1. 训练参数少
  2. 推理不要额外变慢
  3. 性能尽量不输全量微调

3. LoRA 的方法:到底改了什么

这是整篇论文最核心的部分。