外观
LoRA 高效微调技术深度指南
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
本文为 LoRA 进阶补充篇,涵盖 QLoRA、AdaLoRA、Rank 选取、初始化、继续训练等高级话题。基础概念请参考第 16 篇「LoRA 低秩适配面试题」。
1. LoRA 核心回顾
通过低秩分解模拟参数的改变量,以极小的参数量实现大模型的间接训练。
初始化策略:
- 矩阵 A:高斯分布初始化,保证学习能力
- 矩阵 B:全 0 初始化,保证训练开始时旁路为 0 矩阵(ΔW = 0)
如果 BA 全部初始化为 0,容易导致梯度消失(所有神经元功能等价);如果全部高斯初始化,训练刚开始可能获得过大的偏移值,引入太多噪声导致难以收敛。
2. QLoRA
2.1 核心思路
- 使用一种新颖的高精度技术将预训练模型量化为 4 bit
- 添加一小组可学习的低秩适配器权重
- 通过量化权重的反向传播梯度进行微调
2.2 特点
- 显著降低对显存的要求
- 训练速度慢于标准 LoRA
- 使得在消费级 GPU 上微调大模型成为可能
3. AdaLoRA
3.1 动机
LoRA 对所有权重矩阵使用统一的 Rank,未考虑不同参数矩阵对任务的重要性差异。
3.2 核心思路
根据重要性评分动态分配参数预算给权重矩阵:
- 对关键的增量矩阵:分配高秩以捕捉更精细和任务特定的信息
- 对较不重要的矩阵:降低秩,防止过拟合并节省计算预算
4. LoRA 权重是否可以合入原模型?
可以。将训练好的低秩矩阵(B × A)与原模型权重相加,计算出新的权重:
合并后可直接使用标准推理流程,不引入任何额外推理延迟。
5. ChatGLM-6B LoRA 后的权重大小
在 rank=8、target_module=query_key_value 条件下,LoRA 权重约 15MB。
6. LoRA 微调优点
- 一个中心模型服务多个下游任务,节省参数存储量
- 推理阶段不引入额外计算量(合并后推理)
- 与其他参数高效微调方法正交,可有效组合
- 训练任务稳定,效果较好
- LoRA 几乎不添加推理延迟,因为适配器权重可与基本模型合并
7. LoRA 微调为什么能加速训练?
| 原因 | 说明 |
|---|---|
| 只更新部分参数 | 可只更新 Self Attention 参数或部分层 |
| 减少通信时间 | 多卡训练时传输数据量减少 |
| 低精度加速 | 支持 FP16、FP8 或 INT8 量化 |
注意:这些加速能力并非 LoRA 独有,几乎所有参数高效方法都具有。LoRA 的独特优势是低秩分解直观、效果接近全量微调、推理无额外成本。
8. 如何在已有 LoRA 模型上继续训练?
推荐做法:
将之前的 LoRA 与 Base Model 合并后继续训练,同时加入一部分之前的训练数据以保留旧知识。每次都从头训练成本过高。
# 1. 合并旧 LoRA
W_new_base = W_original + B_old × A_old
# 2. 在合并后的模型上训练新 LoRA(混入部分旧数据)9. LoRA 的缺点
| 缺点 | 说明 |
|---|---|
| 参数量有限 | 仅百万到千万级别,效果比全量微调有差距 |
| 不节省训练时间 | 相比全量微调需要更久训练才能收敛 |
| 数据容量受限 | 同样大量数据下比不过全量微调 |
| LLM 场景差距明显 | 在 LLM 上比扩散模型场景感知差距更大 |
如果有足够计算资源且有 10k 以上数据,建议全参数微调。
10. LoRA 应作用于 Transformer 的哪个参数矩阵?
| 策略 | 效果 |
|---|---|
| 将所有参数放到 Attention 的某一个矩阵 | 效果不好 |
| 将参数分配到 Wq 和 Wv | 原论文结论中效果最好(实践可扩展到更多投影层) |
| 即使是 Rank 仅为 4 也能在 ΔW 中获得足够信息 | Rank 在 4-8 之间效果最优 |
在实际操作中:应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。
LLaMA 的常见 target_modules 配置:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
11. Rank 如何选取?
| 项目 | 说明 |
|---|---|
| 论文对比范围 | Rank 1-64 |
| 最优区间 | Rank 4-8 之间效果最好 |
| 再提升 | 效果不再提升(论文面向下游单一监督任务) |
| 指令微调建议 | Rank 选择 8 以上进行测试(指令分布更广) |
12. Alpha 参数如何选取?
Alpha 本质是缩放参数,和 Learning Rate 类似。推荐简化策略:
alpha = rank (默认让两者相等)
只调整 learning rate 即可公式:scaling = lora_alpha / r
13. LoRA 如何避免过拟合?
- 减小 r(Rank):降低模型容量
- 增加数据集大小:更多数据提供更强泛化能力
- 增加优化器的 Weight Decay:更强的正则化
- 增加 LoRA 层的 Dropout 值
14. 微调大模型时优化器如何选择?
| 优化器 | 特点 |
|---|---|
| Adam / AdamW | 最常用,效果稳定 |
| Sophia | 使用梯度曲率而非方差进行归一化,可能提高训练效率和性能 |
15. 哪些因素会影响内存使用?
- 模型大小:最直接的影响因素
- Batch Size:每增大一个 Batch,动态显存线性增长
- LoRA 参数数量:由 Rank 和 Target Modules 决定
- 数据集特性:使用较短的训练序列可节省内存
16. 是否可以逐层调整 LoRA 的最优 Rank?
理论上可以,类似于为不同层设定不同学习率。但由于增加了调优复杂度,实际上很少执行。
17. 初始化为何至关重要?
| 策略 | 问题 |
|---|---|
| BA 全 0 初始化 | 梯度消失,所有神经元功能等价 |
| BA 全高斯初始化 | 训练初期可能获得过大 ΔW,引入噪声,难以收敛 |
| A 高斯 + B 全 0 | 初始偏移为 0 维持网络原有输出,同时保证收敛能力 |