一句话定义
LoRA 不改动预训练权重,只在原有线性层旁边挂一对低秩矩阵 A、B,训练时只更新这两个小矩阵,让模型用很小的参数代价适配新任务。
为什么需要它
全量微调要更新整个模型、保存完整副本,还要为每个任务准备一套权重;显存和存储成本都很高。LoRA 把可训练参数从 d×k 降到 r(d+k),优化器状态和梯度也随之减少。同一份基座模型可以挂多套适配器,按任务切换。
怎么工作
对输入 x,原层输出 W₀x,旁路输出 (α/r)BAx,两者相加:
h = W₀x + (α/r)BAx
- A 是 r×k 的降维矩阵,B 是 d×r 的升维矩阵,r 远小于 d、k。
- A 随机初始化,B 初始化为 0,所以训练开始时旁路不改变原模型输出。
- 训练只更新 A、B;W₀ 保持冻结。
- 推理时可以把 (α/r)BA 合并进 W₀,不增加额外延迟。
关键点与取舍
- 秩 r:常用 8–64;越大容量越强,可训练参数也越多,过大就接近全量微调。
- 目标模块:通常先加在注意力的 Q/V 投影,也可以覆盖 FFN 和更多层;范围越大,参数越多。
- 缩放 α:控制旁路相对原层的影响强度,常按 α/r 使用。
- 合并:合并后推理零额外延迟,但不能再单独卸载某个适配器;多租户通常保留未合并的适配器,按请求切换。
常见误区
- LoRA 不是”只训练某几层”,而是冻结原权重、训练旁路;原层仍然参与前向。
- 不是秩越大越好;任务简单时更小的 r 往往够用。
- LoRA 更擅长调整行为、风格和任务格式,注入大量新知识的效果有限;后者通常要结合 RAG 或继续预训练。
- 训练显存不只由可训练参数决定,激活值和 batch 仍然占大头;QLoRA 才能进一步压低基座权重的占用。
用在哪里
- 单卡或少卡做领域、风格适配,比如客服话术、代码风格、固定格式输出。
- 一个基座服务多个任务:每个任务一套 LoRA,按请求切换,不必保存多份完整模型。
- 与 量化 组合成 QLoRA,在 4 bit 基座上训练,进一步降低显存。
- 如果任务需要大规模知识更新或大幅改变模型能力,全量微调或继续预训练可能更合适。
QLoRA
QLoRA 先把基座量化到 4 bit,再训练 LoRA 适配器;显存更低,但反量化、精度损失和算子支持要一起评估。