transformersのtutorialを読んでみた - part3
はじめに
ファインチューニング
事前学習済みのモデルを使用することには大きな利点があります。 計算コストを削減し、最先端のモデルをゼロから学習することなく使用できます。Transformersを使うと、幅広いタスク向けの何千もの事前学習済みモデルにアクセスできます。事前学習済みのモデルを使用する場合、タスクに固有のデータセットでモデルを学習します。これはファインチューニングとして知られており非常に有用な手法です。
データセットの準備
事前学習済みのモデルをファインチューニングする前に、データセットをダウンロードして訓練用に準備します。
まずはYelpレビューデータセットを読み込みます。
from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
dataset["train"][100]
次に、トークナイザーを利用して、paddingやtruncationなどの処理を行い、配列の長さを調整します。(参考:part2)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
tokenized_datasetsを出力すると以下のように表示されます。
DatasetDict({
train: Dataset({
features: ['label', 'text', 'input_ids', 'token_type_ids', 'attention_mask'],
num_rows: 650000
})
test: Dataset({
features: ['label', 'text', 'input_ids', 'token_type_ids', 'attention_mask'],
num_rows: 50000
})
})
必要に応じて、データセットのサブセットを作成してファインチューニングを行い、所要時間を短縮できます。
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
Transformersは、訓練用に最適化されたTrainerクラスを提供します。Transformersモデルにより、学習のループを手動で記述しなくても、学習を簡単に実行できます。
まずはモデルをロードし、予想されるラベルの数を指定します。
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
ハイパーパラメータ
次に、調整可能なすべてのハイパーパラメータを含むTrainingArgumentsクラスを作成します。
学習の結果を保存する場所を指定します。
from transformers import TrainingArguments
training_args = TrainingArguments(output_dir="/content/drive/MyDrive/tutorial/transformers")
評価関数
Trainerは、学習中にモデルのパフォーマンスを自動的に評価しません。評価関数を計算するには、Trainerに関数を渡す必要があります。Datasetsのload_metric関数を用いることで、評価関数をロードできます。
import numpy as np
from datasets import load_metric
metric = load_metric("accuracy")
先ほど評価関数をロードしたmetricに対してcomputeを呼び出すことで、予測の精度を計算することができます。なお、computeを使う前に、予測結果をlogitsに変換する必要があります。
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
ファインチューニング中に評価関数の様子を確認したい場合は、各エポックの終わりに評価結果を表示するために、Evaluation_strategyパラメータを指定します。
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir="test_trainer", evaluation_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()
Discussion