Bootstrap

【LLM】优化预训练模型:参数高效微调 (PEFT) 指南

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

迁移学习在 GPT-3 和 BERT 等大型语言模型的开发中发挥着至关重要的作用。它是一种机器学习技术,其中在特定任务上训练的模型被用作不同但相似的任务的起点。迁移学习背后的想法是,模型从解决一个问题中获得的知识可以用来帮助解决另一个问题。

迁移学习最早的例子之一是使用预先训练的词嵌入(例如 Word2Vec)来提高基于 NLP 的模型的性能。最近,随着 BERT 和 GPT-3 等大型预训练语言模型的出现,迁移学习的范围显着扩展。微调是迁移学习中最流行的方法之一。它涉及通过在较小的特定于任务的标记数据集上进行训练来使预训练模型适应特定任务。

然而,随着大型语言模型的参数数量达到数万亿,微调整个模型的计算成本变得昂贵且通常不切实际。作为回应,焦点已转向上下文学习,其中为模型提供给定任务的提示并返回上下文更新。然而,模型每次进行预测时处理提示等效率低下以及有时性能不佳的情况使其成为不太受欢迎的选择。这就是参数高效微调(PEFT)作为提示的替代范例的用武之地。PEFT 旨在仅微调模型参数的一小部分,实现与完全微调相当的性能,同时显着降低计算要求。本文将详细讨论PEFT方法,

文章目录

重要术语词汇

什么是PEFT?

微调和参数高效微调有什么区别?

PEFT 的好处

PEFT:标准微调的更好替代方案

参数高效的微调技术

Adapter

LoRA

Prefix tuning

Prompt tuning

P-tuning

使用 PEFT 训练您的模型

导入依赖项并定义变量

预处理数据

模型训练与评估

少样本上下文学习 (ICL) 与参数高效微调 (PEFT)

PEFT 比 ICL 更有效吗?

参数高效微调的过程

结论


重要术语词汇

LLM 模型: 大型语言模型或 LLM 是一种机器学习模型,可以学习 NLP 任务的文本数据的底层结构和语义。他们通过学习一组代表文本高级概念和特征的潜在变量来做到这一点。从本质上讲,LLM 模型试图捕捉文本的内容,而不仅仅关注使用的单词。

预训练模型:预训练模型是经过大量数据训练以促进特定任务(例如图像分类、语音识别或自然语言处理)的机器学习模型。这些模型已经学习了有效执行任务所需的最佳权重和参数集,以便它们可以用作进一步训练新数据或用于其他应用程序的起点。

参数:参数是模型在训练过程中学习的值/变量,用于对新数据进行预测或分类。参数通常表示为神经网络中的权重和偏差,它们控制输入数据如何转换为输出预测。

迁移学习:迁移学习是指采用为特定任务开发的预训练模型,并将其重新用作新的相关任务的起点。这涉及使用预训练模型的学习特征表示作为新模型的起点,然后在特定于新任务的较小数据集上进行训练。

微调:微调是一种特定类型的迁移学习,其中预训练模型的权重在新的特定于任务的数据集上进行调整或微调。预训练模型用作此过程的起点,但在训练过程中会调整权重以更好地适应新数据。微调的量可能会有所不同,具体取决于可用数据量以及原始任务和新任务之间的相似性。

填充:填充是微调语言模型过程中用于处理可变长度输入序列的常用技术。这是向输入序列添加特殊标记(通常是“填充”标记)以使其达到固定长度的过程。

隐藏表示:隐藏表示是预训练模型层学习的输入数据的内部表示。这些表示捕获输入数据的不同抽象级别,并且可以用作特征来为手头的任务训练新模型。

少样本学习:少样本学习是一种机器学习技术,旨在基于有限数量的标记数据(通常在几十到几百个示例的范围内)训练模型,然后仅用很少甚至是单个标记的示例。少样本学习算法可以通过利用相关任务或领域的先验知识,通过很少的示例来学习识别新的对象、类别或概念。

什么是PEFT?

参数高效微调(PEFT)是自然语言处理(NLP)中使用的一种技术,用于提高预训练语言模型在特定下游任务上的性能。它涉及重用预训练模型的参数并在较小的数据集上对其进行微调,与从头开始训练整个模型相比,这可以节省计算资源和时间。

