Hugging Face(三) - Transformers基礎(chǔ)

接上一章節(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ù),需要用:Seq2SeqTrainerSeq2SeqTrainingArguments classes。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容