人工智能
LoRa, QLoRA 和 QA-LoRA:通过低秩矩阵分解实现大型语言模型的高效适应性

大型语言模型(LLMs)已经开辟出了一条独特的道路,提供了无与伦比的理解和生成类似人类文本的能力。LLMs 的强大功能可以归因于其庞大的规模,通常具有数十亿个参数。虽然这种巨大的规模推动了它们的性能,但同时也带来了挑战,特别是在模型适应特定任务或领域时。管理 LLMs 的传统方法,例如微调所有参数,带来了巨大的计算和财务负担,从而对其在实际应用中的广泛采用构成了重大障碍。
在之前的一篇文章中,我们探讨了如何微调大型语言模型(LLMs)以满足特定的需求。我们研究了各种微调方法,例如基于指令的微调、单任务微调和参数高效微调(PEFT),每种方法都有其独特的优化 LLMs 以执行不同任务的方法。讨论的中心是变换器架构,即 LLMs 的骨干,以及处理大量参数在微调过程中的计算和内存需求带来的挑战。
上述图像代表了不同大型语言模型的规模,按其参数数量排序。值得注意的是:PaLM、BLOOM 等。
截至今年,已经有了进一步的进展,导致了更大的模型的出现。然而,在标准系统上对如此庞大的开源模型进行微调是不可行的,除非使用专门的优化技术。
低秩适应(LoRA)由微软在这篇论文中提出,旨在减轻这些挑战并使 LLMs 更加易于获取和适应。
LoRA 的核心在于其对模型适应的方法,不需要深入到重新训练整个模型的复杂性。与传统的微调不同,传统微调会改变每个参数,LoRA 采取了一条更聪明的路线。它冻结了预训练模型的权重,并在变换器架构的每个层中引入了可训练的低秩分解矩阵。这种方法大大减少了可训练参数的数量,确保了更高效的适应过程。
LLM 调优策略的演进
回顾 LLM 调优的旅程,可以识别出多年来实践者采用的一系列策略。最初,人们关注的是微调预训练模型,这是一种涉及全面修改模型参数以适应特定任务的策略。然而,随着模型的大小和复杂性的增长,这种方法的计算需求也随之增长。
下一个获得关注的策略是子集微调,这是其前身的更为克制的版本。在这里,只有模型参数的子集被微调,从而在一定程度上减少了计算负担。尽管它有其优点,但子集微调仍然无法跟上 LLMs 大小的增长速度。
随着实践者寻求更高效的途径,完整微调出现为一种严格但有回报的方法。
LoRA 介绍
矩阵的秩为我们提供了一个关于其列创建的维度的洞察,取决于它的唯一行或列的数量。
- 满秩矩阵:其秩与其行或列的较小数目相匹配。
- 低秩矩阵:其秩远小于其行和列的数量,捕获的特征较少。
现在,大型模型对其领域有广泛的理解,例如语言模型中的语言。但是,微调它们以执行特定任务通常只需要突出这些理解的一小部分。这是 LoRA 发挥作用的地方。它表明,展示这些权重调整的矩阵可以是一个低秩矩阵,从而捕获较少的特征。
LoRA 智能地限制了这个更新矩阵的秩,通过将其分解为两个较小的秩矩阵。因此,LoRA 不是改变整个权重矩阵,而是只改变其中的一部分,使得微调任务更加高效。
将 LoRA 应用于变换器
LoRA 通过关注特定的权重矩阵来最小化神经网络中的训练负担。在变换器架构下,某些权重矩阵与自注意力机制相关,特别是 Wq、Wk、Wv 和 Wo,以及多层感知器(MLP)模块中的另外两个。
LoRA 背后的数学解释
让我们分解 LoRA 背后的数学:
- 预训练权重矩阵 W0:
- 它从一个预训练的权重矩阵 W0 开始,维度为 d×k。这意味着矩阵有 d 行和 k 列。
- 低秩分解:
- 不是直接更新整个矩阵 W0,这可能在计算上很昂贵,该方法提出了一种低秩分解方法。
- 更新 ΔW 到 W0 可以表示为两个矩阵的乘积:B 和 A。
- B 的维度为 d×r。
- A 的维度为 r×k。
- 关键点在于秩 r 远小于 d 和 k,从而允许更高效的表示。
- 训练:
- 在训练过程中,W0 保持不变。这被称为“冻结”权重。
- 另一方面,A 和 B 是可训练的参数。这意味着,在训练过程中,矩阵 A 和 B 进行调整,以提高模型的性能。
- 乘法和加法:
- 同时,W0 和更新 ΔW(它是 B 和 A 的乘积)被相同的输入(表示为 x)乘以。
- 这些乘法的输出然后被加在一起。
- 该过程在以下等式中总结:h=W0x+ΔWx=W0x+BAx. 这里,h 表示在输入 x 上应用更新后的最终输出。
简而言之,这种方法允许以更高效的方式更新大型权重矩阵,通过使用低秩分解来表示更新,这在计算效率和内存使用方面是有益的。
初始化和缩放:
在训练模型时,参数的初始化方式会显著影响学习过程的效率和有效性。在使用 A 和 B 更新权重矩阵时:
- 矩阵 A 和 B 的初始化:
- 矩阵 A:该矩阵使用随机高斯值进行初始化,也称为正态分布。使用高斯初始化的理由是为了打破对称性:同一层中具有不同初始权重的神经元将学习不同的特征。
- 矩阵 B:该矩阵用零初始化。通过这样做,更新 ΔW=BA 在训练开始时为零。它确保模型在开始时不会发生突然的行为变化,从而允许模型在 B 在训练过程中学习适当的值时逐渐适应。
- 从 ΔW 输出的缩放:
- 计算更新 ΔW 后,其输出被一个因子 rα 缩放,其中 α 是一个常数。通过缩放,更新的幅度得以控制。
- 缩放在秩 r 发生变化时尤为重要。例如,如果您决定增加秩以获得更高的准确性(以计算为代价),则缩放确保您不需要在此过程中调整许多其他超参数。这为模型提供了一定的稳定性。
LoRA 的实际影响
LoRA 已经展示了其在 AI 社区中高效地将 LLMs 调整为特定艺术风格的潜力。这在将模型适应 Greg Rutkowski 的艺术风格方面得到了体现。
正如在使用 GPT-3 175B 作为示例的论文中强调的那样,拥有 175B 参数的单独微调模型实例的成本非常高。但是,使用 LoRA,训练参数的数量减少了 10,000 倍,GPU 内存使用量也减少到三分之一。
LoRA 方法不仅代表了使 LLMs 更加易于获取的一大步,也强调了弥合 AI 领域理论进步与实际应用之间差距的潜力。通过缓解计算障碍并促进更高效的模型适应过程,LoRA 有望在 LLMs 在实际场景中的更广泛采用和部署中发挥关键作用。
QLoRA(量化)
虽然 LoRA 在减少存储需求方面是一个游戏规则的改变者,但它仍然需要一台强大的 GPU 来加载模型进行训练。这就是 QLoRA 或量化 LoRA 的用武之地,它将 LoRA 与量化相结合,形成了一种更智能的方法。
通常,权重参数以 32 位格式(FP32)存储,这意味着矩阵中的每个元素占用 32 位空间。想象一下,如果我们可以将相同的信息压缩到仅 8 位甚至 4 位。这就是 QLoRA 的核心思想。量化是指将连续的无限值映射到一个较小的离散有限值集。在 LLMs 的背景下,它指的是将模型的权重从更高精度的数据类型转换为较低精度的数据类型。
以下是 QLoRA 的更简单的解释:
- 初始量化:首先,将大型语言模型(LLM)量化为 4 位,显著减少了内存占用。
- LoRA 训练:然后,以标准的 32 位精度(FP32)进行 LoRA 训练。
现在,您可能会想知道,为什么在将模型缩小到 4 位后,又需要将其恢复到 32 位进行训练。好吧,为了在 FP32 中有效地训练 LoRA 适配器,模型权重也需要恢复到 FP32。这一来回切换是以一种聪明的、分步骤的方式进行的,以避免让 GPU 内存不堪重负。
LoRA 在 Hugging Face 的 参数高效微调(PEFT) 库中找到其实际应用,简化了其使用。对于那些希望使用 QLoRA 的人来说,它可以通过 bitsandbytes 和 PEFT 库的组合来访问。此外,HuggingFace 的 变换器强化学习(TRL)库 通过对 LoRA 的集成支持来实现有监督的微调。这些三个库共同提供了微调选定预训练模型的必要工具包,使得在给定特定属性指令时能够生成令人信服和连贯的产品描述。
QLoRA 后,权重需要恢复到高精度格式,这可能会导致精度损失,并且缺乏加速过程的优化。
一种提议的解决方案是将权重矩阵分组为较小的段,并对每个组单独应用量化和低秩适应。一个名为 QA-LoRA 的新方法试图结合量化和低秩适应的优势,同时保持过程的效率和模型的有效性,以实现所需的任务。
结论
在本文中,我们讨论了大型语言模型(LLMs)面临的挑战,这些挑战源于它们的巨大参数规模。我们深入探讨了传统的微调实践及其相关的计算和财务需求。LoRA 的核心在于其能够在不需要重新训练整个模型的情况下修改预训练模型,从而减少可训练参数并使适应过程更加划算。
我们还简要介绍了量化 LoRA(QLoRA),它是 LoRA 和量化的结合,减少了模型的内存占用,同时保留了训练所需的精度。
通过这些先进的技术,实践者现在拥有强大的库,促进了 LLMs 在各种实际场景中的更广泛采用和部署。
这些策略旨在平衡使 LLMs 适应特定任务的需求和确保微调和部署过程不会过度消耗计算和存储资源。


















