Hugging Face Transformersのハイパーパラメーター最適化
このレポートでは、Hugging Face Transformersのハイパーパラメータ最適化について、3つの戦略を説明します。
Created on January 4|Last edited on January 27
Comment
自然言語処理モデルをゼロから訓練させるのは何百時間もかかります。それよりも、事前に訓練されたモデルを使い、特定のタスクのために微調整する方がはるかに簡単です。Hugging Faceトランスフォーマーライブラリを使用すると、いくつかのレイヤーを追加した事前訓練済みの自然言語処理モデルを素早くロードし、特定のタスクに対して数回の微調整エポックを実行することが可能です。Tuneは、SOTAチューニングアルゴリズムを用いたスケーラブルなハイパーパラメータチューニングを実行するための高レベルな抽象化機能を提供します。
Table of Contents
ハイパーパラメータチューニング実験
このレポートでは、3つの異なる最適化戦略(グリッドサーチ、ベイズ最適化、母集団ベースの訓練)を比較し、どれがより正確なモデルを最短時間で作成できるかを確認します。
我々は、Hugging Faceトランスフォーマーからの標準的な非ケースドBERTモデルを使用し、SuperGLUEベンチマークからのRTEデータセットで微調整を行いたいと考えています。選択したハイパーパラメータが、最終的なモデルの性能に大きな影響を与えることがわかります。
以下の方法でモデルのチューニングを行い、実験を行います。
Ray TuneとW&B
- Tune は、拡張性のある最先端のハイパーパラメーターチューニングアルゴリズムの実装を提供します。
- ノートパソコンからGPU搭載サーバーまで、コードを変更することなく実験を簡単に拡張することができます。
- 2行のコードでGPU間の実験を並列化することができます。
W&B トラッキングを有効にする
Tune を使用して W&B の進捗を追跡する方法は 2 つあります。
- tune.run を呼び出す際に、ロガーとして WandbLogger を渡すことができます。これは、Tune に報告される全てのメトリクスを追跡します。
- @wandb_mixin 関数デコレータを使用して、 wandb.log を呼び出して希望のメトリクスを追跡することができます。Tune は、config ディクショナリに渡された情報を使用して W&B run を初期化します。
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...)
非同期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回は最初のランダム探索に使用した。
その結果を見てみましょう。
母集団に基づく訓練
母集団に基づく訓練はガイド付きハイパーパラメータ探索を使用しますが、新しいハイパーパラメーター構成のために訓練を再開する必要はありません。パフォーマンスの悪い試行を捨てる代わりに、そのネットワーク重みとハイパーパラメータをコピーすることでパフォーマンスの良い試行を利用し、訓練を継続しながら新しいハイパーパラメータ構成を探索します。

素人の言葉でアルゴリズムの背後にある基本的な考え方:
- 与えられた時間ステップ(または反復)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つの試行しか実行しません。
結果を見てみましょう。
This set of panels contains runs from a private project, which cannot be shown in this report
勝者:ハグ顔モデルの母集団に基づく訓練
ここで重要なことは、Hugging Faceトランスフォーマーモデルのハイパーパラメーター最適化には、母集団に基づく訓練が最も効果的なアプローチであるということです。しかし、我々は自然言語処理モデルのハイパーパラメータチューニングについて、より多くの人が興味を持つであろう他のいくつかの洞察を発見しました。
- ベイズ最適化でローカルミニマムを回避:ベイズ最適化でローカルミニマムを回避:ベイズ最適化手法を用いる場合、「ランダムな推測」の初期セットを提供することが不可欠です。直感的には、これはベイズ最適化を開始するためのより有益な事前情報を提供します。そうしないと、オプティマイザーは近視眼的になり、少数のサンプルに過剰に適合してしまう可能性があります。
- 反復時間を短縮することは超重要:マシンの計算資源をすべて活用することを常に心がけてください。並列で実行できるものは、すべて並列で実行すべきです。
- PBTの摂動・突然変異間隔の調整: PBTでは、摂動間隔、つまり、どの程度の頻度でハイパーパラメータを利用し探索するかということが重要な検討事項となります。我々の実験では、毎エポック後にこの変異を行いました。しかし、これをあまりに頻繁に行うと、数バッチステップの学習だけではモデル性能がノイジーになるため、逆効果になります。
- また、ランダムシードも精度の結果に影響を与えています。上記のハイパーパラメーターの調整に加えて、最適なモデルを見つけるために様々なランダムシードを掃引することも価値があるかもしれません。この場合、ここで二段階のアプローチが最適です。まず、早期停止アルゴリズムを使って多くの異なるシードに対して訓練を行い、次に最もパフォーマンスの良いシードだけを選択し、母集団ベース訓練を使って他のハイパーパラメータをチューニングします。
最終的な考察
これらの実験で注意すべき重要な点のいくつか:
- すべての実験は、Tuneを使用して8つのGPUで並列化されています。
- これらの実験は、コードを変更することなく、スケールアップまたはスケールダウンすることができます。
- すべての重要な測定基準、推論、そしてこの報告書を一箇所にまとめ、簡単に共有することができます。
- これらの推論は、適切な検索方法を使用することによって節約されるリソースを正確に定量化するために使用することができます。
- この全体的な構造は、チーム間の生産性を高めることにつながります
Add a comment
Iterate on AI agents and models faster. Try Weights & Biases today.