第 5 章 参数高效微调:LoRA 与 QLoRA¶
开场问题:LoRA 只训练 0.1% 的参数,为什么能接近全量微调?这个“低秩”到底低在哪里?
5.1 从权重更新矩阵出发¶
全量微调把某个线性层 \(W\in\mathbb R^{d_{out}\times d_{in}}\) 更新为 \(W+\Delta W\)。LoRA 假设任务适配所需的变化 \(\Delta W\) 近似低秩,把它写成:
其中 \(A\in\mathbb R^{r\times d_{in}}\),\(B\in\mathbb R^{d_{out}\times r}\),且 \(r\) 远小于输入输出维度。前向变成:
冻结 W,只训练 A、B。若一个 4096×4096 的矩阵取 r=16,全量更新需约 1680 万参数,LoRA 只需约 13 万,缩小 128 倍。
“低秩”不是说原权重低秩,而是说为了适配这个任务,所需的增量位于一个低维子空间。预训练已经给出绝大多数能力,后训练往往只需重新组合。
5.2 初始化为什么一个随机、一个全零¶
通常 A 随机初始化,B 初始化为零。这样训练开始时 \(BA=0\),模型行为与基座完全相同;但 A 非零使 B 在第一步就能收到梯度。若两者都为零,梯度链会卡住。
缩放 \(\alpha/r\) 控制增量强度。调 r 时若不同时考虑 alpha,实际步长会变化,比较就不公平。rsLoRA 使用 \(\alpha/\sqrt r\) 改善大 rank 下的缩放稳定性。
5.3 插在哪些层¶
最早常只插 attention 的 q_proj 和 v_proj,省参数但能力有限。现代做法常对所有主要线性层加 LoRA:q/k/v/o 以及 FFN 的 gate/up/down。
选择依据:
- 格式和风格适配,attention 投影可能已够。
- 领域知识、复杂推理或工具能力,需要覆盖 FFN。
- embedding 和 lm_head 是否训练要单独决定;新词或特定输出标签可能需要。
应报告 target modules,而不能只说“用了 LoRA”。不同插入位置的参数量和效果差别很大。
5.4 rank 不是越大越好¶
r 决定增量空间容量。太小欠拟合,太大增加显存并可能过拟合;超过某个点后接近全量微调,却仍受低秩参数化限制。
合理方法是看任务复杂度、数据量和模型尺寸做小范围扫描,并观察奇异值:若训练后的增量只有少数奇异值显著,rank 还有富余;若全部维度都被用满且性能仍增长,才考虑增大。
不同层可能需要不同 rank,AdaLoRA 等方法会动态分配预算。但在证明固定 rank 不够之前,不要先引入复杂自适应方案。
5.5 LoRA 的显存到底省在哪¶
冻结基座后不需要为 W 保存梯度和优化器状态,训练状态只属于 A、B;这是最大节省。前向和反向仍要经过完整基座,激活显存并不会按参数比例缩小,所以长序列训练仍需重计算和第二册的并行技术。
LoRA 省“可训练参数状态”,不是让大模型突然变成小模型。基座权重仍要放进 GPU,除非进一步做 QLoRA。
5.6 QLoRA:量化基座,训练高精度增量¶
QLoRA 把冻结的基座权重量化成 4 bit(常用 NF4),计算时按块反量化到 bf16,再与 bf16 的 LoRA 分支一起计算。关键点是:4 bit 权重不更新,只有 LoRA 参数更新。
NF4 针对近似正态分布的神经网络权重设计非均匀刻度;double quantization 再量化 scale,进一步省内存;paged optimizer 用统一内存缓解偶发峰值。这些共同构成原始 QLoRA 方案,不等于“任何 INT4 + LoRA”。
代价是训练速度可能比 bf16 LoRA 慢,因为每次计算都要反量化。QLoRA 首先解决“放不下”,不是必然加速。
5.7 合并、部署和多适配器¶
训练完可把 \(\Delta W\) 合并进 W,得到普通权重,推理没有额外分支;也可以保留独立适配器,运行时动态选择。后者适合多租户,但会影响批处理:同一 batch 内适配器不同,kernel 和缓存管理更复杂。
多个 LoRA 直接相加不保证能力可组合。它们可能在同一方向上冲突。模型合并、线性插值、TIES/DARE 等属于独立技术,需要在联合任务上重新评测,不能把“数学上能加”理解成“行为上能兼容”。
5.8 LoRA 与全量微调怎么选¶
LoRA 优先:数据规模中小、预算有限、需要多个任务适配器、强调快速回滚。全量微调优先:数据量足、需要深度改变分布、追求单一任务极限,且有能力做全面回归。
公平比较必须控制数据、训练 token、调参预算和 target modules。拿精调过的 LoRA 对一个默认学习率的全量微调,没有结论价值。
核心问答¶
Q:LoRA 为什么有效? 基座已包含大部分通用能力,特定任务通常只需在低维方向上重组行为,因此权重增量可近似低秩。
Q:QLoRA 会更新 4 bit 权重吗? 不会。量化基座冻结,只训练高精度 LoRA 参数;因此不存在对离散 4 bit 权重直接求梯度的问题。
Q:LoRA 为什么仍会 OOM? 它主要省梯度和优化器状态,激活仍随 batch 和序列长度增长,基座也必须驻留。
Q:多个 LoRA 能直接叠加吗? 数值上能,行为上未必。必须在联合任务和回归集上验证冲突。