LoRA 微调:原理、参数怎么选、常见坑与解法
摘要
LoRA(Low-Rank Adaptation)是当前最主流的参数高效微调方法:冻结预训练权重,只训练旁挂在旁边的两条低秩矩阵。本文先讲清它成立的原理——“针对下游任务的更新是低秩的”这个假设,以及初始化、缩放、合并三个实现细节;再给出 r、α、目标模块、学习率四个旋钮的选择经验;最后梳理六类常见问题(性能天花板、学得少忘得少的两面性、训练不稳定、QLoRA 的坑、部署合并的坑、过拟合)与对应解法。
0. 为什么需要 LoRA:全参微调的三个痛点
全参微调(full fine-tuning)把模型所有参数都当作可训练参数,随之而来三个痛点:
- 显存:训练时要为每个参数存梯度,还要存优化器状态,训练显存是推理的数倍。模型越大,账单越夸张。
- 遗忘:所有参数被带离预训练最优点,旧能力容易退化——尤其数据量小、领域窄的时候。
- 部署:每个任务产出一份全量权重,多任务时存储和加载成本线性叠加。
场景例子:你要给同一个 7B 基座做三个领域的 SFT(医疗问答、代码助手、公文写作)。全参微调要训出三份全量权重、付三份训练账单;LoRA 只需要一个共享的冻结主干,每个领域各训一个几十 MB 的旁路——切换任务就是换一个”插件”。
可以把它记成:全参微调是给每件衣服重新做一件,LoRA 是同一个模特换配饰。
1. 原理:冻结主干,旁路低秩更新
1.1 核心假设:更新是低秩的
LoRA 的出发点是一个假设:预训练权重针对某个下游任务的”理想更新” 是低秩的——不需要动满整个矩阵,用一个小秩子空间就能近似。这受”预训练模型有内在低维性”研究的启发:大模型适配任务时,真正有效的参数变化方向其实很少。
基于这个假设,把更新拆成两个瘦矩阵的乘积:
式 (1) 的解读: 冻结不动,只训练 、 两个窄矩阵, 是旁路的秩,远小于 、。
全参微调: W₀ ──训练──▶ W₀ + ΔW 整块矩阵都在动,ΔW 是稠密的
LoRA: W₀ ──冻结──▶ W₀ + (α/r)·B·A 主干不动,只动两条窄旁路
d×r r×k
参数量从 降到 :当 远小于 时,可训练参数缩小约 倍——对 7B 模型, 的旁路通常只占全量参数的零点几个百分点。
大白话:旁路就是给主干的更新开一条窄窄的专用通道。通道越窄( 越小),省得越多,但能通过的更新也越少。
1.2 初始化与缩放:两个容易忽略的细节
- 初始化: 用随机高斯初始化, 初始化为零。这样训练开始时 ,模型行为与预训练完全一致——不会一开局就破坏主干的输出。
- 缩放因子 :把旁路输出放大 倍再注入主干。它和学习率一起决定”更新有多强”,是 §2.2 的主角。
1.3 推理时合并
训练结束后,旁路可以直接加回主干:。合并后推理零额外开销。不合并也行:主干共享、旁路动态切换,代价是每次前向多一次小矩阵乘——这是”一个主干 + 多个任务插件”的物理基础。
2. 四个旋钮怎么选
要点: 起步 8~16,复杂任务再加; 惯例取 ;目标模块优先 q、v,预算够就全注意力加 MLP;学习率比全参微调高一个数量级左右。
2.1 rank r:通道宽度
决定旁路的表达能力上限,经验规律:
- 任务离预训练分布越远,需要的 越大。领域 SFT(换语气、加格式) 常常够用;代码、强推理、新语言这类”改脑子”的任务要 16~64 甚至更高。
- LoRA 原论文在 GPT-3 上 取 1~8 就在多个任务上达到可观效果——这说明很多任务的更新确实很”窄”。
- 瓶颈不在 而在别处时,加 只增加过拟合风险,不涨效果。
判断方法:把 翻倍,验证集没涨,就说明瓶颈在数据、步数或目标模块,不在秩。
2.2 α 与缩放 α/r
是”把旁路更新放大多少倍”的旋钮,等效更新强度正比于 。惯例取 (缩放为 2)或 (缩放为 1)。注意 和学习率有耦合:前者动的是”更新强度”,后者动的是”优化步长”——实践中二选一细调即可,不必两个都动。
可以把它记成: 决定”能装多少”, 决定”装进去的东西说话声音多大”。
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)。
解法:① 加 、加 target modules;② 换 DoRA——把权重分解成”幅度 × 方向”,只对方向做低秩更新,学习能力更强;③ 混合策略:最关键几层全参、其余层 LoRA。
3.2 “学得少、忘得少”的两面性
Biderman 等在代码与数学任务上对比 LoRA 和全参微调,结论是:全参微调学得多、忘得也多;LoRA 学得少,但旧能力保留得好。这既是优点也是缺点:
- 目标要”保住旧能力”(通用助手迭代、多领域并行)→ LoRA 天然合适,主干冻结就是最硬的遗忘防线。
- 目标要”彻底改变行为”(强风格转换、进全新领域)→ LoRA 可能推不动,考虑全参或 §3.1 的加强手段。
3.3 训练不稳定:加大 r 反而变差
现象:把 加到 256 以上后收敛变差、损失抖动——明明表达能力更强了,训练却更糟。
原因:缩放 随 增大而缩小,从零初始化的 得到的有效更新量级不对;、 角色不对称(一个读、一个写),却用同样的学习率。
解法:① rsLoRA:把缩放改成 ,从理论上保证 增大时训练依然稳定;② LoRA+:给 用比 大数倍的学习率(, 常取 量级),让”解码器”跟上”编码器”。
大白话: 负责读、 负责写,两者从不同的起点出发却用同样的步长走路, 自然跟不上;分学习率就是给 配一双更长的腿。
3.4 与量化结合(QLoRA)的坑
QLoRA 把主干压成 4-bit(NF4 格式)再冻结,旁路保持高精度,让单卡训大模型成为可能。三个坑:
- 容量受限:量化主干加低秩旁路双重受限,复杂任务上的增益有限——只建议在显存真不够时用。
- 速度:每次前向要把量化权重反量化回高精度再计算,比普通 LoRA 慢。
- 实现敏感:NF4、双量化、分页优化器这些工程细节换一套实现(比如换 int8)行为会变,复现实验时要钉死实现版本。
3.5 部署与合并的坑
- merge 前必须把缩放算进去:。漏掉 ,注入强度就错了。
- 保存旁路时把 、 一起存:只存 、 两个矩阵,换个库重载时缩放因子对不上。
- 单任务用 merge(零额外延迟);多任务用”共享主干 + 动态换旁路”(每次前向多一个小矩阵乘,开销很小)。
3.6 过拟合
小数据加大 加无 dropout 时,旁路会过拟合到”背答案”。解法:降 、加 dropout、减步数。
4. 决策清单
| 旋钮 | 起步值 | 什么时候调 |
|---|---|---|
| 8~16 | 复杂任务升 32~64;翻倍不涨说明瓶颈在别处 | |
| 与学习率二选一细调 | ||
| target modules | q、v(预算够就 qkvo+MLP) | 效果不够先加模块 |
| 学习率 | 比全参高一个数量级 | 不稳定就降 |
| dropout | 小数据 0.05~0.1 | 过拟合加 |
实操 checklist:
- 起步:、、q/v(或 qkvo)、学习率 1e-4 量级
- 效果不够:先加 和 target modules,再上 DoRA 或部分层全参
- 训练不稳:rsLoRA 缩放()或 LoRA+ 分学习率
- 显存不够:QLoRA(记住 §3.4 的三个坑)
- 部署:单任务 merge;多任务不 merge 动态换旁路;存旁路时 、 一起存
5. 结论
LoRA 的本质是把”全参更新”压进一条低秩旁路:冻结主干保底,旁路负责适应。用好它的关键不是堆 ,而是理解四个旋钮的职责分工,以及它在”学得少、忘得少”这个光谱上的位置——要稳选 LoRA,要冲选全参或加强变体,显存紧上 QLoRA。多数工程场景里,LoRA 是性价比最高的默认选择。
参考文献
- Hu et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685.
- Dettmers et al. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314.
- Kalajdzievski. A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA. arXiv:2312.03732.
- Hayou et al. LoRA+: Efficient Low Rank Adaptation of Large Models. arXiv:2402.12354.
- Liu et al. DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv:2402.09353.
- Biderman et al. LoRA Learns Less and Forgets Less. arXiv:2405.09673.