精读笔记 · LoRA: Low-Rank Adaptation of Large Language Models
论文信息
- 标题: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
- 发表:ICLR 2022(预印本 arXiv:2106.09685,2021年6月)
- 引用量:截至2025年已超过15000次,是PEFT领域引用最高的论文之一
阅读地图
本文解决的核心问题:如何让大模型适配下游任务,同时大幅减少需要训练的参数数量和显存占用?
全文逻辑线索如下:
痛点(全量微调太贵)
↓
现有方案不够好(Adapter有延迟、Prefix-tuning难优化)
↓
核心洞察(权重更新量ΔW内在秩很低)
↓
LoRA方法(用两个小矩阵BA近似ΔW)
↓
三大红利(省显存 · 多任务切换 · 零推理延迟)
↓
实验验证(参数减少万倍、效果持平或更好)
术语速查表(首次出现时会详细解释,这里先给全局索引):
| 术语 | 英文 | 一句话解释 |
|---|---|---|
| 微调 | Fine-tuning | 在预训练模型基础上用小数据集继续训练,适配特定任务 |
| 冻结权重 | Frozen weights | 训练时不更新某些参数,保持它们不变 |
| 秩 | Rank | 矩阵中"独立信息"的数量,秩越低信息越冗余 |
| 低秩 | Low-rank | 矩阵的秩远小于其行数/列数,意味着可以大幅压缩 |
| PEFT | Parameter-Efficient Fine-Tuning | 高效微调,只训练少量参数来适配下游任务 |
| Adapter | Adapter | 在模型层间插入小型可训练模块的微调方法 |
| 内在秩 | Intrinsic rank | 数据/更新量中真正"有用维度"的数量 |
Abstract · 摘要精译
原文:
"An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes less feasible."翻译:
自然语言处理的一个重要范式是:先在通用领域数据上进行大规模预训练,再将模型适配到特定任务或领域。随着预训练模型越来越大,重新训练所有参数的全量微调(full fine-tuning)变得越来越不可行。讲解:
这里先讲了现代NLP的标准流程——"预训练 + 微调"两阶段范式。预训练阶段用海量通用文本(如整个互联网的文字)训练出一个"通才"模型,然后在微调阶段用少量任务相关数据进一步调整,让它成为"专才"。问题是:当"通才"有175亿个参数时,每次微调都要重新调整全部175亿个参数,这太贵了。
原文:
"Using GPT-3 175B as an example – deploying independent instances of fine-tuned models, each with 175B parameters, is prohibitively expensive."翻译:
以GPT-3(1750亿参数)为例——为每个下游任务部署一个独立的微调模型副本,每个副本都包含1750亿参数,代价极其高昂,几乎不可行。讲解:
这是论文要解决的核心痛点,值得细细体会。假设你是一家公司,你的产品需要让同一个GPT-3基础模型同时支持10个不同任务(比如:法律问答、代码生成、文案写作……)。如果用全量微调,你需要存储10个完整的GPT-3副本。GPT-3的参数量是175B(1750亿),每个参数用FP16(半精度浮点,2字节)存储,一个副本就需要约350GB磁盘空间。10个任务就是3.5TB。这还只是存储成本,部署到GPU推理时显存需求更大。这在工业界根本不可能大规模落地。
原文:
"We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks."翻译:
我们提出低秩适配(Low-Rank Adaptation,LoRA)方法:冻结预训练模型的权重,并在Transformer架构的每一层中注入可训练的秩分解矩阵,从而大幅减少下游任务的可训练参数数量。讲解:
这里一句话道出了LoRA的核心机制,拆解如下:
- 冻结预训练权重:原始大模型的参数完全不动,就像把大模型"锁起来"——这样你不需要为大模型的参数保存梯度,显存省一大截。
- 注入秩分解矩阵:在原来的参数旁边"挂"上两个小矩阵(A和B),训练时只更新这两个小矩阵。
- 秩分解:这是线性代数中的概念,一个大矩阵可以用两个小矩阵的乘积来近似——这就是"低秩分解"。
类比:想象一件定制西装(预训练大模型)。全量微调相当于把整件西装重新量体裁缝;LoRA相当于只在西装的袖口和领口加一小块可拆卸的布料(低秩矩阵),让它适应新场合。西装主体不变,改动量极小,效果却够用。
原文:
"Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency."翻译:
与使用Adam优化器全量微调GPT-3(175B参数)相比,LoRA可将可训练参数数量减少10,000倍,GPU显存需求降低3倍。尽管可训练参数更少、训练吞吐量更高,且与Adapter方法不同——LoRA不引入任何额外推理延迟——在RoBERTa、DeBERTa、GPT-2和GPT-3上,LoRA的模型质量与全量微调持平甚至更优。讲解:
这里给出了三个关键数字,是整篇论文最吸引眼球的结论:
指标 全量微调 LoRA 倍率 可训练参数量(GPT-3) 175B ~17.5M 减少10,000倍 训练显存(GPT-3) 1.2TB 350GB 减少约3.4倍 推理额外延迟 无 无 与Adapter方法不同,LoRA不增加延迟 "on-par or better"(持平或更优)是一个非常强的声明——参数少了上万倍,效果却没有下降,这说明全量微调中大量的参数更新是"冗余的"。
Section 1 · Introduction 引言精译
痛点:全量微调的困境
原文:
"Many applications in natural language processing rely on adapting one large-scale, pre-trained language model to multiple downstream applications. Such adaptation is usually done via fine-tuning, which updates all the parameters of the pre-trained model. The major downside of fine-tuning is that the new model contains as many parameters as in the original model."翻译:
NLP中的许多应用场景,都依赖将一个大规模预训练语言模型适配到多个下游应用。这种适配通常通过微调(fine-tuning)来实现,即更新预训练模型的所有参数。微调最大的缺点是:新模型包含与原模型同样多的参数。讲解:
术语:Fine-tuning(微调)
微调是指拿一个已经在大量数据上训练好的"基础模型"(base model),在特定任务的小数据集上继续训练,使模型"专门化"。比如:GPT-3是在通用文本上预训练的,但如果你想让它做法律文件分析,就需要在法律文本上微调它。问题的关键在于"as many parameters as in the original model"(和原模型一样多的参数)。你微调出来的法律专用GPT-3,和原始GPT-3一样,都有175B个参数需要存储。如果你同时有10个不同领域需要适配,就得存10份GPT-3,这是灾难性的存储开销。
原文:
"As larger models are trained every few months, this changes from a mere 'inconvenience' for GPT-2 or RoBERTa large to a critical deployment challenge for GPT-3 with 175 billion trainable parameters."翻译:
随着规模更大的模型每隔几个月就被训练出来,这个问题从GPT-2或RoBERTa-large时代的"小麻烦",演变成了GPT-3(1750亿可训练参数)时代的部署危机。讲解:
这句话点出了规模化带来的质变。GPT-2大约有15亿参数(1.5B),微调一个副本约需3GB存储,还算可以接受。但到了GPT-3的175B参数,一个微调副本需要350GB,整整增加了100多倍。当问题从"麻烦"升级为"危机",就需要新的解决方案了。
现有尝试:只训练部分层
原文:
"Some, like Li & Liang (2021) only fine-tunes some layers while freezing others. However, these techniques often introduce inference latency by extending model depth... or reduce the model's usable sequence length... and often fail to match the fine-tuning baselines."翻译:
一些方法(如Li & Liang 2021)只微调部分层而冻结其他层。但这些技术往往会通过加深模型深度引入推理延迟……或者缩短模型可用的序列长度……并且经常无法达到全量微调的基准性能。讲解:
术语:Frozen weights(冻结权重)
在训练过程中,"冻结"某个参数意味着不计算它的梯度、不更新它的值,让它保持预训练时的数值不变。这样可以节省显存(不需要存储被冻结参数的梯度),但如果冻结太多层,模型适配能力会下降。只冻结部分层的方案是一个折中,但作者指出它有三个问题:①有些方法加深了模型(插入额外层),推理时要多算几层,速度变慢;②有些方法占用了序列长度(用来当"任务描述"的token),导致模型能处理的输入长度变短;③效果往往比全量微调差。这为LoRA的出场铺垫了背景。
LoRA的核心假设:更新量是低秩的
原文:
"We take inspiration from Li et al. (2018a); Aghajanyan et al. (2020) which show that the learned over-parametrized models in fact reside on a low intrinsic dimension. We hypothesize that the change in weights during model adaptation also has a low 'intrinsic rank', leading to our proposed Low-Rank Adaptation (LoRA) approach."翻译:
我们从Li等人(2018a)和Aghajanyan等人(2020)的研究中获得灵感——这些研究表明,过参数化的已学习模型实际上驻留在一个低内在维度(low intrinsic dimension)上。我们假设:模型适配过程中的权重变化,同样具有较低的"内在秩(intrinsic rank)",这一假设引出了我们提出的低秩适配(LoRA)方法。讲解:
这是整篇论文最核心的科学假设,需要仔细理解。先解释"内在维度/内在秩"这个概念:
想象你在二维平面上画了1000个点,这些点看起来散布在平面上(2维),但如果你仔细看,你会发现它们其实都紧紧靠近一条直线(1维)。这1000个点的"内在维度"就是1,尽管它们存在于2维空间中。
术语:秩(Rank)
矩阵的秩是线性代数中的基本概念,通俗理解:一个矩阵的秩 = 这个矩阵中"真正独立的信息维度数量"。
- 一个1000×1000的矩阵,最多有1000个独立信息维度(满秩)
- 如果这个矩阵的秩只有8,意味着它的所有信息都可以用8个独立方向来描述,其余992个维度都是这8个方向的组合——信息高度冗余!
举个具体类比:想象你在描述一幅图片。这幅图片有1000×1000=100万个像素(相当于满秩矩阵)。但如果这幅图是一张简单的渐变天空图,你其实只需要"从蓝色渐变到白色"这一条信息就够了(相当于秩=1)。JPEG压缩就是利用了图像的低秩特性来大幅压缩文件大小。
论文的假设是:当我们把预训练模型从"通才"调整为"专才"时,需要改变的权重(ΔW)虽然看起来是一个巨大的矩阵,但它携带的"真正有用的信息"只有很少几个维度——即"低内在秩"。这就像天空图片,虽然有100万像素,真正的信息量只需要几个维度来描述。
LoRA的四大优势
原文(综合引言中分列的四点):
"(1) A pre-trained model can be shared and used to build many small LoRA modules for different tasks. We can freeze the shared model and efficiently switch tasks by replacing the matrices A and B in Figure 1, reducing the storage requirement and task-switching overhead significantly.
(2) LoRA makes training more efficient and lowers the hardware barrier to entry by up to 3 times when using adaptive optimizers since we do not need to calculate the gradients or maintain the optimizer states for most parameters.
(3) Our simple linear design allows us to merge the trainable matrices with the frozen weights when deployed, introducing no inference latency compared to a fully fine-tuned model by construction.
(4) LoRA is orthogonal to many prior methods and can be combined with many of them."翻译:
(1) 一个预训练模型可以被共享,并为不同任务构建许多小型LoRA模块。我们可以冻结共享的基础模型,通过替换矩阵A和B来高效切换任务,大幅降低存储需求和任务切换开销。
(2) LoRA使训练更加高效,在使用自适应优化器(如Adam)时,硬件门槛可降低3倍,因为我们无需为大多数参数计算梯度或维护优化器状态。
(3) 我们简洁的线性设计允许在部署时将可训练矩阵与冻结权重合并,从设计上保证了与全量微调模型相比不引入任何额外推理延迟。
(4) LoRA与许多先前方法正交,可以与它们组合使用。讲解:
这四点是LoRA之所以成为工业界主流PEFT方法的根本原因,逐一展开:优势①——多任务共享一个底座模型
传统全量微调:10个任务 = 10份完整模型副本 = 10 × 350GB = 3.5TB存储
LoRA方案:10个任务 = 1份完整模型(350GB)+ 10个小LoRA文件(每个约35MB)= 350GB + 350MB ≈ 350GB存储
这意味着存储成本几乎只与基础模型有关,无论你微调多少个下游任务。优势②——训练时省显存(Adam优化器状态)
这里需要解释一下为什么Adam优化器会占用大量显存。Adam不只存储参数本身,还要为每个参数存储两个额外统计量(一阶矩 m 和二阶矩 v,用于自适应调整学习率)。这意味着训练时每个参数实际上需要4倍显存(参数本身FP32 + m + v,约4×4字节=16字节每参数)。如果我们冻结了175B个参数,就不需要为这175B个参数存储m和v,显存节省巨大。优势③——推理零额外延迟(可合并)
这是LoRA相比Adapter方法的最大技术优势。Adapter方法在每个Transformer层里插入额外的小网络,推理时必须经过这些额外网络,增加了计算时间。LoRA不同:训练完成后,可以把LoRA的两个矩阵B和A"合并"回原始权重(W = W₀ + BA),得到一个和原始模型结构完全相同的新模型,推理时没有任何额外计算。这一点对生产环境部署极其重要。优势④——正交组合
LoRA可以叠加在其他优化技巧上,比如量化(后来的QLoRA就是LoRA+量化)。
Section 2 · 问题定义
原文:
"One of the main drawbacks for full fine-tuning is that for each downstream task, we learn a different set of parameters ΔΦ whose dimension |ΔΦ| equals |Φ₀|. Thus, if the pre-trained model is large (such as GPT-3 with |Φ₀| ≈ 175 Billion), storing and deploying many independent instances of fine-tuned models can be challenging, if at all feasible."翻译:
全量微调最主要的缺点之一是:对于每一个下游任务,我们都要学习一组不同的参数增量ΔΦ,其维度|ΔΦ|等于预训练模型参数总量|Φ₀|。因此,如果预训练模型很大(例如GPT-3,|Φ₀|≈1750亿),存储和部署多个独立的微调模型实例将是极大的挑战,甚至根本不可行。讲解:
这里用数学符号来精确表述了问题。Φ₀表示预训练模型的原始参数集合,ΔΦ表示微调过程中参数的改变量。全量微调就是让ΔΦ和Φ₀一样大——改变所有参数。论文的目标是找到一种方式,使得ΔΦ可以用一个维度远小于|Φ₀|的参数集Θ来编码,即|Θ| ≪ |Φ₀|,从而极大降低存储和计算开销。
Section 3 · 现有方案为什么不够好?
Adapter的问题:推理延迟
原文:
"There is no direct ways to bypass the extra compute in adapter layers. This seems like a non-issue since adapter layers are designed to have few parameters (sometimes <<1% of the original model) by having a small bottleneck dimension, which limits the FLOPs they can add. However, large neural networks rely on hardware parallelism to keep the latency low, and adapter layers have to be processed sequentially."翻译:
Adapter层中的额外计算无法绕过。这看起来不是什么大问题,因为Adapter层通过小的瓶颈维度来控制参数量(有时不足原模型的1%),限制了额外的浮点运算量。然而,大型神经网络依赖硬件并行性来保持低延迟,而Adapter层必须顺序处理。讲解:
术语:Adapter
Adapter是另一种PEFT方法(Houlsby等人2019年提出)。它在每个Transformer层的内部插入一个小型的"适配器"子网络(通常是一个小的两层MLP:先降维再升维)。训练时只更新这些小网络,原始权重冻结。Adapter的问题在这里解释得很精妙:表面上,Adapter参数量很少(不到1%),额外的浮点计算量(FLOPs)也很少——但在实际工程中,延迟不只由FLOPs决定。
想象一条流水线:现代GPU的强大之处在于可以并行处理大量矩阵运算。如果你在每个Transformer层后面加了一个Adapter"收费站",即使这个收费站很小,但每辆车(每个token)都必须停下来等待,不能并行通过。这种"强制串行"的代价在实际部署中可能导致5%-30%的延迟增加,对生产环境影响显著。
Prefix-tuning的问题:优化困难且缩短可用序列
原文:
"We observe that prefix tuning is difficult to optimize and that its performance changes non-monotonically in trainable parameters, confirming similar observations in the original paper. More fundamentally, reserving a part of the sequence length for adaptation necessarily reduces the sequence length available to process a downstream task."翻译:
我们观察到,Prefix Tuning难以优化,其性能随可训练参数数量的变化是非单调的,这与原论文中的类似观察一致。更根本的问题是:为适配预留一部分序列长度,必然减少了可用于处理下游任务的有效序列长度。讲解:
Prefix Tuning(Li & Liang,2021) 是另一种PEFT方法:它在每层的输入序列前面加入一些可训练的"前缀向量"(类似"任务指令"),通过调整这些前缀来引导模型行为,原始模型权重冻结不变。它有两个问题:
1. 优化困难:这些前缀向量的梯度不稳定,训练时容易出现性能随参数量"忽高忽低"的非单调现象——调的参数越多,性能不一定越好,这让超参调整变得头疼。
2. 挤占序列长度:假设模型支持最长1024个token的输入,如果你用了100个前缀token,那用于处理真实用户输入的有效长度就只剩924个token,相当于"花钱买了前排VIP座位,结果舞台变小了"。
Section 4 · LoRA方法(核心!)
4.1 低秩参数化更新矩阵
原文:
"For a pre-trained weight matrix W₀ ∈ ℝ^{d×k}, we constrain its update by representing the latter with a low-rank decomposition W₀ + ΔW = W₀ + BA, where B ∈ ℝ^{d×r}, A ∈ ℝ^{r×k}, and the rank r ≪ min(d,k). During training, W₀ is frozen and does not receive gradient updates, while A and B contain trainable parameters."翻译:
对于一个预训练权重矩阵 W₀ ∈ ℝ^{d×k},我们通过低秩分解来约束其更新:W₀ + ΔW = W₀ + BA,其中 B ∈ ℝ^{d×r},A ∈ ℝ^{r×k},且秩 r ≪ min(d,k)。训练期间,W₀冻结不接收梯度更新,而A和B包含可训练参数。讲解:
这是整篇论文最核心的数学公式,必须吃透。先看不用LoRA时的情况:
- 原始权重矩阵 W₀ 的尺寸是 d×k(比如 d=k=4096,即一个4096×4096的大矩阵)
- 全量微调会直接更新 W₀,训练后得到 W = W₀ + ΔW,其中 ΔW 同样是一个4096×4096的矩阵
- 参数量:4096 × 4096 = 16,777,216个参数LoRA的做法:
- 用两个小矩阵 B(尺寸 d×r)和 A(尺寸 r×k)的乘积 BA 来近似 ΔW
- 如果 r=8(远小于4096),则:
- B 的参数量:4096 × 8 = 32,768
- A 的参数量:8 × 4096 = 32,768
- 合计:65,536个参数
- 参数量减少比例:16,777,216 / 65,536 ≈ 256倍!用维度来感受"秩"的意义:
```
原始 ΔW(满秩):
┌─────────────────────┐
│ 4096 × 4096 矩阵 │ → 16.7M 个参数
└─────────────────────┘LoRA 的低秩分解(r=8):
A (8×4096) B (4096×8)
┌──────────────────┐ ┌────────┐
│ 8行 × 4096列 │ × │4096×8 │ = 65K 个参数
└──────────────────┘ └────────┘
```类比"信息压缩":
想象你要给朋友描述一幅复杂的壁画(4096×4096的ΔW)。满秩版本相当于你要描述每一个像素;低秩版本相当于你说"这幅画整体是红色调,主要图案是一棵树,树的姿态偏左……"——用8个维度的描述就能重建出大概的样子。LoRA假设权重更新就像这幅壁画,其核心信息只需要r=8个维度就能捕捉。
原文:
"For h = W₀x, our modified forward pass yields:
h = W₀x + ΔWx = W₀x + BAx"翻译:
对于原始前向传播 h = W₀x,我们修改后的前向传播变为:
h = W₀x + ΔWx = W₀x + BAx讲解:
这是训练时的计算流程:
- x 是输入向量(比如一个token的embedding)
- W₀x 是原始大模型的计算(W₀冻结,梯度不流向它)
- BAx 是LoRA的附加计算(B和A的参数接受梯度更新)
- 两路结果相加,得到最终输出 h视觉化:
x(输入) / \ / \ W₀x A·x(先经过A降维) ↓ BA·x(再经过B升维) \ / \ / h = W₀x + BAx(输出)
这就像大模型主干道(W₀x)旁边开了一条小旁路(BAx),训练时只需要维护这条小旁路。
4.2 初始化策略:确保训练稳定
原文:
"We use a random Gaussian initialization for A and zero for B, so ΔW = BA is zero at the beginning of training. We then scale ΔWx by α/r, where α is a constant in r. When optimizing with Adam, tuning α is roughly the same as tuning the learning rate if we scale the initialization appropriately."翻译:
我们对A使用随机高斯初始化,对B使用零初始化,使得训练开始时 ΔW = BA = 0。然后我们将 ΔWx 按 α/r 进行缩放,其中 α 是一个与 r 相关的常数。在使用Adam优化器时,如果对初始化进行适当缩放,调整 α 的效果大致等同于调整学习率。讲解:
这个初始化策略非常聪明,体现了工程上的严谨性:为什么B初始化为零?
训练开始时,ΔW = BA = B × A。如果B=0,则无论A取什么值,ΔW=0。这意味着:训练刚开始时,LoRA对模型的影响是零,模型行为与原始预训练模型完全相同。这保证了训练的稳定起点——相当于"从零开始学习任务特定的调整",而不是从随机的扰动状态开始。如果B不初始化为零会怎样?
训练开始时ΔW = BA是一个随机矩阵,这会给原始的预训练模型引入随机噪声,可能破坏预训练中学到的良好表示,导致训练不稳定。α/r 缩放的作用:
这是一个超参数调整技巧。α是一个常数(通常设置为与r相等,比如r=8时α=8),α/r的比值就是缩放因子。这个设计让你在改变r的值(改变低秩的"秩")时,不需要重新调整学习率,方便了超参数搜索。
4.3 推理时的合并——零额外延迟
原文:
"When deployed in production, we can explicitly compute and store W = W₀ + BA and perform inference as usual. Critically, this guarantees that we do not introduce any additional latency during inference compared to a fine-tuned model by construction."翻译:
在生产环境部署时,我们可以显式地计算并存储 W = W₀ + BA,然后像往常一样进行推理。关键在于,这从设计上保证了我们在推理时与全量微调模型相比不引入任何额外延迟。讲解:
这是LoRA最优雅的工程特性之一。合并过程(只需做一次,部署前执行):
```
训练阶段:
模型结构:[冻结的W₀] + [可训练的B×A]
前向传播:h = W₀x + BAx(两条路)部署阶段(合并后):
W_merged = W₀ + BA(把两个矩阵加在一起,一次性运算)
模型结构:[W_merged](和原始模型结构完全相同!)
前向传播:h = W_merged × x(一条路,与原始推理完全一样)
```合并后的模型与原始全量微调的模型在结构上无法区分——都是一个大矩阵W。推理时没有任何额外的分支计算,延迟为零。
对比Adapter:Adapter是在模型结构中"插入"了额外的模块,部署时无法"取出",每次推理都必须执行这些额外模块的计算,延迟无法消除。
任务切换的便利性:当需要切换到不同任务时,只需:
1. 减去当前任务的LoRA:W₀ = W_merged - B_task1 × A_task1
2. 加上新任务的LoRA:W_new = W₀ + B_task2 × A_task2
这两步都是简单的矩阵加减法,极其快速。
4.4 应用到Transformer的哪些权重矩阵?
原文:
"Note that putting all the parameters in ΔWq or ΔWk results in significantly lower performance, while adapting both Wq and Wv yields the best result."翻译:
值得注意的是,将所有参数集中在ΔWq或ΔWk上会导致性能显著下降,而同时适配Wq和Wv能获得最佳结果。讲解:
Transformer中的注意力机制有四个权重矩阵:Wq(Query)、Wk(Key)、Wv(Value)、Wo(Output),以及前馈网络(FFN)中的权重矩阵。论文通过实验发现:在参数总量相同的情况下,把LoRA模块分散到Wq和Wv两个矩阵上,比集中在单个矩阵上效果更好。直觉上,这是因为注意力机制的多个组件共同决定了"关注什么",单独调整某一个会造成不平衡。
在实践中,很多后续工作(包括HuggingFace PEFT库的默认设置)会同时对Wq、Wk、Wv和Wo都应用LoRA,效果更全面。
4.5 秩r应该选多大?
原文:
"To our surprise, a rank as small as one suffices for adapting both Wq and Wv on these datasets."翻译:
令我们惊讶的是,对于这些数据集上的Wq和Wv适配,秩r小到1就已经足够了。讲解:
这个发现非常震撼,也是对"低秩假设"最强力的实验支持。r=1意味着:ΔW = B × A,其中B是一个列向量(d×1),A是一个行向量(1×k)。这个乘积是一个秩为1的矩阵,即所有行都成比例——这是最简单、最压缩的矩阵结构。
然而在某些任务上,即便是这样极度简化的更新(只有d+k个参数,比如4096+4096=8192个参数),也能达到不错的效果!
这说明什么? 说明大模型在预训练时已经学到了非常通用的表示,微调时所需要的"任务特定调整"实际上非常简单——可能只是"往某个方向稍微拨一拨"。就像一个全科医生转型为心脏科专家,并不需要重学所有医学知识,只需要专注深化某几个方向的理解。
实践建议:论文实验中r=4或r=8通常是不错的选择,在压缩率和性能之间取得平衡。对于非常大的模型(如GPT-3 175B),r=4已经足够,参数量依然比全量微调小10,000倍。
原文:
"Directions corresponding to the top singular vector overlap significantly between A_{r=8} and A_{r=64}, while others do not."翻译:
在 A_{r=8}(秩为8)和 A_{r=64}(秩为64)之间,对应最大奇异值的方向重叠度很高,而其他方向则不然。讲解:
这里涉及奇异值分解(SVD)——一种分析矩阵"最重要方向"的数学工具(可以类比为PCA主成分分析)。这个发现说明:无论你用r=8还是r=64来训练LoRA,最重要的那个"调整方向"是一致的(两者的最大奇异向量高度重叠)。而秩更大(r=64)时多出的那些方向,在r=8时根本没有被学到——但这些额外方向对性能提升的贡献很小。
这进一步证实了"低秩就够用"的假设:任务适配所需的最核心信息就集中在最重要的几个方向上,增加更多方向是冗余的。
Section 5 · 关键实验结果
5.1 参数量对比
| 方法 | 模型 | 可训练参数量 | GLUE平均分 |
|---|---|---|---|
| 全量微调 | RoBERTa-base | 125M | 86.4 |
| LoRA | RoBERTa-base | 0.3M | 87.2 |
| 全量微调 | DeBERTa-XXL | 1,500M | 91.7 |
| LoRA | DeBERTa-XXL | 4.7M | 91.3 |
讲解:
以DeBERTa-XXL为例:全量微调需要更新15亿参数,LoRA只需要470万参数——减少了319倍——但GLUE评测分数只差0.4分(91.3 vs 91.7)。这个效果-成本比非常可观。
5.2 GPT-3上的结果
原文:
"As shown in Table 4, LoRA matches or exceeds the fine-tuning baseline on all three datasets. Note that not all methods benefit monotonically from having more trainable parameters, as shown in Figure 2. We observe a significant performance drop when we use more than 256 special tokens for prefix-embedding tuning or more than 32 special tokens for prefix-layer tuning."翻译:
如表4所示,LoRA在所有三个数据集上都与全量微调基准持平或更优。值得注意的是,并非所有方法都随参数量增加而单调改善(见图2)。我们观察到,当Prefix-Embedding Tuning使用超过256个特殊token,或Prefix-Layer Tuning使用超过32个特殊token时,性能会显著下降。讲解:
这组对比在GPT-3(175B参数)规模上进行,更有说服力:GPT-3上的LoRA关键数字(WikiSQL任务):
- 全量微调(假设可行):约175B可训练参数
- LoRA(r=4,适配Wq和Wv):约37.7M可训练参数
- 减少比例:约4,600倍同时,Prefix Tuning的"非单调性"问题也被凸显——参数越多反而越差,说明这种方法的优化landscape(优化地形)本身就不平坦,工程上难以稳定使用。
5.3 显存和存储优势
原文:
"The most significant benefit comes from the reduction in memory and storage usage. For a large Transformer trained with Adam, we reduce that VRAM usage by up to 2/3 if r ≪ d_model as we do not need to store the optimizer states for the frozen parameters. On GPT-3 175B, we reduce the VRAM consumption during training from 1.2TB to 350GB."翻译:
最显著的好处来自显存和存储使用的减少。对于使用Adam优化器训练的大型Transformer,当 r ≪ d_model 时,我们可以将显存使用量降低高达2/3——因为无需为被冻结的参数存储优化器状态。在GPT-3 175B上,我们将训练所需的显存从1.2TB降低到350GB。讲解:
1.2TB是一个极其恐怖的数字——这相当于需要15张A100 80GB显卡才能放下(15×80GB=1200GB=1.2TB)。而350GB只需要约5张A100。这使得微调GPT-3级别的模型从"只有顶级科技公司才能做到"变成了"中等规模的研究机构/公司也能尝试"。存储对比(每个任务):
- 全量微调:350GB(完整模型副本,FP16)
- LoRA(r=4,适配Wq和Wv):约35MB(只存A和B矩阵)
- 减少约10,000倍
Section 7 · 理解低秩更新的本质
原文:
"ΔW has a stronger correlation with W compared to a random matrix, indicating that ΔW amplifies some features already in W."翻译:
ΔW与W的相关性比随机矩阵更强,这表明ΔW放大了W中已经存在的某些特征。讲解:
这是一个深刻的发现,揭示了LoRA(以及模型适配)的本质机制:微调不是在"教会模型新知识",而是在"引导模型更关注某些它已经知道但在预训练中没有被强调的特征"。
类比:一个全科医生(预训练模型)在医学院学习了心脏病、神经病、皮肤病等所有知识。当他转到心脏科专科(微调)时,他不是在学习新的知识,而是在"调高"大脑中心脏相关知识的"音量"、"调低"其他知识的优先级。LoRA的ΔW就是这个"音量调节旋钮"。
原文:
"The low-rank adaptation matrix potentially amplifies important features for specific downstream tasks that were learned but not emphasized in the general pre-training model."翻译:
低秩适配矩阵可能在放大那些已经在通用预训练中被学习、但没有被强调的对特定下游任务重要的特征。讲解:
这句话给出了LoRA有效性的直觉解释:
- 预训练阶段:模型在超大规模通用语料上学习,必然会习得各种任务相关的特征,但这些特征的"权重"是按通用场景分配的,不会特别强调某个专业领域
- 微调阶段:通过LoRA的低秩矩阵,我们调整了这些特征的"权重分配",把任务相关特征的重要性提升
- 关键洞察:这种"特征权重重分配"是一种低秩操作——只需要调整少数几个重要方向,不需要重新学习全部知识
这也解释了为什么只需要r=1或r=4的秩就能工作:你只需要改变少数几个"特征维度的优先级",而不是从头开始建立一套新的特征体系。
总结:LoRA的地位与影响
为什么LoRA成为当今PEFT的主流方法?
术语:PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)
PEFT是一类方法的总称,目标是用极少量的可训练参数来替代全量微调,在性能损失可接受的前提下大幅降低计算和存储成本。LoRA是目前最广泛使用的PEFT方法。
LoRA之所以胜出,是因为它同时满足了实用性的三个关键维度:
| 维度 | LoRA的答案 |
|---|---|
| 效果 | 与全量微调持平或更优 |
| 成本 | 可训练参数减少10,000倍,显存减少3倍 |
| 部署 | 推理零额外延迟(可合并权重) |
其他方法(Adapter、Prefix-tuning)往往只能满足其中两个维度,而LoRA三个都达到了。
LoRA引发的后续研究
LoRA发表后,带动了一系列重要的衍生工作:
| 方法 | 基于LoRA的改进 |
|---|---|
| QLoRA(2023) | LoRA + 4bit量化,将LLaMA-65B微调所需显存从>780GB降至<48GB,使消费级GPU(单卡48GB)可微调700亿参数模型 |
| AdaLoRA | 自适应秩分配,不同矩阵用不同的r |
| LoRA+ | 对A和B使用不同学习率,提升训练效率 |
| DoRA | 把权重分解为大小和方向,分别进行LoRA更新 |
| LoRA-FA | 冻结A矩阵,只训练B,进一步节省显存 |
今天,Hugging Face的PEFT库、LLaMA-Factory、Axolotl等主流微调框架都将LoRA作为默认的微调方法,几乎所有开源大模型(LLaMA、Qwen、Mistral等)的微调教程都以LoRA为基础。
核心公式速记
W = W₀ + BA
其中:
W₀ ∈ ℝ^{d×k} → 预训练权重(冻结)
B ∈ ℝ^{d×r} → LoRA矩阵(可训练,初始化为0)
A ∈ ℝ^{r×k} → LoRA矩阵(可训练,随机初始化)
r ≪ min(d,k) → 秩,通常取 1、2、4、8、16
参数量对比(d=k=4096,r=8):
全量微调:4096×4096 = 16.8M
LoRA:4096×8 + 8×4096 = 65K
压缩比:约 256×
字数统计约 9,800 字 | 覆盖章节:Abstract、Introduction(全部核心段落)、Section 2(问题定义)、Section 3(现有方案分析)、Section 4(LoRA方法,一段不漏)、Section 5(关键实验数据)、Section 7(机制理解)