LoRA(Low-Rank Adaptation)的核心就一行公式:冻结预训练权重 $W_0\in\mathbb{R}^{m\times n}$,微调不学完整的增量 $\Delta W$,而是学它的低秩分解
$$ W = W_0 + \Delta W = W_0 + BA,\qquad B\in\mathbb{R}^{m\times r},\ A\in\mathbb{R}^{r\times n},\ r\ll \min(m,n). $$
这篇文章想回答的是三个"为什么":为什么增量可以是低秩的、为什么这样参数省得多、为什么初始化要一长一零。
低秩假设的证据链
LoRA 论文(Hu et al., 2021)并没有证明 $\Delta W$ 低秩,它诉诸一条更早的证据:内在维度(intrinsic dimension)。Aghajanyan et al.(2020)做过一个实验:把全参数训练投影到一个随机低维子空间里优化,即只学 $d_0$ 维的系数 $\theta$,参数更新为 $P\theta$($P$ 是固定的随机投影矩阵)。结果发现 RoBERTa 在不少下游任务上,$d_0$ 小到几百就能达到全量微调 90% 以上的效果。也就是说,下游任务适配所需的"有效自由度"远小于参数总量——微调这件事本身在一个低维流形上就能完成。
LoRA 是这个观察的结构化版本:不用随机投影,而是让模型自己学出那个低维子空间($A$ 定子空间方向,$B$ 定系数)。原论文还给了一个事后验证:把学出来的 $\Delta W$ 做奇异值分解,谱衰减很快,前几个奇异向量已经抓住大部分能量;同时 $A$ 学到的子空间与 $W_0$ 的顶部奇异方向显著重叠——低秩更新恰好打在预训练权重最重要的方向上。
诚实地说,"低秩"是近似而非定理。后续工作(如 LoRA 的各种变体和全量微调对比研究)表明秩 $r$ 与任务复杂度正相关:风格迁移类任务 $r=4$ 就够,需要注入大量新知识(如领域 continue pretrain)时低秩会欠拟合。LoRA 的适用范围边界,本质上是"任务所需增量秩"与 $r$ 的大小关系。
参数与显存的账
参数量对比很直观:全量更新 $mn$ 个参数,LoRA 是 $r(m+n)$。以 $m=n=4096$(LLaMA-7B 的注意力投影层)为例:全量 16.8M,$r=8$ 的 LoRA 只有 $8\times 8192=65K$,压缩比 256 倍。作用到整个模型,7B 全量微调的梯度和 Adam 优化器状态(一阶二阶矩,各一份参数副本)大约要 7B×(2+4+4+4) 字节 ≈ 100 GB 量级(bf16 参数 + fp32 副本与矩),而 LoRA 只训几千万参数,优化器状态缩到可以忽略,一张 24G 卡就能跑。LoRA 让消费级硬件微调 7B 成为日常,靠的就是这个数量级差。
注意一笔隐性成本:前向时 $x(W_0 + BA)$ 若直接合并计算,和原模型一样快;但训练时反向传播仍然要穿过冻结的 $W_0$ 给 $A$ 传梯度,所以训练显存里激活值省不掉,省的是梯度与优化器状态两大头。
初始化的讲究:$B=0$,$A$ 随机
LoRA 的初始化是 $A$ 用高斯随机、$B$ 全零。为什么反过来不行、两个都随机也不行?看训练起点的模型行为:
$$ W\big|_{t=0} = W_0 + BA. $$
$B=0$ 保证起点处 $\Delta W = 0$,模型在第一步与预训练模型逐比特一致,微调从"已知的良好解"出发,而不是从被随机扰动过的解出发。若 $A,B$ 都随机,$\Delta W$ 是一个随机低秩矩阵,预训练权重被白白污染,第一步要先学"如何抵消这个随机扰动"。
那 $A=0$、$B$ 随机行不行?不行。$\partial \ell/\partial B = (\partial\ell/\partial W)A^\top$,若 $A=0$ 则 $B$ 的梯度恒为零,$B$ 永远动不了;对称地 $B=0$ 时 $A$ 的梯度 $\partial\ell/\partial A = B^\top(\partial\ell/\partial W)$ 也是零——等一下,那 $B=0$ 时 $A$ 不也动不了?关键点在于:$B$ 的梯度正比于 $A$(非零),所以第一步 $B$ 先离开零;一旦 $B\neq 0$,$A$ 的梯度就活了。$B=0$ 是"可被打破的对称",$A=0$ 则是死锁。这个不对称分析值得记住,它和"神经网络隐藏层不能全零初始化"是同一类论证。
缩放系数与秩、学习率的耦合
实际实现里更新项是 $\frac{\alpha}{r}BA$,$\alpha$ 是常数。这个 $1/r$ 不是装饰:$A$ 的初始化方差与 $r$ 无关时,$BA$ 的初始输出尺度随 $r$ 变化($A$ 各行的随机方向在 $r$ 维内积下累积),除以 $r$ 让不同秩下的有效更新幅度大致可比,于是换 $r$ 时学习率不用重新调。这和 μP 里按宽度缩放初始化的思想同源——都是为了超参数跨规模可迁移。
秩的选取:从 8 到 256 的经验地图
$r$ 是 LoRA 唯一的结构性超参,经验分布相当集中:$r=8$ 或 $16$ 覆盖大多数指令微调场景,$r=64$ 以上通常没有边际收益,除非任务涉及大量新知识。这个现象本身就是低秩假设的反向验证——如果任务真的需要高秩增量,$r$ 的收益曲线不会在 16 附近就平坦下来。一个实用的诊断方法:训完一组 LoRA 后对 $BA$ 做 SVD,看奇异值谱的衰减位置;谱在 $r/2$ 处就进入长尾,说明秩给多了,可以减半重训省参数。反之若谱平坦到 $r$ 边界,说明任务复杂度超出当前秩的表达上限。
梯度视角:LoRA 学的是全量梯度的低秩投影
设这一层在全量微调下的梯度是 $G=\partial\ell/\partial W\in\mathbb{R}^{m\times n}$。LoRA 参数化下
$$ \frac{\partial\ell}{\partial A} = B^\top G,\qquad \frac{\partial\ell}{\partial B} = G A^\top. $$
两式合起来看 $BA$ 的演化方向:它始终被约束在"列空间含于 $B$、行空间含于 $A$"的秩 $r$ 流形上。换句话说,LoRA 的每一步等价于把全量梯度 $G$ 投影到当前的低秩子空间再更新——$G$ 里落在正交补上的分量被直接丢弃,永远学不到。这给出"LoRA 什么时候会输"的精确判据:当任务所需的真实 $\Delta W$ 有效秩超过 $r$,被丢弃的分量会积累成系统性误差,这正是注入大量新知识的任务上 LoRA 欠拟合的机制。反过来看,$r=16$ 在多数指令微调上打平全量,本身就是"这些任务的 $G$ 有效秩极低"的实测证据,与论文里 $\Delta W$ 奇异值谱快速衰减的观察互为表里。
这个视角还给了一个可操作的诊断:训完一组 LoRA 后对 $BA$ 做 SVD,若奇异值谱在 $r/2$ 之前已进入长尾,说明秩给多了,减半重训省参数;若谱平坦到 $r$ 的边界,说明任务复杂度顶到了当前秩的表达上限,该加秩或改全量。
合并部署与多 LoRA
推理时把 $BA$ 直接加回权重:$W' = W_0 + \frac{\alpha}{r}BA$,零额外延迟,这是 LoRA 对 adapter 类方法的决定性优势——adapter 在网络里插入新模块,推理路径变长;LoRA 只是改了权重数值。多 LoRA 服务(一个基座挂几百个用户的 adapter)也是这个性质的直接产物:基座共享,每个请求在矩阵乘时加上自己那份低秩增量,vLLM 等框架的 LoRA 支持就是这么做的。
实践中的几个判断
把理论落到训练配置时,有几个反复被验证的经验。一是作用范围:原论文只给注意力的 $W_Q, W_V$ 加 LoRA,后续实践普遍发现给全部线性层(含 $W_K, W_O$ 和 FFN 的两个矩阵)都加,效果稳定更好,参数预算允许时不必省。二是学习率:LoRA 的最优学习率通常比全量微调高一个数量级($10^{-4}$ 对 $10^{-5}$ 量级),直觉是低秩子空间里有效参数少、梯度信噪比高,步子可以更大;用全量微调的学习率跑 LoRA 是新手最常见的失败原因。三是任务匹配:风格、格式、偏好类适配(增量秩天然低)LoRA 几乎无损;向模型注入全新事实性知识(增量秩高)则该考虑全量微调或先 continue pretrain。这三条都可以从"任务所需增量秩 vs $r$"的框架里推出来,不是玄学。
小结
LoRA 的方法论链条:内在维度实验说明"下游适配是低维的"→ 用 $BA$ 参数化这个低维更新 → $B=0$ 初始化保住起点 → $\alpha/r$ 保住超参可迁移 → 合并权重保住推理零开销。每一步设计都对应一个具体的问题,没有一处是拍脑袋。这也是它在一众 PEFT 方法里活到最后的根本原因。