LoRA 原理全拆解
2026年4月4日大约 3 分钟
LoRA 原理全拆解
一、微调的本质与 LoRA 在做什么
大模型微调可理解为在原权重 W 上求增量 *ΔW *:
W' = W + ΔW全量微调要更新几乎所有参数(几十亿~几百亿),显存大、易灾难性遗忘。
LoRA:冻结预训练权重 W,在旁路只训练两个小矩阵 A、B,令
ΔW ≈ B × A (低秩近似)绝大多数原始参数不参与更新,显存与可训练参数量显著下降(常可达「只训百分之几」量级,具体随配置而变)。
二、数学与实现要点
1. 低秩分解
- 直觉:ΔW 往往可用较低「有效秩」近似,不必用满秩矩阵。
- 形状:A 为
(r × d_in)或常见实现里A: (r, d_in)、B: (d_out, r),乘积(d_out × d_in),其中 r ≪ min(d_out, d_in)。 - 秩 r:常用 4、8、16、32;过大可能冗余或过拟合,未必更好。
2. 参数量对比(示例)
若某线性层权重形状 1024 × 512:
| 方式 | 参数量级 |
|---|---|
| 直接训 ΔW 满秩 | 1024 × 512 ≈ 52 万 |
LoRA,r=32(示意:1024×32 + 32×512) | 约 4.9 万(约为满秩 ΔW 的 ~9%) |
具体实现因 in_features/out_features 与 LoRA 挂载位置略有差异,以实际层维数计算为准。
3. 初始化与缩放
- 常见策略:A 用 Kaiming/正态 或实现里 A 零初始化、B 随机 等变体并存;核心是训练初期旁路贡献足够小,贴近原模型。
- 缩放:常写为 ΔW = (B×A) × (α / r)
- α(LoRA alpha):调节旁路力度
- 经验:α = 2r 或 α = r 都常见,需与代码库默认对齐
三、行业前沿与变体
| 方法 | 要点 |
|---|---|
| QLoRA | 底座权重 4bit 等量化的量化基座,LoRA 仍用较高精度算;显存友好,适合单卡微调大模型 |
| AdaLoRA | 自适应分配秩,侧重「重要方向」多给容量 |
| LoRA+ | 对 A、B 不同学习率等技巧,加速与稳定 |
| rsLoRA | 调整缩放与训练稳定性,便于更大 r(如 128、256)场景 |
四、参数设置与实战避坑
核心超参
| 参数 | 建议 |
|---|---|
| r(Rank) | 日常 8~32 先试;任务极简单可更小,数据少慎贪大 |
| LoRA Alpha | 常与 r 或 2r 对齐(如 r=16 → α=16 或 32) |
| Target modules | 多从 q_proj / v_proj 开始;显存允许时可扩到 k、o、MLP 等以换效果 |
避坑
- Dropout:小数据 0.05~0.1 防过拟合;大数据可 0
- Bias:常 不训练 bias(
bias="none"),避免不必要不稳定 - dtype:训练侧多优先 bf16(若硬件支持),与 FP16 溢出风险对比权衡;QLoRA 下底座量化与计算精度按框架文档
显存紧张时的优先级(示意)
- 尝试 QLoRA(或更小 batch / 梯度累积)
- 减小 r
- 减少挂载层(优先保留对任务最关键的投影层)
五、小结
LoRA = 冻结 W + 低秩旁路 (B)(A) + 缩放 α/r。用很少的可训练参数逼近任务所需的 ΔW,是全量微调以外最主流的**参数高效微调(PEFT)**路线之一。
