LoRA可以说是针对特定任务高效训练大型语言模型的重大突破。它被广泛应用于许多应用中。在本文中,我们将解释LoRA本身的基本概念,然后介绍一些以不同的方式改进LoRA的功能的变体,包括LoRA+、VeRA、LoRA- fa、LoRA-drop、AdaLoRA、DoRA和Delta-LoRA。
Lora
低秩自适应(Low-Rank adaptation, LoRA)[1]是目前广泛用于训练大型语言模型(large language models, llm)的一种技术。大型语言模型可以为我们生成各种内容,但对于解决许多问题来说,我们还是希望在给定的下游任务上训练LLM,例如对句子进行分类或生成给定问题的答案。但是如果直接使用微调,这就需要要训练有数百万到数十亿个参数的大模型。
LoRA提供了另一种训练方法,通过减少训练的参数数量,这种方法更快、更容易进行。LoRA引入了两个矩阵A和B,如果参数W的原始矩阵的大小为d × d,则矩阵A和B的大小分别为d × r和r × d,其中r要小得多(通常小于100)。参数r称为秩。如果使用秩为r=16的LoRA,则这些矩阵的形状为16 x d,这样就大大减少了需要训练的参数数量。LoRA的最大的优点是,与微调相比,训练的参数更少,但是却能获得与微调基本相当的性能。
LoRA的一个技术细节是:在开始时,矩阵A被初始化为均值为零的随机值,但在均值周围有一些方差。矩阵B初始化为完全零矩阵。这确保了LoRA矩阵从一开始就不会以随机的方式改变原始W的输出。一旦A和B的参数被调整到期望的方向,那么W的输出中A和B的更新应该是对原始输出的补充。
LoRA大大降低了LLM的训练资源消耗。所以在最初的LoRA方法上出现了有许多不同的变体,它们以不同的方式改进了原始方法。
LoRA+
LoRA+[2]通过为矩阵a和b引入不同的学习率,引入了一种更有效的训练LoRA适配器的方法。LoRA在训练神经网络时,学习率是应用于所有权重矩阵。而LoRA+的作者可以证明,只有单一的学习率是次优的。将矩阵B的学习率设置为远高于矩阵A的学习率,可以使得训练更加高效。
作者证明它所需的数学是相当复杂的(如果你真的对它感兴趣,可以看看原始论文[2])。我们来做一个通俗的简单解释:矩阵B的初始化为0,所以需要比随机初始化的矩阵a需要更大的更新步骤。通过将矩阵B的学习率设置为矩阵A的16倍,作者已经能够在模型精度上获得小幅提高(约2%),同时将RoBERTa或lama-7b等模型的训练时间加快2倍。
VeRA
VeRA(Vector-based Random Matrix Adaptation)[3],引入了一种方法来大幅减少LoRA参数大小。他们没有训练矩阵A和B而是用共享的随机权值初始化这些矩阵(即所有层中所有矩阵A和B都具有相同的权值),并添加两个新的向量d和B,微调的时候只训练向量d和B。
A和B是随机权重矩阵。如果他们根本没有受过训练,他们应该如何对模型的性能做出贡献呢?这种方法基于一个有趣的研究领域,即所谓的随机预测。有相当多的研究表明,在一个大型神经网络中,只有一小部分权重被用来引导行为,并导致模型在训练任务上的预期性能。所以由于随机的初始化,模型的某些部分(或子网络)从一开始就更倾向于期望的模型行为。
但是这样的话在训练过程中所有的参数都需要被训练,这和完全微调没有人任何区别。VeRA的作者通过引入向量d和b只训练这些相关的子网络,与原始的LoRa方法相反矩阵A和b是冻结的,并且矩阵B不再被设置为零,而是像矩阵A一样随机初始化
这种方法会产生许多比完整矩阵a和b小得多的参数。如果将秩为16的lora层引入GPT-3,则会有75.5万个参数。使用VeRA,则只需要280万(减少97%)。在参数如此少的情况下,性能如何呢?VeRA的作者使用GLUE或E2E等常见基准以及基于RoBERTa和GPT2 Medium的模型进行了评估。结果表明VeRA模型产生的性能仅略低于完全微调的模型或使用原始LoRa技术的模型。
LoRA-FA
LoRA- fa[4],是LoRA与Frozen-A的缩写,在LoRA-FA中,矩阵A在初始化后被冻结,因此作为随机投影。矩阵B不是添加新的向量,而是在用零初始化之后进行训练(就像在原始LoRA中一样)。这将参数数量减半,同时具有与普通LoRA相当的性能。
LoRa-drop
Lora矩阵可以添加到神经网络的任何一层。LoRA-drop[5]则引入了一种算法来决定哪些层由LoRA微调,哪些层不需要。
LoRA-drop包括两个步骤。在第一步中对数据的一个子集进行采样,训练LoRA进行几次迭代。然后将每个LoRA适配器的重要性计算为BAx,其中A和B是LoRA矩阵,x是输入。这是添加到冻结层输出中的LoRA的输出。如果这个输出很大,说明它会更剧烈地改变行为。如果它很小,这表明LoRA对冻结层的影响很小可以忽略。
选择最重要的LoRA层也有有不同的方法:可以汇总重要性值,直到达到一个阈值(这是由一个超参数控制的),或者只取最重要的n个固定n的LoRA层。无论使用哪种方法,还都需要在整个数据集上进行完整的训练(因为前面的步骤中使用了一个数据子集),其他层固定为一组共享参数,在训练期间不会再更改。
LoRA-drop算法允许只使用LoRA层的一个子集来训练模型。根据作者提出的证据表明,与训练所有的LoRA层相比,准确度只有微小的变化,但由于必须训练的参数数量较少,因此减少了计算时间。
AdaLoRA
有很多种方法可以决定哪些LoRA参数比其他参数更重要,AdaLoRA[6]就是其中一种,AdaLoRA的作者建议考虑将LoRA矩阵的奇异值作为其重要性的指标。
与上面的LoRA-drop有一个重要的区别是在LoRA-drop中层的适配器要么被完全训练,要么根本不被训练。而AdaLoRA可以决定不同的适配器具有不同的秩(在原始的LoRA方法中,所有适配器具有相同的秩)。
AdaLoRA与相同秩的标准LoRA相比,两种方法总共有相同数量的参数,但这些参数的分布不同。在LoRA中,所有矩阵的秩都是相同的,而在AdaLoRA中,有的矩阵的秩高一些,有的矩阵的秩低一些,所以最终的参数总数是相同的。经过实验表明AdaLoRA比标准的LoRA方法产生更好的结果,这表明在模型的部分上有更好的可训练参数分布,这对给定的任务特别重要。下图给出了AdaLoRA如何为给定模型分配排名的示例。正如我们所看到的,它给接近模型末尾的层提供了更高的秩,表明适应这些更重要。
DoRA
另一种修改LoRa以获得更好性能的方法是weight - decomposition Low-Rank Adaption (DoRA)[7]。因为每个矩阵都可以分解成大小和方向的乘积。对于二维空间中的向量,可以很容易地将其想象为:向量是一个箭头,从0的位置开始,到向量空间中的某一点结束。对于向量的元素,如果你的空间有两个维度x和y,你可以说x=1和y=1。或者可以用不同的方式描述同一个点,通过指定大小和角度(即方向),比如m=√2和a=45°。这意味着从点0开始沿45°方向移动箭头长度为√2。会得到相同的点(x=1,y=1)
这种大小和方向的分解也可以用更高阶的矩阵来完成。DoRA的作者将此应用于权重矩阵,权重矩阵描述了使用正常微调训练的模型和使用LoRA适配器训练的模型在训练步骤中的更新。可以在下图中看到这两种技术的对比:
微调模型(左)和使用LoRA适配器训练的模型(右)。在x轴上可以看到方向的变化,在y轴上可以看到幅度的变化,图中的每个散点都属于模型的一层。这两种训练方式有一个重要的区别。在左图中方向更新与幅度更新之间存在较小的负相关关系,而在右图中存在更强的正相关关系。你可能想知道哪个更好或者这是否有任何意义。但是其实LoRA的主要思想是使用更少的参数实现与微调相同的性能。也就是说只要不增加成本,LoRA的训练能够通过共享尽可能多的属性那就可以了。通过上图我们也可以看到LoRA中的方向和幅度之间的关系与完全微调不同,这可能是LoRA有时不如微调的原因之一。
DoRA的作者介绍了一种方法,通过将预训练矩阵W分离为大小为1 x d的大小向量m和方向矩阵V,从而独立训练大小和方向。然后方向矩阵V通过B* a增强,然后m按原样训练。虽然LoRA倾向于同时改变幅度和方向(正如这两者之间高度正相关所表明的那样),DoRA可以更容易地将二者分开调整,或者用另一个的负变化来补偿一个的变化。所以可以DoRA的方向和大小之间的关系更像微调:
在几个基准测试中,DoRA在准确性方面优于LoRA。将权重更新分解为大小和方向允许DoRA执行更接近于在微调中完成的训练,同时仍然使用LoRA的更小的参数空间。
Delta-LoRA
Delta-LoRA[8]引入了另一种改进LoRA的思想,让预训练矩阵W再次发挥作用。LoRA的主要思想是不要调整预训练矩阵W,因为这太费资源了。LoRA引入了新的较小的矩阵A和b,这些较小的矩阵学习下游任务的能力较差,所以LoRA训练的模型的性能通常低于微调模型的性能。
Delta-LoRA的作者提出用AB的梯度来更新矩阵W, AB的梯度是A*B在连续两个时间步长的差。这个梯度用超参数λ进行缩放,λ控制新训练对预训练权重的影响应该有多大。
这在几乎没有计算开销的情况下引入了更多需要训练的参数。不必像在微调中那样计算整个矩阵W的梯度,而是用在LoRA训练中已经得到的梯度来更新它。作者使用RoBERTA和GPT-2等模型在许多基准测试中比较了这种方法,发现与标准的LoRA方法相比,这种方法的性能有所提高。
总结
LoRA及其相关方法的研究领域是一个非常活跃的研究领域,每天都有新的贡献。本文解释一些方法的核心思想。如果你对这些方法感兴趣请查看论文:
[1] LoRA: Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., … & Chen, W. (2021). Lora: Low-rank adaptation of large language models. arXiv preprint arXiv:2106.09685.
[2] LoRA+: Hayou, S., Ghosh, N., & Yu, B. (2024). LoRA+: Efficient Low Rank Adaptation of Large Models. arXiv preprint arXiv:2402.12354.
[3] VeRA: Kopiczko, D. J., Blankevoort, T., & Asano, Y. M. (2023). Vera: Vector-based random matrix adaptation. arXiv preprint arXiv:2310.11454.
[4]: LoRA-FA: Zhang, L., Zhang, L., Shi, S., Chu, X., & Li, B. (2023). Lora-fa: Memory-efficient low-rank adaptation for large language models fine-tuning. arXiv preprint arXiv:2308.03303.
[5] LoRA-drop: Zhou, H., Lu, X., Xu, W., Zhu, C., & Zhao, T. (2024). LoRA-drop: Efficient LoRA Parameter Pruning based on Output Evaluation. arXiv preprint arXiv:2402.07721.
[6] AdaLoRA: Zhang, Q., Chen, M., Bukharin, A., He, P., Cheng, Y., Chen, W., & Zhao, T. (2023). Adaptive budget allocation for parameter-efficient fine-tuning. arXiv preprint arXiv:2303.10512.
[7] DoRA: Liu, S. Y., Wang, C. Y., Yin, H., Molchanov, P., Wang, Y. C. F., Cheng, K. T., & Chen, M. H. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv preprint arXiv:2402.09353.
[8]: Delta-LoRA: Zi, B., Qi, X., Wang, L., Wang, J., Wong, K. F., & Zhang, L. (2023). Delta-lora: Fine-tuning high-rank parameters with the delta of low-rank matrices. arXiv preprint arXiv:2309.02411.
https://avoid.overfit.cn/post/76413f0a06ec48b08186b28f88da206f
作者:Dorian Drost