Skip to main content

Hugging Face Transformers のハイパーパラメータ最適化

本記事では、Hugging Face Transformers のファインチューニングにおけるハイパーパラメータ最適化の3つの戦略を紹介し、実験の追跡には Weights & Biases(W&B)を用います。
Created on August 12|Last edited on August 12
NLP のモデルを一から学習させるには数百時間かかります。代わりに、事前学習済みモデルを用いて特定のタスク向けにファインチューニングする方がはるかに簡単です。
使用してHugging FaceTransformers ライブラリを用いれば、追加の層をいくつか備えた事前学習済みの NLP モデルをすばやく読み込み、特定のタスクに対して数エポックのファインチューニングを実行できます。Tune最先端のチューニングアルゴリズムを用いたスケーラブルなハイパーパラメータチューニングを実行できる高水準の抽象化を提供します。
本記事では、より短時間で高精度なモデルを得るために、グリッドサーチ、ベイズ最適化、Population-Based Training(PBT)の3つの最適化手法を比較します。
Hugging Face Transformers の標準的な uncased BERT モデルを用い、SuperGLUE の RTE データセットでファインチューニングします。選択するハイパーパラメータは、最終的なモデル性能に大きく影響することが分かります。

目次



ハイパーパラメータチューニング実験

本記事では、以下の手法でモデルをファインチューニングして実験します。

Ray Tune と Weights & Biases

使用する利点は数多くありますRay TuneW&B とともに:
  • Ray Tuneの実装を提供しますスケール可能な最先端のハイパーパラメータチューニングアルゴリズム
  • 実験は、単一の GPU から簡単にスケールできますノートブックからGPU搭載サーバーへコードは一切変更せずに
  • 実験は可能であり並列化された2 行のコードで GPU 間にスケールします
  • 〜を用いてW&B の実験トラッキングこれで、有用な示唆を得るための指標がすべて一箇所にまとまります。
  • 使用W&B と Ray Tune の連携、進捗が失われることはありません

W&B のトラッキングを有効化する

Tune を使用して W&B で進捗を追跡する方法は 2 つあります。
  • 渡すことができます WandbLogger 呼び出す際の logger として tune.runこれは、Tune に報告されたすべての指標を追跡します。
  • 使用できます @wandb_mixin 関数デコレータと呼び出し wandb.log 目的の指標を追跡するためです。 Tune は、渡された情報を用いて W&B の run を初期化します。 config 辞書
config = {
....
"wandb":{
"project": "Project_name",
"api_key": #Your W&B API KEY,
#Additional wandb.init() parameters
}
}


グリッドサーチ(ベースライン)

