• 发布日期
    2025 年 2 月 18 日
  • 分享

在这篇博文中,我将讨论 LoRA(大型语言模型的低秩自适应)方法的细节和原理,同时介绍 论文。本文的主要重点是提出一种新的结构,以降低模型微调的成本,同时提高其性能。微调操作在自然语言处理研究中一直占有重要地位。假设你有一个训练好的模型,你想扩展它的知识。你可以通过微调来实现,而不需要从头开始训练模型。

假设一个模型在训练后有 n 个参数,你需要对其进行微调。如果你使用完全微调方法,模型的所有参数都将被更新。当我们考虑具有数十亿个参数的模型时,更新所有参数将产生时间和存储问题。本文强调使用 LoRA 方法对 RoBERTa、DeBERTa、GPT-2 和 GPT-3 模型进行更好或同等的性能测试。

论文中提到,LoRA 方法受到了 Li et. al (2018a) 和 Aghajanyan et al. (2020) 的研究的启发。这些研究强调,过度参数化的模型的成功实际上是基于较低的内在维度。这成为塑造 LoRA 方法假设的要点。

LoRA 方法是一项完全基于秩分解的研究。在该方法中,两个顺序矩阵与神经网络中的一些密集层并行添加,如图 1 所示。这些顺序矩阵由给定的秩配置形成。下图显示了添加顺序秩矩阵后密集层的样子。输入变量通过原始预训练权重矩阵和顺序矩阵的第一个矩阵发送。然后,通过将这两个并行矩阵的输出相加来计算输出值。

 

Ekran Resmi 2024-12-26 15.25.36.png
来源: https://arxiv.org/abs/2106.09685

LoRA方法

神经网络有许多执行矩阵乘法的密集层。这些层中的权重矩阵实际上是满秩矩阵(所有行和列都是独立的)。但 Aghajanyan 等人提到 在他们的论文中 预训练语言模型的“固有维度”较低。它在这方面形成了 LoRA 假设。因此,LoRA 假设变成了模型可以在适应特定任务的过程中通过权重矩阵的低维变化进行学习。

此矩阵的更新是通过矩阵进行的 

Ekran_Resmi_2024_12_26_15_32_57_6efdebb733.png

低秩分隔。这里,B 是 dxr 矩阵,A 是 rxk 矩阵,而 r(秩)比 d 和 k 小得多。在微调过程中,会阻止 Wo 的梯度更新。Wo 和 ∆W 矩阵都乘以相同的输入值,并将结果相加,形成输出 h= w0 + ∆Wx = w0 +BAx。

在训练开始时,他们对 A 矩阵值使用随机高斯初始化,对 B 矩阵值使用全零初始化。换句话说,BA 在开始时等于零。

LoRA 在 Transformer 架构中的应用

在 transformer 架构中,自注意力模块中有 4 个权重矩阵 Wq、Wk、Wv、Wo,MLP 模块中有 2 个权重矩阵。在 LoRA 适配期间,他们冻结了 MLP 模块中的权重,并将该方法应用于注意力权重,以保持训练简单。

优势   

  • LoRA 提供的最大便利是内存和存储的使用。例如,文章中提到,对于使用 Adam 训练的大型 Transformer 模型,如果 << r d,则 VRAM 使用量最多可减少 2/3。这是因为优化器状态不会保留冻结参数。
  • 对于 GPT-3 175B 型号,VRAM 消耗从 1.2TB 减少到 350GB。
  • 在 r=4 且仅更改值和查询矩阵的权重的场景中,检查点大小从 350GB 减少到 35MB。这使得可以使用更少的 GPU 进行训练。
  • 此外,由于大部分参数没有梯度更新,使用 LoRA 训练 GPT-25 3B 时,与完全微调过程相比,实现了 175% 的加速。

文章还提到,如果需要针对不同的语言进行微调过程,则应该使用整个模型,而不是 LoRA。

其他知识

什么是等级

 是矩阵中线性独立的列或行的总数。假设我们有一个有 n 列的矩阵,并且所有列都是相互独立的,那么我们可以说这个矩阵的列秩为 n。同样,如果一个有 n 行的矩阵的所有行都是相互独立的,那么我们可以再次说这个矩阵的行秩为 n。

矩阵的行秩和列秩必须相等。作为示例,我们可以看下面的矩阵。

矩阵 A = [[1,2,5], [ 2, 4, 10] ]

如果我们仔细观察矩阵,就会发现第二行是第一行的两倍。同样,矩阵的第二列和第三列分别是第一列的 2 倍和 1 倍。换句话说,虽然矩阵中同一行有两个向量,而另一行有三个不同的向量,但每行和每列只有一个唯一的向量。这意味着矩阵的秩为 2。

为了找到秩,我们将矩阵转换为阶梯形式,然后计算至少由一个非零值组成的行数。

什么是低秩矩阵

在矩阵中,秩可以等于或小于列数或行数。具有小于当前行数或列数的线性独立行或列的矩阵称为低秩矩阵。所有行或列都独立的矩阵称为满秩矩阵。

什么是秩分解/分解

我们可以将秩为 r 的矩阵重写为 B=LR^T,方法是将其分解为 L 和 R 矩阵。其中,L 是 mxr 维矩阵,而 R^T 是 rxn 维矩阵。这个过程称为 等级分解.

秩分解的重要性:

秩分解过程的重要性 是它允许我们将矩阵划分为较小的矩阵 L 和 R,并将它们保存在较少的空间中。这意味着您可以通过存储其因子 L 和 R 来存储 B。这将 B 的存储要求从 mn 个数字减少到 (m+n)r 个数字。这里值得一提的另一点是,将矩阵分解为这两个小矩阵后,它允许对矩阵进行许多计算,甚至无需再次生成相同的矩阵。因此,在处理低秩矩阵时,秩分解始终被视为重要的第一步。在秩分解之后,计算速度会更快,并且占用更少的内存。

此外

有关低秩矩阵的更多详细信息,您可以阅读 Ethan R. Epperly 的 博客 和 LoRA纸。此外,您还可以在 微软/LoRA github 存储库。

Gizem ABALI,理学硕士 / 团队负责人