基于Python的自然语言处理系列(35):Transformer 模型的微调(Finetuning)

在本篇文章中,我们将深入探讨如何使用 Huggingface 的 transformers 库进行模型的微调(finetuning)。我们将使用微软研究院的 MRPC 数据集(Microsoft Research Paraphrase Corpus),这个数据集包含 5,801 对句子,每对句子都带有一个标签,表示它们是否是释义对(即两句话是否表达相同的意思)。MRPC 数据集体积小,适合快速实验和学习如何在特定任务上微调预训练模型。

本篇将展示如何加载数据集、预处理数据、实现动态填充,以及如何通过 Trainer 类进行训练与评估。你将学习如何将 Huggingface 提供的预训练模型用于你的具体任务,并微调模型以提高准确性。

1. 加载数据集

我们可以通过 datasets 库从 Huggingface Hub 上加载 MRPC 数据集:

python 复制代码
from datasets import load_dataset

raw_datasets = load_dataset("glue", "mrpc")
print(raw_datasets)

这个命令会下载并缓存数据集,并返回一个 DatasetDict 对象,包含训练集、验证集和测试集。我们可以使用索引访问训练集中的具体数据:

python 复制代码
raw_train_dataset = raw_datasets["train"]
print(raw_train_dataset[0])

2. 数据预处理

在微调模型前,我们需要将原始文本转换为模型可理解的数字格式。我们将使用 BERT 模型的分词器来处理数据。分词器不仅可以处理单句,还可以处理句子对:

python 复制代码
from transformers import AutoTokenizer

checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

inputs = tokenizer("This is the first sentence.", "This is the second one.")
print(inputs)

BERT 模型会为句子对添加 [CLS][SEP] 特殊标记,并使用 token_type_ids 来区分句子对的不同部分。

批量预处理

我们将使用 map() 方法批量处理整个数据集:

python 复制代码
def tokenize_function(example):
    return tokenizer(example["sentence1"], example["sentence2"], truncation=True)

tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
print(tokenized_datasets)

3. 动态填充与批处理

为了让不同长度的输入在同一批次中对齐,我们需要使用动态填充。我们可以通过 Huggingface 的 DataCollatorWithPadding 自动处理填充逻辑:

python 复制代码
from transformers import DataCollatorWithPadding

data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

我们可以验证填充是否正确:

python 复制代码
samples = tokenized_datasets["train"][:8]
batch = data_collator(samples)
print({k: v.shape for k, v in batch.items()})

4. 使用 Trainer 进行微调

定义训练参数

我们首先定义 TrainingArguments 类,它包含训练所需的所有超参数:

python 复制代码
from transformers import TrainingArguments

training_args = TrainingArguments("models")

初始化模型和 Trainer

接下来,我们加载预训练模型,并使用 Trainer 类进行微调:

python 复制代码
from transformers import AutoModelForSequenceClassification, Trainer

model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)

开始训练

我们只需调用 train() 方法,即可开始训练模型:

python 复制代码
trainer.train()

5. 计算指标

为了评估模型的性能,我们定义一个 compute_metrics() 函数来计算准确率和 F1 分数:

python 复制代码
import numpy as np
import evaluate

def compute_metrics(eval_preds):
    metric = evaluate.load("glue", "mrpc")
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

我们将此函数传递给 Trainer,并在每个 epoch 结束时报告评估结果:

python 复制代码
trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
)

trainer.train()

结语

在本篇文章中,我们详细介绍了如何使用 Huggingface 的 transformers 库,通过 Trainer 进行模型的微调。我们使用了 MRPC 数据集作为示例,涵盖了数据加载、预处理、动态填充、训练参数设定以及计算指标的全过程。这些步骤不仅让你了解如何微调预训练模型,还展示了如何使用 Huggingface 提供的工具快速搭建 NLP 模型。

然而,在一些项目中,你可能希望拥有更细粒度的控制,直接使用 PyTorch 而不是 Trainer 进行训练。这可以让你完全掌控训练流程和模型优化策略,从而在特定需求下更灵活地微调模型。

在下一篇文章《基于Python的自然语言处理系列(36):使用PyTorch进行微调》中,我们将展示如何从头到尾使用 PyTorch 进行 Transformer 模型的微调,不依赖 Trainer。通过学习手动训练的过程,你将深入理解模型的训练机制,并掌握如何针对自定义需求进行更精细的优化。敬请期待!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关推荐
GIS数据转换器3 分钟前
城市生命线安全保障:技术应用与策略创新
大数据·人工智能·安全·3d·智慧城市
一水鉴天1 小时前
为AI聊天工具添加一个知识系统 之65 详细设计 之6 变形机器人及伺服跟随
人工智能
井底哇哇7 小时前
ChatGPT是强人工智能吗?
人工智能·chatgpt
Coovally AI模型快速验证7 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
AI浩8 小时前
【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
人工智能·深度学习·计算机视觉·transformer
可为测控8 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
一水鉴天8 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python
倔强的石头1069 小时前
解锁辅助驾驶新境界:基于昇腾 AI 异构计算架构 CANN 的应用探秘
人工智能·架构
佛州小李哥9 小时前
Agent群舞,在亚马逊云科技搭建数字营销多代理(Multi-Agent)(下篇)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
说私域10 小时前
社群裂变+2+1链动新纪元:S2B2C小程序如何重塑企业客户管理版图?
大数据·人工智能·小程序·开源