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

低秩矩阵分解:LoRa,QLoRA和QA-LoRA 高效适应大型语言模型

大型语言模型(LLMs)在理解和生成类似人类文本方面具有独特的优势,已经开拓了独特的领域。LLMs的强大源于其庞大的规模,通常具有数十亿个参数。虽然这种巨大规模促进了它们的性能,但同时也带来了挑战,特别是在针对特定任务或领域进行模型适应时。传统的LLMs管理路径,如微调所有参数,代价昂贵,计算和财务压力巨大,因此在实际应用中普及它们的采用存在重要障碍。

上一篇文章中,我们深入探讨了如何微调大型语言模型(LLMs)以满足特定要求。我们探索了各种微调方法,如基于指令的微调、单任务微调和参数高效微调(PEFT),每种方法都有其独特的优化LLMs的方式。本次讨论的核心是转换器架构,即LLMs的支柱,以及在微调过程中处理大量参数的计算和内存需求带来的挑战。

LLMs中的参数

https://huggingface.co/blog/hf-bitsandbytes-integration

上述图片展示了各种大型语言模型的规模,按参数数量排序。值得注意的是:PaLM、BLOOM等。

截至今年,已经出现了更大模型的进一步发展。然而,在标准系统上调整如此庞大的开源模型是不可行的,需要专门的优化技术。

微软在这篇论文中提出了低秩自适应(LoRA),旨在缓解这些挑战,使LLMs更易于访问和适应。

LoRA的关键在于其适应模型的方法,而无需深入研究重新训练整个模型的复杂性。与传统的微调不同,其中每个参数都可能发生变化,LoRA采取了更智能的路径。它冻结了预训练模型的权重,并将可训练的秩分解矩阵引入Transformer架构的每一层。这种方法极大地减少了可训练参数的数量,确保了更高效的适应过程。

LLM调整策略的演进

回顾LLM调整的历程,可以发现从业者多年来采用了几种策略。最初,重点是微调预训练模型,这种策略包括全面改变模型参数,以适应特定任务。然而,随着模型的增大和复杂性的增加,这种方法的计算需求也随之增加。

下一个获得关注的策略是子集微调,这是前一方法的较为有限的版本。在这种方法中,只微调模型的一部分参数,从某种程度上减轻了计算负担。尽管具有优点,子集微调仍无法跟上LLM规模增长的速度。

随着从业者不断探索更高效的途径,全面微调成为一种严谨但值得的方法。

LoRA简介

矩阵的秩使我们能够窥见由其列创造的维度,由其中的唯一行或列数量决定。

  • 全秩矩阵:其秩等于其行数和列数中较小的数。
  • 低秩矩阵:其秩明显小于其行数和列数,捕捉到的特征较少。

现在,大型模型对其领域,如语言模型中的语言等,有较广泛的理解。但是,将它们微调以适应特定任务通常只需要突出显示其中的一小部分理解。这就是LoRA的亮点所在。它建议展示这些权重调整的矩阵可以是低秩矩阵,因此捕捉到的特征更少。

LoRA通过将此更新矩阵分割为两个较小的秩矩阵来智能地限制其秩数。因此,它只改变部分权重矩阵而不是整个权重矩阵,使微调任务更加高效。

将LoRA应用于Transformer

LoRA通过关注特定权重矩阵有助于最小化神经网络的训练负荷。在Transformer架构下,某些权重矩阵与自注意机制相关联,包括Wq、Wk、Wv和Wo,还有MLP(多层感知机)模块中的另外两个权重矩阵。

Transformer架构

Transformer架构

transformer注意力头

Transformer注意力头

过LoRA的数学解释

让我们来分解一下LoRA背后的数学:

  1. 预训练权重矩阵W0:
    • 它始于一个维度为d×k的预训练权重矩阵W0。这意味着该矩阵有d行和k列。
  2. 低秩分解:
    • 该方法提出了一种低秩分解的方法,代替直接更新整个矩阵W0,这样做可能会导致计算量很大。
    • 更新ΔW到W0可以表示为两个矩阵的乘积:B和A。
      • B的维度为d×r
      • A的维度为r×k
    • 关键点在于,秩r远小于d和k,这样可以更高效地表示。
  3. 训练:
    • 训练过程中,W0保持不变。这被称为“冻结”权重。
    • 另一方面,A和B是可训练的参数。这意味着在训练过程中,对矩阵A和B进行调整以改善模型的性能。
  4. 乘法和加法:
    • W0和更新ΔW(即B和A的乘积)都与相同的输入x相乘。
    • 然后将这些乘积的输出相加。
    • 这个过程可以总结为方程式:h=W0x+ΔWx=W0x+BAx。这里,h表示应用了输入x的更新后的最终输出。

简而言之,这种方法通过使用低秩分解来更新大型权重矩阵,从而实现更高效的计算和内存使用。

