“使用LoRA和QLoRA对大型语言模型进行参数高效微调”

Efficient parameter fine-tuning of large language models using LoRA and QLoRA

概述

随着我们深入研究参数高效微调(PEFT)的世界,了解这种变革性方法背后的驱动力和方法变得至关重要。在本文中,我们将探讨PEFT方法如何优化大型语言模型(LLM)适应特定任务。我们将揭示PEFT的优点和缺点,深入研究PEFT技术的复杂类别,并解析两种显著技术的内部工作原理:低秩适应(LoRA)和量化低秩适应(QLoRA)。本次旅程旨在让您全面了解这些技术,使您能够在语言处理中利用它们的力量。

学习目标:

  • 了解预训练语言模型和自然语言处理中的微调概念。
  • 探索在微调大型模型中的计算和存储要求带来的挑战。
  • 了解参数高效微调(PEFT)技术,如LORA和QLORA。
  • 发现PEFT方法的优点和缺点。
  • 探索各种PEFT方法,包括T-Few、AdaMix和MEFT。
  • 理解LORA和QLORA的工作原理。
  • 了解QLORA如何引入量化以提高参数效率。
  • 探索使用LORA和QLORA进行微调的实际例子。
  • 深入了解PEFT技术的适用性和好处。
  • 了解自然语言处理中参数高效微调的未来前景。

引言

在令人兴奋的自然语言处理领域,大规模预训练语言模型(LLM)已经彻底改变了这个领域。然而,将如此庞大的模型在特定任务上进行微调却面临着高计算成本和存储要求的挑战。研究人员已经深入研究参数高效微调(PEFT)技术,以实现在减少可训练参数的同时实现高任务性能。

预训练LLM和微调

预训练LLM是在大量通用领域数据上训练的语言模型,使其能够捕捉丰富的语言模式和知识。微调涉及将这些预训练模型适应特定的下游任务,从而利用它们的知识在专门任务上表现出色。微调涉及在特定任务数据集上训练预训练模型,这些数据集通常比原始训练数据更小更集中。在微调过程中,模型的参数被调整以优化其在目标任务上的性能。

参数高效微调(PEFT)

PEFT方法已经成为一种高效的方法,可以在显著减少可训练参数的同时微调预训练LLM。这些技术平衡了计算效率和任务性能,使得即使在最大的LLM上进行微调也是可行的,而不会降低质量。

PEFT的优点和缺点

PEFT带来了几个实际的好处,如降低内存使用、存储成本和推理延迟。它允许多个任务共享相同的预训练模型,最大限度地减少了维护独立实例的需要。然而,与传统微调方法相比,PEFT可能会引入额外的训练时间,并且其性能可能对超参数选择敏感。

PEFT的类型

为了满足不同的需求和权衡,已经开发出了各种PEFT方法。一些值得注意的PEFT技术包括T-Few,它在较低的计算成本下实现更高的准确性,以及AdaMix。这种通用方法调整了一组适应模块的混合,如Houlsby或LoRA,以提高完全监督和少样本任务的性能。

探索不同的PEFT方法

让我们深入了解一些著名的PEFT方法的细节-

  • T-Few:该方法使用(IA)3,一种新的PEFT方法,通过学习的向量对内部激活进行重新缩放。它在推理过程中实现了超人类的性能,并且使用的FLOP比传统微调要少得多。
  • AdaMix:一种通用的PEFT方法,通过调整适应模块的混合(如Houlsby或LoRA)来提高完全监督和少样本任务的下游任务性能。
  • MEFT:一种内存高效的微调方法,使LLM可逆,在训练过程中避免缓存中间激活,并显著减少内存占用。
  • QLORA:一种高效的微调技术,它在LLM的每个层中注入低秩适配器,大大减少可训练参数和GPU内存需求。

低秩适应(LoRA)

LoRA是一种创新技术,旨在通过将可训练的低秩矩阵注入Transformer架构的每个层中,有效地微调预训练的语言模型。LoRA旨在减少可训练参数的数量和计算负担,同时在下游任务上保持或提高模型的性能。

