大模型面试帖——LoRA 最硬核面经
一、LoRA 基础篇
1.1 了解 LoRA 么?
LoRA(Low-Rank Adaptation):在机器学习领域,特别是自然语言处理中,LoRA是“Low-Rank Adaptation”的简称,是一种用于微调大型预训练模型的技术。
1.2 讲LoRA的基本思想?
- 基本思想:在不改变原始预训练权重的基础上,通过引入可训练的低秩分解矩阵来调整模型参数,以适应特定任务或领域。
1.3 讲LoRA的工作原理?
LoRA的工作原理:
冻结预训练的模型参数,然后在Transfomer的每一层中加入一个可训练的旁路矩阵(低秩可分离矩阵),接着将旁路输出与初始路径输出相加输入到网络当中,并只训练这些新增的旁路矩阵参数。其中,低秩可分离矩阵由两个矩阵组成,第一个矩阵负责降维,第二个矩阵负责升维,中间层维度为r,从而来模拟本征秩(intrinsic rank),这两个低秩矩阵能够大幅度减小参数量。
](IMG/微信截图_20241030221531.png)
1.4 讲LoRA的优势?
-
减少检查点大小:在GPT-3上,检查点大小从1TB减少到了25MB。
-
没有额外的推理延迟:LoRA更新可以在推理过程中与原始参数合并。W_new = W_old + AxB
-
快速切换任务的能力:LoRA模块可以高效地加载和卸载。(A_frenchxB_french)、(A_germanxB_german)、(A_spanishxB_spanish)
1.5 讲LoRA的特点?
-
将BA加到W上可以消除推理延迟;
-
可以通过可插拔的形式切换到不同的任务;
-
设计的比较简单且效果好。
1.6 LoRA 存在什么问题?
LoRA参与训练的模型参数量不多,也就百万到千万级别的参数量,所以效果比全量微调差很多。(数据以及算力满足的情况下,还是微调的参数越多越好)
1.7 LoRA 微调作为参数变化?
正如我们之前讨论的,微调的最基本方法是迭代地更新参数。就像正常的模型训练一样,你让模型进行推理,然后根据推理的错误程度更新模型的参数。
](img/微信截图_20241030224938.png)
回想一下之前讨论过的反向传播图。这是微调的基本形式。
LoRA 对此有稍微不同的看法。与其将微调视为学习更好的参数,不如将微调视为学习参数变化。您可以冻结模型参数,就像它们一样,然后学习使模型在微调任务中表现更好所需的这些参数的变化。
这与训练非常相似。您让模型进行推断,然后根据推断的错误程度进行更新。但是,您不是更新模型参数,而是更新模型参数的变化。
](img/微信截图_20241030225004.png)
在LoRA中,我们冻结模型参数,并创建一组描述这些参数变化的新值。然后,我们学习必要的参数变化,以在微调任务上表现更好。
你可能会认为这是一个有点愚蠢的抽象。LoRA的整个目的是要使微调变得更小、更快,那么添加更多的数据和额外的步骤如何使我们能够做到这一点呢?在下一节中,我们将讨论这个问题。
二、LoRA 高级篇
2.1 ChatGLM-6B LoRA后的权重多大?
rank 8 target_module query_key_value条件下,大约15M。
2.2 如何在已有LoRA模型上继续训练?
理解此问题的情形是:已有的lora模型只训练了一部分数据,要训练另一部分数据的话,是在这个lora上继续训练呢,还是跟base 模型合并后再套一层lora,或者从头开始训练一个lora? 把之前的LoRA跟base model 合并后,继续训练就可以,为了保留之前的知识和能力,训练新的LoRA时,加入一些之前的训练数据是需要的。每次都要重头训练的话成本比较高。
2.3 LORA应该作用于Transformer的哪个参数矩阵?
](img/微信截图_20241030223124.png)
从上图我们可以看到:
-
将所有微调参数都放到attention的某一个参数矩阵的效果并不好,将可微调参数平均分配到 Wq 和 Wk 的效果最好;
-
即使是秩仅取4也能在 ∆W 中获得足够的信息。因此在实际操作中,应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。
2.4 Lora的矩阵怎么初始化?为什么要初始化为全0?
矩阵B被初始化为0,而矩阵A正常高斯初始化。 如果B,A全都初始化为0,那么缺点与深度网络全0初始化一样,很容易导致梯度消失(因为此时初始所有神经元的功能都是等价的)。 如果B,A全部高斯初始化,那么在网络训练刚开始就会有概率为得到一个过大的偏移值Δ W 从而引入太多噪声,导致难以收敛。 因此,一部分初始为0,一部分正常初始化是为了在训练开始时维持网络的原有输出(初始偏移为0),但同时也保证在真正开始学习后能够更好的收敛。
2.5 LoRA权重是否可以合入原模型?
可以,将训练好的低秩矩阵(B*A)+原模型权重合并(相加),计算出新的权重。
2.6 LoRA微调方法为啥能加速训练?
-
1)只更新了部分参数:比如LoRA原论文就选择只更新Self Attention的参数,实际使用时我们还可以选择只更新部分层的参数;
-
2)减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;
-
3)采用了各种低精度加速技术,如FP16、FP8或者INT8量化等。这三部分原因确实能加快训练速度,然而它们并不是LoRA所独有的,事实上几乎都有参数高效方法都具有这些特点。LoRA的优点是它的低秩分解很直观,在不少场景下跟全量微调的效果一致,以及在预测阶段不增加推理成本。
2.7 哪些因素会影响内存使用?
内存使用受到模型大小、批量大小、LoRA参数数量以及数据集特性的影响。例如,使用较短的训练序列可以节省内存。
2.8 LoRA权重是否可以合并?
可以将多套LoRA权重合并。训练中保持LoRA权重独立,并在前向传播时添加,训练后可以合并权重以简化操作。
2.9 LoRA是否适用于任何模型架构?
只要模型使用矩阵乘法,就可以应用LoRA。因此,几乎所有的模型架构都可以使用LoRA!
2.10 关于LoRA在Transformer中的说明
在研究本文时,我发现很多人没有讨论一个概念上的不一致。将机器学习模型视为一个大箱子的权重是可以的,但实际上许多模型具有复杂的结构,不太像一个箱子。对我来说,像transformer这样的模型中的参数如何应用这个变化矩阵的概念并不明显。
](img/微信截图_20241030225136.png)
2.12 LoRA在Transformer模型上的应用
根据我目前的理解,对于Transformer模型,有两个要注意的事项:
-
通常,在Transformer的多头自注意力层中,密集网络(用于构建查询、键和值)的深度只有1。也就是说,只有一个输入层和一个由权重连接的输出层。
-
这些浅层密集网络是Transformer中大部分可学习参数,非常非常大。可能有超过100,000个输入神经元连接到100,000个输出神经元,这意味着描述其中一个网络的单个权重矩阵可能有10B个参数。因此,尽管这些网络的深度只有1,但它们非常宽,因此描述它们的权重矩阵非常大。
从LoRA在Transformer模型上的角度来看,这些是被优化的主要参数;你正在学习每个这些非常大但浅层的密集层的分解变化。正如之前讨论的那样,每个这些浅层密集层都有可以表示为矩阵的权重。
三、LoRA 经验论
3.1 LoRA 微调参数量怎么确定?
LoRA 模型中可训练参数的结果数量取决于低秩更新矩阵的大小,其主要由秩 r 和原始权重矩阵的形状确定。
实际使用过程中,通过选择不同的 lora_target 决定训练的参数量。
以 LLama 为例:
--lora_target q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
3.2 Rank 如何选取?
Rank的取值比较常见的是8,理论上说Rank在4-8之间效果最好,再高并没有效果提升。不过论文的实验是面向下游单一监督任务的,因此在指令微调上根据指令分布的广度,Rank选择还是需要在8以上的取值进行测试。
3.3 是否可以逐层调整LoRA的最优rank?
理论上,可以为不同层选择不同的LoRA rank,类似于为不同层设定不同学习率,但由于增加了调优复杂性,实际中很少执行。
3.4 alpha参数 如何选取?
alpha其实是个缩放参数,本质和learning rate相同,所以为了简化可以默认让alpha=rank,只调整lr,这样可以简化超参。
3.5 LoRA 高效微调如何避免过拟合?
过拟合还是比较容易出现的。减小r或增加数据集大小可以帮助减少过拟合,还可以尝试增加优化器的权重衰减率或LoRA层的dropout值。
3.6 LoRA在用的时候可能会有哪些坑?
-
低秩矩阵可能不足以捕捉特定任务的复杂性,导致性能下降。
-
如果任务本身过于复杂或具有较多的高维度信息,LoRA 的压缩能力可能不足以达到预期效果。
-
LoRA 的优化和调整需要一定的经验,否则可能无法获得最佳性能。
四、LoRA 对比论
4.1 LoRA这种微调方法和全参数比起来有什么劣势吗?
](img/微信截图_20241030223103.png)
如果有足够计算资源以及有10k以上数据,还是建议全参数微调,lora的一个初衷就是为了解决不够计算资源的情况下微调,只引入了少量参数,就可以在消费级gpu上训练,但lora的问题在于它不能节省训练时间,相比于全量微调,他要训练更久,同时因为可训练参数量很小,在同样大量数据训练下,比不过全量微调。
4.2 何时使用全量微调?
当在数据集上进行微调,这些数据集完全不同于基础模型预训练的数据集时(例如,如果你正在用火星语数据对英语模型进行微调,则可能需要全量微调)。
五、LoRA 奇思妙想
5.1 LoRA带来的一些有趣的想法
-
在RAM中缓存LoRA模块以实现更快的模型切换和在不同的微调之间进行路由。
-
在训练集的不同批次上并行训练多个LoRA模块。
-
创建一个自适应模型树,其中每个节点是一个LoRA模块。
六、LoRA 变体篇
6.1 QLoRA原理,QLoRA里用的是哪种量化?
QLoRA 是基于量化版本的 LoRA,旨在将模型量化为低精度表示(如 4-bit、8-bit 等)以减少计算开销。QLoRA 在保留原始模型性能的同时,通过量化和低秩适配降低存储和计算成本。
QLoRA 使用的是 4-bit 量化,这种量化方式可以显著减少内存需求,同时保留模型的有效性。在实践中,量化可能会导致小幅度的精度损失,但通过精心设计和微调,QLoRA 能够在性能和效率之间找到平衡。
===
(完)
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全整理的大模型大厂真实面经》,扫码获取~