LoRA 原理深度调研
LoRA(Low-Rank Adaptation)试图回答一个非常具体的问题:当大模型已经预训练完成之后,我们是否真的还需要为每个下游任务更新整套权重?Hu 等人在原始论文中给出的答案是否定的:在很多任务上,权重更新本身具有很低的有效秩,因此可以把完整更新矩阵写成一个低秩乘积,只训练很少一部分参数 #Hu et al., 2021。
这篇文章聚焦原理层:为什么低秩近似成立,缩放因子和初始化为什么这样设计,梯度如何流动,以及 QLoRA、AdaLoRA、LoRA+ 这些后续变体分别解决了什么问题。
核心公式速查
其中 $W_0$ 是冻结的预训练权重,$A \in \mathbb{R}^{r \times k}$、$B \in \mathbb{R}^{d \times r}$ 是可训练的低秩矩阵,$r \ll \min(d,k)$,$\alpha$ 是缩放因子 #Hu et al., 2021。
大型语言模型在下游任务上做全量微调时,最大的代价不只是训练算力,还包括每个任务都要保存一份完整权重副本。Hu 等人在论文中以 GPT-3 175B 为例指出,LoRA 可把可训练参数减少约 10000 倍,并把适配器相关的 GPU 显存需求降低约 3 倍 #Hu et al., 2021。
LoRA 的理论直觉并不是凭空出现的,它与 Aghajanyan 等人的内在维度(intrinsic dimensionality)研究直接同源。该工作表明,预训练语言模型在下游任务微调时,真正决定性能的可优化子空间维度远小于完整参数维度;在 RoBERTa-base 这类模型上,只用一个极低维的重参数化子空间就能逼近全量微调性能 #Aghajanyan et al., 2021。
内在维度假设
设预训练权重为 $W_0$,任务适配后的权重为 $W_0 + \Delta W$。若存在一个低维子空间足以承载主要任务相关更新,那么就没有必要显式学习完整的 $\Delta W$;只学习这个低维子空间中的参数即可 #Aghajanyan et al., 2021。
LoRA 把更新矩阵参数化为:
其中 $A \in \mathbb{R}^{r \times k}$,$B \in \mathbb{R}^{d \times r}$。这样一来,原本需要训练 $dk$ 个参数,现在只需训练 $r(d+k)$ 个参数;当 $r$ 很小时,这个差距非常大 #Hu et al., 2021。
一个数量级例子
若某线性层权重为 $768 \times 768$,原始参数量是 589,824;当 $r=8$ 时,LoRA 只需要训练 $8\times768 + 768\times8 = 12,288$ 个参数,压缩约 48 倍。
如果直接使用 $BA$ 而不缩放,那么随着秩 $r$ 提高,更新矩阵的量级也会随之变化,导致不同秩之间的超参数不可迁移。LoRA 引入 $\alpha/r$ 的目的,就是把不同秩下的更新幅度归一化,从而让同一组学习率和训练策略在不同 $r$ 上更稳定 #Hu et al., 2021。
在实践里,常见经验是设 $\alpha = 2r$ 或 $\alpha = r$,这相当于把“表达能力的扩大”和“训练稳定性”绑定在一个更易控制的尺度上。
LoRA 的一个关键工程细节是:$A$ 随机初始化,而 $B$ 零初始化。这样训练开始时就有 $BA = 0$,模型前向输出与原始预训练模型完全一致,不会因为适配器随机噪声而破坏基座模型行为 #Hu et al., 2021。
为什么不是两边都随机初始化
若 $A$ 和 $B$ 都随机初始化,则第一步前向就已经在原模型输出上叠加随机扰动;这会让训练一开始就偏离预训练分布,尤其在小数据集上更容易不稳定。
对于
损失函数 $\mathcal{L}$ 对 $B$ 和 $A$ 的梯度分别是:
这说明虽然 $W_0$ 被冻结,但梯度仍然可以通过 $A$ 与 $B$ 的乘积路径间接塑造输出空间;低秩约束既减少参数,又起到了隐式正则化作用。
从理论上讲,内在维度越低,所需的有效秩就越小;但在真实任务里,秩并不直接等于某个“理论最优值”,而更像一个表达能力预算。原始 LoRA 论文和后续经验通常支持这样一个结论:当 $r$ 从很小的值增加到 8 或 16 时,性能常有明显提升;继续增大到更高值,收益会逐步递减 #Hu et al., 2021。
| 任务复杂度 | 常见秩范围 | 说明 |
|---|---|---|
| 分类 / 情感分析 | $r \in \{2,4,8\}$ | 低维更新通常已足够 |
| 问答 / 摘要 | $r \in \{8,16\}$ | 兼顾表达能力和显存 |
| 代码 / 数学推理 | $r \in \{16,32,64\}$ | 更复杂任务往往需要更高秩 |
- 先试 $r=4$ 或 $r=8$,把它当作基线。
- 若验证集仍显著欠拟合,再提高到 $r=16$ 或更高。
- 如果你已经对多个模块同时注入 LoRA,那么增加模块数有时比单纯增大秩更划算。
QLoRA 的核心贡献不是改变 LoRA 公式本身,而是把基座模型用 4-bit NormalFloat(NF4)量化存储,同时保留 LoRA 适配器在较高精度下训练,从而把超大模型微调的显存门槛大幅压低 #Dettmers et al., 2023。
| 机制 | 作用 |
|---|---|
| NF4 量化 | 为近似正态分布权重提供更合适的 4-bit 表示 |
| 双重量化 | 进一步压缩量化常数 |
| Paged Optimizer | 缓解优化器状态带来的内存峰值 |
该论文最著名的结果之一是:65B 量级模型可以在单张 48GB GPU 上做高质量微调 #Dettmers et al., 2023。
AdaLoRA 的出发点是:并不是所有层都同样重要,因此没必要把相同 rank 平均分配给每一层。它用 SVD 风格的参数化和重要性估计,在训练过程中动态调整预算,把更多秩分给重要层,把更少秩分给不重要层 #Zhang et al., 2023。
这类方法本质上是在回答另一个问题:不是“LoRA 能不能低秩”,而是“有限低秩预算应该怎样花”。
LoRA+ 指出,在宽网络近似下,$A$ 和 $B$ 的梯度统计量级并不一致,因此让两者共享同一个学习率并不理想。论文提出对 $B$ 使用更高学习率:
这样可以改善收敛速度,并带来小幅性能提升 #Hayou et al., 2024。
LoRA 的优势
- 训练参数极少,存储多个任务适配器成本低。
- 推理时可合并权重,几乎没有额外延迟。
- 在中等规模数据集上常能接近全量微调。
LoRA 的边界
- 表达空间被低秩约束,理论上不如全量微调自由。
- 模块选择和秩选择会显著影响结果。
- 在高复杂度任务或跨模态任务上,可能需要更高秩或更多目标层。
核心要点回顾
- LoRA 的本质:把完整权重更新限制在低维子空间中学习 #Hu et al., 2021。
- 理论基础:预训练模型在下游任务上的有效更新维度远小于完整参数维度 #Aghajanyan et al., 2021。
- 工程关键:$\alpha/r$ 控制更新尺度,$A$ 随机初始化、$B$ 零初始化保证安全起点 #Hu et al., 2021。
- 变体演化:QLoRA 解决显存,AdaLoRA 解决预算分配,LoRA+ 解决学习率失衡 #Dettmers et al., 2023 #Zhang et al., 2023 #Hayou et al., 2024。
下一篇 LoRA 适用结构与代码实现 会把这个原理层结论落到实际模块和代码写法上。
参考来源
- Hu, E. J. et al. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685
- Aghajanyan, A. et al. (2021). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. ACL 2021. arXiv:2012.13255
- Dettmers, T. et al. (2023). QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314
- Zhang, Q. et al. (2023). AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning. ICLR 2023. arXiv:2303.10512
- Hayou, S. et al. (2024). LoRA+: Efficient Low Rank Adaptation of Large Models. ICML 2024. PMLR 235