LORA系列
00 min
2024-9-28
2024-9-28
type
status
date
slug
summary
tags
category
icon
password

LORA系列

  • LoRA 引入了低秩矩阵 A 和 B,这些矩阵是经过训练的,而预训练的权重矩阵 W 是固定的。
  • LoRA+ 建议 B 的学习率应远高于 A 的学习率。
  • VeRA 不训练 A 和 B,而是随机初始化它们,并在此基础上训练新的向量 d 和 b。
  • LoRA-FA 仅训练矩阵 B。
  • LoRA-drop 使用 B*A 的输出确定哪些层值得进行训练。
  • AdaLoRA 动态地调整不同层中 A 和 B 的排名,从而在这些层中允许更高的排名,期望对模型性能的贡献更大。
  • DoRA 将 LoRA 适配器分为两个组件:幅度和方向,并允许更独立地训练它们。
  • Delta-LoRA通过 A*B 的梯度改变 W 的权重。
 

LoRA

LoRA 的主要思想是在预训练权重矩阵 W 旁边添加两个较小的可调矩阵 A 和 B,而不改变 W 的参数。
notion image
LoRA 引入了两个矩阵 A 和 B,它们被称为 适配器,并且尺寸要小得多。如果原始参数矩阵 W 的大小为 d x d,则矩阵 A 和 B 的大小分别为 d x r 和 r x d,其中 r 要小得多(通常小于 100)。参数 r 被称为 。也就是说,如果您使用秩为 r=16 的 LoRA,则这些矩阵的形状为 16 x d。秩越高,训练的参数就越多。一方面,这会导致更好的性能,但另一方面需要更多计算时间。
输入到 W 的数据也会输入到 B*A,并且 B*A 的输出会加到原始矩阵 W 的输出上。也就是说,你在上面训练一些参数,并将它们的输出添加到原始预测中,这可以让你影响模型的行为。你不再训练 W,这就是为什么我们有时说 W 是 冻结 的。重要的是,A 和 B 的加法不仅在最后完成(这只会添加一层),而且可以应用于神经网络深处的层。
在开始时,矩阵 A 用均值为零的随机值初始化,但围绕该均值有一定的方差。矩阵 B 被初始化为一个全零矩阵。这确保了 LoRA 矩阵从一开始就不会以随机方式改变原始 W 的输出。A 和 B 对 W 输出的更新应该更像是对原始输出的补充,一旦 A 和 B 的参数被调整到期望的方向。

LoRA+

LoRA+ 为矩阵 A 和 B 引入了不同的学习率,这里用参数 λ 表示
notion image
LoRA+ [2] 介绍了一种更有效的方式来训练 LoRA 适配器,方法是引入矩阵 A 和 B 的不同学习率。 大多数情况下,在训练神经网络时,只使用一个学习率,以相同的方式应用于所有权重矩阵。然而,对于 LoRA 中使用的适配器矩阵,LoRA+ 的作者可以证明,使用单个学习率是次优的。通过将矩阵 B 的学习率设置得比矩阵 A 的学习率高得多,训练变得更加高效。
有一种理论论据可以证明这种方法是合理的,该论据主要基于神经网络初始化的数值注意事项,如果模型在神经元数量方面变得非常宽。然而,证明这一点所需的数学运算相当复杂。直观地,你可能会认为初始化为零的矩阵 B 可以使用比随机初始化的矩阵 A 更大的更新步长。此外,有实证证据表明这种方法有所改进。通过将矩阵 B 的学习率设置为矩阵 A 的 16 倍,作者能够在模型精度方面获得少量改进(约 2%),同时将训练时间缩短两倍,适用于 RoBERTa 或 Llama-7b 等模型。

VeRA

VeRA 不训练 A 和 B,而是将它们初始化为随机投影,并训练额外的向量 d 和 b
notion image
VeRA (Vector-based Random Matrix Adaptation) 作者提出了一种大幅减少 LoRA 适配器参数规模的方法。他们没有训练矩阵 A 和 B(这是 LoRA 的核心思想),而是用共享随机权重初始化这些矩阵(即所有层中的矩阵 A 和 B 具有相同的权重),并添加两个新的向量 d 和 b。在接下来的训练中,只有这些向量 d 和 b 会被训练。
基于随机投影领域的研究,在一个大型神经网络中,只有一小部分权重用于引导行为并实现模型所训练任务的期望性能。由于随机初始化,模型的某些部分(或子网络)从一开始就对期望的模型行为贡献更大。在训练过程中,所有参数都会被训练,因为现在已经知道哪些是重要的子网络。这使得训练成本非常高,因为大多数更新的参数对模型的预测没有任何价值。
基于这个想法,有一些方法只训练这些相关的子网络。通过在矩阵后添加投影向量,而不是训练子网络本身,也可以获得类似的行为。由于矩阵与向量的乘法,这可能导致与调整矩阵中某些稀疏参数相同的输出。这正是 VeRA 的作者所提出的,通过引入向量 d 和 b 进行训练,而矩阵 A 和 B 保持不变。此外,与原始的 LoRa 方法相比,矩阵 B 不再被设置为零,而是像矩阵 A 一样随机初始化。
在 GPT-3 中引入秩为 16 的 LoRA 层,预计有 7550 万个参数。而使用 VeRA,只有 280 万个参数(减少了 97%)。但VeRA 模型的性能仅比完全微调的模型或使用原始 LoRa 技术的模型低一些。

