【学习心得】Python好库推荐——PEFT

一、PEFT是什么?

        PEFT(Parameter-Efficient Fine-Tuning)是一种在深度学习中进行参数高效微调的技术。这种技术主要应用于大型预训练模型的微调过程中,目的是在保持模型性能的同时减少所需的计算资源和时间。通过PEFT,可以有效地调整模型以适应特定任务或数据集,而无需对整个模型的所有参数进行全面微调。

二、PEFT使用场景

        在计算资源有限的情况下,如边缘设备、移动设备或低成本服务器上运行复杂的深度学习模型。通过PEFT技术,可以显著减少模型微调所需的计算资源和存储空间,使模型能够在资源受限的环境中高效运行

        使用大型预训练模型(如BERT、GPT系列、T5等)进行特定任务的微调,但面临计算成本高、时间长的问题。PEFT技术可以通过仅微调部分参数(如低秩矩阵、适配器模块、偏置项等)来实现高效微调,大幅减少计算时间和资源消耗。

方法名称 描述 主要特点 应用场景
LoRA  通过引入低秩矩阵来修改预训练模型中的权重,实现参数高效的微调。 仅需微调少量参数保持模型性能 资源受限环境大型预训练模型的微调
Prompt Tuning 通过优化输入提示(prompt)来调整模型,使其更好地适应特定任务。 不改变模型权重,灵活性高 零样本和少样本学习,快速适应新任务
BitFit 只对模型的偏置项进行微调,而保持其他所有参数不变。 极大地减少需要优化的参数数量, 实现简单 资源受限环境,快速微调
Prefix Tuning 在模型的输入中加入可学习的前缀,通过调整前缀来优化模型性能。 不改变模型权重,适应性强 多任务学习, 零样本和少样本学习
P-tuning 通过优化连续提示(continuous prompts)来微调模型,进一步提升性能。 提高性能,适用于各种NLP任务 复杂任务的微调,高性能要求

三、PEFT怎么用?

(1)安装

# 安装
pip install peft

# 验证
pip show peft

(2)快速入门

快速入门 - Hugging Face 中文icon-default.png?t=O83Ahttps://hugging-face.cn/docs/peft/quicktour在这里我演示一个用peft库实现LoRA微调的示例代码,用到了transformers库和peft库。

import torch  # 导入PyTorch库
from transformers import AutoModelForSequenceClassification, AutoTokenizer, TrainingArguments, Trainer  # 从transformers库中导入相关模块
from datasets import load_dataset  # 从datasets库中导入load_dataset函数
from peft import get_peft_model, LoraConfig, TaskType  # 从peft库中导入get_peft_model、LoraConfig和TaskType

# 加载预训练模型和分词器
model_name = "bert-base-uncased"  # 定义模型名称
tokenizer = AutoTokenizer.from_pretrained(model_name)  # 加载预训练的分词器
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)  # 加载预训练的序列分类模型,并设置标签数量为2

# 定义LoRA配置
lora_config = LoraConfig(
    task_type=TaskType.SEQ_CLS,  # 任务类型,这里是序列分类
    inference_mode=False,  # 是否在推理模式下使用LoRA
    r=4,  # 低秩矩阵的秩
    lora_alpha=16,  # LoRA的缩放因子
    lora_dropout=0.1  # LoRA的dropout概率
)

# 将LoRA配置应用到模型
model = get_peft_model(model, lora_config)  # 获取带有LoRA配置的模型

# 加载数据集
dataset = load_dataset("imdb")  # 加载IMDB数据集
train_dataset = dataset["train"].shuffle().select(range(1000))  # 为了快速演示,只使用1000个样本进行训练
test_dataset = dataset["test"].shuffle().select(range(100))  # 为了快速演示,只使用100个样本进行测试

# 数据预处理
def preprocess_function(examples):
    return tokenizer(examples['text'], padding='max_length', truncation=True, max_length=128)  # 对文本进行分词、填充和截断处理

train_dataset = train_dataset.map(preprocess_function, batched=True)  # 对训练数据集进行预处理
test_dataset = test_dataset.map(preprocess_function, batched=True)  # 对测试数据集进行预处理

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",  # 输出目录
    evaluation_strategy="epoch",  # 评估策略,每个epoch评估一次
    learning_rate=1e-4,  # 学习率
    per_device_train_batch_size=8,  # 每个设备的训练批次大小
    per_device_eval_batch_size=8,  # 每个设备的评估批次大小
    num_train_epochs=3,  # 训练的总epoch数
    weight_decay=0.01,  # 权重衰减系数
)

# 定义Trainer
trainer = Trainer(
    model=model,  # 使用的模型
    args=training_args,  # 训练参数
    train_dataset=train_dataset,  # 训练数据集
    eval_dataset=test_dataset,  # 评估数据集
)

# 开始训练
trainer.train()  # 调用train方法开始训练

# 保存模型
model.save_pretrained("./lora_model")  # 保存经过LoRA微调后的模型
tokenizer.save_pretrained("./lora_model")  # 保存分词器

# 评估模型
results = trainer.evaluate()  # 评估模型性能
print(results)  # 打印评估结果

你可能感兴趣的:(【学习心得】,人工智能,python,语言模型)