LoRA 原理#
TL;DR#
本页内容7 个部分
1. 背景与问题#
全量微调更新所有权重,需要保存相应梯度与优化器状态,每个任务还要存一份完整参数。LoRA(Low-Rank Adaptation,低秩适配)把任务适配限制在较小的增量分支中:冻结原权重,训练两个低秩因子,减少可训练状态与任务专属存储。[1]
2. 目标与定义#
仍然最小化任务损失,改变的是允许训练的参数。设输入 x∈Rdin,基础权重 W0∈Rdout×din,选择秩上限 r。用 A∈Rr×din、B∈Rdout×r 表示增量,固定缩放 s=α/r:
A,BminE[ℓ(fW0+sBA(x),y)],W0 保持冻结。
它把搜索空间限制为秩不超过 r 的单层增量;低秩是方法施加的约束,不是所有任务最优更新都满足的定理。
3. 方法与推导#
3.1 两个小矩阵怎样替代完整增量#
前向为 h=W0x+sB(Ax):先投影到 r 维,再映回输出维,因此 ΔW=sBA 的秩最多为 r。训练参数从 doutdin 减为 r(din+dout)。[1]
例如 4096×4096 投影取 r=16,全量参数为 16,777,216 个,LoRA 为 131,072 个,占 0.78125%;BF16 adapter 裸权重为 256 KiB,不含梯度、优化器、激活与文件元信息。
3.2 梯度怎样进入两个因子#
令 δ=∂ℓ/∂h,链式法则给出:
∇Bℓ=sδ(Ax)⊤,∇Aℓ=sB⊤δx⊤.
随机 A、B=0 时,初始增量为零,B 通常先获得梯度,A 的首步任务梯度为零。冻结 W0 并不阻断梯度穿过主体传播到更早的 adapter;完整初始化比较见微调实践。
4. 计算过程#
用二维线性层手算一次 SGD:W0=I2、x=(1,2)⊤、标签为零向量,损失为 ∥h∥22/2。取 r=α=1,A=(1,−1),B=(0,0)⊤,学习率 0.1:
同一结果可由合并权重 W0+B′A 计算。这是小矩阵演算,没有声称真实微调中每步 loss 都下降。
5. 比较与边界#
可在 Q/K/V/O、MLP 等矩阵添加 LoRA;扩散模型也可适配注意力或部分卷积。插入范围与 rank 一起决定可训练参数,不能仅凭 rank 估计整个模型 adapter 大小。
增大 rank 扩大允许的增量空间,也增加成本;收益要用固定数据、预算与评测比较。普通线性层在评测模式下可合并为 W0+sBA;量化权重的合并可能涉及反量化与重新量化,存在额外误差。冻结基础参数保留了原文件,启用增量后的原有能力仍需评测。
参考资料#
- LoRA(ICLR 2022). §4 与 §7:低秩参数化、初始化、矩阵选择与 rank 实验。