LoRA的工作原理

  1. 起始点保留:在LoRA中,起始点假设至关重要。它假设预训练模型的权重已经接近下游任务的最优解。因此,LoRA冻结预训练模型的权重,专注于优化可训练的低秩矩阵。
  2. 低秩矩阵:LoRA在每个层的自注意模块中引入表示为矩阵A和B的低秩矩阵。这些低秩矩阵充当适配器的角色,允许模型适应和专门针对特定任务,同时最小化所需的附加参数数量。
  3. 秩亏性:LoRA背后的一个重要观点是在适应过程中观察到的权重变化(∆W)的秩亏性。这表明模型的适应涉及可以用比原始权重矩阵低得多的秩有效表示的变化。LoRA利用这一观察结果实现参数效率。

LoRA的优点

  1. 减少参数开销:LoRA使用低秩矩阵而不是微调所有参数,显著减少可训练参数的数量,使其在内存使用和计算成本上更加高效。
  2. 高效的任务切换:LoRA允许预训练模型在多个任务之间共享,减少了为每个任务维护单独的微调实例的需求。这有助于在部署过程中快速无缝地切换任务,减少存储和切换成本。
  3. 无推理延迟:LoRA的线性设计确保与完全微调模型相比没有额外的推理延迟,使其适用于实时应用。

量化低秩适应(QLoRA)

QLoRA是LoRA的扩展,进一步引入量化以增强微调过程中的参数效率。它基于LoRA的原理,引入了4位NormalFloat(NF4)量化和双量化技术。

  • NF4量化:NF4量化利用预训练神经网络权重的固有分布,通常是具有特定标准差的以零为中心的正态分布。通过将所有权重转换为适合NF4范围(-1到1)内的固定分布,NF4量化有效地对权重进行量化,而无需昂贵的分位数估计算法。
  • 双量化:双量化解决了量化常数的内存开销问题。双量化通过对量化常数进行量化,显著减少了内存占用,同时不影响性能。该过程涉及使用具有块大小256的8位浮点数进行第二次量化步骤,从而实现了大幅节省内存。

QLoRA的优点

  1. 进一步减少内存占用:QLoRA通过引入量化进一步提高了内存效率,使其特别适用于在资源受限设备上部署大型模型。
  2. 保持性能:尽管具有参数效率,QLoRA保持了高模型质量,在各种下游任务上与完全微调的模型表现相当甚至更好。
  3. 适用于各种LLM:QLoRA是一种通用技术,适用于不同的语言模型,包括RoBERTa、DeBERTa、GPT-2和GPT-3,使研究人员能够探索各种LLM架构的参数效率微调。

使用PEFT微调大型语言模型

让我们通过一个使用QLORA微调大型语言模型的代码示例来将这些概念付诸实践。

# 步骤1:加载预训练模型和分词器
from transformers import BertTokenizer, BertForMaskedLM, QLORAdapter

model_name = "bert-base-uncased"
pretrained_model = BertForMaskedLM.from_pretrained(model_name)
tokenizer = BertTokenizer.from_pretrained(model_name)

# 步骤2:准备数据集
texts = ["[CLS] 你好,你好吗? [SEP]", "[CLS] 我很好。 [SEP]"]
train_encodings = tokenizer(texts, truncation=True, padding="max_length", return_tensors="pt")
labels = torch.tensor([tokenizer.encode(text, add_special_tokens=True) for text in texts])

# 步骤3:定义QLORAdapter类
adapter = QLORAdapter(input_dim=768, output_dim=768, rank=64)
pretrained_model.bert.encoder.layer[0].attention.output = adapter

# 步骤4:微调模型
optimizer = torch.optim.AdamW(adapter.parameters(), lr=1e-5)
loss_fn = nn.CrossEntropyLoss()

for epoch in range(10):
    optimizer.zero_grad()
    outputs = pretrained_model(**train_encodings.to(device))
    logits = outputs.logits
    loss = loss_fn(logits.view(-1, logits.shape[-1]), labels.view(-1))
    loss.backward()
    optimizer.step()

# 步骤5:使用微调模型进行推理
test_text = "[CLS] 你今天好吗? [SEP]"
test_input = tokenizer(test_text, return_tensors="pt")
output = pretrained_model(**test_input)
predicted_ids = torch.argmax(output.logits, dim=-1)
predicted_text = tokenizer.decode(predicted_ids[0])
print("预测文本:", predicted_text)

结论

LLMs的参数高效微调是一个快速发展的领域,解决了计算和内存需求带来的挑战。像LORA和QLORA这样的技术展示了优化微调效率的创新策略,而不牺牲任务性能。这些方法为在实际应用中部署大型语言模型提供了一个有希望的途径,使得自然语言处理比以往更加易于访问和实用。

常见问题