LORA动画

LORA

初始化和缩放:

在训练模型时,参数的初始化方式可以显着影响学习过程的效率和效果。关于使用A和B更新我们的权重矩阵的情况:

  1. 矩阵A和B的初始化:
    • 矩阵A:该矩阵使用随机的高斯值进行初始化,也称为正态分布。使用高斯初始化的原理是打破对称性:同一层中的不同神经元在具有不同初始权重时会学习到不同的特征。
    • 矩阵B:该矩阵使用零进行初始化。通过这样做,更新ΔW=BA在训练开始时从零开始。这确保了模型行为在开始时没有突变,并允许模型在训练过程中逐渐适应B学习到的适当值。
  2. 缩放ΔW的输出:
    • 在计算更新ΔW后,其输出按照rα的因子进行缩放,其中α是一个常数。通过缩放,控制更新的大小。
    • 当秩r发生变化时,缩放尤为重要。例如,如果决定增加秩以获得更高的准确性(以计算为代价),缩放可以确保您无需在过程中调整许多其他超参数。它为模型提供了一定的稳定性。

LoRA的实际影响

LoRA已经从AI社区中得到了人们广泛的认可,它展示了将LLM调整到特定艺术风格的潜力。这在模型模仿Greg Rutkowski的艺术风格上得到了显著展示。

正如论文中以GPT-3 175B为例所强调的那样。每个细调的模型都有巨大的175B参数,而成本相当高昂。但是,有了LoRA,可训练的参数减少了10,000倍,GPU内存使用也减少了三分之一。

LoRa对GPT-3微调的影响

LoRA对GPT-3微调的影响

LoRA方法不仅对于使LLM(大型语言模型)更易使用迈出了重要的一步,而且强调了弥合人工智能领域理论进展与实际应用之间差距的潜力。通过减少计算障碍并促进更高效的模型适应过程,LoRA在广泛采用和部署LLM在实际场景中将发挥至关重要的作用。

QLoRA(量化)

虽然LoRA在减少存储需求方面是一个创新者,但仍需使用强大的GPU来加载模型进行训练。这就是QLoRA(量化LoRA)的用武之地,它将LoRA与量化相结合,实现更智能的方法。

量化

量化

通常,权重参数以32位格式(FP32)存储,这意味着矩阵中的每个元素占用32位空间。想象一下,如果我们能将相同的信息压缩到只有8位甚至4位,这就是QLoRA的核心思想。量化是指将连续的无限值映射到更小的一组离散有限值的过程。在LLM的上下文中,它是指将模型的权重从高精度数据类型转换为低精度数据类型的过程。

LLM中的量化

LLM中的量化

以下是QLoRA的简单介绍:

  1. 初始量化:首先,将大型语言模型(LLM)将量化为4位,极大地减少了内存占用。
  2. LoRA训练:然后进行LoRA训练,但使用标准的32位精度(FP32)。

现在,你可能会想,为什么在缩小到4位后还要回到32位进行训练?好吧,为了有效地使用FP32对LoRA适配器进行训练,模型权重也需要恢复为FP32。这种来回切换是以智能、分步的方式进行的,以避免过多占用GPU内存。

LoRA在Hugging Face的“Parameter Efficient Fine-Tuning (PEFT)”库中找到了实际应用,简化了使用它的过程。对于那些希望使用QLoRA的人来说,通过“bitsandbytes”和PEFT库的结合可以轻松访问。此外,HuggingFace的“Transformer Reinforcement Learning (TRL) library”为LoRA提供了集成支持,促进了有监督的微调。这三个库共同为微调选定的预训练模型提供了必要的工具集,使其能够在特定属性指令下生成有说服力和连贯的产品描述。

从QLoRA的微调之后,权重必须恢复到高精度格式,这可能会导致准确性损失并缺乏加速过程的优化。

提出的解决方案是将权重矩阵分组为较小的片段,并对每个组应用量化和低秩适应。一种名为“QA-LoRA”的新方法试图将量化和低秩适应的优势结合起来,同时保持过程高效和模型对所需任务的有效性。

结论

本文介绍了LLM庞大参数大小所带来的挑战。我们深入探讨了传统的微调方法及其相关的计算和财务需求。LoRA的关键在于它能够在不完全重新训练的情况下修改预训练模型,从而减少了可训练参数并使适应过程更具成本效益。

我们还简要介绍了量化LoRA(QLoRA),它是LoRA和量化的混合体,可以减少模型的内存占用,同时保持训练所需的基本精度。借助这些先进的技术,从业者现在可以利用强大的库,更轻松地采用和部署LLMs,适用于各种真实场景。

Matrix

Matrix

这些策略的制定旨在平衡LLMs适应特定任务的能力,并确保微调和部署过程在计算和存储资源方面不过于苛刻。