PEFT 通过冻结预训练模型的某些层并仅微调特定于下游任务的最后几层来实现这种效率。这样,模型就可以以更少的计算开销和更少的标记示例来适应新任务。尽管 PEFT 是一个相对新颖的概念,但自从引入迁移学习以来,更新最后一层模型已经在计算机视觉领域得到实践。即使在 NLP 领域,静态和非静态词嵌入的实验也很早就进行了。

参数高效的微调旨在提高预训练模型(例如 BERT 和 RoBERTa)在各种下游任务(包括情感分析、命名实体识别和问答)上的性能。它在数据和计算资源有限的低资源环境中实现了这一点。它仅修改模型参数的一小部分,并且不太容易出现过度拟合。

微调和参数高效微调有什么区别?

微调和参数高效微调是机器学习中用于提高预训练模型在特定任务上的性能的两种方法。

微调是采用预先训练的模型,并使用新数据进一步训练新任务。整个预训练模型通常经过微调训练,包括其所有层和参数。此过程的计算成本可能很高且耗时,尤其是对于大型模型。

另一方面,参数高效微调是一种微调方法,专注于仅训练预训练模型参数的子集。这种方法涉及识别新任务最重要的参数,并仅在训练期间更新这些参数。这样做,PEFT 可以显着减少微调所需的计算量。

参数高效的微调标准微调
目标使用有限的数据和计算提高预训练模型在特定任务上的性能利用充足的数据和计算提高预训练模型在特定任务上的性能
训练数据小数据集(较少的示例)大数据集(很多例子)
训练时间与微调相比,训练时间更快与 PEFT 相比,训练时间更长
计算资源使用更少的计算资源需要更大的计算资源
型号参数仅修改模型参数的一小部分重新训练整个模型
过拟合由于模型没有过度修改,因此不太容易过度拟合由于模型被广泛修改,更容易出现过度拟合
训练表现不如微调,但也足够好了通常比 PEFT 具有更好的性能
用例非常适合资源匮乏的环境或无法获得大量训练数据的情况非常适合具有充足训练数据和计算资源的高资源环境

在计算资源有限或涉及大型预训练模型的情况下,参数高效的微调特别有用。在这种情况下,PEFT 可以提供一种更有效的方法来微调模型,而不会牺牲性能。然而,值得注意的是,PEFT 有时可能会达到与完全微调不同的性能水平,特别是在预训练模型需要进行重大修改才能在新任务上表现良好的情况下。

PEFT 的好处

在这里,我们将讨论 PEFT 相对于传统微调的好处。那么,让我们了解为什么参数高效微调比微调更有利。

  1. 降低计算和存储成本: PEFT 仅涉及微调少量额外模型参数,同时冻结预训练的 LLM 的大部分参数,从而显着降低计算和存储成本。
  2. 克服灾难性遗忘:在 LLM 的全面微调过程中,当模型忘记预训练期间学到的知识时,可能会发生灾难性遗忘。PEFT 只需更新一些参数即可解决这个问题。
  3. 在低数据情况下具有更好的性能: PEFT 方法已被证明在低数据情况下比完全微调表现更好,并且可以更好地推广到域外场景。
  4. 可移植性:与完全微调的大型检查点相比,PEFT 方法使用户能够获得价值几 MB 的微小检查点。这使得 PEFT 方法训练的权重易于部署并用于多个任务,而无需替换整个模型。
  5. 与完全微调相当的性能: PEFT 只需少量可训练参数即可实现与完全微调相当的性能。

PEFT:标准微调的更好替代方案

标准的微调过程涉及调整Transformer 模型提取的隐藏表示 (h) ,以增强其在下游任务中的性能。这些隐藏表示指的是变压器架构提取的任何特征,例如变压器层或自注意力层的输出。

 为了说明这一点,假设我们有一个输入句子:“这完全是浪费钱。” 在微调之前,Transformer模型计算句子中每个标记的隐藏表示 (h) 。微调后,模型的参数被更新,更新后的参数将生成一组不同的隐藏表示,用h'表示。因此,即使对于同一个句子,预训练和微调模型生成的隐藏表示也会有所不同。 

本质上,微调是修改预训练语言模型的隐藏表示以使它们更适合下游任务的过程。然而,为了实现这一目标,无需微调模型中的所有参数。仅微调一小部分参数通常足以将隐藏表示从 h 更改为h'

参数高效的微调技术

目前,仅采用以下PEFT方法。尽管如此,正在进行的研究仍在探索和开发新方法。

