HuggingFace Transformersのハイパーパラメータ最適化
この記事では、HuggingFace Transformersのハイパーパラメータ最適化のための3つの戦略を説明し、W&Bを使用して実験を追跡します。
Created on August 5|Last edited on August 5
Comment
NLPモデルをゼロから訓練するには何百時間もかかります。その代わりに、あらかじめ訓練されたモデルを使用し、それを特定のタスクに合わせて微調整する方がはるかに簡単です。
使用ハギングフェイストランスフォーマーズライブラリでは、事前トレーニングされたNLPモデルを迅速にロードし、いくつかの追加レイヤーを使用して特定のタスクに対して数エポックのファインチューニングを行うことができます。調整は、最先端のチューニングアルゴリズムを使用して、スケーラブルなハイパーパラメータチューニングを実行するための高レベルの抽象化を提供します。
この記事では、グリッドサーチ、ベイズ最適化、人口に基づくトレーニングの3つの異なる最適化戦略を比較し、どれが最も短時間でより正確なモデルをもたらすかを検討します。
私たちは、Hugging Face transformersから標準のuncased BERTモデルを使用し、SuperGLUEベンチマークのRTEデータセットでファインチューニングを行いたいと思います。選択するハイパーパラメータが最終的なモデルのパフォーマンスに大きな影響を与えることを確認します。
目次
ハイパーパラメータ調整実験
この記事では、次の方法を使用してモデルの調整を試みます。
Ray TuneとW&B
- レイチューンの実装を提供します最新のハイパーパラメータ調整アルゴリズムでスケール可能なもの
- 実験は簡単に拡張できます。ノートパソコンからGPU搭載サーバーへコードを変更せずに
- 実験は並列化された2行のコードでGPU間に跨る
W&Bトラッキングを有効にする
Tuneを使用して進捗を追跡する方法は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 operationconfig=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は、最新の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がHugging Faceトランスフォーマーモデルのハイパーパラメータ最適化に最も効果的なアプローチであるということです。しかし、NLPモデルのハイパーパラメータチューニングに関して、より広範な関心を引くかもしれないいくつかの洞察も明らかになりました。
- ベイズ最適化による局所解の回避:ベイズ最適化手法を使用する際には、「ランダムな推測」の初期セットを提供することが不可欠です。直感的には、これはベイズ最適化を開始するためのより情報量の多い事前分布を提供します。そうでなければ、最適化アルゴリズムは近視眼的になり、少数のサンプルに過適合する可能性があります。
- 反復時間を短縮することは非常に重要です。常にすべてのマシンのコンピューティングリソースを利用するようにしてください。並行して実行できるものはすべて並行して実行するべきです。
- PBTの摂動/突然変異間隔の調整:PBTでは、重要な考慮事項は摂動間隔、つまりハイパーパラメータを活用および探索する頻度です。私たちの実験では、この変異を各エポックの後に行いました。しかし、これを頻繁に行うと、モデルのパフォーマンスがわずかなバッチステップでしか訓練されていない場合、ノイズが多くなるため逆効果です。
- 乱数シードも私たちの精度結果に影響します。上記のハイパーパラメータを調整することに加えて、異なるランダムシードを試して最適なモデルを見つけることも価値があります。ここでは2段階のアプローチが最適かもしれません。まず、多くの異なるシードを用いてアーリーストッピングアルゴリズムを使用し、次に最も性能の良いシードを選択して、他のハイパーパラメータを調整するために人口ベーストレーニングを使用します。
いくつかの最終的な考え
これらの実験で注意すべき重要な点:
- すべての実験は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