Huggingface transformers库使用教程(翻译)--------微调预训练模型

参考链接:https://huggingface.co/docs/transformers/v4.49.0/zh/training

使用预训练模型有许多显著的好处。它降低了计算成本,减少了碳排放,同时允许您使用最先进的模型,而无需从头开始训练一个。🤗 Transformers 提供了涉及各种任务的成千上万的预训练模型。当您使用预训练模型时,您需要在与任务相关的数据集上训练该模型。这种操作被称为微调,是一种非常强大的训练技术。在本教程中,您将使用您选择的深度学习框架来微调一个预训练模型:

  • 使用 🤗 Transformers 的 Trainer 来微调预训练模型。
  • 在 TensorFlow 中使用 Keras 来微调预训练模型。
  • 在原生 PyTorch 中微调预训练模型。

1. 准备数据集

在您进行预训练模型微调之前,需要下载一个数据集并为训练做好准备。之前的教程向您展示了如何处理训练数据,现在您有机会将这些技能付诸实践!

首先,加载Yelp评论数据集:

from datasets import load_dataset

dataset = load_dataset("yelp_review_full")
dataset["train"][100]
{'label': 0,
 'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\nThe cashier took my friends\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\"serving off their orders\\" when they didn\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\nThe manager was rude when giving me my order. She didn\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\nI\'ve eaten at various McDonalds restaurants for over 30 years. I\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}

正如您现在所知,您需要一个tokenizer来处理文本,包括填充和截断操作以处理可变的序列长度。如果要一次性处理您的数据集,可以使用 🤗 Datasets 的 map 方法,将预处理函数应用于整个数据集:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google-bert/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))

2. 训练

此时,您应该根据您训练所用的框架来选择对应的教程章节。您可以使用右侧的链接跳转到您想要的章节 - 如果您想隐藏某个框架对应的所有教程内容,只需使用右上角的按钮!

使用 PyTorch Trainer 进行训练
🤗 Transformers 提供了一个专为训练 🤗 Transformers 模型而优化的 Trainer 类,使您无需手动编写自己的训练循环步骤而更轻松地开始训练模型。Trainer API 支持各种训练选项和功能,如日志记录、梯度累积和混合精度。

首先加载您的模型并指定期望的标签数量。根据 Yelp Review 数据集卡片,您知道有五个标签:

from transformers import AutoModelForSequenceClassification

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

您将会看到一个警告,提到一些预训练权重未被使用,以及一些权重被随机初始化。不用担心,这是完全正常的!BERT 模型的预训练head被丢弃,并替换为一个随机初始化的分类head。您将在您的序列分类任务上微调这个新模型head,将预训练模型的知识转移给它。

3. 训练超参数

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

指定保存训练检查点的位置:

from transformers import TrainingArguments

training_args = TrainingArguments(output_dir="test_trainer")

4. 评估

Trainer 在训练过程中不会自动评估模型性能。您需要向 Trainer 传递一个函数来计算和展示指标。🤗 Evaluate 库提供了一个简单的 accuracy 函数,您可以使用 evaluate.load 函数加载它(有关更多信息,请参阅此快速入门):

import numpy as np
import evaluate

metric = evaluate.load("accuracy")

metric 上调用 compute 来计算您的预测的准确性。在将预测传递给 compute 之前,您需要将预测转换为logits(请记住,所有 🤗 Transformers 模型都返回对logits):

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

如果您希望在微调过程中监视评估指标,请在您的训练参数中指定 eval_strategy 参数,以在每个epoch结束时展示评估指标:

from transformers import TrainingArguments, Trainer

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

5. 训练器

创建一个包含您的模型、训练参数、训练和测试数据集以及评估函数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()

6. 在原生 PyTorch 中训练

Trainer 负责训练循环,允许您在一行代码中微调模型。对于喜欢编写自己训练循环的用户,您也可以在原生 PyTorch 中微调 🤗 Transformers 模型。

现在,您可能需要重新启动您的notebook,或执行以下代码以释放一些内存:

del model
del trainer
torch.cuda.empty_cache()

接下来,手动处理 tokenized_dataset 以准备进行训练。

移除 text 列,因为模型不接受原始文本作为输入:

tokenized_datasets = tokenized_datasets.remove_columns(["text"])

将 label 列重命名为 labels,因为模型期望参数的名称为 labels:

tokenized_datasets = tokenized_datasets.rename_column("label", "labels")

设置数据集的格式以返回 PyTorch 张量而不是lists:

