上一篇 我们建立了 Part 3 的核心观察:训练好的权重矩阵经验上接近低秩 ,微调的有效维度远低于参数总数。这个发现引出一个自然的问题——既然微调只需要在一个低维子空间中调整权重,我们能不能直接把增量参数化为低秩矩阵 ,从而大幅减少可训练参数?
LoRA (Low-Rank Adaptation, Hu et al., 2022)给出了肯定的回答。它是”经验低秩性”到”参数效率”的直接转化——可能是过去几年中对大模型微调实践影响最大的单一技术。本文将从数学框架出发,严格推导 LoRA 的核心公式,解释它为什么有效,计算它的参数量优势,并系统梳理 QLoRA、LoRA+、rsLoRA 等重要变体。
为什么需要 LoRA?
Full Fine-Tuning 的显存代价(以 LLaMA-7B 为例) 模型参数 (28 GB) 梯度 (28 GB) Adam 状态 (56 GB) ≥ 112 GB 问题 ①:单卡放不下(A100 80GB 勉强够) 问题 ②:每个下游任务存一份完整副本(28 GB/份) 问题 ③:多任务部署需同时加载多份模型 LoRA (仅 0.13%) ~0.03 GB
Full Fine-Tuning 的代价
微调一个大语言模型的标准做法是Full Fine-Tuning (全参数微调):对所有权重矩阵 W W W 计算梯度 ∇ W L \nabla_W \mathcal{L} ∇ W L ,然后执行梯度下降更新:
W ← W − η ∇ W L W \leftarrow W - \eta \nabla_W \mathcal{L} W ← W − η ∇ W L
对于一个 7B 参数的模型(如 LLaMA-7B),这意味着:
显存 :存储完整的模型参数(7B × 4 bytes = 28 GB, FP32)、梯度(28 GB)、优化器状态(Adam 需要额外 56 GB)——总计超过 112 GB
存储 :每个下游任务保存一份完整的模型副本(28 GB/份)
部署 :多个任务需要同时加载多份完整模型
这在实践中是不可接受的。我们需要一种方法,让微调只涉及少量额外参数 ,同时保持接近 Full Fine-Tuning 的性能。
理论基础:Intrinsic Dimensionality
LoRA 的理论根基来自 Art. 23 学习算子 和 Art. 5 矩阵微积分 中讨论的两个关键结论:
结论 1 (Li et al., 2018):神经网络的损失曲面具有远低于参数数量的内禀维度 (intrinsic dimension)。一个有 D D D 个参数的网络,其内禀维度 d int d_{\text{int}} d int 可能只有 D D D 的千分之一。
结论 2 (Aghajanyan et al., 2021):预训练越充分,微调的内禀维度越低。RoBERTa 在 MRPC 上的内禀维度仅约 200——在一个 200 维的子空间中微调就能达到满参数微调 90% 的性能。
这两个结论直接暗示:微调时权重的变化 Δ W \Delta W Δ W 是低秩 的——它只涉及参数空间中极少数”重要方向”。如果 Δ W \Delta W Δ W 的有效秩为 r r r ,其中 r ≪ min ( m , n ) r \ll \min(m, n) r ≪ min ( m , n ) ,那么我们可以把 Δ W \Delta W Δ W 分解为两个小矩阵的乘积,大幅减少参数量。
LoRA 的数学框架
核心公式
LoRA 的核心思想用一个公式表达:
h = W 0 x + Δ W x = W 0 x + B A x h = W_0 x + \Delta W x = W_0 x + BAx h = W 0 x + Δ W x = W 0 x + B A x
逐项理解:
W 0 ∈ R d × d W_0 \in \mathbb{R}^{d \times d} W 0 ∈ R d × d :预训练权重矩阵 (frozen, 冻结不更新)。这里 d d d 表示隐藏层维度,实际中 W 0 W_0 W 0 可以是非方阵 R d out × d in \mathbb{R}^{d_{\text{out}} \times d_{\text{in}}} R d out × d in ,本文为简化记号取 d out = d in = d d_{\text{out}} = d_{\text{in}} = d d out = d in = d
x ∈ R d x \in \mathbb{R}^d x ∈ R d :输入向量
Δ W = B A \Delta W = BA Δ W = B A :低秩权重增量 ,其中 B ∈ R d × r B \in \mathbb{R}^{d \times r} B ∈ R d × r ,A ∈ R r × d A \in \mathbb{R}^{r \times d} A ∈ R r × d
r r r :秩 (rank),r ≪ d r \ll d r ≪ d ,是 LoRA 的核心超参数
h ∈ R d h \in \mathbb{R}^d h ∈ R d :输出向量
关键约束 :W 0 W_0 W 0 在微调过程中完全冻结 ,只有 A A A 和 B B B 是可训练参数。
让我们用更细粒度的数学来理解 Δ W = B A \Delta W = BA Δ W = B A 的结构。B ∈ R d × r B \in \mathbb{R}^{d \times r} B ∈ R d × r 的列 b 1 , … , b r ∈ R d \mathbf{b}_1, \ldots, \mathbf{b}_r \in \mathbb{R}^d b 1 , … , b r ∈ R d 张成输出空间中的一个 r r r 维子空间;A ∈ R r × d A \in \mathbb{R}^{r \times d} A ∈ R r × d 的行 a 1 T , … , a r T \mathbf{a}_1^T, \ldots, \mathbf{a}_r^T a 1 T , … , a r T 张成输入空间中的一个 r r r 维子空间。增量 Δ W = B A \Delta W = BA Δ W = B A 的秩最多为 r r r ——它只能在 r r r 个方向上修改模型的行为。
用 Art. 3 SVD 的外积展开视角:训练完成后,Δ W = B A \Delta W = BA Δ W = B A 可以做 SVD 得到 Δ W = U Σ V T = ∑ i = 1 r σ i u i v i T \Delta W = U\Sigma V^T = \sum_{i=1}^{r} \sigma_i \mathbf{u}_i \mathbf{v}_i^T Δ W = U Σ V T = ∑ i = 1 r σ i u i v i T 。每个秩一项 σ i u i v i T \sigma_i \mathbf{u}_i \mathbf{v}_i^T σ i u i v i T 代表一个”微调方向”——LoRA 的假设是,微调只需要 r r r 个这样的方向就够了。
下图展示了 LoRA 的架构:输入 x x x 同时经过冻结的 W 0 W_0 W 0 和可训练的低秩旁路 B A BA B A ,两路输出相加得到最终结果。
LoRA 架构:冻结 W₀ + 低秩旁路 BA
只训练 A 和 B(蓝色),W₀(灰色)完全冻结
x ∈ Rᵈ W₀ 冻结 (d×d) A r×d B d×r × α/r + h = W₀x + (α/r)BAx 可训练参数: 2rd (而非 d²)
初始化策略
LoRA 的初始化不是对称的——它确保训练开始时增量为零 :
A A A :从均值为 0 的高斯分布随机初始化,A i j ∼ N ( 0 , σ 2 ) A_{ij} \sim \mathcal{N}(0, \sigma^2) A ij ∼ N ( 0 , σ 2 )
B B B :初始化为零矩阵 ,B = 0 B = 0 B = 0
因此训练开始时 Δ W = B A = 0 ⋅ A = 0 \Delta W = BA = 0 \cdot A = 0 Δ W = B A = 0 ⋅ A = 0 ,模型的行为与预训练模型完全一致。这是一个重要的设计选择——它意味着 LoRA 微调从预训练模型的精确行为出发,逐步偏离,而不是从一个随机扰动出发。
为什么不反过来(A = 0 A = 0 A = 0 , B B B 随机)?两种选择都能保证初始增量为零。Hu et al. (2022) 在原始论文中选择 B = 0 B = 0 B = 0 的方案,后续实验也沿用了这一惯例。
Scaling Factor: α / r \alpha / r α / r
实际实现中,LoRA 在增量上乘以一个缩放因子(scaling factor):
h = W 0 x + α r B A x h = W_0 x + \frac{\alpha}{r} BAx h = W 0 x + r α B A x
其中 α \alpha α 是一个常数超参数(通常取 α = r \alpha = r α = r 或 α = 2 r \alpha = 2r α = 2 r )。
为什么需要缩放? 当改变秩 r r r 时,B A BA B A 的输出规模会随 r r r 变化。α r \frac{\alpha}{r} r α 的作用是稳定不同 r r r 下的学习动态——这样调整 r r r 时不需要重新搜索学习率。当 α = r \alpha = r α = r 时,缩放因子为 1,等价于无缩放。
在实践中,α \alpha α 通常固定为某个值(如 16 或 32),然后调整 r r r 。α r \frac{\alpha}{r} r α 确保了当 r r r 增大时,LoRA 增量的幅度不会不受控地增长。
Hu et al. (2022) 在原始论文中实验了将 LoRA 应用到 Transformer 不同层的效果。对于一个标准的 Transformer 层,权重矩阵包括:
矩阵 维度 说明 W Q W_Q W Q d × d k d \times d_k d × d k Query 投影 W K W_K W K d × d k d \times d_k d × d k Key 投影 W V W_V W V d × d v d \times d_v d × d v Value 投影 W O W_O W O d v × d d_v \times d d v × d Output 投影 W up W_{\text{up}} W up d × d ff d \times d_{\text{ff}} d × d ff MLP 上投影 W down W_{\text{down}} W down d ff × d d_{\text{ff}} \times d d ff × d MLP 下投影
实验表明,对 W Q W_Q W Q 和 W V W_V W V 同时应用 LoRA(即使只用 r = 4 r = 4 r = 4 )就能达到接近 Full Fine-Tuning 的性能。但在实践中,现代框架(如 PEFT, Hugging Face)通常对所有 attention 投影矩阵(W Q , W K , W V , W O W_Q, W_K, W_V, W_O W Q , W K , W V , W O )甚至 MLP 层同时应用 LoRA,以获得更好的效果。
参数量分析
单层参数量
对于一个 d × d d \times d d × d 的权重矩阵:
Full Fine-Tuning :d 2 d^2 d 2 个可训练参数
LoRA(秩 r r r ) :r × d + r × d = 2 r d r \times d + r \times d = 2rd r × d + r × d = 2 r d 个可训练参数
压缩比:
Compression Ratio = d 2 2 r d = d 2 r \text{Compression Ratio} = \frac{d^2}{2rd} = \frac{d}{2r} Compression Ratio = 2 r d d 2 = 2 r d
数值例子
GPT-2 (d = 768 d = 768 d = 768 , r = 8 r = 8 r = 8 ) :
Full FT: 768 2 = 589,824 768^2 = 589{,}824 76 8 2 = 589 , 824
LoRA: 2 × 8 × 768 = 12,288 2 \times 8 \times 768 = 12{,}288 2 × 8 × 768 = 12 , 288
压缩比: 589,824 12,288 = 48 × \frac{589{,}824}{12{,}288} = 48\times 12 , 288 589 , 824 = 48 ×
LLaMA-7B (d = 4096 d = 4096 d = 4096 , r = 8 r = 8 r = 8 ) :
Full FT: 4096 2 = 16,777,216 4096^2 = 16{,}777{,}216 409 6 2 = 16 , 777 , 216
LoRA: 2 × 8 × 4096 = 65,536 2 \times 8 \times 4096 = 65{,}536 2 × 8 × 4096 = 65 , 536
压缩比: 16,777,216 65,536 = 256 × \frac{16{,}777{,}216}{65{,}536} = 256\times 65 , 536 16 , 777 , 216 = 256 ×
LLaMA-65B (d = 8192 d = 8192 d = 8192 , r = 8 r = 8 r = 8 ) :
Full FT: 8192 2 = 67,108,864 8192^2 = 67{,}108{,}864 819 2 2 = 67 , 108 , 864
LoRA: 2 × 8 × 8192 = 131,072 2 \times 8 \times 8192 = 131{,}072 2 × 8 × 8192 = 131 , 072
压缩比: 67,108,864 131,072 = 512 × \frac{67{,}108{,}864}{131{,}072} = 512\times 131 , 072 67 , 108 , 864 = 512 ×
一个关键观察:模型越大,LoRA 的压缩比越高 。这是因为 Full FT 参数量与 d 2 d^2 d 2 成正比,而 LoRA 参数量与 d d d 成正比。这使得 LoRA 对大模型尤为重要。
交互可视化
拖动下面的滑块调整秩 r r r ,观察 LoRA 参数量如何随 r r r 和层维度 d d d 变化。
LoRA 参数量 vs Full Fine-Tuning
秩 r: 8
拖动滑块调整秩 r
GPT-2 (d=768) LLaMA-7B (d=4096) LLaMA-65B (d=8192)
单层参数量对比 — LLaMA-7B (d=4096), r=8 Full FT 16.8M LoRA 65.5K 压缩比: 256.0x 减少 (99.61%)
GPT-2 (d=768) LLaMA-7B (d=4096) LLaMA-65B (d=8192)
LoRA 参数量随秩 r 的变化 LoRA params = 2 r d (W ∈ ℝ^{ d × d }) 0 300.0K 600.0K 900.0K 1.0M 1 8 16 32 48 64 秩 r 参数量 r=8 12.3K 65.5K 131.1K 模型层 Full FT (d²) LoRA (2rd) 压缩比 GPT-2 (d=768) 589.8K 12.3K 48.0x LLaMA-7B (d=4096) 16.8M 65.5K 256.0x LLaMA-65B (d=8192) 67.1M 131.1K 512.0x
读图要点 :
柱状图 :直观对比 Full FT 与 LoRA 的参数量差距。即使 r = 64 r = 64 r = 64 ,LoRA 参数量仍然远小于 Full FT
折线图 :LoRA 参数量 2 r d 2rd 2 r d 随 r r r 线性增长。三条线的斜率分别为 2 d 2d 2 d ,维度 d d d 越大,斜率越陡——但由于 Full FT 是 d 2 d^2 d 2 ,即使斜率陡,绝对值仍远小于 d 2 d^2 d 2
表格 :对比三种典型模型规模的压缩比。d = 8192 d = 8192 d = 8192 时,r = 8 r = 8 r = 8 的 LoRA 只有 Full FT 的 1 512 \frac{1}{512} 512 1 参数
为什么 LoRA 有效?数学解释
为什么 LoRA 有效?三层数学解释 ① 内禀维度 θ = θ₀ + Pz LoRA = 结构化的子空间约束 ΔW=BA 的自由度 ≈ 2rd 2rd ≫ d_int → 有余量 ② 梯度低秩性 ∇ₗ ∈ span(q₁,...,qₖ) 梯度集中在 Hessian 前几个主方向上 低秩 ΔW 捕获主要梯度 ③ 隐式正则化 rank(ΔW) ≤ r ≪ d 限制秩 = 限制模型容量 ≈ 截断 SVD 去噪 保留主成分,去掉噪声 GPT-3 175B: r=4~8 就能匹配 Full FT 性能(增大 r 到 64+ 边际收益递减)
与内禀维度的联系
回忆 Art. 23 学习算子 中 Li et al. (2018) 的内禀维度框架:将参数限制在随机子空间 θ = θ 0 + P z \theta = \theta_0 + P\mathbf{z} θ = θ 0 + P z 中优化,只需极低的维度 d int d_{\text{int}} d int 就能恢复大部分性能。
LoRA 可以看作这个框架的一个结构化实例 。在 LoRA 中,每一层的权重增量 Δ W = B A \Delta W = BA Δ W = B A 被限制在秩为 r r r 的矩阵空间中。对于一个 d × d d \times d d × d 的矩阵,秩 ≤ r \leq r ≤ r 的矩阵构成一个维度为 r ( 2 d − r ) ≈ 2 r d r(2d - r) \approx 2rd r ( 2 d − r ) ≈ 2 r d (当 r ≪ d r \ll d r ≪ d )的流形。LoRA 的总可训练参数约为 L × 2 r d L \times 2rd L × 2 r d ,其中 L L L 是应用 LoRA 的层数。
Aghajanyan et al. (2021) 的实验显示,预训练模型微调的内禀维度 d int d_{\text{int}} d int 通常在数百的量级。而 LoRA 的可训练参数通常为数万到数十万——这远多于 d int d_{\text{int}} d int ,为覆盖有效子空间提供了充足的容量。
与矩阵 Taylor 展开的联系
从 Art. 5 矩阵微积分 中的矩阵 Taylor 展开出发,微调后的模型在某个输入 x x x 上的输出变化可以写为:
h ( W 0 + Δ W , x ) − h ( W 0 , x ) ≈ Δ W ⋅ x h(W_0 + \Delta W, x) - h(W_0, x) \approx \Delta W \cdot x h ( W 0 + Δ W , x ) − h ( W 0 , x ) ≈ Δ W ⋅ x
(对于线性层,这是精确的而非近似。)LoRA 将 Δ W \Delta W Δ W 限制为低秩——这等价于假设输出的变化只沿少数方向发生。
更深层地,损失函数的一阶 Taylor 展开为:
L ( W 0 + Δ W ) ≈ L ( W 0 ) + tr ( ∇ W L T Δ W ) \mathcal{L}(W_0 + \Delta W) \approx \mathcal{L}(W_0) + \text{tr}(\nabla_W \mathcal{L}^T \Delta W) L ( W 0 + Δ W ) ≈ L ( W 0 ) + tr ( ∇ W L T Δ W )
如果梯度 ∇ W L \nabla_W \mathcal{L} ∇ W L 本身(近似)低秩(这正是 Gur-Ari et al. (2018) 的发现——梯度集中在 Hessian 的前几个主方向上),那么一个低秩的 Δ W \Delta W Δ W 就足以捕获梯度中最重要的成分。
秩 r r r 的选择
秩 r r r 是 LoRA 最重要的超参数。Hu et al. (2022) 的实验发现:
对于 GPT-3 175B,r = 4 r = 4 r = 4 或 r = 8 r = 8 r = 8 就能在多数任务上匹配 Full Fine-Tuning 的性能
增大 r r r 到 64 或更高时,性能提升趋于饱和
不同任务的最优 r r r 可能不同——更复杂的任务可能需要更高的秩
直觉上,r r r 应该与微调任务的内禀维度 d int d_{\text{int}} d int 匹配。简单的分类任务(如情感分析)内禀维度低,r = 4 r = 4 r = 4 就够;复杂的生成任务可能需要 r = 16 r = 16 r = 16 或更高。
实践中的经验法则:
场景 推荐 r r r 简单分类/NLI 4–8 通用指令微调 16–32 复杂代码生成 32–64
与 Full Fine-Tuning 的等价性分析
一个自然的问题是:LoRA 是否在某种意义上等价于 Full Fine-Tuning?
理论上 :当 r = min ( d out , d in ) r = \min(d_{\text{out}}, d_{\text{in}}) r = min ( d out , d in ) 时,Δ W = B A \Delta W = BA Δ W = B A 可以表达任意 d out × d in d_{\text{out}} \times d_{\text{in}} d out × d in 矩阵——此时 LoRA 的表达能力与 Full Fine-Tuning 完全一致。
实践中 :r ≪ d r \ll d r ≪ d 时,LoRA 是 Full Fine-Tuning 的一个正则化版本。它通过限制 Δ W \Delta W Δ W 的秩,隐式地施加了一个正则化约束——阻止模型在高维空间中过度拟合。这类似于 Art. 3 SVD 中截断 SVD 丢弃小奇异值的效果:保留主要成分,去掉噪声。
Hu et al. (2022) 的实验表明,在大多数下游任务上,LoRA (r = 8 r = 8 r = 8 ) 的性能与 Full Fine-Tuning 的差距在 1% 以内。这个结果有力地验证了内禀维度理论的预测:微调的有效子空间确实是低维的。
LoRA 的推理优化
训练 W₀ 冻结 + BA 可训练 合并 W = W₀ + (α/r)BA 推理部署 单个 W,零额外延迟 多任务部署:共享 W₀ + 切换 (A,B) 模块 存储:d² + N×2rd(而非 N×d²)
LoRA 有一个对推理非常友好的性质:训练完成后,可以将低秩增量合并回原始权重 :
W = W 0 + α r B A W = W_0 + \frac{\alpha}{r}BA W = W 0 + r α B A
合并后的 W W W 是一个标准的 d × d d \times d d × d 矩阵,推理时不需要任何额外计算——没有延迟开销。这使得 LoRA 在推理效率上完全等价于原始模型。
对比其他参数高效微调方法:
方法 推理延迟 原因 LoRA(合并后) 无额外延迟 增量合并回权重 Adapter 有额外延迟 需要额外的前向传播步骤 Prefix Tuning 有额外延迟 增加了序列长度
另外,多任务场景下可以共享 W 0 W_0 W 0 、切换 LoRA 模块 。对于 N N N 个下游任务,只需存储 N N N 个小的 ( A , B ) (A, B) ( A , B ) 矩阵对,加上一份共享的 W 0 W_0 W 0 ——存储从 N × d 2 N \times d^2 N × d 2 降到 d 2 + N × 2 r d d^2 + N \times 2rd d 2 + N × 2 r d 。
变体与进展
LoRA 的核心框架催生了一系列重要变体,每个变体解决 LoRA 的一个特定局限。
QLoRA: 量化 + 低秩
QLoRA:量化 × 低秩的正交组合 x W̃₀ (4-bit NF4) 冻结 · 量化 · 节省 4× 显存 B A · FP16/BF16 · 可训练 + h = Dequant(W̃₀)x + BAx 三大技术 1. NF4 量化 2. Double Quant. 3. Paged Optim. 效果:单张 48GB GPU 微调 65B 模型,性能 ≈ 16-bit Full FT
QLoRA (Quantized LoRA, Dettmers et al., 2023)是 LoRA 最重要的变体之一。它的核心思想是:
h = Dequant ( W ~ 0 ) ⋅ x + B A x h = \text{Dequant}(\tilde{W}_0) \cdot x + BAx h = Dequant ( W ~ 0 ) ⋅ x + B A x
其中 W ~ 0 \tilde{W}_0 W ~ 0 是 W 0 W_0 W 0 的 4-bit 量化版本。QLoRA 引入了三个关键技术:
1. 4-bit NormalFloat (NF4) 量化
NF4 是一种信息论最优的数据类型。它基于一个观察:预训练权重近似服从均值为 0 的正态分布 N ( 0 , σ 2 ) \mathcal{N}(0, \sigma^2) N ( 0 , σ 2 ) 。NF4 将正态分布的分位数(quantile)作为量化网格点,使得每个量化区间包含相等的概率质量——这是对正态分布的信息论最优量化。
2. Double Quantization
量化常数(quantization constants)本身也被量化。标准的 blockwise 量化为每个 block(如 64 个权重)存储一个 FP32 的缩放因子,这额外占用 32 / 64 = 0.5 32/64 = 0.5 32/64 = 0.5 bit/param。Double quantization 将这些缩放因子再做一次 8-bit 量化,把额外开销降到约 0.127 bit/param。
3. Paged Optimizers
使用 NVIDIA Unified Memory 实现优化器状态的 CPU-GPU 分页,避免 GPU 显存溢出。
核心组合思路 :QLoRA 将”量化”和”低秩”两种压缩思路正交组合——量化压缩已有的预训练权重 (从 16-bit 到 4-bit),LoRA 压缩新增的微调参数 (低秩约束)。两者互不干扰:
W ~ 0 ⏟ 4-bit 量化 + α r B A ⏟ 低秩增量 (FP16/BF16) \underbrace{\tilde{W}_0}_{\text{4-bit 量化}} + \underbrace{\frac{\alpha}{r}BA}_{\text{低秩增量 (FP16/BF16)}} 4-bit 量化 W ~ 0 + 低秩增量 (FP16/BF16) r α B A
效果:QLoRA 可以在单张 48 GB GPU(如 A6000)上微调 65B 参数的模型,性能与 16-bit Full Fine-Tuning 几乎一致。
LQ-LoRA: 低秩 + 量化联合分解
LQ-LoRA (Guo et al., ICLR 2024)进一步将低秩分解和量化统一到一个框架中。不同于 QLoRA 先量化再加 LoRA,LQ-LoRA 对每个权重矩阵做联合分解:
W ≈ Q + L R W \approx Q + LR W ≈ Q + L R
其中 Q Q Q 是量化矩阵,L , R L, R L , R 是低秩矩阵。分解目标是最小化:
min Q , L , R ∥ W − Q − L R ∥ F 2 \min_{Q, L, R} \|W - Q - LR\|_F^2 min Q , L , R ∥ W − Q − L R ∥ F 2
这种联合优化的关键优势是:低秩部分 L R LR L R 可以补偿量化误差 ——Q Q Q 中的量化噪声被 L R LR L R 的连续值部分吸收。相比 QLoRA 的”先量化后适配”的级联方式,联合分解能更好地在量化精度和低秩容量之间分配”误差预算”。
LoRA+: 差异化学习率
LoRA+ (Hayou et al., ICML 2024)观察到 LoRA 中 A A A 和 B B B 的最优学习率应该不同:
A t + 1 = A t − η A ∇ A L , B t + 1 = B t − η B ∇ B L A_{t+1} = A_t - \eta_A \nabla_A \mathcal{L}, \quad B_{t+1} = B_t - \eta_B \nabla_B \mathcal{L} A t + 1 = A t − η A ∇ A L , B t + 1 = B t − η B ∇ B L
其中 η B ≫ η A \eta_B \gg \eta_A η B ≫ η A (通常 η B / η A ≈ 16 \eta_B / \eta_A \approx 16 η B / η A ≈ 16 )。
直觉上,A A A 决定了从输入空间中”选择哪些方向”(投影),B B B 决定了”在输出空间中如何表达”(重建)。由于 B B B 初始化为零,它需要更大的学习率来快速离开零点附近的平坦区域。
LoRA+ 的实验显示,这种差异化学习率可以将训练速度提升 2 倍,并略微改善最终性能。
rsLoRA: 秩稳定化缩放
rsLoRA (Rank-Stabilized LoRA, Kalajdzievski, 2023)指出 LoRA 的标准缩放因子 α / r \alpha / r α / r 在不同秩下的行为不一致。当 r r r 增大时,B A BA B A 的输出方差会增大(因为求和的项变多),但 α / r \alpha / r α / r 的补偿不足。
rsLoRA 提出用 α / r \alpha / \sqrt{r} α / r 替代 α / r \alpha / r α / r :
h = W 0 x + α r B A x h = W_0 x + \frac{\alpha}{\sqrt{r}} BAx h = W 0 x + r α B A x
这个修正确保了:无论 r r r 取什么值,LoRA 增量的输出方差保持稳定。数学上,如果 A A A 和 B B B 的元素独立同分布,B A BA B A 的每个元素是 r r r 个随机变量的和,方差正比于 r r r ,标准差正比于 r \sqrt{r} r 。除以 r \sqrt{r} r 正好归一化方差。
实践中,rsLoRA 在大 r r r (如 r ≥ 32 r \geq 32 r ≥ 32 )时效果尤为明显。
NNCF lora_correction: 补偿量化误差
NNCF(Neural Network Compression Framework) 中实现了一种称为 lora_correction 的技术。核心思想是用低秩矩阵补偿权重量化引入的误差:
W corrected = Quant ( W ) + Δ W correction W_{\text{corrected}} = \text{Quant}(W) + \Delta W_{\text{correction}} W corrected = Quant ( W ) + Δ W correction
其中 Δ W correction = B A \Delta W_{\text{correction}} = BA Δ W correction = B A 是一个低秩矩阵,通过最小化 ∥ W − Quant ( W ) − B A ∥ F 2 \|W - \text{Quant}(W) - BA\|_F^2 ∥ W − Quant ( W ) − B A ∥ F 2 来训练。
这与 LoRA 的微调用途不同——lora_correction 的目标不是适配下游任务,而是还原量化前的精度 。但数学形式完全一致:都是用低秩矩阵 B A BA B A 来近似一个目标矩阵(微调中是 Δ W task \Delta W_{\text{task}} Δ W task ,量化补偿中是 W − Quant ( W ) W - \text{Quant}(W) W − Quant ( W ) )。
变体总结
变体 核心改进 解决的问题 QLoRA 4-bit NF4 量化 + LoRA 显存不够大 LQ-LoRA 量化+低秩联合分解 量化误差大 LoRA+ η B ≫ η A \eta_B \gg \eta_A η B ≫ η A 训练速度慢 rsLoRA α / r \alpha/\sqrt{r} α / r 缩放不同 r r r 下不稳定 lora_correction 低秩矩阵补偿量化误差 量化精度损失
数值验证
让我们用一个具体的数值例子,验证 LoRA 的参数量计算和推理合并。
设定
取 LLaMA-7B 的一个 attention 层的 W Q W_Q W Q 矩阵:d = 4096 d = 4096 d = 4096 ,r = 8 r = 8 r = 8 ,α = 16 \alpha = 16 α = 16 。
参数量 :
LoRA 参数 = 2 × r × d = 2 × 8 × 4096 = 65,536 \text{LoRA 参数} = 2 \times r \times d = 2 \times 8 \times 4096 = 65{,}536 LoRA 参数 = 2 × r × d = 2 × 8 × 4096 = 65 , 536
Full FT 参数 = d 2 = 4096 2 = 16,777,216 \text{Full FT 参数} = d^2 = 4096^2 = 16{,}777{,}216 Full FT 参数 = d 2 = 409 6 2 = 16 , 777 , 216
压缩比 = 16,777,216 65,536 = 256 × \text{压缩比} = \frac{16{,}777{,}216}{65{,}536} = 256\times 压缩比 = 65 , 536 16 , 777 , 216 = 256 ×
Scaling factor :
α r = 16 8 = 2 \frac{\alpha}{r} = \frac{16}{8} = 2 r α = 8 16 = 2
推理合并 :
训练完成后,合并权重:
W merged = W 0 + α r B A = W 0 + 2 ⋅ B A W_{\text{merged}} = W_0 + \frac{\alpha}{r}BA = W_0 + 2 \cdot BA W merged = W 0 + r α B A = W 0 + 2 ⋅ B A
W merged ∈ R 4096 × 4096 W_{\text{merged}} \in \mathbb{R}^{4096 \times 4096} W merged ∈ R 4096 × 4096 ,推理时直接用 W merged W_{\text{merged}} W merged 替代 W 0 W_0 W 0 ,无额外开销。
LLaMA-7B 全模型 LoRA 参数量估算
LLaMA-7B 有 32 层 Transformer,每层有 4 个 attention 投影(W Q , W K , W V , W O W_Q, W_K, W_V, W_O W Q , W K , W V , W O ,维度均为 4096 × 4096 4096 \times 4096 4096 × 4096 )。如果对所有 attention 投影应用 LoRA (r = 8 r = 8 r = 8 ):
LoRA 总参数 = 32 × 4 × 2 × 8 × 4096 = 8,388,608 ≈ 8.4 M \text{LoRA 总参数} = 32 \times 4 \times 2 \times 8 \times 4096 = 8{,}388{,}608 \approx 8.4\text{M} LoRA 总参数 = 32 × 4 × 2 × 8 × 4096 = 8 , 388 , 608 ≈ 8.4 M
对比模型总参数 ≈ 6.7 B \approx 6.7\text{B} ≈ 6.7 B ,LoRA 可训练参数仅占 ≈ 0.13 % \approx 0.13\% ≈ 0.13% 。
总结与展望
本文建立了 LoRA 的完整数学框架,从理论基础到实践细节。回顾关键要点:
核心公式 h = W 0 x + α r B A x h = W_0 x + \frac{\alpha}{r}BAx h = W 0 x + r α B A x :冻结预训练权重 W 0 W_0 W 0 ,只训练低秩增量 Δ W = B A \Delta W = BA Δ W = B A (B ∈ R d × r B \in \mathbb{R}^{d \times r} B ∈ R d × r ,A ∈ R r × d A \in \mathbb{R}^{r \times d} A ∈ R r × d ,r ≪ d r \ll d r ≪ d )
初始化 :A ∼ N ( 0 , σ 2 ) A \sim \mathcal{N}(0, \sigma^2) A ∼ N ( 0 , σ 2 ) ,B = 0 B = 0 B = 0 ,确保训练开始时 Δ W = 0 \Delta W = 0 Δ W = 0
理论基础 :内禀维度理论(Li et al., 2018; Aghajanyan et al., 2021)解释了为什么低秩增量就足够——微调的有效维度远低于参数总数
参数效率 :压缩比 d / ( 2 r ) d / (2r) d / ( 2 r ) ,对于 LLaMA-7B (d = 4096 d = 4096 d = 4096 , r = 8 r = 8 r = 8 ) 达到 256 倍压缩,可训练参数仅占总参数的 0.13%
推理无开销 :训练后合并 W = W 0 + α r B A W = W_0 + \frac{\alpha}{r}BA W = W 0 + r α B A ,推理时完全等价于原始模型
重要变体 :QLoRA(4-bit 量化 + LoRA)、LoRA+(差异化学习率)、rsLoRA(α / r \alpha/\sqrt{r} α / r 缩放)、LQ-LoRA(联合分解)、lora_correction(量化误差补偿)
LoRA 是 Part 1 工具在 Part 3 语境下的直接应用:Art. 3 SVD 的低秩近似思想变成了参数化策略,Art. 5 矩阵微积分 的 Taylor 展开和 Hessian 分析解释了低秩更新的有效性。同一套数学工具——从分解到优化——贯穿了理论和实践。
下一篇 我们进入第二个应用方向:Efficient Attention ——利用注意力矩阵的近似低秩性降低 O ( n 2 ) O(n^2) O ( n 2 ) 的计算复杂度。如果说 LoRA 利用了权重增量 Δ W \Delta W Δ W 的低秩性来压缩训练 ,Efficient Attention 则利用注意力矩阵 softmax ( Q K T / d k ) \text{softmax}(QK^T/\sqrt{d_k}) softmax ( Q K T / d k ) 的低秩性来加速推理 ——同一个数学原理,不同的切入点。