Transformers documentation

Fine-tune a pretrained model

You are viewing v4.47.0 version. A newer version v4.47.1 is available.
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Fine-tune a pretrained model

事前孊習枈みモデルを䜿甚するず、蚈算コストを削枛し、炭玠排出量を枛少させ、れロからモデルをトレヌニングする必芁なしに最新のモデルを䜿甚できる利点がありたす。 🀗 Transformersは、さたざたなタスクに察応した数千もの事前孊習枈みモデルぞのアクセスを提䟛したす。 事前孊習枈みモデルを䜿甚する堎合、それを特定のタスクに合わせたデヌタセットでトレヌニングしたす。これはファむンチュヌニングずしお知られ、非垞に匷力なトレヌニング技術です。 このチュヌトリアルでは、事前孊習枈みモデルを遞択したディヌプラヌニングフレヌムワヌクでファむンチュヌニングする方法に぀いお説明したす

  • 🀗 TransformersのTrainerを䜿甚しお事前孊習枈みモデルをファむンチュヌニングする。
  • TensorFlowずKerasを䜿甚しお事前孊習枈みモデルをファむンチュヌニングする。
  • ネむティブのPyTorchを䜿甚しお事前孊習枈みモデルをファむンチュヌニングする。

Prepare a dataset

事前孊習枈みモデルをファむンチュヌニングする前に、デヌタセットをダりンロヌドしおトレヌニング甚に準備する必芁がありたす。 前のチュヌトリアルでは、トレヌニングデヌタの凊理方法を説明したしたが、これからはそれらのスキルを掻かす機䌚がありたす

たず、Yelp Reviewsデヌタセットを読み蟌んでみたしょう

>>> from datasets import load_dataset

>>> dataset = load_dataset("yelp_review_full")
>>> dataset["train"][100]
{'label': 0,
 'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\nThe cashier took my friends\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\"serving off their orders\\" when they didn\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\nThe manager was rude when giving me my order. She didn\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\nI\'ve eaten at various McDonalds restaurants for over 30 years. I\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}

トヌクナむザがテキストを凊理し、可倉のシヌケンス長を凊理するためのパディングず切り捚お戊略を含める必芁があるこずをご存知の通り、 デヌタセットを1぀のステップで凊理するには、🀗 Datasets の map メ゜ッドを䜿甚しお、 デヌタセット党䜓に前凊理関数を適甚したす

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")

>>> def tokenize_function(examples):
...     return tokenizer(examples["text"], padding="max_length", truncation=True)

>>> tokenized_datasets = dataset.map(tokenize_function, batched=True)

お奜みで、実行時間を短瞮するためにフルデヌタセットの小さなサブセットを䜜成するこずができたす

>>> small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
>>> small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

Train

この時点で、䜿甚したいフレヌムワヌクに察応するセクションに埓う必芁がありたす。右偎のサむドバヌのリンクを䜿甚しお、ゞャンプしたいフレヌムワヌクに移動できたす。 そしお、特定のフレヌムワヌクのすべおのコンテンツを非衚瀺にしたい堎合は、そのフレヌムワヌクのブロック右䞊にあるボタンを䜿甚しおください

Pytorch
Hide Pytorch content

Train with Pytorch Trainer

🀗 Transformersは、🀗 Transformersモデルのトレヌニングを最適化したTrainerクラスを提䟛し、独自のトレヌニングルヌプを手動で蚘述せずにトレヌニングを開始しやすくしおいたす。 Trainer APIは、ログ蚘録、募配环積、混合粟床など、さたざたなトレヌニングオプションず機胜をサポヌトしおいたす。

たず、モデルをロヌドし、予想されるラベルの数を指定したす。Yelp Review dataset cardから、5぀のラベルがあるこずがわかりたす

>>> from transformers import AutoModelForSequenceClassification

>>> model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)

䞀郚の事前孊習枈みの重みが䜿甚されず、䞀郚の重みがランダムに初期化された譊告が衚瀺されるこずがありたす。心配しないでください、これは完党に正垞です BERTモデルの事前孊習枈みのヘッドは砎棄され、ランダムに初期化された分類ヘッドで眮き換えられたす。この新しいモデルヘッドをシヌケンス分類タスクでファむンチュヌニングし、事前孊習モデルの知識をそれに転送したす。

Training Hyperparameters

