PEFT(Parameter-Efficient Fine-Tuning)库是一个用于有效微调大型预训练语言模型的工具,尤其是在计算资源有限的情况下。它提供了一系列技术,旨在提高微调过程的效率和灵活性。以下是PEFT库的详细解读以及一些常用方法的总结:
PEFT库详解
-
参数高效微调的概念
- PEFT旨在通过只微调模型的一部分参数(而不是整个模型)来减少计算和内存开销。这对于大型语言模型(如BERT、GPT等)尤其重要,因为它们的参数数量通常非常庞大。
-
常见方法
- PEFT包括几种不同的策略,每种策略都有其适用场景和优缺点。以下是一些最常用的PEFT方法:
常用的PEFT方法总结
-
LoRA(Low-Rank Adaptation)
- 原理:通过在预训练模型的权重矩阵中添加低秩矩阵,LoRA将大模型的微调问题转化为对小矩阵的优化。
- 优点:显著减少训练时所需的参数,降低计算复杂度。
- 使用场景:适合在计算资源有限的情况下进行快速微调。
pythonfrom transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import LoRAConfig, get_peft_model # 加载预训练模型和分词器 model_name = "distilbert-base-uncased" model = AutoModelForSequenceClassification.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 配置LoRA lora_config = LoRAConfig( r=8, # 低秩适配的秩 lora_alpha=32, lora_dropout=0.1 ) # 应用LoRA lora_model = get_peft_model(model, lora_config) # 训练代码(略)
-
Adapter
- 原理:在预训练模型的不同层之间插入小型的"适配器"网络,只微调适配器参数,保留主模型的权重不变。
- 优点:适配器可以在不同任务之间共享,大幅度减少微调时的参数数量。
- 使用场景:适用于需要频繁在不同任务之间切换的情况。
pythonfrom transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import AdapterConfig, get_peft_model # 加载预训练模型和分词器 model_name = "distilbert-base-uncased" model = AutoModelForSequenceClassification.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 配置Adapter adapter_config = AdapterConfig( reduction_factor=2, non_linearity="relu" ) # 应用Adapter adapter_model = get_peft_model(model, adapter_config) # 训练代码(略)
-
Prefix Tuning
- 原理:在输入序列前添加一个学习到的前缀,这个前缀在微调过程中进行优化,而主模型的参数保持不变。
- 优点:可以实现快速微调,同时保留主模型的知识。
- 使用场景:适合文本生成和对话系统等任务。
pythonfrom transformers import AutoModelForCausalLM, AutoTokenizer from peft import PrefixTuningConfig, get_peft_model # 加载预训练模型和分词器 model_name = "gpt2" model = AutoModelForCausalLM.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 配置Prefix Tuning prefix_config = PrefixTuningConfig( prefix_length=10, # 前缀长度 task_type="text-generation" ) # 应用Prefix Tuning prefix_model = get_peft_model(model, prefix_config) # 训练代码(略)
-
Prompt Tuning
- 原理:通过优化输入提示(prompt)的参数来指导模型生成所需的输出。
- 优点:相较于传统微调方法,减少了对模型整体参数的依赖。
- 使用场景:适用于自然语言处理中的各种任务,如文本分类和问答。
pythonfrom transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import PromptTuningConfig, get_peft_model # 加载预训练模型和分词器 model_name = "distilbert-base-uncased" model = AutoModelForSequenceClassification.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 配置Prompt Tuning prompt_config = PromptTuningConfig( prompt_length=5, # 提示长度 task_type="classification" ) # 应用Prompt Tuning prompt_model = get_peft_model(model, prompt_config) # 训练代码(略)
-
BitFit
- 原理:只对模型的偏置参数进行微调,保持权重参数不变。
- 优点:极大地减少了微调的参数数量,同时在许多任务中表现良好。
- 使用场景:适用于资源受限的场景。
pythonfrom transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import BitFitConfig, get_peft_model # 加载预训练模型和分词器 model_name = "distilbert-base-uncased" model = AutoModelForSequenceClassification.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 配置BitFit bitfit_config = BitFitConfig() # 应用BitFit bitfit_model = get_peft_model(model, bitfit_config) # 训练代码(略)
transformers库概述
transformers
库是由Hugging Face开发的一个开源库,专门用于处理自然语言处理(NLP)任务。它提供了预训练的模型、简单的API和丰富的功能,使得使用大型语言模型变得更加方便。以下是transformers
库的详解和一些最常用的方法总结。
1. 加载模型和分词器
from_pretrained(model_name)
:- 用途:从Hugging Face Model Hub加载预训练模型和分词器。
from_pretrained(model_name)
方法用于从Hugging Face Model Hub加载预训练模型及其配置。可以通过指定模型的名称、路径或标识符来获取预训练的模型。(这里我常常自己先下载下来,不然的话huggingface社区老没办法从本地登进去) - 示例:
model = AutoModel.from_pretrained("bert-base-uncased")
- 用途:从Hugging Face Model Hub加载预训练模型和分词器。
2. 分词器(Tokenizer)
tokenizer(text)
:-
用途:将文本转化为模型可接受的输入格式,包括分词、编码等。
-
参数:可以设置
return_tensors
参数指定返回的张量格式(如"pt"
表示PyTorch)。 -
示例:
inputs = tokenizer("Hello, world!", return_tensors="pt")
-
Hugging Face提供多种类型的分词器,主要包括:
|-------------------|------|---------------|-----------------|------------------|
| BertTokenizer | BERT | - 用于NLP任务的分词器 | - 使用WordPiece分词 | - 处理复杂句子和OOV词效果好 ||-------------------|-------|-------------------------|--------------------------------|-------------|
| GPT2Tokenizer | GPT-2 | - 通过from_pretrained
加载 | - 使用Byte Pair Encoding (BPE)分词 | - 适合文本生成和补全 ||-----------------|----|-----------------------|---------------------|---------------|
| T5Tokenizer | T5 | - 提供tokenization和编码功能 | - 使用SentencePiece分词 | - 支持多种任务,灵活性高 ||----------------------|---------|----------------|------------------|----------------|
| RobertaTokenizer | RoBERTa | - 支持填充、截断和解码功能 | - 训练数据更丰富,取消特殊标记 | - 在上下文理解方面表现优秀 ||-------------------|------|-----------|--------------|-----------------|
| AutoTokenizer | 多种模型 | - 方便集成和使用 | - 自动选择适合的分词器 | - 提高开发效率,适合快速实验 | -
BertTokenizer:用于BERT模型。
-
GPT2Tokenizer:用于GPT-2模型。
-
T5Tokenizer:用于T5模型。
-
RobertaTokenizer:用于RoBERTa模型。
-
AutoTokenizer:自动选择适当的分词器,根据给定的模型名称。
-
3. 推理
model(inputs)
:- 用途:推理(Inference)是指使用训练好的模型对新输入进行预测或生成输出的过程。在自然语言处理(NLP)和深度学习中,推理是模型应用的关键步骤,通常在模型训练完成后进行。以下是推理的基本概念和过程,(在这里我理解为,推理是对经过分词处理的输入数据进行推断,输出模型的预测结果。)目的 :推理的目的是对未知数据进行预测,例如分类、生成文本、回答问题等。输入与输出:推理通常接收原始输入(如文本、图像等),并输出模型的预测结果(如分类标签、生成的文本等)。
- 示例:
outputs = model(**inputs)
4. Pipeline
pipeline(task)
:- 用途:创建一个简化的任务接口,支持文本分类、问答、翻译等多种任务。
- 示例:
classifier = pipeline("sentiment-analysis")
- 使用方法:
result = classifier("I love this movie!")
5. Trainer
Trainer
:- 用途:用于模型的训练和评估,简化了训练过程。
- 方法:
train()
:开始训练模型。evaluate()
:评估模型在验证集上的表现。save_model()
:保存微调后的模型。
6. 保存和加载模型
save_pretrained(directory)
:- 用途:将模型和分词器保存到指定目录。
- 示例:
model.save_pretrained("./my_model")
from_pretrained(directory)
:- 用途:从本地目录加载已保存的模型和分词器。
- 示例:
model = AutoModel.from_pretrained("./my_model")
7. 自定义数据集
Dataset
:- 用途:自定义数据集类,继承自
torch.utils.data.Dataset
,实现数据的加载和预处理。 - 方法:
__len__()
:返回数据集大小。__getitem__(idx)
:返回指定索引的数据样本。
- 用途:自定义数据集类,继承自
8. 模型评估
evaluate()
:- 用途:在验证集上评估模型性能,返回各类指标(如损失、准确率等)。
- 示例:
metrics = trainer.evaluate(eval_dataset=eval_dataset)
9. 文本生成
model.generate()
:- 用途:用于生成文本,例如进行对话生成或续写。
- 示例:
generated_ids = model.generate(input_ids, max_length=50)
10. 模型的选择
AutoModel
、AutoModelForSequenceClassification
等 :- 用途:根据任务选择合适的模型架构。
- 示例:
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")