LoRA 技术详解:原理、训练理论与面经问答总结
随着大模型的发展,显存资源日益紧张,LoRA(Low-Rank Adaptation)及其家族成员成为微调大模型的主流方案。基于 PEFT 库,使用消费级显卡(如 RTX 4090 24G)即可进行大模型微调。近期出现的 DoRA 等改进版本也获得了良好的反馈。
LoRA 系列主要分为两部分:LoRA 总述与 LoRA 家族演进。本文重点介绍第一部分 LoRA 总述,以面试常见问题形式整理并解答。
一、概念
1. 简单介绍一下 LoRA
LoRA 通过低秩分解来模拟参数的改变量,从而以极小的参数量实现大模型的间接训练。其核心思想是冻结预训练模型的矩阵参数,选择用两个低秩矩阵 A 和 B 来替代更新量,在下游任务时只更新 A 和 B。
2. LoRA 的思路
- 主要思想:在原模型旁边增加一个旁路,通过低秩分解(先降维再升维)来模拟参数的更新量。
- 训练:原模型固定,只训练降维矩阵 A 和升维矩阵 B。
- 推理:可将 BA 加到原参数上,不引入额外的推理延迟。
- 初始化:A 采用高斯分布初始化,B 初始化为全 0,保证训练开始时旁路为 0 矩阵。
- 可插拔式的切换任务:当前任务 W0+B1A1,将 LoRA 部分减掉,换成 B2A2,即可实现任务切换。
3. LoRA 的特点
- 将 BA 加到 W 上可以消除推理延迟;
- 可以通过可插拔的形式切换到不同的任务;
- 设计的比较简单且效果好。
4. LoRA 的优点
- 一个中心模型服务多个下游任务,节省参数存储量;
- 推理阶段不引入额外计算量;
- 与其它参数高效微调方法正交,可有效组合;
- 训练任务比较稳定,效果比较好;
- LoRA 几乎不添加任何推理延迟,因为适配器权重可以与基本模型合并。
5. LoRA 的缺点
LoRA 参与训练的模型参数量不多,通常为百万到千万级别,因此在数据及算力满足的情况下,效果比全量微调差一些。原则上微调的参数越多越好。
二、训练理论
1. LoRA 权重是否可以合入原模型?
可以。将训练好的低秩矩阵(B*A)与原模型权重合并(相加),计算出新的权重后,即可直接加载使用,无需保留 LoRA 模块。
2. ChatGLM-6B LoRA 后的权重多大?
在 rank 8、target_module 为 query_key_value 条件下,大约 15MB。
3. LoRA 微调方法为啥能加速训练?
- 只更新了部分参数:例如 LoRA 原论文选择只更新 Self Attention 的参数,实际使用时还可以选择只更新部分层的参数;
- 减少了通信时间:由于更新的参数量变少,多卡训练时传输的数据量减少,从而减少了传输时间;
- 采用了各种低精度加速技术:如 FP16、FP8 或者 INT8 量化等。 这三部分原因确实能加快训练速度,但并非 LoRA 独有。LoRA 的核心优势在于低秩分解直观,在不少场景下跟全量微调效果一致,且在预测阶段不增加推理成本。
4. 如何在已有 LoRA 模型上继续训练?
如果已有的 LoRA 模型只训练了一部分数据,要训练另一部分数据时,建议将之前的 LoRA 跟 base model 合并后,继续训练。为了保留之前的知识和能力,训练新的 LoRA 时,加入一些之前的训练数据是必要的。每次都要重头训练的话成本比较高。
5. LoRA 这种微调方法和全参数比起来有什么劣势吗?
如果有足够计算资源以及有 10k 以上数据,还是建议全参数微调。LoRA 的一个初衷就是为了解决不够计算资源的情况下微调,只引入了少量参数,就可以在消费级 GPU 上训练。但 LoRA 的问题在于它不能节省训练时间,相比于全量微调,它往往要训练更久,同时因为可训练参数量很小,在同样大量数据训练下,性能上限可能不如全量微调。


