预训练 Transformer 模型的简介
原文:towardsdatascience.com/an-introduction-to-fine-tuning-pre-trained-transformers-models-9ea546611664Image fromby是众多流行开源 NLP 模型的家园。其中许多模型本身就很有效,但通常需要某种形式的训练或微调来提高特定用例的性能。随着大型语言模型(LLM)的崩溃继续,本文将回顾 Huggi
原文:
towardsdatascience.com/an-introduction-to-fine-tuning-pre-trained-transformers-models-9ea546611664
Image from Unsplash by Markus Spiske
HuggingFace 是众多流行开源 NLP 模型的家园。其中许多模型本身就很有效,但通常需要某种形式的训练或微调来提高特定用例的性能。随着大型语言模型(LLM)的崩溃继续,本文将回顾 HuggingFace 提供的一些核心构建块,这些构建块简化了 NLP 模型的训练。
传统上,可以使用 PyTorch、TensorFlow/Keras 和其他流行的 ML 框架来训练 NLP 模型。虽然您可以走这条路,但这确实需要更深入地了解您所使用的框架,以及编写更多代码来编写训练循环。有了 HuggingFace 的 Trainer 类,与您想要利用的 NLP Transformers 模型交互有更简单的方式。
Trainer 是一个专门针对 Transformers 模型进行优化的类,并且与其他 Transformers 库(如 Datasets 和 Evaluate)提供了紧密集成。在更高级别上,Trainer 还支持分布式训练库,并且可以轻松集成到像 Amazon SageMaker 这样的基础设施平台。
在这个例子中,我们将查看如何使用 Trainer 类在本地微调流行的 BERT 模型,用于 IMBD 数据集 的文本分类用例(大型电影评论数据集 引用)。
注意:本文假设读者具备 Python 基础知识和 NLP 领域知识。我们不会深入探讨模型构建或选择的特定机器学习理论,本文旨在理解我们如何微调 HuggingFace 模型库中现有的预训练模型。
目录
-
设置
-
微调 BERT
-
其他资源与结论
1. 设置
在这个例子中,我们将在 SageMaker Studio 中工作,并使用 ml.g4dn.12xlarge 实例上的 conda_python3 内核。请注意,您可以使用更小的实例类型,但这可能会根据可用的 CPU/worker 数量影响训练速度。
下载数据集我们将使用 HuggingFace Datasets 库。
import datasets
from datasets import load_dataset
我们指定了一个训练数据集和一个评估数据集,我们将利用这些数据集进行训练循环。
train_dataset = load_dataset("imdb", split="train")
test_dataset = load_dataset("imdb", split="test")
test_subset = test_dataset.select(range(100)) # we will take a subset of the data for evaluation
对于任何文本数据,你必须指定一个分词器来预处理数据,使其成为模型可以理解的形式。在这种情况下,我们指定了我们正在使用的 BERT 模型的 HuggingFace Hub 模型 ID。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
# tokenize text data
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
然后,我们利用内置的 map 函数来处理我们的训练和评估数据集。
tokenized_train = train_dataset.map(tokenize_function, batched=True)
tokenized_test = test_subset.map(tokenize_function, batched=True)
预处理数据(作者截图)
2. 微调 BERT
现在我们已经准备好了数据,我们使用与之前指定的相同的 Model ID 下载我们的 BERT 模型。注意,我们还指定了我们的文本分类用例的标签数量。在这种情况下,我们指定了两个,因为两个值是 0 和 1,分别代表负和正。
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased",
num_labels=2)
接下来,对于我们的训练循环,我们指定一个 TrainingArguments 对象。在这个对象中,我们可以指定不同的训练参数,如训练的轮数、分布式训练策略等。
在这种情况下,我们只指定了训练模型工件的输出目录、训练轮数以及每个轮次后的模型评估。为了简化,我们在这个例子中将轮数限制为只有一个。
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir="test_trainer",
evaluation_strategy="epoch", num_train_epochs=1)
对于评估,我们使用来自 Evaluate 库的内置评估函数。
import numpy as np
import evaluate
metric = evaluate.load("accuracy")
# eval function
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
然后,我们将 TrainingArguments、分词数据集和评估指标函数传递给 Trainer 对象。我们可以通过 train 方法启动一个训练运行,使用现有的硬件大约需要 10-15 分钟。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_test, #using test as eval
compute_metrics=compute_metrics,
tokenizer=tokenizer
)
trainer.train()
完成训练(作者截图)
对于推理,我们可以直接使用微调后的 trainer 对象,并在用于评估的分词测试数据集上预测:
trainer.predict(tokenized_test)
输出(作者截图)
在更实际的用例中,你可以将 trainer 对象保存到本地目录中的模型工件。
trainer.save_model("./custom_model")
模型工件(作者截图)
然后,你可以指定我们训练的模型类型来加载这些模型工件,并在单个数据点上看到推理结果。
loaded_model = AutoModelForSequenceClassification.from_pretrained(
pretrained_model_name_or_path="custom_model/")
# sample inference
encoding = tokenizer("I am super delighted", return_tensors="pt")
res = loaded_model(**encoding)
predicted_label_classes = res.logits.argmax(-1)
predicted_label_classes
正分类(作者截图)
在一个实际用例中,你可以将训练好的模型工件部署到像 Amazon SageMaker 这样的服务堆栈上。
3. 补充资源与结论
GitHub – RamVegiraju/huggingface-finetune-trainer: 利用 HuggingFace Trainer 微调 Transformers 模型
您可以在上面的链接中找到整个示例的代码。我希望这篇文章对您了解如何使用 HuggingFace Trainer 类微调 Transformers 模型是一个有用的介绍。为了扩大您的训练工作负载,请参阅这里了解您如何利用 SageMaker Training Jobs 微调 BERT 模型。在未来的文章中,我们将探讨如何扩展这个 Trainer 类,使用 PEFT 等技术微调 LLMs。
如往常一样,感谢您阅读,并请随时留下任何反馈。
更多推荐



所有评论(0)