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 Face Transformers ライブラリを使えば、追加の層をいくつか備えた事前学習済みのNLPモデルを素早く読み込み、特定のタスクに対して数エポックのファインチューニングを実行できます。 Tune最先端のチューニングアルゴリズムを用いたスケーラブルなハイパーパラメータチューニングを実行するための高水準抽象化を提供します。
本記事では、より短時間で高精度なモデルを得るために、グリッドサーチ、ベイズ最適化、Population-Based Training(PBT)の3つの最適化戦略を比較します。
Hugging Face Transformers の標準的な uncased BERT モデルを用い、SuperGLUE ベンチマークの RTE データセットでファインチューニングします。選択するハイパーパラメータによって最終的なモデル性能が大きく左右されることが分かります。

目次



ハイパーパラメータ最適化の実験

本記事では、次の手法を用いてモデルのチューニングを実験的に行います。

Ray Tune と W&B

使用する利点は多くあります Ray Tune W&B を用いて:
  • Ray Tuneの実装を提供しますスケール可能な最先端のハイパーパラメータ最適化アルゴリズム
  • 実験は容易に拡張でき、…ノートブックからGPU搭載サーバーまでコードを一切変更せずに
  • 実験は並列化された2行のコードでGPU間にわたって
  • 〜で W&B の実験トラッキング、指標が一元管理され、有用な示唆を得やすくなります
  • 使用して Weights & Biases と Ray Tune の連携、進捗が失われることはありません

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

Tune を使って Weights & Biases(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 operation
config=config
...
)


Run set
0


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

ベイズ最適化では、パラメータの性能(すなわち損失)を予測するガウス過程モデルを学習し、その予測に基づいて次に試すハイパーパラメータを決定します。さらに、これを次の手法と組み合わせます。早期終了アルゴリズム、Asynchronous HyperBand(非同期 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 は、最先端(SOTA)の Population-Based Training(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)

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