Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
huggingface
GitHub Repository: huggingface/notebooks
Path: blob/main/transformers_doc/ja/tensorflow/training.ipynb
4542 views
Kernel: Unknown Kernel

Fine-tune a pretrained model

事前学習済みモデルを使用すると、計算コストを削減し、炭素排出量を減少させ、ゼロからモデルをトレーニングする必要なしに最新のモデルを使用できる利点があります。 🤗 Transformersは、さまざまなタスクに対応した数千もの事前学習済みモデルへのアクセスを提供します。 事前学習済みモデルを使用する場合、それを特定のタスクに合わせたデータセットでトレーニングします。これはファインチューニングとして知られ、非常に強力なトレーニング技術です。 このチュートリアルでは、事前学習済みモデルを選択したディープラーニングフレームワークでファインチューニングする方法について説明します:

  • 🤗 TransformersのTrainerを使用して事前学習済みモデルをファインチューニングする。

  • TensorFlowとKerasを使用して事前学習済みモデルをファインチューニングする。

  • ネイティブのPyTorchを使用して事前学習済みモデルをファインチューニングする。

Prepare a dataset

#@title from IPython.display import HTML HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/_BZearw7f0w?rel=0&amp;controls=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>')

事前学習済みモデルをファインチューニングする前に、データセットをダウンロードしてトレーニング用に準備する必要があります。 前のチュートリアルでは、トレーニングデータの処理方法を説明しましたが、これからはそれらのスキルを活かす機会があります!

まず、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

この時点で、使用したいフレームワークに対応するセクションに従う必要があります。右側のサイドバーのリンクを使用して、ジャンプしたいフレームワークに移動できます。 そして、特定のフレームワークのすべてのコンテンツを非表示にしたい場合は、そのフレームワークのブロック右上にあるボタンを使用してください!

#@title from IPython.display import HTML HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/rnTGBy2ax1c?rel=0&amp;controls=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>')

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配列としてトークン化します。ラベルは既に01のリストであるため、トークン化せずに直接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の配列です

最後に、モデルをロードし、compilefit メソッドを実行します。 注意点として、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)
[removed]

モデルをcompile()する際にloss引数を渡す必要はありません!Hugging Faceモデルは、この引数を空白のままにしておくと、タスクとモデルアーキテクチャに適した損失を自動的に選択します。 必要に応じて自分で損失を指定してオーバーライドすることもできます!

このアプローチは、小規模なデータセットには適していますが、大規模なデータセットに対しては問題になることがあります。なぜなら、トークナイズされた配列とラベルはメモリに完全に読み込まれる必要があり、またNumPyは「ジャギー」な配列を処理しないため、トークナイズされた各サンプルを全体のデータセット内で最も長いサンプルの長さにパディングする必要があります。 これにより、配列がさらに大きくなり、すべてのパディングトークンがトレーニングを遅くする原因になります!

Loading data as a tf.data.Dataset

トレーニングを遅くせずにデータを読み込むには、データをtf.data.Datasetとして読み込むことができます。独自のtf.dataパイプラインを作成することもできますが、これを行うための便利な方法が2つあります:

  • prepare_tf_dataset(): これはほとんどの場合で推奨する方法です。モデル上のメソッドなので、モデルを検査してモデル入力として使用可能な列を自動的に把握し、他の列を破棄してより単純で高性能なデータセットを作成できます。

  • to_tf_dataset: このメソッドはより低レベルで、データセットがどのように作成されるかを正確に制御する場合に便利です。columnslabel_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

追加リソース

さらなるファインチューニングの例については、以下を参照してください:

  • 🤗 Transformers Examples には、PyTorchとTensorFlowで一般的なNLPタスクをトレーニングするスクリプトが含まれています。

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