← 返回列表

LoRA 微调:原理、参数怎么选、常见坑与解法

摘要

LoRA(Low-Rank Adaptation)是当前最主流的参数高效微调方法:冻结预训练权重,只训练旁挂在旁边的两条低秩矩阵。本文先讲清它成立的原理——“针对下游任务的更新是低秩的”这个假设,以及初始化、缩放、合并三个实现细节;再给出 r、α、目标模块、学习率四个旋钮的选择经验;最后梳理六类常见问题(性能天花板、学得少忘得少的两面性、训练不稳定、QLoRA 的坑、部署合并的坑、过拟合)与对应解法。

0. 为什么需要 LoRA:全参微调的三个痛点

全参微调(full fine-tuning)把模型所有参数都当作可训练参数,随之而来三个痛点:

  • 显存:训练时要为每个参数存梯度,还要存优化器状态,训练显存是推理的数倍。模型越大,账单越夸张。
  • 遗忘:所有参数被带离预训练最优点,旧能力容易退化——尤其数据量小、领域窄的时候。
  • 部署:每个任务产出一份全量权重,多任务时存储和加载成本线性叠加。

场景例子:你要给同一个 7B 基座做三个领域的 SFT(医疗问答、代码助手、公文写作)。全参微调要训出三份全量权重、付三份训练账单;LoRA 只需要一个共享的冻结主干,每个领域各训一个几十 MB 的旁路——切换任务就是换一个”插件”。

可以把它记成:全参微调是给每件衣服重新做一件,LoRA 是同一个模特换配饰。

1. 原理:冻结主干,旁路低秩更新

1.1 核心假设:更新是低秩的

LoRA 的出发点是一个假设:预训练权重针对某个下游任务的”理想更新” ΔW\Delta W 是低秩的——不需要动满整个矩阵,用一个小秩子空间就能近似。这受”预训练模型有内在低维性”研究的启发:大模型适配任务时,真正有效的参数变化方向其实很少。

基于这个假设,把更新拆成两个瘦矩阵的乘积:

h=W0x+αr BAx,B∈Rd×r,  A∈Rr×k(1)h = W_0 x + \frac{\alpha}{r}\, B A x, \qquad B \in \mathbb{R}^{d \times r},\; A \in \mathbb{R}^{r \times k} \tag{1}
(1)

式 (1) 的解读:W0W_0 冻结不动,只训练 BB、AA 两个窄矩阵,rr 是旁路的秩,远小于 dd、kk。

全参微调:  W₀ ──训练──▶ W₀ + ΔW          整块矩阵都在动,ΔW 是稠密的
LoRA:      W₀ ──冻结──▶ W₀ + (α/r)·B·A   主干不动,只动两条窄旁路
                                           d×r      r×k

参数量从 dkd k 降到 r(d+k)r(d+k):当 rr 远小于 min⁡(d,k)\min(d,k) 时,可训练参数缩小约 min⁡(d,k)/2r\min(d,k)/2r 倍——对 7B 模型,r=8r=8 的旁路通常只占全量参数的零点几个百分点。

大白话:旁路就是给主干的更新开一条窄窄的专用通道。通道越窄(rr 越小),省得越多,但能通过的更新也越少。

1.2 初始化与缩放:两个容易忽略的细节

  • 初始化:AA 用随机高斯初始化,BB 初始化为零。这样训练开始时 BA=0BA = 0,模型行为与预训练完全一致——不会一开局就破坏主干的输出。
  • 缩放因子 α/r\alpha/r:把旁路输出放大 α/r\alpha/r 倍再注入主干。它和学习率一起决定”更新有多强”,是 §2.2 的主角。

1.3 推理时合并

训练结束后,旁路可以直接加回主干:W=W0+(α/r)BAW = W_0 + (\alpha/r)BA。合并后推理零额外开销。不合并也行:主干共享、旁路动态切换,代价是每次前向多一次小矩阵乘——这是”一个主干 + 多个任务插件”的物理基础。

2. 四个旋钮怎么选

要点:rr 起步 8~16,复杂任务再加;α\alpha 惯例取 2r2r;目标模块优先 q、v,预算够就全注意力加 MLP;学习率比全参微调高一个数量级左右。

2.1 rank r:通道宽度

rr 决定旁路的表达能力上限,经验规律:

  • 任务离预训练分布越远,需要的 rr 越大。领域 SFT(换语气、加格式)r=8r=8 常常够用;代码、强推理、新语言这类”改脑子”的任务要 16~64 甚至更高。
  • LoRA 原论文在 GPT-3 上 rr 取 1~8 就在多个任务上达到可观效果——这说明很多任务的更新确实很”窄”。
  • 瓶颈不在 rr 而在别处时,加 rr 只增加过拟合风险,不涨效果。

判断方法:把 rr 翻倍,验证集没涨,就说明瓶颈在数据、步数或目标模块,不在秩。

2.2 α 与缩放 α/r

α\alpha 是”把旁路更新放大多少倍”的旋钮,等效更新强度正比于 α/r\alpha/r。惯例取 α=2r\alpha = 2r(缩放为 2)或 α=r\alpha = r(缩放为 1)。注意 α\alpha 和学习率有耦合:前者动的是”更新强度”,后者动的是”优化步长”——实践中二选一细调即可,不必两个都动。

可以把它记成:rr 决定”能装多少”,α/r\alpha/r 决定”装进去的东西说话声音多大”。

2.3 target modules:往哪插旁路

  • 经典起步:注意力层的 q、v 投影。LoRA 原论文发现给 q、v 上旁路性价比最高,这是多数开源 recipe 的默认配置。
  • 想要更好:全注意力(q、k、v、o)加 MLP 全上,效果通常最好,代价是旁路参数翻倍。
  • embedding / lm_head 一般不碰:它们是词表接口,低秩更新作用有限,还占参数。
  • 层间均匀加最稳;只给最后几层加是省参数的折中,但更容易碰到性能天花板。

