Path: blob/main/transformers_doc/ja/training.ipynb
4522 views
Fine-tune a pretrained model
事前学習済みモデルを使用すると、計算コストを削減し、炭素排出量を減少させ、ゼロからモデルをトレーニングする必要なしに最新のモデルを使用できる利点があります。 🤗 Transformersは、さまざまなタスクに対応した数千もの事前学習済みモデルへのアクセスを提供します。 事前学習済みモデルを使用する場合、それを特定のタスクに合わせたデータセットでトレーニングします。これはファインチューニングとして知られ、非常に強力なトレーニング技術です。 このチュートリアルでは、事前学習済みモデルを選択したディープラーニングフレームワークでファインチューニングする方法について説明します:
🤗 TransformersのTrainerを使用して事前学習済みモデルをファインチューニングする。
TensorFlowとKerasを使用して事前学習済みモデルをファインチューニングする。
ネイティブのPyTorchを使用して事前学習済みモデルをファインチューニングする。
Prepare a dataset
事前学習済みモデルをファインチューニングする前に、データセットをダウンロードしてトレーニング用に準備する必要があります。 前のチュートリアルでは、トレーニングデータの処理方法を説明しましたが、これからはそれらのスキルを活かす機会があります!
まず、Yelp Reviewsデータセットを読み込んでみましょう:
トークナイザがテキストを処理し、可変のシーケンス長を処理するためのパディングと切り捨て戦略を含める必要があることをご存知の通り、 データセットを1つのステップで処理するには、🤗 Datasets の map
メソッドを使用して、 データセット全体に前処理関数を適用します:
お好みで、実行時間を短縮するためにフルデータセットの小さなサブセットを作成することができます:
Train
この時点で、使用したいフレームワークに対応するセクションに従う必要があります。右側のサイドバーのリンクを使用して、ジャンプしたいフレームワークに移動できます。 そして、特定のフレームワークのすべてのコンテンツを非表示にしたい場合は、そのフレームワークのブロック右上にあるボタンを使用してください!
Train with Pytorch Trainer
🤗 Transformersは、🤗 Transformersモデルのトレーニングを最適化したTrainerクラスを提供し、独自のトレーニングループを手動で記述せずにトレーニングを開始しやすくしています。 Trainer APIは、ログ記録、勾配累積、混合精度など、さまざまなトレーニングオプションと機能をサポートしています。
まず、モデルをロードし、予想されるラベルの数を指定します。Yelp Review dataset cardから、5つのラベルがあることがわかります:
一部の事前学習済みの重みが使用されず、一部の重みがランダムに初期化された警告が表示されることがあります。心配しないでください、これは完全に正常です! BERTモデルの事前学習済みのヘッドは破棄され、ランダムに初期化された分類ヘッドで置き換えられます。この新しいモデルヘッドをシーケンス分類タスクでファインチューニングし、事前学習モデルの知識をそれに転送します。
Training Hyperparameters
次に、トレーニングオプションをアクティベートするためのすべてのハイパーパラメータと、調整できるハイパーパラメータを含むTrainingArgumentsクラスを作成します。 このチュートリアルでは、デフォルトのトレーニングハイパーパラメータを使用して開始できますが、最適な設定を見つけるためにこれらを実験しても構いません。
トレーニングのチェックポイントを保存する場所を指定します:
Evaluate
Trainerはトレーニング中に自動的にモデルのパフォーマンスを評価しません。メトリクスを計算して報告する関数をTrainerに渡す必要があります。 🤗 Evaluateライブラリでは、evaluate.load
関数を使用して読み込むことができるシンプルなaccuracy
関数が提供されています(詳細についてはこちらのクイックツアーを参照してください):
metric
の~evaluate.compute
を呼び出して、予測の正確度を計算します。 compute
に予測を渡す前に、予測をロジットに変換する必要があります(すべての🤗 Transformersモデルはロジットを返すことを覚えておいてください):
評価メトリクスをファインチューニング中に監視したい場合、トレーニング引数で eval_strategy
パラメータを指定して、各エポックの終了時に評価メトリクスを報告します:
Trainer
モデル、トレーニング引数、トレーニングおよびテストデータセット、評価関数を使用してTrainerオブジェクトを作成します:
その後、train()を呼び出してモデルを微調整します:
Kerasを使用してTensorFlowモデルをトレーニングする
Keras APIを使用して🤗 TransformersモデルをTensorFlowでトレーニングすることもできます!
Loading Data from Keras
🤗 TransformersモデルをKeras APIでトレーニングする場合、データセットをKerasが理解できる形式に変換する必要があります。 データセットが小さい場合、データセット全体をNumPy配列に変換してKerasに渡すことができます。 複雑なことをする前に、まずそれを試してみましょう。
まず、データセットを読み込みます。GLUEベンチマークからCoLAデータセットを使用します (GLUE Banchmark)、これは単純なバイナリテキスト分類タスクです。今のところトレーニング分割のみを使用します。
次に、トークナイザをロードし、データをNumPy配列としてトークン化します。ラベルは既に0
と1
のリストであるため、トークン化せずに直接NumPy配列に変換できます!
モデルを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()を使用する前に、次のコードサンプルに示すように、トークナイザの出力をデータセットに列として追加する必要があります:
Hugging Faceのデータセットはデフォルトでディスクに保存されるため、これによりメモリの使用量が増えることはありません! 列が追加されたら、データセットからバッチをストリームし、各バッチにパディングを追加できます。これにより、 データセット全体にパディングを追加する場合と比べて、パディングトークンの数が大幅に削減されます。
上記のコードサンプルでは、トークナイザをprepare_tf_dataset
に渡して、バッチを正しく読み込む際に正しくパディングできるようにする必要があります。 データセットのすべてのサンプルが同じ長さであり、パディングが不要な場合は、この引数をスキップできます。 パディング以外の複雑な処理を行う必要がある場合(例:マスク言語モデリングのためのトークンの破損など)、 代わりにcollate_fn
引数を使用して、サンプルのリストをバッチに変換し、必要な前処理を適用する関数を渡すことができます。 このアプローチを実際に使用した例については、 examplesや notebooksをご覧ください。
tf.data.Dataset
を作成したら、以前と同様にモデルをコンパイルし、適合させることができます:
Train in native Pytorch
Trainerはトレーニングループを処理し、1行のコードでモデルをファインチューニングできるようにします。 トレーニングループを独自に記述したいユーザーのために、🤗 TransformersモデルをネイティブのPyTorchでファインチューニングすることもできます。
この時点で、ノートブックを再起動するか、以下のコードを実行してメモリを解放する必要があるかもしれません:
モデルは生のテキストを入力として受け取らないため、
text
列を削除します:
label
列をlabels
に名前を変更します。モデルは引数の名前をlabels
と期待しています:
データセットの形式をリストではなくPyTorchテンソルを返すように設定します:
以前に示したように、ファインチューニングを高速化するためにデータセットの小さなサブセットを作成します:
DataLoader
トレーニングデータセットとテストデータセット用のDataLoader
を作成して、データのバッチをイテレートできるようにします:
ロードするモデルと期待されるラベルの数を指定してください:
Optimizer and learning rate scheduler
モデルをファインチューニングするためのオプティマイザと学習率スケジューラーを作成しましょう。 PyTorchからAdamW
オプティマイザを使用します:
デフォルトの学習率スケジューラをTrainerから作成する:
最後に、GPUを利用できる場合は device
を指定してください。それ以外の場合、CPUでのトレーニングは数時間かかる可能性があり、数分で完了することができます。
クラウドGPUが利用できない場合、ColaboratoryやSageMaker StudioLabなどのホストされたノートブックを使用して無料でGPUにアクセスできます。
さて、トレーニングの準備が整いました! 🥳
トレーニングループ
トレーニングの進捗を追跡するために、tqdmライブラリを使用してトレーニングステップの数に対して進行状況バーを追加します:
Evaluate
Trainerに評価関数を追加したのと同様に、独自のトレーニングループを作成する際にも同様の操作を行う必要があります。 ただし、各エポックの最後にメトリックを計算および報告する代わりに、今回はadd_batch
を使用してすべてのバッチを蓄積し、最後にメトリックを計算します。
追加リソース
さらなるファインチューニングの例については、以下を参照してください:
🤗 Transformers Examples には、PyTorchとTensorFlowで一般的なNLPタスクをトレーニングするスクリプトが含まれています。
🤗 Transformers Notebooks には、特定のタスクにモデルをファインチューニングする方法に関するさまざまなノートブックが含まれています。