標準動作とカスタマイズの使い分け
Vizierとのやり取りはシンプルです。実行したトライアルのパラメータと評価指標を入力すると、次のトライアル向けに推奨パラメータが返ってきます。とはいえ、必要に応じてさらに細かく調整することもできます。ただし、こうした高度な設定オプションをむやみにいじるのは避けたほうが無難です。Vizierが行っているのは入れ子構造の最適化、つまりトライアル自体が一つの最適化であり、Vizierはその繰り返しを通じて最良の答えに収束させることを目的としています。各トライアルにはコストがかかるため、ここにさらにもう一段の入れ子を加え、同じ問題に対して設定を変えながらVizierスタディを何度も実行すると、最適化のコストが得られる便益を上回ってしまいがちです。
探索アルゴリズム
Vizierがパラメータ空間を探索しながら最適なパラメータセットを探す際のアルゴリズムは、自分で選ぶことができます。1つ目はグリッドサーチで、限られたイテレーション数の中でできるだけ多くの選択肢を試せるよう、パラメータ空間を等間隔に進んでいきます。2つ目はランダムサーチで、その名のとおりパラメータ空間をランダムに飛び回るだけですが、意外なほど効果を発揮することがあります。これら2つのアルゴリズムはかなり素朴で、Vizierを使わずにハイパーパラメータの範囲を地道に試したり、ランダムに組み合わせを試したりしても結果は変わりません。それでもVizierを使えば、このプロセスを自動で記録・管理してくれます。なお、グリッドサーチとランダムサーチは無料で利用できます。
より洗練されているのがベイジアンサーチで、Vizierが内部に独自のモデルを構築し、最良の提案を導き出します(詳細は研究論文を参照)。ランダムに動いたり等間隔に進んだりする方式と比べて、はるかに速く収束することが期待できます。
ベイジアンサーチはデフォルトで使われるアルゴリズムであり、課金対象となるのもこれだけです。月あたり最初の100トライアルは無料、それ以降は1トライアルあたり1ドルです。Vizierはコストのかかる最適化プロセスの繰り返しを最小化するために設計されているため、この料金は、たとえば1回20ドルかかるML学習や、数千ドル規模の機会損失を生みかねないA/Bテストと比べればごくわずかです。さらに、自前で構築するライブラリではなくハイパー最適化サービスとして提供されているため、アーキテクチャを整える時間とコストも節約できます。
停止判断
前述のとおり、Vizierは停止のタイミングについても助言してくれます。下のグラフでは、緑の点線は最初は改善するもののやがて悪化に転じており、停止するのが賢明です。Vizierはこうした傾向を検知できます。一方、オレンジの点線は急速に改善しており、続行する価値があります。実線はその中間です。停止の判定アルゴリズムは設定可能で、最新のイテレーションが過去全イテレーションの中央値を超えない場合や、直近数回を超えない場合にスタディの停止を推奨するよう指定できます。
図1. 停止に関する提案(研究論文に基づく)
最適なパラメータセットの選び方
スタディが終了すると、Vizierは最良だったパラメータセットを返してくれます。さらに、その選び方自体もVizierに指示できます。最も良い指標を出したトライアルを選ぶのが当然のように思えますし、デフォルトもそうなっています。ただし、ノイズの多いプロセス(下図参照)では、ピークが単なる偶然や瞬間的なスパイクの結果ということもあり、これは「勝者の呪い(Winner’s Curse)」と呼ばれることがあります。そうしたノイズがあると分かっていて、なおかつ全体としては右肩上がりの傾向にある場合は、最後のトライアルを選ぶようVizierに指示することもできます。
図2. 勝者の呪い:あえて「最良」を選ばない方がよい理由
転移学習
Vizierは、これまでに蓄積した学習を引き継いで、過去の類似スタディを土台に新しいスタディを立ち上げることができます。たとえば、VizierのアドバイスのもとA/BテストでWebサイトを最適化したあと、数週間後に大規模な新機能を盛り込んだ新バージョンがリリースされ、その部分も調整したい、というケースです。resumePreviousJobIdを使えば、別のスタディから学習結果を引き継げます。既存のモデリングの成果を再利用でき、Vizierが助言する時間とコストのかかるトライアルの実行回数を大幅に減らせるため、節約効果は小さくありません。
現時点でこの機能は、AI Platformのハイパーパラメータチューナーを支える内部版Vizierでのみ利用可能で、Vizierブランドの2つのAPIでは提供されていません。
API
Vizierは複数のAPIを提供しています。
Vertex AI Vizier API(使用されているProtocol Bufferのクライアントジェネレーターから「GAPIC」と呼ばれることもあります)は、PythonクラスVizierServiceClientを中心に構成されています。Generally Available製品であり、Googleが今後注力していく方向性でもあるため、これがメインで押さえておくべきAPIです。
Vizierはもう一つ別のAPIとしても公開されており、こちらは旧GCP AI Platformにバックポートされたもので、現在はベータ版です。ディスカバリーベースのAPIで、ライブラリ内に実装された関数は見当たらず、動的なラッパー層を通じて定義された関数を呼び出す形になります。聞こえほど難しくはなく、ドキュメントと試行錯誤、そしてサンプルコード(後述する筆者のコードを含む)があれば十分使いこなせます。
もう1つの実装は、前述のとおりオープンソースプロジェクトです。自分で運用したい場合や、コードを読み解きたい場合に役立ちます。
コードのウォークスルー
世の中に出回っているコードサンプルはごくわずかです。実際、Vizierの公式ドキュメントには、バックポート版のAI Platform Vizier API向けのMLノートブックが1つあるだけで、推奨されるVertex AI Vizier API向けのものはありません。そこで筆者が用意したのがこのノートブックです。コンテナ内部で実行される通常のML学習プロセスを軸に組み立てられています(ご存じのとおり、Vizierは学習の実行方法には依存しません)。#[0]、#[1]と番号が振られたコードコメントをたどりながら読み進められます。
加えて、Ryan Holbrook氏がこのオープンソースのノートブックを公開しています。筆者が作成した派生版もあわせてご活用ください。実行成功時の出力を確認できるほか、追加設定なしでエンドツーエンドに実行しやすいよう微調整してあります。
これまでにMLでハイパーパラメータチューナーサービスを使った経験があるかもしれません。Vizierはまさにそれであり、それ以上の存在です。VizierはMLについて何も知りませんし、そもそもユーザーがMLを行っていることすら認識していません。だからこそ、時間とコストのかかる最適化プロセスであれば、用途を問わず活用できます。サービスとして堅牢でスケーラブルであり、最小化の対象となる高コストなプロセスと比べればほぼ無料といってよい料金です。その助言に従うかどうかはユーザーの自由ですが、いずれの場合でも、最適解への最短ルートを示してくれます。