SimpleTransformers:简化的变压器(Transformers)
引言
抱抱脸(HuggingFace)的变压器(Transformers)是个开源库,是成千上万预训练模型的一站式工具。这个API的设计经过深思熟虑、易于使用。不过还是有一定程度的复杂性,要掌握一些技术诀窍才能玩转它。
换成 Simple Transformers,去除了复杂性,让你专心于重要的事情——利用变压器(Transformer)模型架构做模型训练和模型实验。它帮你绕过所有的复杂搭建、样板代码及其他通通的不快,方法如下:
- 用一行代码初始化模型;
- 下一行代码就是训练;
- 第三行代码评估。
在这篇简短报告中,我们将分别利用抱抱脸和Simple Transformers在互联网电影资料库(IMDB)数据集上构建一个情感分类器。之后我们将利用Simple Transformers做一些小项目。
抱抱脸方式
在这部分,我们将尝试利用抱抱脸API构建一个简单的情感分类器。我们将利用互联网电影资料库数据集来微调DistilBERT模型。
用谷歌Colab笔记本亲自动手→\rightarrow
使用抱抱脸的变压器,几行代码就可以构建一个情感分类器。但有一些陷阱,尤其是对于那些刚接触变压器的人。
1. 导入
** 不同的变压器模型需要不同的导入。抱抱脸支持两个深度学习框架——PyTorch和TensorFlow。针对TensorFlow的导入要用前缀TF。
from transformers import DistilBertTokenizerFast
from transformers import TFDistilBertForSequenceClassification, TFTrainer, TFTrainingArguments
对于我们的情感分类器,我们主要用到一个分词器、一个模型和一个训练器。
2.分词器
在自然语言处理(NLP)中,分词是一项最常见的预处理任务。给定一个句子,其任务就是把这个句子切分成片段,这些片段称为“词语”(token)。甚至变压器的输入词模块,因此你需要导入正确的模块。也需要分词。然而,不同的变压器需要不同的分
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
train_encodings = tokenizer(train_texts, truncation=True, padding=True)
val_encodings = tokenizer(val_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)
3. 训练参数
抱抱脸提供的接口虽然简单,但具备完整的训练和评估。使用TrainingArguments
或TFTrainingArguments
,可以得到更广泛的训练选项,并得到内置功能如记录、梯度积累以及混合精度。可到这里深入了解不同的训练参数。
training_args = TFTrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
)
4. 获取模型
仅利用抱抱脸的API,可以下载任意的预训练变压器模型。无论如何,仍然需要导入正确的模块。
model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
5. 训练
Trainer
或TFTrainer API
提供的接口用于在下游任务中训练、评估变压器模型。
trainer = TFTrainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset
)
trainer.train()
抱抱脸自带Weights and Biases集成。在W&B仪表盘上训练时,trainer.train()
自动记录全部指标。下列图表是我们训练情感分类器时所记录的。
Simple Transformers方式
Simple Transformers免除了我们在抱抱脸部分看到的全部复杂性。Simple Transformers提供了更多对抱抱脸的抽象,以便于快速地训练、评估变压器(Transformer)模型。对于全部下游微调任务,只需要三行代码。接下来我们用Simple Transformers构建一个情感分类器。
在谷歌Colab笔记本上微调SimpleTransformer →\rightarrow
要知道Simple Transformers有多照顾初学者,请看这篇帖子,作者是Simple Transformers的创建者蒂丽娜·拉贾帕克塞(Thilina Rajapakse)。
1. 导入
使用Simple Transformers就是一行简单的导入。对于每一个下游任务,就有一个模块要导入。例如,这段代码的导入就是用于文本分类任务的。
from simpletransformers.classification import ClassificationModel
2. 训练参数
你只需要一个字典型train_args
来提供训练参数. 可到这里查看全部可用参数。
train_args={
'num_train_epochs': 3,
'train_batch_size': 16,
'eval_batch_size': 64,
'warmup_steps': 500,
'weight_decay': 0.01,
'logging_steps': 10,
'learning_rate': 5e-5,
'fp16': False,
'wandb_project': 'gallery',
"wandb_kwargs": {'entity': 'wandb'}
}
3. 初始化特定任务模型
我们只需要初始化特定任务模型。因为我们在这里做的是分类,我们需要初始化ClassificationModel
。在抱抱脸中,要使用预训练模型就要导入对应的模块,而Simple Transformers不同,我们只需要把模型名称作为参数传入即可。我们可以传入train_args
。注意,无需初始化分类器。Simple Transformers自动进行正确的分词。不过,你也可以指定分词器名称。
model = ClassificationModel('distilbert', 'distilbert-base-uncased', use_cuda=True, cuda_device=0, args=train_args)
4. 训练
训练模型就是简单地把数据集传递给model.train_model
。它首先进行对应的分词,然后训练模型。抱抱脸自带Weights and Biases集成,Weights and Biases将自动记录全部训练指标。
model.train_model(train_df)
训练结果如下所示。
SimpleTransformers小试锋芒
在这个小项目中,我们将利用Simple Transformers构建一个多类分类模型。我们将使用该数据集,该数据集最初发布于这个论坛帖子,包含了Stack Overflow上的几千个编程问题。其中每个问题都有一个标签(Python、CSharp、JavaScript或Java)。任务就是把输入的问题分类到某个标签。
用谷歌Colab笔记本亲手做实验 →\rightarrow
因为这是个多类分类问题,我们在初始化模型时要反映出同样的结果。要注意参数num_labels
。
# labels
LABELS = ['csharp', 'java', 'javascript', 'python']
# initialize model
model = ClassificationModel('distilbert', 'distilbert-base-cased', num_labels=4, use_cuda=True, cuda_device=0, args=train_args)
训练模型就是简单地调用model.train_model()
。训练结果如下所示。
结语
Simple Transformers为其他很多自然语言处理任务提供了内置支持。其中一些如下
- 词语分类
- 问题回答
- 语言建模
- 语言生成
若要深入了解Simple Transformers能做什么,请查看阿尤什·乔拉西亚(Ayush Chaurasia) 写的这篇《SimpleTransformers在常见自然语言处理使用场景中的应用》(Using SimpleTransformers on common NLP applications)。
我希望大家喜欢这篇简短教程,介绍了通过Simple Transformers来使用变压器。
你以前用过Simple Transformers吗?你用过以后觉得怎么样呢?请在评论区分享给大家!