tokenized_datasets.set_format("torch")

接着,创建一个先前展示的数据集的较小子集,以加速微调过程

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

6.1 DataLoader

您的训练和测试数据集创建一个DataLoader类,以便可以迭代处理数据批次

from torch.utils.data import DataLoader

train_dataloader = DataLoader(small_train_dataset, shuffle=True, batch_size=8)
eval_dataloader = DataLoader(small_eval_dataset, batch_size=8)

加载您的模型,并指定期望的标签数量:

from transformers import AutoModelForSequenceClassification

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

6.2 Optimizer and learning rate scheduler

创建一个optimizerlearning rate scheduler以进行模型微调。让我们使用 PyTorch 中的 AdamW 优化器:

from torch.optim import AdamW

optimizer = AdamW(model.parameters(), lr=5e-5)

创建来自 Trainer 的默认learning rate scheduler

from transformers import get_scheduler

num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
)

最后,指定 device 以使用 GPU(如果有的话)。否则,使用 CPU 进行训练可能需要几个小时,而不是几分钟。

import torch

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)

如果没有 GPU,可以通过notebook平台如 Colaboratory 或 SageMaker StudioLab 来免费获得云端GPU使用。

现在您已经准备好训练了!🥳

6.3 训练循环

为了跟踪训练进度,使用 tqdm 库来添加一个进度条,显示训练步数的进展:

from tqdm.auto import tqdm

progress_bar = tqdm(range(num_training_steps))

model.train()
for epoch in range(num_epochs):
    for batch in train_dataloader:
        batch = {k: v.to(device) for k, v in batch.items()}
        outputs = model(**batch)
        loss = outputs.loss
        loss.backward()

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(1)

6.4 评估

就像您在 Trainer 中添加了一个评估函数一样,当您编写自己的训练循环时,您需要做同样的事情。但与在每个epoch结束时计算和展示指标不同,这一次您将使用 add_batch 累积所有批次,并在最后计算指标。

import evaluate

metric = evaluate.load("accuracy")
model.eval()
for batch in eval_dataloader:
    batch = {k: v.to(device) for k, v in batch.items()}
    with torch.no_grad():
        outputs = model(**batch)

    logits = outputs.logits
    predictions = torch.argmax(logits, dim=-1)
    metric.add_batch(predictions=predictions, references=batch["labels"])

metric.compute()

附加资源

更多微调例子可参考如下链接:

🤗 Transformers 示例 包含用于在 PyTorch 和 TensorFlow 中训练常见自然语言处理任务的脚本。

🤗 Transformers 笔记 包含针对特定任务在 PyTorch 和 TensorFlow 中微调模型的各种notebook。

### 如何在 Windows 上安装 Python 的 `transformers` 为了顺利地在 Windows 操作系统上安装 `transformers` ,建议先确保已正确配置好 Python 和 pip 环境。考虑到网络因素的影响,在此推荐使用国内镜像源来加速下载过程。 #### 安装 PyTorch 由于 `transformers` 依赖于 PyTorch 或 TensorFlow 中的一个作为后端支持,因此首先需要安装 PyTorch: 通过命令提示符(CMD)执行如下指令完成 PyTorch 的安装: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 ``` 注意这里的版本号 (`cu113`) 需要根据实际使用的 CUDA 版本来调整;如果不需要 GPU 支持,则可以省略 `--extra-index-url` 参数并直接从默认索引获取 CPU-only 版本[^1]。 #### 安装 Transformers 接着就可以继续安装 `transformers` 本身了。同样可以在 CMD 下运行下面这条语句来进行操作,并指定阿里云或其他可用的中国区镜像站点以提高效率: ```bash pip install transformers -i https://mirrors.aliyun.com/pypi/simple/ ``` 这一步骤将会自动解析并拉取所有必要的依赖项,从而使得后续能够正常使用 Hugging Face 提供的各种预训练模型和服务功能[^2]。 #### 测试安装是否成功 最后编写一段简单的测试程序验证环境搭建情况: ```python from transformers import pipeline # 创建一个基于 distilgpt2 的文本生成器实例 text_generator = pipeline("text-generation", model="distilgpt2") # 尝试调用该对象处理给定输入字符串 output_text = text_generator("Hello, how are you?") print(output_text) ``` 这段脚本会加载名为 "distilgpt2" 的轻量化 GPT-2 模型用于对话回复任务,并打印出由其产生的延续性话语片段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值