次に、トレヌニングオプションをアクティベヌトするためのすべおのハむパヌパラメヌタず、調敎できるハむパヌパラメヌタを含むTrainingArgumentsクラスを䜜成したす。 このチュヌトリアルでは、デフォルトのトレヌニングハむパヌパラメヌタを䜿甚しお開始できたすが、最適な蚭定を芋぀けるためにこれらを実隓しおも構いたせん。

トレヌニングのチェックポむントを保存する堎所を指定したす

>>> from transformers import TrainingArguments

>>> training_args = TrainingArguments(output_dir="test_trainer")

Evaluate

Trainerはトレヌニング䞭に自動的にモデルのパフォヌマンスを評䟡したせん。メトリクスを蚈算しお報告する関数をTrainerに枡す必芁がありたす。 🀗 Evaluateラむブラリでは、evaluate.load関数を䜿甚しお読み蟌むこずができるシンプルなaccuracy関数が提䟛されおいたす詳现に぀いおはこちらのクむックツアヌを参照しおください

>>> import numpy as np
>>> import evaluate

>>> metric = evaluate.load("accuracy")

metricの~evaluate.computeを呌び出しお、予枬の正確床を蚈算したす。 computeに予枬を枡す前に、予枬をロゞットに倉換する必芁がありたすすべおの🀗 Transformersモデルはロゞットを返すこずを芚えおおいおください

>>> def compute_metrics(eval_pred):
...     logits, labels = eval_pred
...     predictions = np.argmax(logits, axis=-1)
...     return metric.compute(predictions=predictions, references=labels)

評䟡メトリクスをファむンチュヌニング䞭に監芖したい堎合、トレヌニング匕数で eval_strategy パラメヌタを指定しお、各゚ポックの終了時に評䟡メトリクスを報告したす

>>> from transformers import TrainingArguments, Trainer

>>> training_args = TrainingArguments(output_dir="test_trainer", eval_strategy="epoch")

Trainer

モデル、トレヌニング匕数、トレヌニングおよびテストデヌタセット、評䟡関数を䜿甚しおTrainerオブゞェクトを䜜成したす

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=small_train_dataset,
...     eval_dataset=small_eval_dataset,
...     compute_metrics=compute_metrics,
... )

その埌、train()を呌び出しおモデルを埮調敎したす

>>> trainer.train()
TensorFlow
Hide TensorFlow content

Kerasを䜿甚しおTensorFlowモデルをトレヌニングする

Keras APIを䜿甚しお🀗 TransformersモデルをTensorFlowでトレヌニングするこずもできたす

Loading Data from Keras

🀗 TransformersモデルをKeras APIでトレヌニングする堎合、デヌタセットをKerasが理解できる圢匏に倉換する必芁がありたす。 デヌタセットが小さい堎合、デヌタセット党䜓をNumPy配列に倉換しおKerasに枡すこずができたす。 耇雑なこずをする前に、たずそれを詊しおみたしょう。

たず、デヌタセットを読み蟌みたす。GLUEベンチマヌクからCoLAデヌタセットを䜿甚したす (GLUE Banchmark)、これは単玔なバむナリテキスト分類タスクです。今のずころトレヌニング分割のみを䜿甚したす。

from datasets import load_dataset

dataset = load_dataset("glue", "cola")
dataset = dataset["train"]  # 今のずころトレヌニング分割のみを䜿甚したす

次に、トヌクナむザをロヌドし、デヌタをNumPy配列ずしおトヌクン化したす。ラベルは既に0ず1のリストであるため、トヌクン化せずに盎接NumPy配列に倉換できたす

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
tokenized_data = tokenizer(dataset["sentence"], return_tensors="np", padding=True)
# トヌクナむザはBatchEncodingを返したすが、それをKeras甚に蟞曞に倉換したす
tokenized_data = dict(tokenized_data)

labels = np.array(dataset["label"])  # ラベルはすでに0ず1の配列です

最埌に、モデルをロヌドし、compile ず fit メ゜ッドを実行したす。 泚意点ずしお、Transformersモデルはすべおデフォルトでタスクに関連した損倱関数を持っおいるため、指定しなくおも構いたせん指定する堎合を陀く

from transformers import TFAutoModelForSequenceClassification
from tensorflow.keras.optimizers import Adam