2.4 其余超参

  • 学习率:比全参微调高一个数量级左右。旁路是”新生的”参数,梯度信号足,可以大步走——全参 SFT 常用 1e-5 量级,LoRA 用 1e-4 量级。
  • dropout:小数据集上给旁路加 0.05~0.1 防过拟合。
  • 步数:与全参同量级,不需要额外加长。

3. 常见问题与解法

要点:六类典型问题——性能天花板(§3.1)、“学得少忘得少”的两面性(§3.2)、训练不稳定(§3.3)、与量化结合的坑(§3.4)、部署合并的坑(§3.5)、过拟合(§3.6)。

3.1 性能不如全参微调:天花板问题

现象:同样数据、同样步数,LoRA 比全参微调低一截,复杂任务(代码、数学、多步推理)差距更明显。

原因:低秩约束本身限制了搜索空间;Biderman 等的实证也确认 LoRA 学得比全参微调少(当然忘得也少,见 §3.2)。

解法:① 加 rr、加 target modules;② 换 DoRA——把权重分解成”幅度 × 方向”,只对方向做低秩更新,学习能力更强;③ 混合策略:最关键几层全参、其余层 LoRA。

3.2 “学得少、忘得少”的两面性

Biderman 等在代码与数学任务上对比 LoRA 和全参微调,结论是:全参微调学得多、忘得也多;LoRA 学得少,但旧能力保留得好。这既是优点也是缺点:

  • 目标要”保住旧能力”(通用助手迭代、多领域并行)→ LoRA 天然合适,主干冻结就是最硬的遗忘防线。
  • 目标要”彻底改变行为”(强风格转换、进全新领域)→ LoRA 可能推不动,考虑全参或 §3.1 的加强手段。

3.3 训练不稳定:加大 r 反而变差

现象:把 rr 加到 256 以上后收敛变差、损失抖动——明明表达能力更强了,训练却更糟。

原因:缩放 α/r\alpha/r 随 rr 增大而缩小,从零初始化的 BB 得到的有效更新量级不对;AA、BB 角色不对称(一个读、一个写),却用同样的学习率。

解法:① rsLoRA:把缩放改成 α/r\alpha/\sqrt{r},从理论上保证 rr 增大时训练依然稳定;② LoRA+:给 BB 用比 AA 大数倍的学习率(ηB=ληA\eta_B = \lambda\eta_A,λ\lambda 常取 242^4 量级),让”解码器”跟上”编码器”。

大白话:AA 负责读、BB 负责写,两者从不同的起点出发却用同样的步长走路,BB 自然跟不上;分学习率就是给 BB 配一双更长的腿。

3.4 与量化结合(QLoRA)的坑

QLoRA 把主干压成 4-bit(NF4 格式)再冻结,旁路保持高精度,让单卡训大模型成为可能。三个坑:

  • 容量受限:量化主干加低秩旁路双重受限,复杂任务上的增益有限——只建议在显存真不够时用。
  • 速度:每次前向要把量化权重反量化回高精度再计算,比普通 LoRA 慢。
  • 实现敏感:NF4、双量化、分页优化器这些工程细节换一套实现(比如换 int8)行为会变,复现实验时要钉死实现版本。

3.5 部署与合并的坑

  • merge 前必须把缩放算进去:W=W0+(α/r)BAW = W_0 + (\alpha/r)BA。漏掉 α/r\alpha/r,注入强度就错了。
  • 保存旁路时把 α\alpha、rr 一起存:只存 BB、AA 两个矩阵,换个库重载时缩放因子对不上。
  • 单任务用 merge(零额外延迟);多任务用”共享主干 + 动态换旁路”(每次前向多一个小矩阵乘,开销很小)。

3.6 过拟合

小数据加大 rr 加无 dropout 时,旁路会过拟合到”背答案”。解法:降 rr、加 dropout、减步数。

4. 决策清单

旋钮起步值什么时候调
rr8~16复杂任务升 32~64;翻倍不涨说明瓶颈在别处
α\alpha2r2r与学习率二选一细调
target modulesq、v(预算够就 qkvo+MLP)效果不够先加模块
学习率比全参高一个数量级不稳定就降
dropout小数据 0.05~0.1过拟合加

实操 checklist:

  • 起步:r=8∼16r=8{\sim}16、α=2r\alpha=2r、q/v(或 qkvo)、学习率 1e-4 量级
  • 效果不够:先加 rr 和 target modules,再上 DoRA 或部分层全参
  • 训练不稳:rsLoRA 缩放(α/r\alpha/\sqrt{r})或 LoRA+ 分学习率
  • 显存不够:QLoRA(记住 §3.4 的三个坑)
  • 部署:单任务 merge;多任务不 merge 动态换旁路;存旁路时 α\alpha、rr 一起存

5. 结论

LoRA 的本质是把”全参更新”压进一条低秩旁路:冻结主干保底,旁路负责适应。用好它的关键不是堆 rr,而是理解四个旋钮的职责分工,以及它在”学得少、忘得少”这个光谱上的位置——要稳选 LoRA,要冲选全参或加强变体,显存紧上 QLoRA。多数工程场景里,LoRA 是性价比最高的默认选择。

参考文献

  1. Hu et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685.
  2. Dettmers et al. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314.
  3. Kalajdzievski. A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA. arXiv:2312.03732.
  4. Hayou et al. LoRA+: Efficient Low Rank Adaptation of Large Models. arXiv:2402.12354.
  5. Liu et al. DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv:2402.09353.
  6. Biderman et al. LoRA Learns Less and Forgets Less. arXiv:2405.09673.