Adapter

Adapter是一种特殊类型的子模块,可以添加到预先训练的语言模型中,以在微调期间修改其隐藏表示。通过在 Transformer 架构中的多头注意力和前馈层之后插入适配器,我们可以在微调期间仅更新适配器中的参数,同时保持模型参数的其余部分冻结。

采用适配器的过程非常简单。所需要做的就是将适配器添加到每个转换器层中,并将分类器层放置在预训练模型的顶部。通过更新适配器和分类器头的参数,我们可以提高预训练模型在特定任务上的性能,而无需更新整个模型。这种方法可以节省时间和计算资源,同时仍然产生令人印象深刻的结果。

使用适配器进行微调是如何进行的?

适配器模块包括与非线性激活层连接的两个前馈投影层。还有一个绕过前馈层的跳跃连接。

如果我们将适配器放置在多头注意力层之后,那么适配器层的输入就是多头注意力层计算的隐藏表示h 。这里,h在适配器层采取了两条不同的路径;一种是跳过连接,使输入保持不变,另一种方式涉及前馈层。 

最初,第一个前馈层将h投影到低维空间中。该空间的尺寸小于h。接下来,输入通过非线性激活函数,然后第二个前馈层将其投影回h的维度。将两种方式得到的结果相加得到适配器模块的最终输出。

跳跃连接保留适配器的原始输入 h ,而前馈路径基于原始h生成增量变化,表示为Δh。通过将从前馈层获得的增量变化Δh与前一层的原始 h 相加,适配器修改了由预训练模型计算的隐藏表示。这允许适配器改变预训练模型的隐藏表示,从而改变特定任务的输出。

LoRA

大型语言模型的低秩适应(LoRA)是针对特定任务或领域的模型微调领域的另一种方法。与适配器类似,LoRA 也是一个小型可训练子模块,可以插入到 Transformer 架构中。它涉及冻结预训练的模型权重并将可训练的秩分解矩阵注入到变压器架构的每一层中,从而大大减少下游任务的可训练参数的数量。该方法可以将可训练参数的数量减少多达 10,000 倍,并将 GPU 内存需求减少 3 倍,同时在各种任务上的性能仍与微调模型质量相当或更好。LoRA 还可以实现更高效的任务切换,降低硬件进入门槛,并且与其他方法相比没有额外的推理延迟。

它是如何工作的?

LoRA与预训练Transformer模型中的模块并行插入,特别是与前馈层并行。前馈层具有两个投影层和它们之间的非线性层,其中使用仿射变换将输入向量投影到具有不同维度的输出向量。LoRA 层插入到两个前馈层的旁边。

现在,让我们考虑前馈项目层及其旁边的 LoRA。前馈层的原始参数采用维度为d的前一层模型的输出,并将其投影到d FFW中。这里,FFW是前馈的缩写。旁边的 LoRA 模块由两个前馈层组成。LoRA 的第一个前馈层采用与前馈向上投影层相同的输入,并将其投影到 r 维向量中,该向量远小于d模型。然后,第二前馈层将向量投影到另一个维度为d FFW的向量。最后,将两个向量加在一起形成最终的表示。  

正如我们之前讨论的,微调正在改变原始 Transformer 模型计算的隐藏表示h 。因此,在这种情况下,原始变压器的前馈上投影层计算的隐藏表示是h。同时,LoRA计算出的向量是增量变化Δh,用于修改原始h。因此,原始表示和增量变化之和是更新的隐藏表示h'

通过在前馈层旁边插入 LoRA 模块,并在预训练模型顶部插入分类器头,每个任务的特定于任务的参数都保持在最低限度。

Prefix tuning

Prefix tuning是针对自然语言生成任务微调大型预训练语言模型的轻量级替代方案。微调需要更新和存储每个任务的所有模型参数,考虑到当前模型的规模很大,这可能非常昂贵。前缀调整保持语言模型参数冻结,并优化一个称为前缀的小型连续特定于任务的向量。在前缀调优中,前缀是一组与语言模型一起训练的自由参数。前缀调整的目标是找到一个上下文,引导语言模型生成解决特定任务的文本。 

前缀可以被视为后续令牌可以处理的一系列“虚拟令牌”。通过仅学习 0.1% 的参数,前缀调优获得了与完整数据设置中的微调相当的性能,优于低数据设置中的微调,并且可以更好地推断训练期间未见过的主题的示例。

