LoRA (Low-Rank Adaptation)
LoRA 通过冻结大模型的权重并训练小型低秩更新矩阵来微调模型,从而减少可训练参数、内存占用和存储需求。
LoRA 是低秩适配(Low-Rank Adaptation)的缩写,是一种参数高效微调(PEFT)方法。它冻结模型的原始权重,并在选定层旁训练一对小矩阵,从而让大型预训练模型适应新任务。两个矩阵的乘积构成一个低秩更新,并加到冻结权重上,因此只有极少一部分参数会获得梯度。LoRA 由 Microsoft 的 Hu 等人于 2021 年提出。与使用 Adam 进行完整微调相比,LoRA 将 GPT-3 175B 的可训练参数减少了 10,000 倍,将训练所需的 GPU 内存减少了 3 倍,同时在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上达到或超过完整微调的质量。如今,LoRA 被广泛用于在普通硬件上定制大型语言模型(LLM)、扩散模型和视觉 Transformer。LoRa 是用于 IoT 设备的远距离无线电协议,与此处所说的 LoRA 无关。
LoRA 的工作原理#
微调通过某个更新量 ΔW 改变大小为 d × k 的预训练权重矩阵 W。LoRA 假设该更新的内在秩较低,因此可以写成两个瘦矩阵的乘积:ΔW = B × A,其中 A 的大小为 r × k,B 的大小为 d × r,而秩 r 远小于 d 或 k。该层的输出变为 h = Wx + (α / r) × BAx,其中 α 是固定的缩放常数。A 使用较小的随机值初始化,B 则初始化为零,因此训练开始时模型与预训练模型完全相同。只有 A 和 B 会在反向传播期间更新,这也省去了所有冻结权重的优化器状态。
对于 4096 × 4096 的投影层,完整微调会训练约 1680 万个权重,而秩为 8 的适配器只训练 8 × (4096 + 4096) = 65,536 个权重。下面的 PyTorch 脚本会构建这样的适配器,并将它合并到冻结层中:
import torch
from torch import nn
# A frozen pretrained 4096 x 4096 projection, like one in a transformer attention block
base = nn.Linear(4096, 4096).requires_grad_(False)
# LoRA's trainable rank-8 update: B @ A, scaled by alpha / r
# B starts at zero, so the adapted layer initially matches the pretrained one
r, alpha = 8, 16
A = nn.Parameter(torch.randn(r, 4096) * 0.01)
B = nn.Parameter(torch.zeros(4096, r))
trainable = A.numel() + B.numel()
total = trainable + sum(p.numel() for p in base.parameters())
print(f"Trainable: {trainable:,} of {total:,} parameters ({trainable / total:.2%})")
# After training, merge the update into the base weight so inference costs nothing extra
nn.init.normal_(B, std=0.01) # stand-in for trained values
x = torch.randn(2, 4096)
adapted = base(x) + (alpha / r) * (x @ A.T @ B.T)
merged = nn.functional.linear(x, base.weight + (alpha / r) * B @ A, base.bias)
print(f"Merged layer matches adapter output: {torch.allclose(adapted, merged, atol=1e-5)}")该适配器训练的是该层 16,846,848 个参数中的 65,536 个,占 0.39%;将 B × A 合并到 W 中,与单独运行适配器会得到相同的输出。因此,合并后的 LoRA 模型运行速度与原始模型完全相同;相比之下,早期适配器层会在每次前向传播中增加额外计算。
在实践中使用 LoRA#
原论文只对 Transformer 的注意力查询投影和值投影进行适配,如今许多方案则会针对所有线性层。秩和 α 是主要的超参数:Hugging Face PEFT 库默认使用 r = 8 和 α = 8。由于基础模型保持不变,一次部署可以只保留一份模型副本,并按需切换小型任务适配器。对于 GPT-3 175B 的查询投影和值投影采用秩 4 时,每个适配后的检查点会从 350 GB 缩小到约 35 MB,体积约减少 10,000 倍。
- 语言模型:团队可以在一块 GPU 上将开源 LLM 适配到特定领域、风格或指令格式,通常会将 LoRA 与指令微调数据结合使用。
- 图像生成:LoRA 文件可以让 Stable Diffusion 等模型学习某种角色、产品或艺术风格,并且与基础检查点分开共享和叠加使用。
- 视觉和多模态模型:适配器可以针对医疗、工业或文档图像定制视觉 Transformer 和视觉语言模型(VLM),而无需重新训练骨干网络。
变体#
- QLoRA:将基础模型冻结为 4 位 NormalFloat 精度,并在其上训练 LoRA 适配器。Dettmers 等人使用这种方法,在单块 48 GB GPU 上微调一个 650 亿参数模型,同时保持了完整 16 位微调的性能。
- DoRA:将每个预训练权重拆分为幅度和方向,只对方向应用 LoRA,因此在推理成本相同的情况下,能缩小与完整微调之间的精度差距。
LoRA 与相关术语的比较#
- 参数高效微调:只训练模型一小部分参数的方法的统称。冻结层是最简单的形式,Ultralytics YOLO 将其作为
freeze训练参数提供:它会让 YOLO26 模型的前 N 层保持预训练权重,同时训练其余部分。 - 全量微调:更新所有权重,并为每个任务保存一份完整大小的模型。在编程和数学任务上,全量微调的表现显著优于标准 LoRA,而 LoRA 能更好地避免基础模型的其他技能出现灾难性遗忘。
- 提示调优:学习软提示嵌入,并将其添加到输入前面,同时冻结所有模型权重。
- 迁移学习:将一个任务中的知识用于另一个任务的通用方法。LoRA 是一种高效的实现方式。
- 模型合并:合并分别经过微调的模型权重;将多个 LoRA 适配器合并到一个基础模型中就是常见做法。










