Quick tour
- 下载所有相关的库
- AutoClass
- AutoTokenizer
- AutoModel
- Save a model
- 自定义模型构建
- AutoConfig
- AutoModel
- Trainer--Pytorch优化的训练循环
- 微调教程
学习教程来自 Huggingface官网,此学习文档为个人笔记,主要学习pytorch框架的相关使用方法。
下载所有相关的库
! pip install transformers datasets
AutoClass
AutoTokenizer
一个tokenizer负责将文本处理成数字数组作为模型的输入。最重要的事情是需要实例化一个与模型名字相同的tokenizer,确保使用与模型预训练相同的tokenization规则。下面是使用AtuoTokenizer加载tokenizer的示例:
form transformers import AutoTokenizer
model_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
tokenizer = AutoTokenizer.from_pretrained(model_name)
将自己的文本输入到tokenizer:
encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
print(encoding)
{‘input_ids’: [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
‘token_type_ids’: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
‘attention_mask’: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
tokenizer返回的字典包括:
- input_ids: tokens的数字表示
- attention_mask: 表示应关注哪些tokens
同时,tokenizer还可以接受一个list,填充并截断(padding and truncate)文本以返回具有统一长度的批次:
pt_batch = tokenizer(["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],padding = True,truncation = True,max_length = 512,return_tensors='pt',)
AutoModel
Transformers提供一个简单且统一的方式来加载预训练模型。这意味着可以像加载_AutoTokenizer_一样加载_AutoModel_。唯一不同的是需要为任务选择正确的_AutoModel_。如对于文本分类任务,可以加载_AutoModelForSequenceClassification_:
from transformers import AutoModelForSequenceClassificationmodel_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
model = AutoModelForSequenceClassification.from_pretrained(model_name)
有关AutoModel支持的任务,请参阅任务汇总。
下面将预处理的输入批次直接输入到模型,只需要添加**解包字典。
pt_outputs = pt_model(**pt_batch)
模型在logits属性中输出最终激活。将softmax函数应用于logits以检索概率:
from torch import nn
pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)
tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
[0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)
[说明]所有Transformers模型输出最终激活函数(如softmax)之前的tensors,因为最终激活函数通常与loss融合。模型的输出是特殊的数据类,因此它们的属性在IDE中自动完成。模型输出行为类似一个元组或一个字典(可以用整数、切片或字符串索引),这种情况下None属性将被忽略。
Save a model
一旦对模型进行了微调,可以使用PreTrainedModel.save_pretrained()将模型和tokenizer一起保存:
pt_save_directory = './pt_save_pretrained'
tokenizer.save_pretrained(pt_save_directory)
pt_model.save_pretrained(pt_save_directory)
当准备再次使用该模型时,使用PreTrainedModel.from_pretrained():
pt_model = AutoModelForSequenceClassification.from_pretrained('./pt_save_pretrained')
一个特别cool的transformers功能是保存一个模型,并重新加载它为Pytorch或Tensorflow模型。from_pt或from_tf参数能够将模型从一个框架转为另一个:
from transformers import AutoModel
tokenizer = AutoTokenizer.form_pretrained(tf_save_directory)
pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True)
自定义模型构建
你可以修改模型的配置类(configuration class)来改变模型的构建方式。Configuration指定模型的属性,如隐藏层数或注意力头数。当你从自定义配置类初始化模型时,你可以从头开始。模型属性是随机初始化的,你需要训练模型,然后才能使用它得到有意义的结果。
AutoConfig
从导入AutoConfig开始,然后加载你想修改的预训练模型。在AutoConfig.from_pretrained()中,你可以具体说明你想要修改的属性,如注意力头数:
from transformers import AutoConfig
my_config = AutoConfig.from_pretrained('distilbert-base-uncased', n_heads=12)
AutoModel
使用AutoModel.from_config()从自定义配置创建模型:
from transformers import AutoModel
my_model = AutoModel.from_config(my_config)
Trainer–Pytorch优化的训练循环
所有的模型都是标准的torch.nn.Module,因此你可以在任何典型的训练循环中使用它们。同时你可以写自己的训练循环,Transformers为Pytorch提供了Trainer类,它包含基本的训练循环并为分布式训练、混合精度等功能添加了额外的功能。
依赖于自己的任务,通常将以下参数传递给Trainer:
- 一个PreTrainedModel或一个torch.nn.Module
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained('distilbert-base-uncased')
2.TrainingArguments包含你能改变的模型超参数,如用于训练的学习率、批次大小、epoch数。如果没有具体说明任何训练参数,将使用默认值:
from transformers import TrainingArguments
training_args = TrainingArguments(output_dir = 'path/to/save/folder',learning_rate = 2e-5,per_device_train_batch_size = 8,per_device_eval_batch_size = 8,num_train_epochs = 2,)
- 一个预处理类,如tokenizer, image processor, feature extractor, or processor:
from transformers import AutoTokenzier
tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased')
4.加载数据集:
from dataset import load_dataset
dataset = load_dataset('rotten_tomatoes') # doctest: +IGNORE_RESULT
- 创建一个函数来tokenize数据集:
def tokenize_dataset(dataset):return tokenizer(dataset['text'])
然后利用map将其应用到整个数据集:
dataset = dataset.map(tokenize_dataset, batched=True)
6.利用DataCollatorWithPadding从数据集中创建一个批次示例:
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
在Trainer中聚集所有这些类:
from transformers import Trainer
trainer = Trainer(model = model,args = training_args,train_dataset = dataset['train'],eval_dataset = dataset['test'],tokenizer = tokenizer,data_collator = data_collator,) #doctest: SKIP
当你准备完毕后,调用train()来开始训练:
trainer.train()
您可以通过在Trainer中对方法进行子类化来自定义训练循环行为。这允许您自定义丢失函数、优化器和调度程序等功能。查看Trainer参考资料,可以对其方法进行子类化。
另一种自定义训练循环的方法是使用回调(Callbacks)。您可以使用回调与其他库集成,并检查培训循环以报告进度或提前停止培训。回调不会修改训练循环本身中的任何内容。要自定义类似损失函数的东西,您需要将Trainer子类化。
微调教程
如果找不到适合自己用例的模型,可以用自己的数据微调一个模型(待填坑)。