与前面提到的所有 PEFT 技术类似,前缀调整的最终目标是达到h'。前缀调整使用前缀来修改原始预训练语言模型提取的隐藏表示。当增量变化Δh添加到原始隐藏表示h时,我们得到修改后的表示,即h'

使用前缀调整时,仅更新前缀,而其余层固定不更新。

Prompt tuning

提示调整是另一种 PEFT 技术,用于使预训练的语言模型适应特定的下游任务。与传统的“模型调整”方法不同,提示调整涉及通过反向传播学习软提示,可以通过合并标记的示例来针对特定任务进行微调。即时调整优于 GPT-3 的小样本学习,并且随着模型大小的增加而变得更具竞争力。它还有益于域传输的稳健性并实现高效的提示集成。它需要为每个任务存储一个小的特定于任务的提示,从而更容易为多个下游任务重用单个冻结模型,这与模型调整不同,模型调整需要为每个任务制作整个预训练模型的特定于任务的副本。

它是如何工作的?

提示调整是前缀调整的更简单的变体。其中,一些向量被添加到输入层序列的开头。当出现输入句子时,嵌入层将每个标记转换为其相应的单词嵌入,并且前缀嵌入被添加到标记嵌入序列的前面。接下来,预先训练的 Transformer 层将像 Transformer 模型处理正常序列一样处理嵌入序列。在微调过程中,仅调整前缀嵌入,而变压器模型的其余部分保持冻结且不变。

与传统的微调方法相比,该技术具有多个优点,包括提高效率和减少计算开销。此外,仅对前缀嵌入进行微调这一事实意味着过度拟合训练数据的风险较低,从而产生更稳健和更通用的模型。

P-tuning

P-tuning 可以提高自然语言理解 (NLU) 任务中 GPT 等语言模型的性能。传统的微调技术对于 GPT 并不有效,但 P-tuning 使用可训练的连续提示嵌入来提高其性能。该方法已在 LAMA 和 SuperGLUE 两个 NLU 基准上进行了测试,并在精度和世界知识恢复方面显示出显着的改进。P-tuning 还减少了对快速工程的需求,并且在少样本 SuperGLUE 基准测试中优于最先进的方法。

P-tuning 可用于改进各种任务的预训练语言模型,包括句子分类和预测国家首都。该技术涉及使用提示生成的差异输出嵌入来修改预训练语言模型的输入嵌入。可以使用下游损失函数和提示编码器来优化连续提示,这有助于解决离散性和关联性挑战。

使用 PEFT 训练您的模型

在我们的示例中,我们将使用 LoRA 微调预训练的序列到序列语言模型,以生成特定任务的文本。

导入依赖项并定义变量

首先,让我们导入所有必要的库、模块和其他依赖项,例如 AutoModelForSeq2SeqLM、PeftModel、torch、数据集和 AutoTokenizer 等。代码行将是这样的:

from transformers import AutoModelForSeq2SeqLM
from peft import PeftModel, PeftConfig
import torch
from datasets import load_dataset
import os
from transformers import AutoTokenizer
from torch.utils.data import DataLoader
from transformers import default_data_collator, get_linear_schedule_with_warmup
from tqdm import tqdm
from datasets import load_dataset

接下来,我们需要定义数据集的名称、文本列名称、标签列名称以及训练模型的批量大小。

dataset_name = "twitter_complaints"
text_column = "Tweet text"
label_column = "text_label"
batch_size = 8

现在,运行以下命令来定义预训练的 PEFT 模型并加载其配置。

peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
config = PeftConfig.from_pretrained(peft_model_id)

在上面的代码集中,“peft_model_id”变量包含预训练模型的 ID,“config”变量设置为模型的配置。

现在,设置每个设备允许的最大内存;也就是说,GPU最多允许使用6GB内存,CPU最多可以使用30GB内存。

max_memory = {0: "6GIB", 1: "0GIB", 2: "0GIB", 3: "0GIB", 4: "0GIB", "cpu": "30GB"}

加载peft_model_id指定的预训练PEFT模型的基础模型。

model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path, device_map="auto", max_memory=max_memory)

在上面的命令中,“AutoModelForSeq2SeqLM”类用于加载基础模型,“from_pretrained”函数用于加载预训练模型的权重。“device_map”参数指定设备和模型组件之间的映射,“max_memory”参数指定每个设备允许的最大内存。

