🔥

transformersのtutorialを読んでみた - part3

2022/09/19に公開

はじめに

https://huggingface.co/docs/transformers/training

ファインチューニング

事前学習済みのモデルを使用することには大きな利点があります。 計算コストを削減し、最先端のモデルをゼロから学習することなく使用できます。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()
GitHubで編集を提案

Discussion