微调预训练模型huggingface,transformers

首先加载Yelp Reviews数据集: 

from datasets import load_dataset

dataset = load_dataset("yelp_review_full")
dataset["train"][100]

如您现在所知,您需要一个分词器来处理文本,并包括填充和截断策略来处理任何可变序列长度。若要在一个步骤中处理数据集,请使用 Datasets map 方法对整个数据集应用预处理函数:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")


def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)


tokenized_datasets = dataset.map(tokenize_function, batched=True)

可以创建完整数据集的较小子集进行微调,以减少所需的时间:

small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

使用 PyTorch 训练器进行训练:

transformers 提供了一个针对训练 Transformers 模型而优化的训练器类,无需手动编写自己的训练循环即可更轻松地开始训练训练器 API 支持广泛的训练选项和功能,例如日志记录、梯度累积和混合精度。首先加载模型并指定预期标签的数量。从Yelp Review数据集卡片中,您知道有五个标签:

from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)

接下来,创建一个 TrainingArguments 类,其中包含您可以调整的所有超参数以及用于激活不同训练选项的标志。在本教程中,您可以从默认的训练超参数开始,但您可以随意尝试这些参数以找到最佳设置。

from transformers import TrainingArguments

training_args = TrainingArguments(output_dir="test_trainer")

训练器不会在训练期间自动评估模型性能。需要向训练器传递一个函数来计算和报告指标。评估库提供了一个简单的准确性函数,您可以使用 evaluate.load 加载(有关详细信息,请参阅此快速教程):

import numpy as np
import evaluate

metric = evaluate.load("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

如果要在微调期间监视评估指标,请在训练参数中指定参数,以在每个纪元结束时报告评估指标:evaluation_strategy

from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")

使用模型、训练参数、训练和测试数据集以及评估函数创建 Trainer 对象:

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
    compute_metrics=compute_metrics,
)

然后通过调用 train() 微调模型:

trainer.train()

猜你喜欢

转载自blog.csdn.net/weixin_44002458/article/details/130138488