Hugging Face Transformers のハイパーパラメータ最適化
本記事では、Hugging Face Transformers のハイパーパラメータ最適化について、3 つの戦略を解説し、実験の追跡には Weights & Biases(W&B)を用います。
Created on August 12|Last edited on August 12
Comment
NLPモデルをゼロから学習させるには何百時間もかかります。代わりに、事前学習済みモデルを用いて特定のタスク向けにファインチューニングする方がはるかに簡単です。
使用して Hugging Face Transformers ライブラリを使えば、事前学習済みの NLP モデルにいくつかの追加層を重ねて素早く読み込み、特定タスクに対して数エポックのファインチューニングを実行できます。 Tune最先端のチューニングアルゴリズムを用いたスケーラブルなハイパーパラメータチューニングを実行するための高水準の抽象化を提供します。
本記事では、より短時間で高い精度を得られるかを検証するために、グリッドサーチ、ベイズ最適化、Population-Based Training(PBT)の3つの最適化手法を比較します。
Hugging Face の Transformers から標準的な uncased BERT モデルを用い、SuperGLUE ベンチマークの RTE データセットでファインチューニングします。選択するハイパーパラメータによって最終的なモデル性能が大きく変わり得ることを見ていきます。
目次
ハイパーパラメータチューニング実験
本記事では、次の手法でモデルをチューニングして実験します。
Ray Tune と W&B
- Ray Tuneの実装を提供していますスケール可能な最先端のハイパーパラメータチューニングアルゴリズム
- 実験は簡単にスケールできます。ノートブックからGPU搭載サーバーへコードに一切変更を加えることなく
- 実験は並列化されたGPU 間で、わずか 2 行のコードで
W&B のトラッキングを有効化
Tune を使って W&B で進捗を記録する方法は、主に 2 つあります。
- 渡すことができます WandbLogger 呼び出す際のロガーとして 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 operationconfig=config...)
Run set
0
非同期 HyperOpt によるベイズ最適化
ベイズ最適化では、ガウス過程モデルを当てはめて、各パラメータの性能(すなわち損失)を予測し、その予測に基づいて次に試すハイパーパラメータを決めます。あわせてこれを早期停止アルゴリズム、Asynchronous 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(PBT)
Population Based Training(PBT)は、指針に基づくハイパーパラメータ探索を行いつつ、新しいハイパーパラメータ設定のたびに学習を最初からやり直す必要がありません。性能の低いトライアルを捨てるのではなく、性能の良い実行からネットワーク重みとハイパーパラメータを複製して引き継ぎ、学習を継続しながら新たなハイパーパラメータ設定を探索します。

このアルゴリズムの基本的な考え方を平易な言葉で言うと、次のようになります。
- 所定のタイムステップ(または反復回数)T の間、いくつかのサンプルに対してハイパーパラメータ最適化を実行します。
- T 回の反復ごとに実行同士を比較し、成績の良い実行の重みを成績の悪い実行へコピーします。同時に、良好だった実行に近い値になるように後者のハイパーパラメータも更新します。
- 成績の最も悪い実行を終了します。 このアルゴリズムの発想自体は単純に見えますが、ゼロから構築するには多くの複雑な最適化の数学が必要になります。Tune は、最先端の 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 件のトライアルベイズ最適化よりもはるかに少ない件数で済みます。悪いトライアルを途中で止めるのではなく、良いトライアルからコピーするためです。
結果を見ていきましょう。
Run set
0
Run set
0
勝者:Hugging Face モデルの Population Based Training(PBT)
ここでの最大のポイントは、Population Based Training(PBT)が、Hugging Face の Transformer モデルに対するハイパーパラメータ最適化で最も効果的だったということです。とはいえ、NLP モデルのハイパーパラメータチューニングについて、より広く役立ちそうないくつかの示唆も得られました。
- ベイズ最適化で局所最小値を回避する方法ベイズ最適化を用いる場合、最初にランダムな推測のセットを与えることが不可欠です。直感的には、これによってベイズ最適化が出発点とする事前情報がより豊かになります。これがないと、最適化器は近視眼的になり、少数のサンプルに過度適合してしまうおそれがあります。
- イテレーション時間を短縮することは非常に重要です。マシンの計算リソースは常に余すところなく活用しましょう。並列実行できるものはすべて並列で実行すべきです。
- PBT における摂動(突然変異)間隔の調整PBT では、重要なポイントとして「摂動(突然変異)を行う間隔」、つまりハイパーパラメータの探索と活用をどれくらいの頻度で実施するかを考える必要があります。今回の実験では、各エポックの終了ごとにこの突然変異を適用しました。ただし、頻度が高すぎると逆効果です。バッチ数が少ない段階ではモデルの性能がノイズに左右されやすく、信頼できる指標にならないためです。
- 乱数シードも精度の結果に影響します。上記のハイパーパラメータ調整に加えて、ランダムシードを変えてスイープし、最良のモデルを探す価値もあります。ここでは二段構えの手法が有効でしょう。まず、早期停止アルゴリズムを使って多数のシードで学習を回し、性能の高いシードだけを選別します。次に、その選別したシードを用いながら、残りのハイパーパラメータは Population Based Training(PBT)でチューニングします。
いくつかの締めくくりの考察
本稿の実験で特に注意すべき重要ポイントは次のとおりです。
- すべての実験は8 基の GPU に並列化しましたTune を使うことで
- これらの実験はスケールアップ/スケールダウンが可能ですコードを変更せずに
- 私たちはすべての重要な指標、推論結果、そしてこのレポートまでも一箇所に簡単に共有できます
- これらの推論結果は、…に利用できますリソースを正確に定量化する適切な探索手法を用いることで節約できるリソースが保存されます。
- この全体構成によってチーム間の生産性向上
Add a comment
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