LoRA 与参数高效微调:低秩分解的数学原理
一、算法概览
LoRA(Low-Rank Adaptation) 是一种参数高效微调方法:冻结预训练权重 W,在旁边并联一个低秩更新 B · A(其中 A、B 是两个小矩阵),仅训练 A 和 B。数学依据是"模型适应下游任务所需的权重更新具有低秩本质"——即 ΔW 可以被低秩矩阵良好近似。LoRA 把可训练参数从 d_in · d_out 降到 r · (d_in + d_out)(r 为秩,通常 8-64),训练显存降低 3-10 倍,且推理时可将 B · A 合并回 W,零额外延迟。与 Adapter、Prefix-Tuning 并称 PEFT 三大流派,但 LoRA 因推理无损、实现简洁而胜出。
二、历史背景与问题起源
2.1 全量微调的显存噩梦
一个 7B 模型,全量微调需要:模型权重(fp16:14GB)+ 梯度(14GB)+ Adam 优化器状态(m 和 v,fp32:56GB)≈ 84GB。还要加上激活值,单卡 80G 的 A100 都装不下。175B 模型更是灾难。
2.2 PEFT 的探索
2020-2021 年间,社区探索了多种参数高效微调方案:
- Adapter(2019):在每层插入小 MLP,增加推理深度和延迟。
- Prefix-Tuning(2021):在注意力前拼可学习 prefix,挤占上下文长度。
- BitFit(2021):只训练 bias,参数少但效果不稳定。
这些方法要么牺牲推理效率,要么效果不佳。LoRA(2021 年底,微软)找到了"低秩分解"这个优雅解法——既不增加推理负担,又能逼近全量微调效果。
2.3 假设:内在维度
Aghajanyan 等人 2020 年发现:预训练模型适应下游任务时,实际所需的"内在维度"远小于参数量。RoBERTa-base 有 125M 参数,但某些任务只需调整不到 1% 的参数方向就能达到全量微调 90% 的效果。这为 LoRA 提供了理论支撑——ΔW 是低秩的。
三、核心原理深入
3.1 核心思想:把 ΔW 分解为低秩矩阵
全量微调:W' = W + ΔW,其中 W 是预训练权重(冻结),ΔW 是更新量(需训练)。
LoRA 的关键假设:ΔW 可以被低秩矩阵近似:
ΔW ≈ B · A
其中 W ∈ R^(d_out × d_in)
B ∈ R^(d_out × r), A ∈ R^(r × d_in), r << min(d_in, d_out)
前向传播变为:
h = W · x + B · A · x
参数量对比:原层 d_in · d_out,LoRA 层 r · (d_in + d_out)。以 d=4096、r=8 为例:原参数 16.7M,LoRA 参数 65K,压缩 256 倍。
3.2 初始化技巧:保证训练开始时为零
A 用高斯随机初始化,B 初始化为零:
A ~ N(0, σ²) # 随机
B = 0 # 零
这样训练开始时 B · A = 0,模型输出与预训练完全一致,不破坏原模型能力。训练过程中 B 逐渐学到非零值,更新才"开启"。
3.3 缩放因子 α:解耦学习率与秩
LoRA 引入缩放因子:
h = W · x + (α / r) · B · A · x
α/r 是固定的缩放系数,作用是:改变 r 时不用重新调学习率。增大 r 不需要等比例减小学习率,工程上方便。实践中 α 常设为 r 的 2 倍(如 r=8 时 α=16)。
3.4 为什么有效:低秩假设的本质
为什么 ΔW 是低秩的?直觉解释:预训练模型已经"知道"大部分通用知识,下游任务只是微调某些方向。这些方向构成一个低维子空间——比如教模型"医学问答",不需要重塑所有参数方向,只需在医学相关的几十个维度上调整。
数学上,A 学习"输入的哪些方向重要"(降维到 r 维),B 学习"如何把这些方向映射到输出"(升维回 d_out)。这与 PCA/自编码器的低秩思想一脉相承。
3.5 应用范围与秩的选择
LoRA 通常只加在 注意力层的 W_Q、W_V 上,有时也加 W_K、W_O 或 FFN。研究表明:
- 只加 W_Q、W_V 已能获得大部分收益。
- 加上 FFN 的 W_up、W_down 在复杂任务上效果更好。
- r=8 对大多数任务够用,r=64 用于领域差距大的任务(如代码、多语言)。
四、训练/推理流程
训练流程:
1. 加载预训练模型,冻结所有 W
2. 为指定层初始化 LoRA 旁路(A、B)
3. 前向:h = W·x + (α/r)·B·A·x
4. 反向:只更新 A、B 的梯度(W 的梯度不计算)
5. 保存:只保存 A、B(几 MB 到几十 MB)
推理流程(关键优势):
1. 训练完成后:W_merged = W + (α/r) · B · A
2. 把合并后的 W_merged 写回模型
3. 推理时无 A、B,与原模型完全相同 → 零额外延迟
多任务切换:每个任务训练独立 LoRA,推理时按需加载/合并,无需多份完整模型——这是全量微调做不到的。
五、与其他算法的关系
| 技术 | 关系 |
|---|---|
| Adapter | 同属 PEFT,但增加推理层数和延迟,LoRA 推理无损 |
| Prefix-Tuning | 修改注意力输入,挤占上下文,效果不如 LoRA 稳定 |
| QLoRA | LoRA + 4bit 量化基础模型 |
| DoRA | LoRA 改进,分解为方向和量级,效果略好但更复杂 |
| AdaLoRA | 自适应分配秩 r,重要层用大 r |
| GaLore | 梯度低秩投影,支持全量参数低显存训练 |
趋势:LoRA 已是微调事实标准,HuggingFace PEFT、vLLM、SGLang 都原生支持。QLoRA 进一步把显存压到消费级显卡能跑。研究热点转向 DoRA 等改进和 MoE 场景下的 LoRA 适配。
六、关键论文
| # | 论文 | 贡献 |
|---|---|---|
| 1 | "LoRA: Low-Rank Adaptation of Large Language Models" — Hu et al., ICLR 2022 (arXiv:2106.09685) | 提出 LoRA,低秩分解微调 |
| 2 | "Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning" — Aghajanyan et al., ACL 2021 (arXiv:2012.13255) | 验证微调的内在低维性,LoRA 理论基础 |
| 3 | "DoRA: Weight-Decomposed Low-Rank Adaptation" — Liu et al., ICML 2024 (arXiv:2402.09353) | 分解方向与量级,改进 LoRA |
| 4 | "GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection" — Zhao et al., 2024 (arXiv:2403.12135) | 梯度低秩投影,全量参数低显存 |
七、实践思考
三个常见理解误区:
| 误区 | 正解 |
|---|---|
| ❌ "LoRA 效果一定不如全量微调" | ✅ 在数据量适中的场景,LoRA 已能逼近全量微调;数据极大或领域差距大时才有明显差距 |
| ❌ "r 越大效果越好" | ✅ r 增大到一定程度收益递减,且过大的 r 会引入噪声、降低泛化;r=8-64 覆盖绝大多数场景 |
| ❌ "LoRA 必须加在所有层" | ✅ 研究表明只加注意力 W_Q、W_V 已能获得大部分收益,加 FFN 在复杂任务上才有显著提升 |