训练与优化 / 微调与蒸馏 原理笔记入门 3 分钟阅读 查看源文件 ↗

LoRA 原理#

TL;DR#

本页内容7 个部分

1. 背景与问题#

全量微调更新所有权重,需要保存相应梯度与优化器状态,每个任务还要存一份完整参数。LoRA(Low-Rank Adaptation,低秩适配)把任务适配限制在较小的增量分支中:冻结原权重,训练两个低秩因子,减少可训练状态与任务专属存储。[1]

2. 目标与定义#

仍然最小化任务损失,改变的是允许训练的参数。设输入 x∈Rdinx\in\mathbb R^{d_{\mathrm{in}}},基础权重 W0∈Rdout×dinW_0\in\mathbb R^{d_{\mathrm{out}}\times d_{\mathrm{in}}},选择秩上限 rr。用 A∈Rr×dinA\in\mathbb R^{r\times d_{\mathrm{in}}}、B∈Rdout×rB\in\mathbb R^{d_{\mathrm{out}}\times r} 表示增量,固定缩放 s=α/rs=\alpha/r:

min⁡A,B  E[ℓ(fW0+sBA(x),y)],W0 保持冻结。\min_{A,B}\;\mathbb E[\ell(f_{W_0+sBA}(x),y)],\qquad W_0\text{ 保持冻结。}

它把搜索空间限制为秩不超过 rr 的单层增量;低秩是方法施加的约束,不是所有任务最优更新都满足的定理。

3. 方法与推导#

3.1 两个小矩阵怎样替代完整增量#

前向为 h=W0x+sB(Ax)h=W_0x+sB(Ax):先投影到 rr 维,再映回输出维,因此 ΔW=sBA\Delta W=sBA 的秩最多为 rr。训练参数从 doutdind_{\mathrm{out}}d_{\mathrm{in}} 减为 r(din+dout)r(d_{\mathrm{in}}+d_{\mathrm{out}})。[1]

例如 4096×40964096\times4096 投影取 r=16r=16,全量参数为 16,777,216 个,LoRA 为 131,072 个,占 0.78125%;BF16 adapter 裸权重为 256 KiB,不含梯度、优化器、激活与文件元信息。

3.2 梯度怎样进入两个因子#

令 δ=∂ℓ/∂h\delta=\partial\ell/\partial h,链式法则给出:

∇Bℓ=sδ(Ax)⊤,∇Aℓ=sB⊤δx⊤.\nabla_B\ell=s\delta(Ax)^\top,\qquad\nabla_A\ell=sB^\top\delta x^\top.

随机 AA、B=0B=0 时,初始增量为零,BB 通常先获得梯度,AA 的首步任务梯度为零。冻结 W0W_0 并不阻断梯度穿过主体传播到更早的 adapter;完整初始化比较见微调实践。

4. 计算过程#

用二维线性层手算一次 SGD:W0=I2W_0=I_2、x=(1,2)⊤x=(1,2)^\top、标签为零向量,损失为 ∥h∥22/2\|h\|_2^2/2。取 r=α=1r=\alpha=1,A=(1,−1)A=(1,-1),B=(0,0)⊤B=(0,0)^\top,学习率 0.1:

步骤 计算结果
初始前向 Ax=−1Ax=-1,h=W0x=(1,2)⊤h=W_0x=(1,2)^\top,loss = 2.5
反向 δ=(1,2)⊤\delta=(1,2)^\top,∇Bℓ=(−1,−2)⊤\nabla_B\ell=(-1,-2)^\top,∇Aℓ=0\nabla_A\ell=0
更新因子 B′=(0.1,0.2)⊤B'=(0.1,0.2)^\top,A′=AA'=A
再次前向 h′=(1,2)⊤+B′(−1)=(0.9,1.8)⊤h'=(1,2)^\top+B'(-1)=(0.9,1.8)^\top
更新后 loss (0.92+1.82)/2=2.025(0.9^2+1.8^2)/2=2.025

同一结果可由合并权重 W0+B′AW_0+B'A 计算。这是小矩阵演算,没有声称真实微调中每步 loss 都下降。

5. 比较与边界#

可在 Q/K/V/O、MLP 等矩阵添加 LoRA;扩散模型也可适配注意力或部分卷积。插入范围与 rank 一起决定可训练参数,不能仅凭 rank 估计整个模型 adapter 大小。

增大 rank 扩大允许的增量空间,也增加成本;收益要用固定数据、预算与评测比较。普通线性层在评测模式下可合并为 W0+sBAW_0+sBA;量化权重的合并可能涉及反量化与重新量化,存在额外误差。冻结基础参数保留了原文件,启用增量后的原有能力仍需评测。

参考资料#

  1. LoRA(ICLR 2022). §4 与 §7:低秩参数化、初始化、矩阵选择与 rank 实验。

相关阅读路线

完成一次训练更新 ↗