ベースラインを構築するために、論文著者が提示した探索空間に対してグリッドサーチを実行し、最適なハイパーパラメータを特定します。
{
"per_gpu_batch_size": [16, 32],
"learning_rate": [2e-5, 3e-5, 5e-5],
"num_epochs": [2, 3, 4]
}
それでは、指標の可視化を見て性能を比較しましょう。
analysis = tune.run(
...
resources_per_trial={'gpu': #num_gpu,
'cpu': #num_cpu }, # Tune will use this information to parallelize the tuning operation
config=config
...
)


Run set
0


非同期 HyperOpt を用いたベイズ最適化

ベイズ探索では、パラメータの性能(すなわち損失)を予測するガウス過程モデルを学習し、その予測に基づいて今後のハイパーパラメータを決定します。さらにこれを、次の手法と組み合わせます。早期停止アルゴリズム、非同期 HyperBand低性能のトライアルを早期停止して、リソースの無駄を避けます。

この実験では、weight_decay と warmup_steps も探索対象に含め、探索空間を拡張します。
{
"per_gpu_batch_size": (16, 64),
"weight_decay": (0, 0.3),
"learning_rate": (1e-5, 5e-5),
"warmup_steps": (0, 500),
"num_epochs": (2, 5)
}
合計で60回のトライアルを実行し、そのうち15回は初期のランダム探索に充てました。
それでは結果を見ていきましょう。

Run set
0


Population-Based Training

Population-Based Training(PBT)は誘導型のハイパーパラメータ探索を行いつつ、新しいハイパーパラメータ構成のたびに学習を再開する必要がありません。成績の悪いトライアルを捨てる代わりに、成績の良い実行からネットワークの重みとハイパーパラメータをコピーして活用し、そのまま学習を継続しながら新たなハイパーパラメータ構成を探索します。

平易に言えば、このアルゴリズムの基本的な考え方は次のとおりです。
  • 与えられたタイムステップ(または反復)Tに対して、いくつかのサンプルについてハイパーパラメータ最適化を実行する。
  • T 回ごとに実行を比較し、成績の良い実行の重みを成績の悪い実行にコピーし、そのハイパーパラメータを高成績の実行に近い値へ更新します。
  • 成績の悪い実行を打ち切る。 アルゴリズムの発想自体はシンプルに見えますが、これを一から構築するには多くの複雑な最適化数学が必要になります。Tune は、SOTA の PBT アルゴリズムをスケーラブルかつ使いやすい形で実装しています。
これが今回使用する探索空間です。
{
"per_gpu_batch_size": [16, 32, 64],
"weight_decay": (0, 0.3),
"learning_rate": (1e-5, 5e-5),
"num_epochs": [2, 3, 4, 5]
}
私たちは〜のみ実行します8 件の trialsベイズ最適化よりはるかに少なくて済みます。これは、不調なトライアルを止めるのではなく、好調なトライアルからコピーするためです。
結果を見ていきましょう。


Run set
0





Run set
0



結論:Hugging Face モデルの勝者は Population-Based Training(PBT)

ここでの重要なポイントは、Hugging Face Transformers のモデルに対するハイパーパラメータ最適化では、Population-Based Training(PBT)が最も効果的だったということです。加えて、NLP モデルのハイパーパラメータチューニングに関して、より広く役立ついくつかの示唆も得られました。
  • ベイズ最適化で局所最適解を回避する方法ベイズ最適化を用いる場合、最初に「ランダムな推定値」の集合を与えることが不可欠です。直感的には、これによりベイズ最適化が出発点とする事前情報がより豊かになります。これがないと、オプティマイザは近視眼的になり、少数のサンプルに過剰適合してしまう可能性があります。
  • 反復時間を短縮することは非常に重要です。常にマシンの計算資源を余すことなく活用してください。並列実行できる処理は、必ず並列で実行しましょう。
  • PBT の摂動/変異間隔の調整についてPBT では、重要な検討事項は摂動間隔、すなわちハイパーパラメータをどの頻度で「活用」と「探索」するかです。私たちの実験では、各 epoch 後にこの変異を実行しました。ただし、頻度が高すぎると逆効果になります。少ないバッチステップしか学習していない段階ではモデルの性能がノイズに左右されやすいためです。
  • ランダムシードも精度結果に影響します。上記のハイパーパラメータに加えて、最良のモデルを見つけるために異なる乱数シードをスイープする価値もあります。ここでは二段階のアプローチが有効です。まず、早期停止アルゴリズムを用いて多数のシードで学習し、成績の良いシードだけを選びます。次に、その選抜したシードに対して Population-Based Training(PBT)を用い、他のハイパーパラメータをチューニングします。

いくつかの最後の考察

これらの実験で特に注目すべきポイントは次のとおりです。
  • すべての実験は8 基の GPU にまたがって並列化Tune を使用することで
  • これらの実験拡張にも縮小にも対応できるコードは変更しないでください。
  • これで必要なものはすべて揃いました重要な指標、推論結果、そしてこのレポートまで一箇所でかつ簡単に共有できます
  • これらの推論は次の用途に利用できますリソースを正確に定量化する適切な探索手法を用いることで節約できる時間と計算資源。
  • この全体構成によりチーム間の生産性向上

Bazen Gashaw Teferra
Bazen Gashaw Teferra •  *
Where do we pass the parameters - e.g.: per_gpu_batch_size? I mean you mentioned hyperparameters inside {} but you never assign them to anything
1 reply