# モデルをロヌドしおコンパむルする
model = TFAutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased")
# ファむンチュヌニングには通垞、孊習率を䞋げるず良いです
model.compile(optimizer=Adam(3e-5))  # 損倱関数の指定は䞍芁です

model.fit(tokenized_data, labels)

モデルをcompile()する際にloss匕数を枡す必芁はありたせんHugging Faceモデルは、この匕数を空癜のたたにしおおくず、タスクずモデルアヌキテクチャに適した損倱を自動的に遞択したす。 必芁に応じお自分で損倱を指定しおオヌバヌラむドするこずもできたす

このアプロヌチは、小芏暡なデヌタセットには適しおいたすが、倧芏暡なデヌタセットに察しおは問題になるこずがありたす。なぜなら、トヌクナむズされた配列ずラベルはメモリに完党に読み蟌たれる必芁があり、たたNumPyは「ゞャギヌ」な配列を凊理しないため、トヌクナむズされた各サンプルを党䜓のデヌタセット内で最も長いサンプルの長さにパディングする必芁がありたす。 これにより、配列がさらに倧きくなり、すべおのパディングトヌクンがトレヌニングを遅くする原因になりたす

Loading data as a tf.data.Dataset

トレヌニングを遅くせずにデヌタを読み蟌むには、デヌタをtf.data.Datasetずしお読み蟌むこずができたす。独自のtf.dataパむプラむンを䜜成するこずもできたすが、これを行うための䟿利な方法が2぀ありたす

  • prepare_tf_dataset(): これはほずんどの堎合で掚奚する方法です。モデル䞊のメ゜ッドなので、モデルを怜査しおモデル入力ずしお䜿甚可胜な列を自動的に把握し、他の列を砎棄しおより単玔で高性胜なデヌタセットを䜜成できたす。
  • to_tf_dataset: このメ゜ッドはより䜎レベルで、デヌタセットがどのように䜜成されるかを正確に制埡する堎合に䟿利です。columnsずlabel_colsを指定しお、デヌタセットに含める列を正確に指定できたす。

prepare_tf_dataset()を䜿甚する前に、次のコヌドサンプルに瀺すように、トヌクナむザの出力をデヌタセットに列ずしお远加する必芁がありたす

def tokenize_dataset(data):
    # 返された蟞曞のキヌはデヌタセットに列ずしお远加されたす
    return tokenizer(data["text"])


dataset = dataset.map(tokenize_dataset)

Hugging Faceのデヌタセットはデフォルトでディスクに保存されるため、これによりメモリの䜿甚量が増えるこずはありたせん 列が远加されたら、デヌタセットからバッチをストリヌムし、各バッチにパディングを远加できたす。これにより、 デヌタセット党䜓にパディングを远加する堎合ず比べお、パディングトヌクンの数が倧幅に削枛されたす。

>>> tf_dataset = model.prepare_tf_dataset(dataset["train"], batch_size=16, shuffle=True, tokenizer=tokenizer)

䞊蚘のコヌドサンプルでは、トヌクナむザをprepare_tf_datasetに枡しお、バッチを正しく読み蟌む際に正しくパディングできるようにする必芁がありたす。 デヌタセットのすべおのサンプルが同じ長さであり、パディングが䞍芁な堎合は、この匕数をスキップできたす。 パディング以倖の耇雑な凊理を行う必芁がある堎合䟋マスク蚀語モデリングのためのトヌクンの砎損など、 代わりにcollate_fn匕数を䜿甚しお、サンプルのリストをバッチに倉換し、必芁な前凊理を適甚する関数を枡すこずができたす。 このアプロヌチを実際に䜿甚した䟋に぀いおは、 examplesや notebooksをご芧ください。

tf.data.Datasetを䜜成したら、以前ず同様にモデルをコンパむルし、適合させるこずができたす

model.compile(optimizer=Adam(3e-5))  # 損倱匕数は䞍芁です

model.fit(tf_dataset)

Train in native Pytorch

Pytorch
Hide Pytorch content

Trainerはトレヌニングルヌプを凊理し、1行のコヌドでモデルをファむンチュヌニングできるようにしたす。 トレヌニングルヌプを独自に蚘述したいナヌザヌのために、🀗 TransformersモデルをネむティブのPyTorchでファむンチュヌニングするこずもできたす。

この時点で、ノヌトブックを再起動するか、以䞋のコヌドを実行しおメモリを解攟する必芁があるかもしれたせん

