LoRA:低秩适配到底在训练什么?
微调一个大模型,传统做法是把所有参数都更新一遍——又贵又慢还占显存。LoRA 提出一个更聪明的思路:冻结原始模型不动,只往里面塞一对极小的「适配器」矩阵,训练时只更新这一小撮参数。结果效果接近全量微调,但显存、存储、成本都砍掉一两个数量级。本文把它是什么、原理、作用、能干什么、解决什么问题一次讲清。
1. LoRA 一句话讲清
LoRA(Low-Rank Adaptation,低秩适配)是 2021 年微软提出的一种参数高效微调(PEFT)技术。它的核心主张是:模型在适配新任务时产生的权重变化量 ΔW 其实是「低秩」的——可以用两个小矩阵相乘来近似表示,因此不必动原模型一个参数,只训练这两个小矩阵就够了。
冻结基座
原始预训练权重 W 全程不更新,像被冻住一样,省下大量反向传播的计算与显存。
旁路加残差
在权重旁边挂一对小矩阵 B·A,前向时把它的输出叠加到原输出上,即 h = Wx + BAx。
只训小矩阵
训练对象只有 A 和 B(参数量常是全集的 0.1%~1%),学完即得到一个轻量「适配器」。
2. 为什么需要 LoRA?
要理解 LoRA 的价值,先得看它想解决的痛点——全量微调(Full Fine-Tuning)的真实代价。
全量微调的「三座大山」
显存爆炸
反向传播要存所有参数的梯度、优化器状态(如 Adam 的 m/v)。训练 7B 模型全量微调常需 60~80GB 显存,普通人根本跑不起。
存储灾难
每个任务要存一整份完整模型副本。100 个任务 = 100 份 13GB 模型,空间与分发成本惊人。
灾难性遗忘
更新所有参数容易让模型丢掉预训练学到的通用能力,还可能破坏基座稳定性。
3. 核心原理:低秩分解
LoRA 的理论基础是一个观察:模型适配新任务时权重的变化量 ΔW 具有很低的「内在秩」。换句话说,这个巨大的变化矩阵其实是高度冗余的,可以用两个瘦长的小矩阵相乘来逼近。
数学表达
设某层原始权重 W ∈ ℝ^(d×k)(如 4096×4096)。LoRA 将它改写为:
h = Wx + ΔW·x = Wx + B·A·x ,其中 B ∈ ℝ^(d×r),A ∈ ℝ^(r×k)
- W:预训练权重,冻结,训练中不更新(不存梯度)。
- A → B:随机初始化(A 用高斯,B 用 0),是唯一要训练的部分。
- r:秩(rank),是 LoRA 最核心的超参,通常取 8 / 16 / 32 / 64。r 越小越省,越大表达力越强。
- 关键:
ΔW = B·A的秩最多为 r,远小于 d、k——这就是「低秩」二字的由来。
ΔW 是「完整重写整本书」,低秩的 B·A 相当于「在书边写一薄本批注贴纸」——贴纸很薄,但足以改变阅读重点与结论。秩 r 就是这本贴纸的「页数」。
4. 训练时到底发生了什么
前向传播
输入 x 同时过两条路:
- 主干:
Wx,用冻结的预训练权重算(normal 路径)。 - 旁路:
BAx,用可训练小矩阵算。 - 两条路相加得到最终输出
h = Wx + BAx。 - 旁路的
ΔW通常还乘一个缩放系数α/r来平衡量级。
反向传播与推理
- 只有
A、B的梯度被计算与更新,W的梯度被关掉。 - 梯度/优化器状态只需为极小矩阵准备,显存骤降。
- 推理时:可把
BA直接加回W合并,零额外延迟;也可保持分离便于随时换适配器。
5. 进阶:量化版 QLoRA
LoRA 把可训练参数砍小了,但基座模型本身还是占显存。2023 年的 QLoRA 再补一刀:把冻结的基座量化为 4-bit(NF4 数据类型),再用 LoRA 微调,让 65B 模型能在单张 48GB 显卡上微调。
4-bit 量化基座
用 NF4 把权重压到 4-bit 存储,显存再降 ~3×。
分页优化器
用 NVIDIA 统一内存避免显存峰值 OOM。
双量化
对量化常数再量化一次,进一步省显存。
6. LoRA 能干什么 / 作用
LoRA 不是「换个更好的模型」,而是一个让微调变得便宜、灵活、可量产的方法。它的作用体现在四个层面:
把大模型适配特定任务
给通用基座挂上专属 LoRA,就能变成「法律助手」「医疗问答」「客服口吻」等垂直模型。
学习特定风格/人设
用少量样本训练,让模型模仿某作者的文风、某角色的语气,而不必重训全模型。
多能力并存、按需切换
一个基座 + 多个 LoRA 适配器:用时加载对应「贴纸」,不用时换下,像换镜头一样灵活。
低成本快速实验
单卡几小时就能训一个适配器,方便做 A/B、试不同数据配比,迭代飞快。
不止 LLM:LoRA 是「通用适配器」
虽然起源于大模型语言微调,同一思想已被广泛用于:
7. LoRA 解决了什么问题
显存/算力门槛
把全量微调的 60GB+ 显存降到 12GB 甚至单卡 4-bit 可跑,普通人也能微调大模型。
存储与分发
一个适配器只有几 MB~百 MB,对比完整模型 13GB+;存 100 个任务的适配器也不占多少空间。
任务隔离与组合
不同任务互不干扰、各自独立存;可按需加载/合并,避免「一个模型只为一件事重训」的浪费。
稳定性与遗忘
冻结基座,训练只动极小增量,大幅降低灾难性遗忘与破坏预训练通用能力的风险。
8. 关键超参数一览
| 超参数 | 含义 | 经验取值 | 影响 |
|---|---|---|---|
| r(rank) | 低秩矩阵的秩,适配器「容量」 | 8 / 16 / 32 / 64 | 越大表达力越强、参数越多、越接近全量微调 |
| α(alpha) | 缩放系数,实际增量 = (α/r)·BA | 常为 r 的 1~2 倍 | 控制旁路贡献强度,α=r 时等价于无缩放 |
| lora_dropout | 作用在 A 输入上的 dropout | 0 / 0.05 / 0.1 | 正则化,防过拟合小数据集 |
| target_modules | 对哪些权重挂 LoRA | q,k,v,o / q,v / all linear | 挂注意力层足够,挂全量更贵但可能更优 |
| 量化位宽 | 基座是否 4-bit(QLoRA) | FP16 / 4-bit NF4 | 4-bit 进一步降显存,略有精度折损 |
9. 全量微调 vs LoRA 对比
| 维度 | 全量微调(Full FT) | LoRA / QLoRA |
|---|---|---|
| 可训练参数 | 100%(全部权重) | 0.1% ~ 1% |
| 显存占用 | 极高(需存全部梯度+优化器状态) | 低,QLoRA 可单卡跑大模型 |
| 产出物 | 一整份新模型(GB 级) | 一份适配器(MB 级) |
| 多任务 | 每任务一份完整副本 | 一基座 + 多适配器,按需切换 |
| 遗忘风险 | 较高 | 低(基座冻结) |
| 推理延迟 | 基准 | 合并后零额外延迟 |
| 表达上限 | 最高 | 受秩 r 约束,常态任务够用 |
| 适用场景 | 资源充足、需极致适配 | 绝大多数微调、个人/中小团队 |
10. 典型应用场景
企业私有知识
用内部语料训 LoRA,让通用模型说「自家话」,权重不泄露、部署轻。
AI 绘画定制
SD 的 LoRA 能学特定画风、角色、概念,社区海量「风格包」即此物。
多语言/方言
给基座加一个语言 LoRA,切换即用,不必为每个语种训整模型。
人设与角色扮演
用少量对话样本训出某角色口吻的适配器,随时挂载。
科研快速验证
几小时出一个适配器验证假设,大幅降低实验成本。
指令/对齐微调
LoRA 常用于 SFT、甚至是 RLHF 阶段的轻量适配(如 LoRA+PPO)。
11. 总结
一句话回顾
LoRA 是一种「低秩适配」的参数高效微调技术:冻结预训练基座,只在权重旁挂一对极小的可训练矩阵 B·A 来近似权重的更新量 ΔW。它让微调从「重训整个模型」变成「训练一张轻薄贴纸」。
- 是什么:低秩分解 + 冻结主干 + 旁路残差的 PEFT 方法。
- 原理:
h = Wx + BAx,只更新秩为 r 的小矩阵,r 越小越省。 - 作用:把大模型便宜地适配到具体任务/风格,支持多适配器切换与快速实验。
- 能干什么:LLM、扩散模型、视觉、语音等几乎所有需要「微调适配」的地方。
- 解决什么:全量微调的显存爆炸、存储灾难、任务隔离难、易遗忘等痛点。
- 进阶:QLoRA 在 4-bit 基座上做 LoRA,把门槛压到消费级显卡。