Connect with us

人工智能

LoRa、QLoRA 与 QA-LoRA:通过低秩矩阵分解实现大语言模型的高效适配

mm
LoRA : Low-Rank Adaptation of Large Language Models

大语言模型(LLMs)已经开辟了一个独特的领域,在理解和生成类人文本方面提供了无与伦比的能力。LLMs 的强大可追溯至其庞大的规模,通常拥有数十亿参数。虽然这种巨大的规模推动了其性能,但同时也带来了挑战,尤其是在为特定任务或领域进行模型适配时。管理 LLMs 的传统途径,例如微调所有参数,会带来沉重的计算和财务成本,从而对其在现实应用中的广泛采用构成了重大障碍。 在之前的文章中,我们深入探讨了微调大语言模型(LLMs)以使其适应特定需求。我们探索了各种微调方法,例如基于指令的微调、单任务微调和参数高效微调(PEFT),每种方法都有其优化 LLMs 以适应不同任务的独特途径。讨论的核心是 Transformer 架构,这是 LLMs 的支柱,以及在微调过程中处理海量参数所带来的计算和内存需求挑战。

LLM中的参数

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

上图展示了各种大语言模型的规模,按其参数数量排序。值得注意的是:PaLMBLOOM 等。 截至今年,技术进步已催生出更庞大的模型。然而,在没有专门优化技术的情况下,在标准系统上调整如此巨大的开源模型是不可行的。 微软在这篇论文中引入了低秩适配(LoRA),旨在缓解这些挑战,使 LLMs 更易于访问和适配。 LoRA 的核心在于其在不涉及重新训练整个模型复杂性的情况下进行模型适配的方法。与传统的微调(每个参数都可能改变)不同,LoRA 采用了一条更智能的路径。它冻结预训练模型的权重,并在 Transformer 架构的每一层中引入可训练的秩分解矩阵。这种方法大幅减少了可训练参数的数量,确保了更高效的适配过程。

LLM 调优策略的演进

回顾 LLM 调优的历程,可以识别出从业者多年来采用的几种策略。最初,焦点集中在微调预训练模型上,这是一种全面改变模型参数以适应手头特定任务的策略。然而,随着模型规模和复杂性的增长,这种方法的计算需求也随之增加。 接下来获得关注的是子集微调策略,这是其前身的一个更受限制的版本。这里只微调模型参数的一个子集,在一定程度上减轻了计算负担。尽管有其优点,子集微调仍然无法跟上 LLMs 规模的增长速度。 随着从业者探索更高效的途径,全量微调作为一种严谨但回报丰厚的方法出现了。

LoRA 简介

矩阵的秩让我们得以一窥其列所创建的维度,它由矩阵拥有的独立行或列的数量决定。

  • 满秩矩阵:其秩等于其行数或列数中较小的那个。
  • 低秩矩阵:其秩明显小于其行数和列数,它捕获的特征较少。

现在,大型模型对其领域(如语言模型中的语言)有广泛的理解。但是,为特定任务微调它们通常只需要突出这些理解中的一小部分。这就是 LoRA 的闪光点。它提出,展示这些权重调整的矩阵可以是一个低秩矩阵,从而捕获更少的特征。 LoRA 通过将更新矩阵分解为两个较小的秩矩阵,巧妙地限制了该更新矩阵的秩。因此,它不改变整个权重矩阵,而只改变其中的一部分,使微调任务更加高效。

将 LoRA 应用于 Transformer

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

Transformers-architecture

Transformers Architecture

 

transformer attention heads

Transformer Attention Heads

LoRA 背后的数学解释

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

  1. 预训练权重矩阵 W0
    • 它从一个维度为 d×k 的预训练权重矩阵 W0 开始。这意味着该矩阵有 d 行和 k 列。
  2. 低秩分解
    • 该方法没有直接更新整个矩阵 W0(这在计算上可能很昂贵),而是提出了一种低秩分解方法。
    • W0 的更新 ΔW 可以表示为两个矩阵的乘积:BA
      • B 的维度为 d×r
      • A 的维度为 r×k
    • 这里的关键点是秩 r 远小于 dk,这使得表示方式在计算上更高效。
  3. 训练
    • 在训练过程中,W0 保持不变。这被称为“冻结”权重。
    • 另一方面,AB 是可训练参数。这意味着在训练期间,会对矩阵 AB 进行调整以提高模型的性能。
  4. 乘法与加法
    • W0 和更新 ΔW(即 BA 的乘积)都与相同的输入(记为 x)相乘。
    • 然后将这些乘法的输出相加。
    • 这个过程总结在方程中:h=W<span class="vlist

I have spent the past five years immersing myself in the fascinating world of Machine Learning and Deep Learning. My passion and expertise have led me to contribute to over 50 diverse software engineering projects, with a particular focus on AI/ML. My ongoing curiosity has also drawn me toward Natural Language Processing, a field I am eager to explore further.