HyperOpt を使用してモデルのチューニングを自動化する方法
モデルのチューニングが好きですか? あなたの答えが「はい」の場合、この投稿は あなたのために。
このブログでは、非常に人気のある自動化されたハイパーパラメータ調整アルゴリズムについて説明します。 ツリーベースのパルゼン推定器 (TPE)。 TPE は、オープンソース パッケージの HyperOpt でサポートされています。 HyperOpt と TPE を活用することで、機械学習エンジニアは次のことを実行できます。 手動で調整することなく、高度に最適化されたモデルを迅速に開発する.
それ以上の苦労なしに、飛び込みましょう!
HyperOpt は、ツリーベースの Parzen Esimtors (TPE) と呼ばれるアルゴリズムを使用して、ユーザー定義の目的関数を最適化するモデル ハイパーパラメーターを選択するオープンソースの Python パッケージです。 各ハイパーパラメーターの関数形式と境界を定義するだけで、TPE は複雑なハイパースペースを徹底的かつ効率的に検索して、最適値に到達します。
TPE は、ベイジアン更新を利用し、以下のシーケンスに従うシーケンシャル アルゴリズムです。
- ランダムに選択されたハイパーパラメーターのセットをいくつか使用してモデルをトレーニングし、目的関数の値を返します。
- いくつかのしきい値ガンマ (γ) に従って、観測された目的関数の値を「良い」グループと「悪い」グループに分けます。
- 「有望性」スコアを計算します。 P(x|良い) / P(x|悪い).
- 混合モデルを介して有望性を最大化するハイパーパラメーターを決定します。
- ステップ 4 のハイパーパラメータを使用してモデルを適合させます。
- 停止基準までステップ 2 ~ 5 を繰り返します。
ここにあるのです 簡単なコード例.
わかりました、それはたくさんの大きな言葉でした。 ゆっくりと、何が起こっているのかを本当に理解しましょう。
1.1 — 私たちの目標
データサイエンティストは忙しい。 私たちは本当に優れたモデルを作成したいと考えていますが、それは効率的で理想的には無干渉の方法で行います。
ただし、ML モデリング ライフサイクルの特定のステップは、自動化が非常に困難です。 たとえば、探索的データ分析 (EDA) や特徴量エンジニアリングは通常、対象に固有のものであり、人間の直感が必要です。 一方、モデルのチューニングは、コンピューターが得意とする反復プロセスです。
この投稿全体の目標は、アルゴリズムを活用してモデルのチューニング プロセスを自動化する方法を理解することです。
その目標について考えるのを助けるために、アナロジーを使ってみましょう: 私たちは埋められた宝物を探している海賊です. また、私たちは非常に有能な海賊であり、埋もれた宝物を探す時間を最小限に抑えることを目指していることに注意することも重要です. では、検索に費やす時間を最小限に抑えるにはどうすればよいでしょうか。 答えは 地図を使おう!
図 1 には、宝物がどこにあるかを示す架空の地図があります。 何度も登ったり掘ったりした後、宝物がどこにあるかを正確に知っているので、その宝物にたどり着くのはそれほど難しくありません.
しかし、地図がない場合はどうなるでしょうか。
モデルの調整を任されたとき、残念ながらマップは与えられません。 ハイパーパラメータ検索空間に対応する私たちの地形は不明です。 さらに、ハイパーパラメータの最適なセットに対応する私たちの宝の場所も不明です。
このセットアップを使用して、このスペースを効率的に探索し、宝物を見つけるためのいくつかの潜在的な方法について話しましょう!
1.2 — 考えられる解決策
モデル チューニングの元の方法は「手動」です。エンジニアは実際に多くの異なる構成を手動でテストし、どのハイパーパラメータの組み合わせが最適なモデルを生成するかを確認します。 有益ではありますが、このプロセスは非効率的です。 もっといい方法があるはず…
1.2.1 — グリッド検索 (最悪)
最初の最適化アルゴリズムはグリッド検索です。 グリッド検索は、ユーザーが指定したグリッド内のハイパーパラメーターのすべての可能な組み合わせを繰り返しテストします。
たとえば、図 2 で赤い点が表示されている場所は、モデルを再トレーニングして評価する場所です。 このフレームワークは非効率的です。 不正なハイパーパラメータを再利用します. たとえば、ハイパーパラメータ 2 が目的関数にほとんど影響を与えない場合でも、その値のすべての組み合わせをテストするため、必要な反復回数が 10 倍になります (この例では)。
しかし、先に進む前に、グリッド検索は、正しく指定されたグリッドが与えられた場合に最適なものを見つけることが保証されているため、依然としてかなり人気があることに注意することが重要です。 この方法を使用することにした場合は、 ハイパーパラメータの関数形式を反映するようにグリッドを変換してください。 たとえば、 ランダム フォレスト分類器 は整数です — 連続したスペースを検索させないでください。 また、均一に分布している可能性は低いです。ハイパーパラメータの関数形式がわかっている場合は、それを反映するようにグリッドを変換します。
要約すれば、 グリッド検索は次元の呪いの影響を受け、評価ごとに情報を再計算しますが、依然として広く使用されています。
1.2.2 — ランダム検索 (良い)
XNUMX つ目のアルゴリズムはランダム検索です。 ランダム検索は、ユーザー指定のグリッド内でランダムな値を試行します。 グリッド検索とは異なり、考えられるすべてのハイパーパラメーターの組み合わせをテストする必要がないため、効率が向上します。
ここにクールな事実があります: ランダム検索は (平均で) 上位 5% のハイパーパラメータ設定を 60回の反復. とはいえ、グリッド検索と同様に、各ハイパーパラメータの機能形式を反映するように検索スペースを変換する必要があります。
ランダム検索は、ハイパーパラメーター最適化の優れたベースラインです。
1.2.3 — ベイジアン最適化 (改善)
XNUMX 番目の候補は、最初の Sequential Model-Based Optimization (SMBO) アルゴリズムです。 従来の手法との主な概念上の違いは、 以前の実行を繰り返し使用して、将来の探索ポイントを決定します。
ベイジアン ハイパーパラメーター最適化は、ハイパーパラメーター検索空間の確率分布を開発するように見えます。 そこから、期待される期待される改善などの取得関数を使用して、ハイパースペースをより「検索可能」に変換します。 最後に、確率的勾配降下などの最適化アルゴリズムを使用して、取得関数を最大化するハイパーパラメーターを見つけます。 これらのハイパーパラメータは、モデルに適合するために使用され、収束するまでプロセスが繰り返されます。
通常、ベイジアン最適化はランダム検索よりも優れていますが、数値ハイパーパラメーターが必要になるなど、いくつかのコアな制限があります。
1.2.4 — ツリーベースの Parzen 推定器 (最高)
最後に、ショーの主役であるツリーベースのパルゼン推定器 (TPE) について話しましょう。 TPE は、通常、基本的なベイジアン最適化よりも優れたもう XNUMX つの SMBO アルゴリズムですが、主なセールス ポイントは、ツリー構造を介して複雑なハイパーパラメーターの関係を処理することです。
これを理解するために図5を使用しましょう ツリー構造. ここでは、サポート ベクター マシン (SVM) 分類器をトレーニングしています。 XNUMX つのカーネルをテストします。 linear
および RBF
。 A linear
カーネルは width パラメータを取りませんが、 RBF
そのため、ネストされた辞書を使用することで、この構造をエンコードして検索スペースを制限することができます。
TPE は、従来のベイジアン最適化ではサポートされていないカテゴリ変数もサポートしています。
先に進む前に、簡単な免責事項があります。 他の多くのハイパーパラメータ調整パッケージ. それぞれがさまざまなアルゴリズムをサポートしており、その中にはランダム フォレスト、ガウス プロセス、遺伝的アルゴリズムなどがあります。 TPE は非常に人気のある汎用アルゴリズムですが、必ずしも最適とは限りません。
一般に、TPE は非常に堅牢で効率的なハイパーパラメーター最適化ソリューションです。
いくつかの一般的なハイパーパラメータ最適化アルゴリズムについての一般的な理解が得られたので、TPE のしくみについて詳しく見ていきましょう。
例えに戻ると、私たちは埋もれた宝を探している海賊です しかし、地図を持っていません. 私たちの船長はできるだけ早く宝物を必要としているので、宝物を持っている可能性が高い戦略的な場所を掘る必要があります。以前の発掘を使用して、将来の発掘場所を決定します。
2.1 — 初期化
まず、私たちは スペースの制約を定義する. 上で述べたように、ハイパーパラメータには関数形式、最大値/最小値、および他のハイパーパラメータとの階層関係があることがよくあります。 ML アルゴリズムとデータに関する知識を使用して、検索空間を定義できます。
次に、 目的関数を定義する、これは、ハイパーパラメータの組み合わせがどれほど「良い」かを評価するために使用されます。 一部の例には、RMSE や AUC などの従来の ML 損失関数が含まれます。
すごい! 境界のある検索スペースと成功を測定する方法ができたので、検索を開始する準備が整いました…
2.2 — 反復ベイジアン最適化
ベイジアン最適化は、目的関数に従って「成功」する可能性が高いハイパースペース内のポイントを見つけるシーケンシャル アルゴリズムです。 TPE はベイジアン最適化を活用しますが、いくつかの巧妙なトリックを使用してパフォーマンスを向上させ、検索スペースの複雑さを処理します…
2.2.0 — 概念的なセットアップ
最初のトリックはモデリングです P(x|y) P(y|x)…
ベイジアン最適化は、通常、モデル化するように見えます P(y|x)、 これは、目的関数値の確率です (y)、与えられたハイパーパラメータ (x)。 TPE は反対のことを行います — モデル化するように見えます P(x|y)、 これは、ハイパーパラメータの確率です (x), 与えられた目的関数値 (y).
つまり、TPE は最適な目的関数値を見つけようとし、次に関連するハイパーパラメーターを決定しようとします。
その非常に重要な設定で、実際のアルゴリズムに入りましょう。
2.2.1 — データを「良い」グループと「悪い」グループに分ける
私たちの目標は、目的関数に従って最適なハイパーパラメータ値を見つけることです。 では、どのように活用できますか P(x|y) それをするために?
まず、TPE は観測されたデータ ポイントを XNUMX つのグループに分割します。 良い、 g(x)、 および 悪い、 l(x). 善と悪の間のカットオフは、ユーザー定義のパラメーター ガンマ (γ) によって決定されます。これは、観測値を分割する目的関数のパーセンタイルに対応します (y*).
したがって、γ = 0.5 の場合、観測値を分割する目的関数の値 (y*) は観測点の中央値になります。
図 7 に示すように、形式化できます。 p(x|y) 上記のフレームワークを使用します。 そして、海賊の例えで言えば…
海賊の視点: すでに探索した場所を見ると、l(x) は宝物がほとんどない場所をリストし、g(x) は宝物がたくさんある場所をリストします。
2.2.32 — 「有望性」スコアの計算
次に、TPE は、観測されていないハイパーパラメータの組み合わせを評価する方法を定義します。 「有望度」スコア.
図 8 は、有望性スコアを定義しています (P)、これは次のコンポーネントとの単なる比率です…
- 分子: 一連のハイパーパラメータを観測する確率 (x)、対応する目的関数値が「良いに設立された地域オフィスに加えて、さらにローカルカスタマーサポートを提供できるようになります。」
- 分母: 一連のハイパーパラメータを観測する確率 (x)、対応する目的関数値が「悪いに設立された地域オフィスに加えて、さらにローカルカスタマーサポートを提供できるようになります。」
「有望性」の値が大きいほど、ハイパーパラメータが x 「良い」目的関数を生成します。
海賊の視点: 有望度は、地形内の特定の場所に多くの宝物がある可能性が高いことを示します。
先に進む前に、ベイジアン最適化に精通している場合、この方程式は取得関数として機能し、 期待される改善 (EI).
2.2.3 — 確率密度推定値の作成
第三に、TPE は次の方法で「有望性」スコアを評価します。 混合モデル. 混合モデルの考え方は、複数の確率分布を取り、線形結合を使用してそれらをまとめることです — SRC. 次に、これらの結合された確率分布を使用して、確率密度推定値を作成します。
一般的に、混合モデリングのプロセスは…
- ポイントの分布タイプを定義します。 私たちの場合、変数がカテゴリの場合は再重み付けされたカテゴリ分布を使用し、数値の場合はガウス分布 (つまり、正規分布) または一様分布を使用します。
- 各ポイントを反復し、そのポイントに分布を挿入します。
- すべての分布の質量を合計して、確率密度推定値を取得します。
このプロセスは両方のセットに対して個別に実行されることに注意してください l(x) および g(x)。
図 9 の例を見てみましょう…
各観測値 (x 軸の青い点) について、正規分布 ~N(μ, σ) を作成します。ここで…
- μ(ミュー) 正規分布の平均です。 その値は、x 軸に沿ったポイントの位置です。
- σ (シグマ) 正規分布の標準偏差です。 その値は、最も近い隣接ポイントまでの距離です.
ポイントが互いに接近している場合、標準偏差は小さくなり、その結果、分布は非常に高くなり、逆に、ポイントが離れて広がっている場合、分布はフラットになります (図 10)…
海賊の視点: NA — 海賊は混合モデルには向いていません。
先に進む前に別の簡単な説明: 文献を読んでいる場合、TPE が「切り捨てられた」ガウスを使用していることに気付くでしょう。これは、ガウスが +/- 無限大に拡張するのではなく、ハイパーパラメーター構成で指定した範囲によって制限されていることを意味します。 .
2.2.4 — 次の探索ポイントの決定!
これらのピースをまとめてみましょう。 ここまでで、1) 目的関数の観測値を取得し、2) 「有望性」の式を定義し、3) 事前値に基づく混合モデルを介して確率密度推定値を作成しました。 特定のポイントを評価するためのピースがすべて揃っています。
最初のステップは、両方の平均確率密度関数 (PDF) を作成することです。 g(x) および l(x).
プロセスの例を図 11 に示します。赤い線は平均 PDF であり、単純にすべての PDF の合計を PDF の数で割ったものです。
平均 PDF を使用して、任意のハイパーパラメーター値の確率を取得できます (x) にいる g(x) or l(x).
たとえば、図 11 の観測値が「良い」セットに属しているとします。 g(x). 私たちの平均 PDF に基づくと、3.9 または 0.05 のハイパーパラメータ値が「良い」セットに属する可能性は低いです。 逆に、~1.2 のハイパーパラメータ値は、「良い」セットに属する可能性が非常に高いようです。
これは全体像の半分にすぎません。 「悪い」セットにも同じ方法論を適用します。 l(x)。 最大化を目指しているので g(x) / l(x), 有望なポイントはどこに配置する必要があります g(x) 高くて l(x) 低い.
かなりクールだよね?
これらの確率分布を使用して、ツリー構造のハイパーパラメーターからサンプリングし、「有望性」を最大化するハイパーパラメーターのセットを見つけることができ、それによって探索する価値があります。
海賊の視点: 次に掘る場所は、(宝がたくさんある確率) / (宝が少ない確率) が最大になる場所です。
仕組みがわかったので、オープンソース パッケージの HyperOpt を使用して TPE を実装するための実用的なヒントをいくつか紹介します。
3.1 — HyperOpt アプリの構造
一般に、HyperOpt を活用する際の主な手順は XNUMX つあります。
- 検索スペースを定義し、 これは、最適化しようとしているハイパーパラメーターの範囲と機能形式にすぎません。
- フィッティング関数を定義し、 あなたを呼び出す
model.fit()
特定のトレーニング/テスト分割で機能します。 - 目的関数を定義し、 これは、RMSE や AUC などの従来の精度指標のいずれかです。
残念ながら、これらの自動化されたチューニング方法では、データ サイエンティストからの設計入力が依然として必要です。完全に無料のランチではありません。 ただし、逸話的に、TPE はハイパーパラメーターの誤指定に対してかなり堅牢です (理由の範囲内で)。
3.2— ヒントとコツ
- HyperOpt は、両方を介して並列化可能です Apache Spark および MongoDBの. 複数のコアを使用している場合、それがクラウドであろうとローカル マシンであろうと、ランタイムが大幅に短縮される可能性があります。
- Apache Spark を介してチューニング プロセスを並列化する場合は、
SparkTrials
単一ノード ML モデル (sklearn) のオブジェクトとTrails
並列化された ML モデル (MLlib) のオブジェクト。 コードは以下です。 - MLフロー モデルの実行を追跡するためのオープンソースの方法です。 HyperOpt と簡単に統合できます。
- 検索スペースをあまりにも早く絞り込まないでください。 ハイパーパラメータの組み合わせによっては、驚くほど効果的な場合があります。
- 検索スペースを定義するのは難しい場合があります。 ハイパーパラメータの機能形式. ただし、個人的な経験から言えば、TPE はこれらの機能形式の誤指定に対してかなり堅牢です。
- 適切な目的関数を選択することは大いに役立ちます。 ほとんどの場合、エラーは等しく作成されません。 特定のタイプのエラーがより問題になる場合は、そのロジックを関数に組み込むようにしてください。
3.3 — コード例
HyperOpt を分散方式で実行するためのコードを次に示します。 それは本のコードから適応された、 機械学習エンジニアリングの実践 — これが git リポジトリ.
このスニペットのいくつかの優れた機能には、次の方法による並列化が含まれます Apache Spark およびモデルのロギング MLフロー. また、このスニペットは sklearn RandomForestRegressor を最適化することに注意してください — ニーズに合わせてモデルとフィッティング関数を変更する必要があります。
これで、HyperOpt の素晴らしさを実感できます。
キーポイントをうまく打てるように、簡単におさらいしましょう。
ハイパーパラメータの調整は ML モデルのライフサイクルに必要な部分ですが、時間がかかります。 逐次モデルベース最適化 (SMBO) アルゴリズムは、複雑なハイパースペースから最適なものを探すのに優れており、ハイパーパラメーターの調整に適用できます。 Tree-based Parzen Estimator (TPE) は非常に効率的な SMBO であり、ベイジアン最適化とランダム検索の両方より優れています。
TPE は、停止基準まで以下のステップを繰り返します。
- いくつかのハイパーパラメータ ガンマに従って、観察されたポイントを「良い」セットと「悪い」セットに分割します。
- 混合モデルを「良い」セットと「悪い」セットの両方に当てはめ、平均確率密度推定値を作成します。
- 「見込み」スコアを最適化するポイントを選択します。これは、ステップ 2 を利用して、「良い」セットと「悪い」セットに含まれる確率を推定します。
最後に、SparkTrials を介して HyperOpt を並列化する方法を示す非常に優れたコード スニペットがあります。 また、すべての反復を MLflow に記録します。
ソースから再公開された HyperOpt Demystified
<!–
–>