Path: blob/main/transformers_doc/ja/tensorflow/training.ipynb
4542 views
Fine-tune a pretrained model
事前学習済みモデルを使用すると、計算コストを削減し、炭素排出量を減少させ、ゼロからモデルをトレーニングする必要なしに最新のモデルを使用できる利点があります。 🤗 Transformersは、さまざまなタスクに対応した数千もの事前学習済みモデルへのアクセスを提供します。 事前学習済みモデルを使用する場合、それを特定のタスクに合わせたデータセットでトレーニングします。これはファインチューニングとして知られ、非常に強力なトレーニング技術です。 このチュートリアルでは、事前学習済みモデルを選択したディープラーニングフレームワークでファインチューニングする方法について説明します:
🤗 TransformersのTrainerを使用して事前学習済みモデルをファインチューニングする。
TensorFlowとKerasを使用して事前学習済みモデルをファインチューニングする。
ネイティブのPyTorchを使用して事前学習済みモデルをファインチューニングする。
Prepare a dataset
事前学習済みモデルをファインチューニングする前に、データセットをダウンロードしてトレーニング用に準備する必要があります。 前のチュートリアルでは、トレーニングデータの処理方法を説明しましたが、これからはそれらのスキルを活かす機会があります!
まず、Yelp Reviewsデータセットを読み込んでみましょう:
トークナイザがテキストを処理し、可変のシーケンス長を処理するためのパディングと切り捨て戦略を含める必要があることをご存知の通り、 データセットを1つのステップで処理するには、🤗 Datasets の map
メソッドを使用して、 データセット全体に前処理関数を適用します:
お好みで、実行時間を短縮するためにフルデータセットの小さなサブセットを作成することができます:
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
追加リソース
さらなるファインチューニングの例については、以下を参照してください:
🤗 Transformers Examples には、PyTorchとTensorFlowで一般的なNLPタスクをトレーニングするスクリプトが含まれています。
🤗 Transformers Notebooks には、特定のタスクにモデルをファインチューニングする方法に関するさまざまなノートブックが含まれています。