1. LoRA 是什么 & 为什么出现
背景问题
大模型参数多、显存占用高,直接全量微调(Full Fine-tuning)成本巨大。LoRA 的核心思路
不直接更新原模型的权重矩阵 $W_0$,而是在它的基础上加一个 低秩矩阵近似:
$$W’ = W_0 + \Delta W,\quad \Delta W = BA$$其中:
$A \in \mathbb{R}^{r \times d}$,$B \in \mathbb{R}^{d \times r}$
$r$ 是秩(rank),远小于 $d$(比如 r=8)
$A$、$B$ 是需要训练的,$W_0$ 冻结不动
优点
显存占用小(参数量缩小到 $O(rd)$)
可以快速切换不同任务(加载不同 LoRA 权重)
与原模型推理速度几乎一样
面试常问:
为什么低秩分解能减少参数量?
r 取太小或太大会有什么影响?
2. LoRA 的数学原理
假设 Transformer 里的一个线性层是:
h=W0xh = W_0 xh=W0x
LoRA 加入的变化:
h=W0x+BAxh = W_0 x + BAxh=W0x+BAx
$A$、$B$ 在初始化时通常是:
$A$:正态分布初始化(小值)
$B$:全零初始化(这样初始时等于原模型推理结果)
优化时只更新 $A$ 和 $B$ 的参数。
面试常问:
LoRA 为什么要把低秩矩阵拆成 $A$ 和 $B$,而不是直接训练 $\Delta W$?
为什么要用零初始化 B?
3. LoRA 在 Transformer 中的应用位置
常见的注入位置:
Self-Attention 的 Q、V 投影层(最常见)
也可以在 FFN(前馈层)中加 LoRA
可以只在部分层加,节省更多显存
面试常问:
为什么 LoRA 常加在 Q、V 而不是 K?
如果显存特别紧,可以怎么裁剪 LoRA 注入位置?
4. LoRA 的超参数
r(秩):秩越大,模型表达能力越强,但参数也多
alpha(缩放系数):控制 LoRA 增量的权重
dropout:防止过拟合
target_modules:指定在哪些模块注入 LoRA(比如
q_proj,v_proj)
面试常问:
r 和 alpha 如何配合调参?
训练 LoRA 时 batch size 和学习率会有什么变化?
5. LoRA 与其他微调方式的比较
| 方法 | 参数更新量 | 显存占用 | 推理速度 | 适用场景 |
|---|---|---|---|---|
| 全量微调 | 全部参数 | 高 | 慢 | 高精度需求 |
| LoRA | 极少 | 低 | 几乎不变 | 多任务快速适配 |
| Prefix Tuning | 极少 | 低 | 略低 | 自然语言任务 |
| Adapter | 较少 | 中等 | 略低 | 中等规模模型 |
面试常问:
LoRA 和 Prefix Tuning 的差异?
LoRA 在多任务中如何快速切换?
6. LoRA 的部署与合并
训练好 LoRA 后,有两种用法:
推理时动态加载(模型保持原权重 + LoRA 权重)
合并到原模型权重(
W_0 ← W_0 + BA)
面试常问:
为什么推理时通常选择合并 LoRA?
多个 LoRA 权重能叠加吗?
7. 面试可能延伸到的点
量化 + LoRA(QLoRA)
把原模型权重量化到 4-bit,然后用 LoRA 训练,进一步降低显存LoRA 在多模态模型中的应用(如 LLaVA)
安全性问题:LoRA 权重容易被滥用(因为小文件也能影响模型输出)
问题
1. 为什么低秩分解能减少参数量?
解释:
模型中一个权重矩阵通常很大,比如 $W$ 是 $d \times d$ 大小,如果直接训练全部参数,参数量是 $d^2$。低秩分解是把这个矩阵近似为两个小矩阵相乘:
ΔW=BA\Delta W = B AΔW=BA
假设 $B$ 是 $d \times r$,$A$ 是 $r \times d$,其中 $r$ 很小(比如8),所以参数量是 $2dr$,远小于 $d^2$。这样大幅减少了需要训练和存储的参数。
2. r 取太小或太大会有什么影响?
解释:
$r$ 越小,表示用更低的秩来近似权重矩阵,模型学习能力有限,可能无法捕捉复杂的任务特征,表现欠佳。
$r$ 越大,参数多,模型表达更强,但显存和计算成本提高,且训练难度加大,可能过拟合。
通常需要在性能和资源之间做平衡。
3. LoRA 为什么要把低秩矩阵拆成 A 和 B,而不是直接训练 $\Delta W$?
解释:
如果直接训练完整矩阵 $\Delta W$,参数量还是很大。拆成两个小矩阵 $A$ 和 $B$,就像把一个大矩阵拆成“细长矩阵乘积”,实现参数量压缩和计算加速。这就是低秩分解的思想。
4. 为什么要用零初始化 B?
解释:
初始时让 $\Delta W = B A$ 等于零,保证刚开始模型的行为和原模型 $W_0$ 一致,这样训练更稳定,避免模型性能突然下降。
一般做法是让 $B$ 全零,$A$ 小随机值。
5. 为什么 LoRA 常加在 Q、V 而不是 K?
解释:
Q(查询)和 V(值)矩阵在注意力机制中直接影响信息的提取和输出表达,调整这两部分能更有效地改动模型表现。
K(键)矩阵负责匹配,调整它对模型影响相对较小,且增加训练负担。
因此,注入 LoRA 多选在 Q 和 V。
6. 如果显存特别紧,可以怎么裁剪 LoRA 注入位置?
解释:
可以只给少数关键层加 LoRA,比如靠近输出层的几层
只加在 Q 或 V 的某一个,而不是两个都加
也可以调低秩 $r$,减少参数量
这样在保证微调效果的同时,控制显存使用。
7. r 和 alpha 如何配合调参?
解释:
$r$ 是秩,决定参数量和模型容量
$\alpha$ 是缩放因子,控制 LoRA 增量的强度
一般,$\alpha$ 选为 $r$ 的倍数(比如 $\alpha=16$,$r=8$),让增量更稳定。若 $\alpha$ 太大,可能导致训练不稳定;太小则收敛慢。
8. 训练 LoRA 时 batch size 和学习率会有什么变化?
解释:
因为参数量大幅减少,batch size 可以适当加大,提高训练效率
学习率通常也会比全量微调稍高,方便快速收敛
但需要根据实际训练表现调节,避免过拟合或震荡
9. LoRA 和 Prefix Tuning 的差异?
解释:
LoRA 是直接修改权重矩阵,微调模型参数
Prefix Tuning 是在输入序列前添加一段可训练的“提示”,不改动模型权重
LoRA 适合需要模型参数调整的场景,Prefix Tuning 更像软提示调整
10. LoRA 在多任务中如何快速切换?
解释:
因为 LoRA 的微调参数是独立的小模块,可以为不同任务训练不同 LoRA 权重,推理时只需加载对应 LoRA,快速切换,不用重新加载完整模型。
11. 为什么推理时通常选择合并 LoRA?
解释:
推理时为了速度和方便,常把 $W_0$ 和 $BA$ 合并成一个权重矩阵,减少计算步骤,提升效率。合并后就是一个普通线性层,推理时无额外开销。
12. 多个 LoRA 权重能叠加吗?
解释:
可以叠加多个 LoRA 权重(比如不同任务),但要注意权重间的冲突和模型稳定性,最好保证它们针对的任务相关且不矛盾。
Support me with a coffee?