LoRA(Low-Rank Adaptation)是近年来大模型微调领域的重要技术。随着显卡资源紧张,基于 LoRA 及其改进版本(如 DoRA)的微调方案展现出极高的研究价值与落地潜力。本文整理 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)+ 原模型权重合并(相加),计算出新的权重。
2. ChatGLM-6B LoRA 后的权重多大?
rank 8 target_module query_key_value 条件下,大约 15M。
3. LoRA 微调方法为啥能加速训练?
- 只更新了部分参数:比如 LoRA 原论文就选择只更新 Self Attention 的参数,实际使用时我们还可以选择只更新部分层的参数;
- 减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;
- 采用了各种低精度加速技术,如 FP16、FP8 或者 INT8 量化等。 这三部分原因确实能加快训练速度,然而它们并不是 LoRA 所独有的,事实上几乎都有参数高效方法都具有这些特点。LoRA 的优点是它的低秩分解很直观,在不少场景下跟全量微调的效果一致,以及在预测阶段不增加推理成本。
4. 如何在已有 LoRA 模型上继续训练?
理解此问题的情形是:已有的 lora 模型只训练了一部分数据,要训练另一部分数据的话,是在这个 lora 上继续训练呢,还是跟 base 模型合并后再套一层 lora,或者从头开始训练一个 lora? 把之前的 LoRA 跟 base model 合并后,继续训练就可以,为了保留之前的知识和能力,训练新的 LoRA 时,加入一些之前的训练数据是需要的。每次都要重头训练的话成本比较高。
5. LoRA 这种微调方法和全参数比起来有什么劣势吗?
如果有足够计算资源以及有 10k 以上数据,还是建议全参数微调,lora 的一个初衷就是为了解决不够计算资源的情况下微调,只引入了少量参数,就可以在消费级 gpu 上训练,但 lora 的问题在于它不能节省训练时间,相比于全量微调,他要训练更久,同时因为可训练参数量很小,在同样大量数据训练下,比不过全量微调。
6. LORA 应该作用于 Transformer 的哪个参数矩阵?
从相关实验分析来看:


