Skip to main content

SimpleTransformers:简化的变压器(Transformers)

Simple Transformers去除了复杂性,让你专心于重要的事情——利用变压器(Transformer)模型架构做模型训练和模型实验。
Created on January 8|Last edited on January 8

引言

抱抱脸(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. 训练参数

抱抱脸提供的接口虽然简单,但具备完整的训练和评估。使用TrainingArgumentsTFTrainingArguments,可以得到更广泛的训练选项,并得到内置功能如记录、梯度积累以及混合精度。可到这里深入了解不同的训练参数。

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. 训练

TrainerTFTrainer 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()自动记录全部指标。下列图表是我们训练情感分类器时所记录的。




Run set
1


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)

训练结果如下所示。




Run set
2


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()。训练结果如下所示。




Run set
2


结语

Simple Transformers为其他很多自然语言处理任务提供了内置支持。其中一些如下

  • 词语分类
  • 问题回答
  • 语言建模
  • 语言生成

若要深入了解Simple Transformers能做什么,请查看阿尤什·乔拉西亚(Ayush Chaurasia) 写的这篇《SimpleTransformers在常见自然语言处理使用场景中的应用》(Using SimpleTransformers on common NLP applications)

我希望大家喜欢这篇简短教程,介绍了通过Simple Transformers来使用变压器。

你以前用过Simple Transformers吗?你用过以后觉得怎么样呢?请在评论区分享给大家!