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 的问题在于它不能节省训练时间,相比于全量微调,它往往要训练更久,同时因为可训练参数量很小,在同样大量数据训练下,性能上限可能不如全量微调。
6. LoRA 应该作用于 Transformer 的哪个参数矩阵?
实验表明:
- 将所有微调参数都放到 attention 的某一个参数矩阵的效果并不好,将可微调参数平均分配到 Wq 和 Wk 的效果最好;
- 即使是秩仅取 4 也能在 ΔW 中获得足够的信息。 因此实际操作中,应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。
7. LoRA 微调参数量怎么确定?
LoRA 模型中可训练参数的结果数量取决于低秩更新矩阵的大小,主要由秩 r 和原始权重矩阵的形状确定。实际使用过程中,通过选择不同的 lora_target 决定训练的参数量。
以 Llama 为例:--lora_target q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
8. Rank 如何选取?
Rank 的取值比较常见的是 8。理论上说 Rank 在 4-8 之间效果最好,再高并没有明显效果提升。不过论文的实验是面向下游单一监督任务的,因此在指令微调上根据指令分布的广度,Rank 选择还是需要在 8 以上的取值进行测试。
9. Alpha 参数如何选取?
Alpha 其实是个缩放参数,本质和学习率相同。为了简化可以默认让 alpha=rank,只调整 lr,这样可以简化超参。
10. LoRA 高效微调如何避免过拟合?
过拟合还是比较容易出现的。减小 r 或增加数据集大小可以帮助减少过拟合,还可以尝试增加优化器的权重衰减率或 LoRA 层的 dropout 值。
11. 哪些因素会影响内存使用?
内存使用受到模型大小、批量大小、LoRA 参数数量以及数据集特性的影响。例如,使用较短的训练序列可以节省内存。
12. LoRA 权重是否可以合并?
可以将多套 LoRA 权重合并。训练中保持 LoRA 权重独立,并在前向传播时添加,训练后可以合并权重以简化操作。
13. 是否可以逐层调整 LoRA 的最优 rank?
理论上,可以为不同层选择不同的 LoRA rank,类似于为不同层设定不同学习率,但由于增加了调优复杂性,实际中很少执行。
14. LoRA 的矩阵怎么初始化?为什么要初始化为全 0?
矩阵 B 被初始化为 0,而矩阵 A 正常高斯初始化。
- 如果 B、A 全都初始化为 0,那么缺点与深度网络全 0 初始化一样,很容易导致梯度消失(因为此时初始所有神经元的功能都是等价的)。
- 如果 B、A 全部高斯初始化,那么在网络训练刚开始就会有概率得到一个过大的偏移值 ΔW,从而引入太多噪声,导致难以收敛。 因此,一部分初始为 0,一部分正常初始化是为了在训练开始时维持网络的原有输出(初始偏移为 0),但同时也保证在真正开始学习后能够更好的收敛。
三、LoRA 家族演进
除了基础 LoRA,社区还涌现了多种改进版本:
1. DoRA (Weight-Decomposed Low-Rank Adaptation)
DoRA 将 LoRA 的权重更新分解为幅度(Magnitude)和方向(Direction)两部分。相比 LoRA 仅学习方向,DoRA 同时学习幅度和方向,理论上能更好地逼近全量微调的效果,尤其在复杂任务上表现更佳。
2. AdaLoRA
AdaLoRA 引入了自适应秩分配机制,根据权重的敏感度动态调整不同层的秩,而不是对所有层使用相同的秩。这进一步提高了参数效率。
3. QLoRA
QLoRA 结合了 4-bit 量化技术与 LoRA,使得在单张消费级显卡上微调超大模型(如 65B)成为可能,大幅降低了显存门槛。
四、总结
LoRA 作为目前最流行的参数高效微调方法之一,在工业界和学术界都得到了广泛应用。它平衡了训练成本与模型效果,特别适合资源受限的场景。理解其原理、参数设置及优缺点,对于从事大模型应用开发的人员至关重要。

