1回の試行に多くの時間や費用がかかる最適化プロセスを想像してみてください。1回の実行に数時間と数十ドルを要する機械学習(ML)の学習。1回のイテレーションに丸1日かかり、場合によっては数千ドル規模の機会損失につながりかねないA/Bテスト。あるいは、その日の投入材料を最小コスト・最大産出量で選定することがまさに賭けとなる工場のサプライチェーン管理——判断を一つ誤れば、丸1日と多額のコストが吹き飛びかねません。
試行結果が芳しくなければ、もう一度やり直すしかありません。とはいえ1回ごとにコストがかさむ以上、当てずっぽうにパラメータを振るわけにはいきません。できるだけ少ない試行回数で、現実的に到達可能な最良のパラメータに収束させたいはずです。
本シリーズ全3回では、ML学習をはじめとする最適化プロセスのコストを抑える新たなアプローチとして、Google Vertex AI Vizierを用いたブラックボックス最適化ワークフローを解説します。
押さえておきたいのは、Vizierは機械学習専用のツールではないという点です。そもそもVizierは、利用者がMLに取り組んでいることすら認識しません。試行そのものにも一切関与しないのです。Vizierが知るのは、利用者から渡された情報——パラメータと目的指標(試行結果の良し悪し)——のみ。専門家である利用者がML学習や最適化対象のプロセスを実行し、Vizierは外部に立つアドバイザーとして、次のラウンドに向けた提案を返します。
ML学習においては、Vertex AI Vizierを使って最適なハイパーパラメータ——正則化、学習率、層の数やサイズなど、学習実行全体を方向づける設定——を選定できます。さらに、次の学習で採用するモデルの種類自体も探索対象のパラメータとして扱えます。たとえば二値分類問題をNaive Bayes、ロジスティック回帰、XGBoostのいずれで解くか、といった選択です。
Vertex AI Vizierはあくまで外部から学習に助言する仕組みなので、あらゆる種類のMLに利用できます。Google Vertex SDKでカスタム学習ジョブを起動するケースでも、カスタムコンテナ内で独自のTensorFlowやPyTorchモデルを学習させるケースでも問題ありません。
Vizierの使い方
ScikitやHyperoptといったハイパーパラメータチューナーのライブラリをご存じの方も多いでしょう。これらはMLの試行を繰り返し回し、その都度ハイパーパラメータを調整しながら最適な結果への収束を図ります。
これに対して、GoogleやAWSが提供するハイパーパラメータチューナーサービスを使えば、ライブラリやコンピュート基盤を構築する手間が不要となり、プロセスは大幅に簡素化されます。
Vertex AI Vizierは、本シリーズで紹介するブラックボックス方式によって、これをさらに一歩先へ進めます。最大の違いは利用パターンです。Vizierでは対話的に試行を進め、ラウンドごとにVertex AI Vizierへ助言を求めると、過去の試行結果の良し悪しのみに基づく提案が返ってきます。
プロセス全体の流れ
Vertex AI Vizierでワークフローを実装する際の大まかな手順は次のとおりです。
- まず、Vertex AI Vizierのスタディ(study)を作成します。スタディの中で複数の試行(trial)を実行する形になります。スタディはスタディ構成によって定義し、実験(=試行)のゴール(計測値/メトリクス)と入力値(ハイパーパラメータ)を指定します。
- 試行を実行します。機械学習モデルの学習や、最適化したい他のプロセスを動かします。
- その試行のパラメータと最適化指標をあわせてVertex AI Vizierに送信し、APIを呼び出します。MLモデルの学習であれば、たとえば通常のtrain/validation/testの分割後に、検証データに対するクロスエントロピー損失やバランス精度などが該当します。
- そのリクエストへの応答として、次の試行に向けた提案が返ってきます。1組以上のパラメータセットが含まれており、次回の試行を組み立てる際に活用できます。
- 次の試行を実行します。通常は提案されたパラメータをそのまま使いますが、あくまで提案なので、ご自身の判断で別のパラメータを選んでも構いません。いずれにせよ、Vertex AI Vizierは学習を続けます。
- そのまま次の試行へと進めます。
- 十分な回数の試行を終えたら反復を停止します(詳細は後述)。
Vizierとのやり取りを示すフローチャート
Vertex AI VizierはSaaSとして提供されており、扱いやすいPython API経由でRESTサービスを呼び出すだけで利用できます(Python APIについては後ほど解説します)。
APIコールの実例
入力と出力の例をご紹介します。やや簡略化していますが、RESTコールの本質はつかんでいただけるはずです(実際の利用ではPythonクライアントを使います。詳細は後述)。
入力:
{
"Params": {"flour": 0.21, "recipe": "Pam's chocolate chip", "eggs": 2 },
"rating": 8.1
}
出力:
{"flour": 0.32, "recipe": "Chocoflake", "eggs": 1}
このJSONは、研究チームが実際に取り組んだクッキーレシピの最適化例です。クッキー作りは手間もコストもかかるので、何百回も焼き直すわけにはいきません。
パラメータには各材料の分量が含まれます。ここでは浮動小数点数のパラメータと整数のパラメータがあります。もう一つのパラメータはレシピの選択で、これはカテゴリカルパラメータ(順序関係のない複数の選択肢から選ぶパラメータ)にあたります。
入力にはさらに、成功指標としてテイスターによるクッキーの評価点も含まれます。
RESTコールからの応答(出力)は、次回の焼成で使うべきパラメータの提案です(実際には複数の提案が返ってくる場合もあります)。
スタディ内での試行の進め方
試行は逐次的に行うことも、複数を並列で走らせることもできます。たとえばVertex AI Vizierにまとめて5件の提案を求め、5つの試行を同時実行する、といった使い方です。並列化にはトレードオフがあります。処理を高速化できる一方で、逐次的に進めればVizierが過去すべての試行結果を踏まえて推奨を改善できる、という利点が失われるのです。
試行回数はあらかじめ決めておくこともでき、たとえば20回といった具合です。推奨値はパラメータ数の10倍です。あるいは結果の収束状況を踏まえて、Vizier側が停止のタイミングを示唆することもできます。1回ごとにコストがかかる以上、試行回数を切り詰めることは重要です。
今後の展開
直近の2023年2月、Vizierはオープンソース版としても公開されました。実装に目を通してみることをおすすめします。ただし、オープンソース版には核となるベイズ最適化アルゴリズムが含まれておらず、Vertex AI Vizierサービスならではの使いやすさ、スケーラビリティ、堅牢性も提供されません。本シリーズではVertex AI Vizierに絞って取り上げます。
第1回となる本記事では、Vertex AI Vizierの使い方の概要をご紹介しました。第2回では、この「ブラックボックス」アプローチの利点を掘り下げます。重量級の最適化プロセスの責任を利用者側に委ねることで、利用者はML学習の構造設計など本来得意とする領域に集中でき、Vertex AI Vizierは自らの得意分野——最小限の試行回数で最良の結果へ導くこと——に専念できるのです。