LoRA(Low-Rank Adaptation)
一句话:冻结预训练权重
,只训练一对低秩矩阵 ,把可训练参数压到千分之一量级,且训练完可合并回原权重、推理零延迟。论文 LoRA: Low-Rank Adaptation of Large Language Models (Hu et al., 2021)。 提出年份:2021(arXiv) · 机构/团队:Microsoft · 会议/来源:ICLR 2022 / arXiv:2106.09685
直觉与动机
全量微调 70B 模型,光是 AdamW 的一阶、二阶动量就要占去权重本身 2 倍的显存,再加上梯度,单任务训练动辄上百 GB;每个下游任务还要存一份完整 checkpoint。问题是:适配一个具体任务,真的需要更新全部参数吗?
LoRA 的核心假设是权重更新具有低「内在秩」。预训练模型已经学到了通用表示,适配下游任务所需的改动
相比之前的 PEFT 方案,LoRA 的关键优势是推理零开销:
- Adapter 在每层之间串联额外的瓶颈 MLP,必然增加前向的串行深度和延迟;
- Prefix/Prompt-tuning 把可学习向量拼到序列前面,挤占了宝贵的上下文长度;
- LoRA 的增量是对原权重的线性叠加,训练完直接做
合并,得到的就是一个普通的 dense 权重,推理时与原模型结构、速度完全一致。
方法与公式
对任意一个线性层
其中
初始化是 LoRA 能稳定起步的关键:
缩放因子
部署合并:训练结束后计算
把结果写回权重矩阵,得到一个标准 dense 模型。多任务场景下也可不合并,保留多个

图源:Hu et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685(用于学习注解,版权归原作者)
与 baseline 对比
| 维度 | 全量微调 | LoRA |
|---|---|---|
| 可训练参数 | 100% | ~0.1%–1% |
| 优化器状态显存 | 巨大(动量随参数量) | 极小(只覆盖 |
| checkpoint 体积 | 整套权重(GB 级) | 单个 adapter(MB 级) |
| 推理延迟 | — | 合并后无额外延迟 |
| 任务切换 | 换整套权重 | 换 adapter,热插拔 |
| 新知识容纳量 | 高 | 受秩 |
实现要点
import torch.nn as nn
class LoRALinear(nn.Module):
def __init__(self, base: nn.Linear, r=8, alpha=16, dropout=0.0):
super().__init__()
self.base = base # 冻结的 W0
for p in self.base.parameters():
p.requires_grad = False
d_out, d_in = base.weight.shape
self.A = nn.Parameter(torch.randn(r, d_in) * (1 / r ** 0.5)) # 高斯
self.B = nn.Parameter(torch.zeros(d_out, r)) # 零初始化
self.scaling = alpha / r
self.dropout = nn.Dropout(dropout)
def forward(self, x):
return self.base(x) + self.scaling * (self.dropout(x) @ self.A.T) @ self.B.T
@torch.no_grad()
def merge(self): # 部署时合并回基座
self.base.weight += self.scaling * (self.B @ self.A)实现上要注意:
- 注入哪些模块:最小集是注意力的
投影(论文的主推配置);要逼近全量微调,应把 乃至 MLP 的所有 Linear 都加上。覆盖越全,效果上限越高、参数也越多。 - dropout 加在输入侧:作用于
进入 LoRA 分支之前,不影响主干。 - 混合精度:
一般保持 bf16/fp32,与基座 dtype 解耦。 - 不要对 LayerNorm、embedding、lm_head 盲目加 LoRA:embedding 维度大、收益有限,需要时单独处理。
调参与实践经验
- 秩
:从 8 起步,效果不够再翻到 16/32/64。收益随 递减——任务越接近预训练分布,越小的 就够;要灌入大量新知识时小秩会成为瓶颈。 :经验默认 。调大 相当于放大 LoRA 分支的步长,过大易不稳。注意若改用 rsLoRA 的 缩放,高秩下行为更稳定。 - 学习率:通常比全量微调大一个数量级,
是常见区间,因为只更新极少量参数、梯度信号需要更大步长。可进一步参考 LoRA+ 给 设更大 lr。 - 目标模块优先级:显存紧→只加
;追效果→全 Linear。MLP 模块参数量占大头,加上它对复杂推理任务帮助明显。 - 过拟合:小数据集(几千条以内)配 LoRA dropout 0.05~0.1,并适当减小
。
进一步的初始化、缩放、结构改进见 LoRA 家族总览;显存受限场景见 QLoRA;想更贴近全量微调见 DoRA。
参考文献
- Hu et al., 2021. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685
- Aghajanyan et al., 2020. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. arXiv:2012.13255