接下来,使用以下命令加载“peft_model_id”指定的完整 PEFT 模型:

model = PeftModel.from_pretrained(model, peft_model_id, device_map="auto", max_memory=max_memory)

预处理数据

将数据集标签映射到人类可读的类名称:

预处理数据的第一步是将数据集标签映射到人类可读的类名称。为此,您需要将训练集的标签名称中的所有下划线替换为空格。

classes = [k.replace("_", " ") for k in dataset["train"].features["Label"].names]
print(classes)

然后,运行以下代码将标签映射到人类可读的类名称。

dataset = dataset.map(
lambda x: {"text_label": [classes[label] for label in x["Label"]]},
batched=True,
num_proc=1,
)
print(dataset)
dataset["train"][0]

Tokenization:

首先,我们需要从 Transformer 库加载一个预先训练的分词器来进行分词。我们还需要通过标记每个类标签并获取生成的标记 ID 列表的长度来设置目标标签的最大长度。稍后可以使用这将所有标签填充到一致的长度。为此,请运行以下命令:

tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)
target_max_length = max([len(tokenizer(class_label)["input_ids"]) for class_label in classes])

运行以下代码从输入示例中提取文本和目标标签,使用预先训练的分词器对文本进行分词,并将标签填充到一致的长度。

def preprocess_function(examples):
    inputs = examples[text_column]
    targets = examples[label_column]
    model_inputs = tokenizer(inputs, truncation=True)
    labels = tokenizer(
        targets, max_length=target_max_length, padding="max_length", truncation=True, return_tensors="pt"
    )
    labels = labels["input_ids"]
    labels[labels == tokenizer.pad_token_id] = -100
    model_inputs["labels"] = labels
    return model_inputs

指定预处理数据集并准备微调模型所需的步骤。

processed_datasets = dataset.map(
    preprocess_function,
    batched=True,
    num_proc=1,
    remove_columns=dataset["train"].column_names,
    load_from_cache_file=True,
    desc="Running tokenizer on dataset",
)

现在,将预处理的数据集分成单独的训练集、评估集和测试集。

train_dataset = processed_datasets["train"]
eval_dataset = processed_datasets["eval"]
test_dataset = processed_datasets["test"]

定义一个整理函数:

接下来,我们需要定义一个整理函数来收集预处理后的示例并将其组合成批次。

def collate_fn(examples):
    return tokenizer.pad(examples, padding="longest", return_tensors="pt")

接下来,定义训练、评估和测试数据集的数据加载器。

train_dataloader = DataLoader(
    train_dataset, shuffle=True, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True
)
eval_dataloader = DataLoader(eval_dataset, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True)
test_dataloader = DataLoader(test_dataset, collate_fn=collate_fn, batch_size=batch_size, pin_memory=True)

模型训练与评估

要使用预处理的数据集训练模型,首先定义规范,例如纪元数和损失函数。

训练完成后,根据其预期目的评估模型。

model.eval()
i = 15
inputs = tokenizer(f'{text_column} : {dataset["test"][i]["Tweet text"]} Label : ', return_tensors="pt")
print(dataset["test"][i]["Tweet text"])
print(inputs)

with torch.no_grad():
    outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=10)
    print(outputs)
    print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True))

评估微调的机器学习模型的性能是至关重要的一步。评估模型性能的一种常见方法是在评估数据集上检查其准确性。您可以参考这个GitHub存储库来查看整个评估过程,包括计算这些指标的代码。

少样本上下文学习 (ICL) 与参数高效微调 (PEFT)

少样本上下文学习和参数高效微调是用于训练自然语言处理模型的技术或方法。尽管这两种方法都可以使预训练的语言模型无需大量训练即可执行新任务,但这两种方法所采用的方法在技术上是不同的。第一种方法 ICL 允许模型通过输入提示示例来执行新任务,而无需基于梯度的训练。然而,ICL 会产生大量的计算、内存和存储成本。第二种方法是 PEFT,涉及训练少量添加或选择的参数,以使模型能够以最少的更新执行新任务。

ICL 是一种旨在通过在微调过程中结合上下文信息来提高预训练语言模型的小样本学习性能的方法。这种方法涉及在几次任务中微调预先训练的语言模型,并提供额外的上下文信息作为输入。该上下文信息可以采用附加句子或段落的形式,提供有关当前任务的更多信息。ICL 旨在使用这些上下文信息来增强模型泛化到新任务的能力,即使训练示例有限。