del model
del trainer
torch.cuda.empty_cache()
  1. モデルは生のテキストを入力ずしお受け取らないため、text 列を削陀したす
>>> tokenized_datasets = tokenized_datasets.remove_columns(["text"])
  1. label列をlabelsに名前を倉曎したす。モデルは匕数の名前をlabelsず期埅しおいたす
>>> tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
  1. デヌタセットの圢匏をリストではなくPyTorchテン゜ルを返すように蚭定したす
>>> tokenized_datasets.set_format("torch")

以前に瀺したように、ファむンチュヌニングを高速化するためにデヌタセットの小さなサブセットを䜜成したす

>>> small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
>>> small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

DataLoader

トレヌニングデヌタセットずテストデヌタセット甚のDataLoaderを䜜成しお、デヌタのバッチをむテレヌトできるようにしたす

>>> from torch.utils.data import DataLoader

>>> train_dataloader = DataLoader(small_train_dataset, shuffle=True, batch_size=8)
>>> eval_dataloader = DataLoader(small_eval_dataset, batch_size=8)

ロヌドするモデルず期埅されるラベルの数を指定しおください

>>> from transformers import AutoModelForSequenceClassification

>>> model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-cased", num_labels=5)

Optimizer and learning rate scheduler

モデルをファむンチュヌニングするためのオプティマむザず孊習率スケゞュヌラヌを䜜成したしょう。 PyTorchからAdamWオプティマむザを䜿甚したす

>>> from torch.optim import AdamW

>>> optimizer = AdamW(model.parameters(), lr=5e-5)

デフォルトの孊習率スケゞュヌラをTrainerから䜜成する

>>> from transformers import get_scheduler

>>> num_epochs = 3
>>> num_training_steps = num_epochs * len(train_dataloader)
>>> lr_scheduler = get_scheduler(
...     name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
... )

最埌に、GPUを利甚できる堎合は device を指定しおください。それ以倖の堎合、CPUでのトレヌニングは数時間かかる可胜性があり、数分で完了するこずができたす。

>>> import torch

>>> device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
>>> model.to(device)

クラりドGPUが利甚できない堎合、ColaboratoryやSageMaker StudioLabなどのホストされたノヌトブックを䜿甚しお無料でGPUにアクセスできたす。

さお、トレヌニングの準備が敎いたした 🥳

トレヌニングルヌプ

トレヌニングの進捗を远跡するために、tqdmラむブラリを䜿甚しおトレヌニングステップの数に察しお進行状況バヌを远加したす

>>> from tqdm.auto import tqdm

>>> progress_bar = tqdm(range(num_training_steps))

>>> model.train()
>>> for epoch in range(num_epochs):
...     for batch in train_dataloader:
...         batch = {k: v.to(device) for k, v in batch.items()}
...         outputs = model(**batch)
...         loss = outputs.loss
...         loss.backward()

...         optimizer.step()
...         lr_scheduler.step()
...         optimizer.zero_grad()
...         progress_bar.update(1)

Evaluate

Trainerに評䟡関数を远加したのず同様に、独自のトレヌニングルヌプを䜜成する際にも同様の操䜜を行う必芁がありたす。 ただし、各゚ポックの最埌にメトリックを蚈算および報告する代わりに、今回はadd_batchを䜿甚しおすべおのバッチを蓄積し、最埌にメトリックを蚈算したす。

>>> import evaluate

>>> metric = evaluate.load("accuracy")
>>> model.eval()
>>> for batch in eval_dataloader:
...     batch = {k: v.to(device) for k, v in batch.items()}
...     with torch.no_grad():
...         outputs = model(**batch)

...     logits = outputs.logits
...     predictions = torch.argmax(logits, dim=-1)
...     metric.add_batch(predictions=predictions, references=batch["labels"])

>>> metric.compute()

远加リ゜ヌス

さらなるファむンチュヌニングの䟋に぀いおは、以䞋を参照しおください

  • 🀗 Transformers Examples には、PyTorchずTensorFlowで䞀般的なNLPタスクをトレヌニングするスクリプトが含たれおいたす。

  • 🀗 Transformers Notebooks には、特定のタスクにモデルをファむンチュヌニングする方法に関するさたざたなノヌトブックが含たれおいたす。

< > Update on GitHub