外观
LoRA 低秩适配面试题
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. 什么是 LoRA?
LoRA(Low-Rank Adaptation)通过低秩分解来模拟参数的改变量,以极小的参数量实现大模型的间接训练。
核心思想:冻结预训练模型的权重矩阵,在旁边增加一个旁路,用两个低秩矩阵(A 和 B)来近似参数更新量。
2. LoRA 的实现思路
关键步骤:
- 在原模型旁增加旁路,通过低秩分解(先降维再升维)模拟参数更新量
- 训练时冻结原模型,只训练降维矩阵 A 和升维矩阵 B
- 推理时将 BA 加到原参数上,不引入额外推理延迟
- 初始化:A 采用高斯分布,B 初始化为全 0,保证训练开始旁路为 0 矩阵
- 可插拔式任务切换:
W₀ + B₁A₁ → W₀ + B₂A₂
3. LoRA 的优点
- 参数效率:一个中心模型服务多个下游任务,大幅节省参数存储
- 零推理延迟:推理时合并权重,不增加推理成本
- 可组合:与其他参数高效微调方法正交,可组合使用
- 训练稳定:效果较好且训练过程稳定
- 任务切换灵活:可插拔式切换不同任务
4. LoRA 为何能加速训练?
| 原因 | 说明 |
|---|---|
| 只更新部分参数 | 减少计算量(如只更新 Self Attention 参数或部分层) |
| 减少通信时间 | 多卡训练时传输数据量减少 |
| 低精度加速 | 支持 FP16、FP8 或 INT8 量化 |
但这些加速能力并非 LoRA 独有,几乎所有参数高效方法都具有。LoRA 的核心优势在于:低秩分解直观、效果接近全量微调、推理无额外成本。
5. QLoRA
在 LoRA 基础上进一步降低显存需求:
- 使用新颖的高精度技术将预训练模型量化为 4 bit
- 添加一小组可学习的低秩适配器权重,通过量化权重的反向传播梯度进行微调
特点:显著降低对显存的要求,但训练速度慢于标准 LoRA。
6. AdaLoRA
对 LoRA 的改进,根据重要性评分动态分配参数预算给权重矩阵:
- 关键矩阵 → 分配高秩,捕捉精细任务特定信息
- 次要矩阵 → 降低秩,防止过拟合并节省计算预算
7. LoRA 权重是否可以合入原模型?
可以。将训练好的低秩矩阵(B×A)与原模型权重直接相加,即可计算新权重。推理时无需额外开销。
8. ChatGLM-6B LoRA 后权重多大?
Rank=8,target_module=query_key_value 条件下,约 15MB。
9. LoRA 的缺点
- 参与训练的参数量有限(百万到千万级别),效果比全量微调差不少
- 不能节省训练时间(计算图变大,可能训练更慢)
- 在大量数据训练下,比不过全量微调
- 在 LLM 上表现差距比扩散模型更大
10. 如何在已有 LoRA 上继续训练?
建议将之前的 LoRA 与 Base Model 合并后继续训练新的 LoRA。为保留之前的知识和能力,新训练时应加入一些之前的训练数据。
11. LoRA 应作用于 Transformer 的哪个参数矩阵?
实验结果:
- 所有微调参数集中在某一个参数矩阵 → 效果差
- 将可微调参数分配到 Wq 和 Wv → 原论文中效果最好(实践中也常扩展到 q/k/v/o 与 FFN)
- 即使是 Rank=4 也能获得足够的信息
实践中应作用于多类权重矩阵(而非用更大的秩单独微调某一种):
--lora_target q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj12. Rank 如何选取?
- 论文实验范围:1-64
- 最优区间:Rank 4-8(更高并无提升)
- 注意:论文针对下游单一监督任务,指令微调因指令分布更广,建议 Rank 8 以上进行测试
13. Alpha 参数如何选取?
Alpha 本质是缩放参数,与 Learning Rate 作用相同。为了简化超参,可设置 alpha = rank,只调整 LR。
14. 如何避免 LoRA 过拟合?
- 减小 Rank(r)
- 增加数据集大小
- 增加优化器的权重衰减率
- 增加 LoRA 层的 Dropout 值
15. LoRA 矩阵初始化:为什么 B 初始化为全 0?
- A:高斯初始化,B:全 0 初始化
- 若全部初始化为 0 → 梯度消失(所有神经元功能等价)
- 若全部高斯初始化 → 训练开始可能得到过大偏移值 ΔW,引入噪声难以收敛
- 半零半随机初始化:训练开始维持原有输出(初始偏移为 0),同时保证后续能良好收敛
16. LoRA vs 全参数微调的劣势
- 如果有足够计算资源且数据量 > 10K,建议全参数微调
- LoRA 初衷:解决计算资源不足时的微调,引入少量参数即可在消费级 GPU 上训练
- LoRA 核心问题:不能节省训练时间,且可训练参数量小,大量数据下效果不如全量微调
17. LoRA 微调参数量计算
可训练参数数量取决于低秩更新矩阵的大小,主要由秩 r 和原始权重矩阵形状决定。以 LLaMA 为例,选择不同的 lora_target 决定训练参数量:
python
# 在 Q、K、V、O、Gate、Up、Down 投影层上应用 LoRA
lora_target = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]