ハイパーパラメータの最適化
この記事では、HuggingFace Transformersのハイパーパラメータ最適化のための3つの戦略を、W&Bを使用して実験を追跡する方法について説明します。
Created on August 1|Last edited on August 1
Comment
NLPモデルを最初からトレーニングするには何百時間もかかります。代わりに、事前にトレーニングされたモデルを使用し、特定のタスクに合わせて微調整する方がはるかに簡単です。
使用してハギングフェイストランスフォーマーライブラリを使用すると、事前訓練済みのNLPモデルを迅速にロードし、いくつかの追加レイヤーを持たせ、特定のタスクで数エポックのファインチューニングを実行できます。曲最先端のチューニングアルゴリズムを使用して、スケーラブルなハイパーパラメータチューニングを実行するための高レベルの抽象化を提供します。
この記事では、3つの異なる最適化戦略 - グリッドサーチ、ベイズ最適化、人口ベーストレーニング - を比較し、どの戦略が最も短時間でより正確なモデルをもたらすかを検討します。
私たちはHugging Face transformersの標準的な大文字小文字区別なしのBERTモデルを使用し、SuperGLUEベンチマークのRTEデータセットで微調整を行いたいと考えています。選択するハイパーパラメータが最終的なモデルのパフォーマンスに大きな影響を与えることがわかるでしょう。
目次
目次ハイ���ーパラメータチューニング実験Ray TuneとW&BW&Bトラッキングを有効にするグリッドサーチ(ベースライン):非同期ハイパーオプトによるベイズ探索集団ベーストレーニング勝者: 我々のHugging Faceモデルの人口に基づくトレーニングいくつかの最後の考え
ハイパーパラメータチューニング実験
この記事では、次の方法を使用してモデルの調整を実験します。
Ray TuneとW&B
- レイ・チューンの実装を提供します。最先端のハイパーパラメータ調整アルゴリズムをスケーリングする
- 実験は簡単に拡大できます。ノートパソコンからGPU搭載のサーバーへコードを変更せずに
- 実験は可能です並列化された2行のコードでGPU間の
W&Bトラッキングを有効にする
W&Bを使用して進捗を追跡する方法は2つあります。
- 合格できます。WandbLoggerロガーとして呼び出すときtune.runこれはTuneに報告されたすべての指標を追跡します。
- 使用できます@wandb_mixinデコレーターと呼び出しwandb.log目的の指標を追跡します。Tuneは渡された情報を使用してW&Bランを初期化します。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
非同期ハイパーオプトによるベイズ探索
ベイズ探索では、ガウス過程モデルを適合させ、パラメータの性能(すなわち、損失)を予測し、今後のハイパーパラメータに情報を与えるために使用します。また、これを組み合わせて、アーリーストッピングアルゴリズム、非同期ハイパーバンドパフォーマンスが悪い試行を早期に中止してリソースの浪費を避ける。

この実験では、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
集団ベーストレーニング
人口ベースのトレーニングは、ガイド付きのハイパーパラメータ検索を使用しますが、新しいハイパーパラメータ構成に対してトレーニングを再起動する必要はありません。パフォーマンスの悪い試行を破棄する代わりに、好調な実行のネットワーク重みとハイパーパラメータをコピーし、新しいハイパーパラメータ構成を探索しながらトレーニングを続けます。

アルゴリズムの基本的な考え方を簡単に言うと、
- 与えられた時間ステップ(またはイテレーション)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回の試行良いものからコピーし、悪い試行を停止するわけではないので、ベイズ最適化よりもはるかに少ない。
結果を見てみましょう。
Run set
0
Run set
0
勝者: 我々のHugging Faceモデルの人口に基づくトレーニング
ここでの重要なポイントは、人口ベーストレーニングがHugging Faceトランスフォーマーモデルのハイパーパラメータ最適化に最も効果的なアプローチであるということです。しかし、NLPモデルのハイパーパラメータ調整について、より広範な興味を引くかもしれない他のいくつかの知見も発見しました。
- ベイズ最適化による局所解の回避:ベイズ最適化法を使用する際には、初期の「ランダム推測」のセットを提供することが重要です。直感的には、これによりベイズ最適化が開始するためのより情報量の多い事前分布を提供できます。そうしないと、オプティマイザーが近視眼的になり、少数のサンプルに適合しすぎる可能性があります。
- 反復時間を短縮することは非常に重要です。常にすべてのマシンのコンピューティングリソースを利用してください。並行して実行できるものは何でも並行して実行するべきです。
- PBTの摂動・変異間隔の調整:PBTでは、重要な考慮事項は摂動間隔、すなわちハイパーパラメータを活用および探索する頻度です。私たちの実験では、この突然変��を各エポックごとに行いました。しかし、これをあまり頻繁に行うと、モデルのパフォーマンスがわずか数バッチステップのトレーニングでは不安定になるため、逆効果になります。
- ランダムシードも私たちの精度結果に影響します。上記のハイパーパラメータの調整に加えて、最適なモデルを見つけるために異なるランダムシードを試すことも価値があるかもしれません。ここでは2段階のアプローチが最適に機能するでしょう。まず、多くの異なるシードで早期停止アルゴリズムを使用してトレーニングし、次に最も性能が良いシードを選択し、他のハイパーパラメータを調整するためにPopulation Based Trainingを使用します。
いくつかの最後の考え
これらの実験で注目すべき重要な点のいくつか:
- すべての実験は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