另一方面,参数高效微调是一种旨在通过识别和冻结重要模型参数来提高下游任务上预训练语言模型微调效率的方法。这种方法涉及在少量数据上微调预训练模型,同时冻结一些模型参数以防止过度拟合。通过有选择地冻结某些参数,模型可以保留更多预先训练的知识,从而利用有限的训练数据提高其在下游任务上的性能。

PEFT 比 ICL 更有效吗?

参数化少样本学习 (PFSL) 是自然语言处理应用程序的一项重要任务,其中模型必须快速适应训练示例有限的新任务。近年来,人们提出了各种方法来应对这一挑战,其中 ICL 是最流行的技术之一。然而,2021 年发表的一篇研究论文引入了一种称为参数高效少样本学习的新方法,该方法在准确性方面优于 ICL,同时需要的计算资源显着减少。

PEFT 优于 ICL 的主要原因之一是它使用了一种称为 (IA)^3 的新颖缩放方法,该方法使用学习向量重新缩放内部激活。该技术比仅引入一些额外参数时微调整个模型的效果更好。相比之下,ICL 在少量数据上对整个模型进行微调,这可能会导致过度拟合和准确性下降。

PEFT 优于 ICL 的另一个原因是它使用了两个额外的损失项,这些损失项鼓励模型输出错误选择的较低概率,并考虑不同答案选择的长度。这些损失项有助于模型更好地泛化到新任务并避免过度拟合。

除了其优越的性能之外,参数高效的微调在计算上也比 ICL 更加高效。研究论文发现,与使用 GPT-3 的少量 ICL 相比,PEFT 在推理过程中使用的浮点运算 (FLOP) 少了 1,000 倍以上,并且在单个 NVIDIA A100 GPU 上训练仅需 30 分钟。这使得 PEFT 成为现实世界 NLP 应用的更实用和可扩展的解决方案。

总体而言,PEFT 的引入代表了 NLP 应用的小样本学习领域的重大进步。它使用 (IA)^3 缩放、附加损失项和卓越的计算效率,使其成为需要快速适应新的少样本学习场景的任务的 ICL 更好的替代方案。

参数高效微调的过程

参数高效微调所涉及的步骤可能会有所不同,具体取决于具体实现和所使用的预训练模型。然而,以下是 PEFT 所涉及步骤的总体概述:

预训练:最初,使用图像分类或语言建模等通用任务在大型数据集上预训练大型模型。此预训练阶段有助于模型从数据中学习有意义的表示和特征。

特定于任务的数据集:收集或创建特定于您要微调预训练模型的目标任务的数据集。该数据集应该被标记并代表目标任务。

参数识别:识别或估计目标任务的预训练模型中参数的重要性或相关性。此步骤有助于确定在微调期间应优先考虑哪些参数。可以使用各种技术来识别重要参数,例如重要性估计、敏感性分析或基于梯度的方法。

子集选择:根据预训练模型参数的重要性或与目标任务的相关性,选择预训练模型参数的子集。可以通过设置某些标准来确定子集,例如重要性分数的阈值或选择前 k 个最重要的参数。

微调:使用预训练模型中的值初始化选定的参数子集,并冻结其余参数。使用特定于任务的数据集微调所选参数。这涉及在目标任务数据上训练模型,通常使用随机梯度下降 (SGD) 或 Adam 优化等技术。

评估:在验证集上或通过与目标任务相关的其他评估指标来评估微调模型的性能。此步骤有助于评估 PEFT 在使用较少参数的情况下实现所需性能的有效性。

迭代细化(可选):根据性能和要求,您可以选择通过调整参数选择标准、探索不同子集或微调其他周期来迭代和细化 PEFT 过程,以进一步优化模型的性能。

然而,值得注意的是,PEFT 中使用的具体实现细节和技术可能因研究论文和应用程序的不同而有所不同。

结论

PEFT(参数高效微调)是一种自然语言处理技术,用于提高预训练语言模型在特定下游任务上的性能。它涉及冻结预训练模型的某些层,并且仅微调特定于下游任务的最后几层。该技术在几个方面比传统的微调更有利,例如降低计算和存储成本、克服灾难性遗忘,以及与使用少量可训练参数进行完全微调的性能相当。总的来说,PEFT 是一种很有前景的方法,可以提高 NLP 模型在各种应用中的效率和有效性。

;