LoRA-FA

LoRA-FA 冻结矩阵 A,仅训练矩阵 B
notion image
在 LoRA-FA 中,矩阵 A 在初始化后被冻结,因此作为随机投影。相反,矩阵 B 在初始化为零后进行训练(就像在原始 LoRA 中一样)。这将参数数量减半,同时性能与普通 LoRA 相当。

LoRA-drop

LoRA-drop 使用 B*A 的输出来决定哪些 LoRA 层值得进行训练。
notion image
LoRA-drop引入了一种算法来决定哪些层值得通过 LoRA 进行增强,以及哪些层不值得付出努力。即使训练 LoRA 适配器的成本远低于微调整个模型,但您添加的 LoRA 适配器越多,训练的成本仍然越高。
LoRA-drop步骤:1.从数据中抽取一个子集,并训练 LoRA 适配器几次迭代。2.计算每个 LoRA 适配器的重要性,公式为 B*A*x,其中 A 和 B 是 LoRA 矩阵,x 是输入。这实际上是 LoRA 适配器的输出,它被添加到每个冻结层的输出中。如果这个输出很大,它会更显著地改变冻结层的行为。如果很小,这表明 LoRA 适配器对冻结层的影响很小,也可以省略。
如何选择LoRA层:1将重要性值相加,直到达到一个由超参数控制的阈值,2.可以直接选择重要性最高的前 n 个 LoRA 层。在使用全量数据进行微调的时候,仅会在被选择的层上进行训练。其他的层会被固定。

AdaLoRA

在网络的不同层次上,LoRA 矩阵被赋予不同的秩。一般来说,越往后,秩更高
notion image
 
 
 

DoRA

DoRA 的出发点是,每个矩阵都可以分解为一个大小和一个方向的乘积。在 DoRA 中,权重矩阵 W 被分解为幅度 m 和方向 V,且两者是独立微调的。
notion image
LoRA 的主要思想是实现与微调相同的性能,但参数更少。这意味着,理想情况下,我们希望在不增加成本的前提下,LoRA 的训练尽可能多地与微调共享属性。如果在微调中方向和幅度之间的相关性略为负,那这对于 LoRA 来说也可能是一个理想的特。 换句话说,如果 LoRA 中方向和大小之间的关系与完全微调不同,这可能是 LoRA 有时表现不如微调的原因之一。
DoRA 的作者提出了一种通过将预训练矩阵 W 分离为大小为1 x d的幅度向量 m 和方向矩阵 V,独立训练幅度和方向的方法。然后,方向矩阵 V 通过 B*A 进行增强,这与标准的 LoRA 方法相同,而 m 则保持不变进行训练,因为它只有一个维度。虽然 LoRA 倾向于同时改变幅度和方向(这两者之间的高度正相关表明了这一点),但 DoRA 可以更容易地调整其中一个而不影响另一个,或者用一个的负变化来补偿另一个的变化。我们可以看到方向和幅度之间的关系更像是微调中的关系:
 

Delta-LoRA

Delta-LoRA 不会冻结矩阵 W,而是用从 B*A 获得的梯度更新它。
notion image
 
Delta-LoRA 的作者提议通过 AB 的梯度来更新矩阵 W,AB 是在两个连续时间步之间的差异。这个梯度被某个超参数λ缩放,λ控制新训练对预训练权重的影响程度,然后被添加到 W 中(而α和 r(秩)是原始 LoRA 设置中的超参数):
notion image
这引入了更多的参数进行训练,几乎没有计算开销。我们不必像在微调中那样计算整个矩阵 W 的梯度,而是用在 LoRA 训练中已经获得的梯度来更新它。
 

论文链接

上一篇
大模型时代如何学 AI
下一篇
RAG VS FineTune