接上一章節(jié),這里對Transformers進行深入的介紹,詳細的參考文檔可以直接看官方文檔。
AutoClass
AutoClass是一種用于檢索預(yù)訓(xùn)練模型(by name or path)的簡化方式,用戶只需要選擇合適的AutoClass即可。
AutoTokenizer
tokenizer 的目的是,對text進行預(yù)處理,將其轉(zhuǎn)化為 array-of-numbers,有很多規(guī)則來決策,如何做tokenization過程,包括如何split a word。如下我們實例化一個tokenization(注意,具體的Tokenizer類的處理規(guī)則需要和加載的model name保持一致):
from 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]}
input_ids 表示了每個token代表的id。
AutoModel
Transformers提供了一種簡單、統(tǒng)一的方式,用于加載預(yù)訓(xùn)練模型,需要為我們的任務(wù)選擇正確的模型。比如對于text(或sequence)分類,需要加載AutoModelForSequenceClassification。
from transformers import AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)
然后,就可以將輸入傳給模型了。
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",
)
pt_outputs = pt_model(**pt_batch)
模型會輸出最后的激活層,我們應(yīng)用softmax function(到logits),就可以查看相關(guān)的概率了:
from torch import nn
pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)
保存模型
如果模型做了微調(diào),可以采用 PreTrainedModel.save_pretrained() 進行保存:
pt_save_directory = "./pt_save_pretrained"
tokenizer.save_pretrained(pt_save_directory)
pt_model.save_pretrained(pt_save_directory)
模型配置
可以對模型進行修改,通過配置來指定模型的屬性,比如number-of-hidden-layers,number-of-attention-heads。當(dāng)初始化一個model的時候,可以指定相關(guān)的配置。
AutoConfig 可以用于加載預(yù)訓(xùn)練模型(指定參數(shù))。
from transformers import AutoConfig
my_config = AutoConfig.from_pretrained("distilbert/distilbert-base-uncased", n_heads=12)
然后可以創(chuàng)建模型了:
from transformers import AutoModel
my_model = AutoModel.from_config(my_config)
訓(xùn)練/微調(diào)
所有的models都是標準的torch.nn.Module,可以對它們進行訓(xùn)練,Transformers為PyTorch提供了Trainer class,包括了基礎(chǔ)的training loop,增加了其它功能,比如分布式的訓(xùn)練:
from transformers import AutoModelForSequenceClassification
# 加載一個預(yù)訓(xùn)練的模型
model = AutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
# 定義訓(xùn)練參數(shù)
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,
)
# 加載預(yù)訓(xùn)練的class,如tokenizer、image processor、feature extractor、processor
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")
# 加載數(shù)據(jù)集
from datasets import load_dataset
dataset = load_dataset("rotten_tomatoes")
# 定義處理dataset的function
def tokenize_dataset(dataset):
return tokenizer(dataset["text"])
# map應(yīng)用于整個dataset
dataset = dataset.map(tokenize_dataset, batched=True)
# 構(gòu)建examples(根據(jù)dataset)
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
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
trainer.train()
如果是翻譯、摘要的任務(wù),需要用:Seq2SeqTrainer 和 Seq2SeqTrainingArguments classes。