Blog

はじめに

みなさんこんにちは。Optunaコミッタの今村です。

Optunaはブラックボックス最適化フレームワークとしてOSSで開発が続けられているソフトウェアです。我々はOptunaエコシステムの新たな挑戦として、Optuna向け機能共有プラットフォームOptunaHubのベータ版を先日リリースしました。OptunaHubは公開から間もないにも関わらず、おかげさまで多くのコントリビュータから機能の登録をいただいています。今回はその中からCatCmaSamplerという機能をピックアップして、その素晴らしさをご紹介したいと思います。

TL;DR

  • OptunaHubにて最先端の進化計算アルゴリズム CatCMAが公開されました。
  • CatCMAは連続・離散の混合探索空間で威力を発揮するアルゴリズムです。
  • ニューラルネットワークのハイパーパラメータ最適化において、CMA-ESを凌駕する性能を達成することを確認しました。

CMA-ESと混合探索空間

みなさんはCMA-ES (Covariance Matrix Adaptation Evolutionary Strategy)というブラックボックス最適化アルゴリズムをご存知でしょうか?CMA-ESは1996年にNikolaus Hansen と Andreas Ostermeierによって提案された、進化計算分野のブラックボックス最適化手法です。連続な探索空間に限定された手法ながら非常に高速に動作し、かつ性能も良いアルゴリズムとして有名です。このブログではCMA-ES自体の説明は行わないので、興味のある方はサーベイ論文をぜひご覧ください。

しかし、この連続な探索空間に限定されているというところがCMA-ESのネックになっていました。実世界におけるブラックボックス最適化問題の応用例の中には、整数変数を含む探索空間やカテゴリカル(順序を持たない離散値の意味です)な変数を含む探索空間を持つ問題が多く存在します。例えば、機械学習のハイパーパラメータ最適化です。LightGBMモデルで何回に一回baggingをするかを定めるbagging_freq変数は整数値ですし、XGBoostモデルでブースターとして通常のGrandient Boosting 決定木を使うかDARTを使うか定める変数はカテゴリカルです。こうした探索空間を持つハイパーパラメータ最適化を行おうとすると、CMA-ESの直接的な利用は難しいと言わざるを得ませんでした。

CMA-ESを混合探索空間を持つ目的関数に適用するために、2022年には連続変数と整数変数を同時に扱うことができるCMA-ES with Marginという手法が提案されていましたが、カテゴリカル変数については対象外でした。しかし、2024年7月の国際会議GECCOにおいて連続変数とカテゴリ変数を両方含む探索空間に適用可能な手法であるCatCMAが提案されました。

Ryoki Hamano, Shota Saito, Masahiro Nomura, Kento Uchida, and Shinichi Shirakawa. CatCMA : Stochastic Optimization for Mixed-Category Problems. In Proceedings of the Genetic and Evolutionary Computation Conference (GECCO ’24), 2024.  https://arxiv.org/abs/2405.09962 

OptunaのCMA-ESはCyberAgent社が開発するPythonライブラリ(GitHub: https://github.com/CyberAgentAILab/cmaes)を使用して実装されています。このCMA-ES実装は軽量かつ高速なライブラリとして非常に優れており、CatCMAにも対応しています。この実装を利用して、論文の著者の1人であるMasahiro Nomuraさんの協力によってCatCMAはOptunaHubに迅速に導入されたのです!この貢献によってOptunaではあらゆる混合探索空間に対してCMA-ESを適用することが可能になっており、既存のOptunaの様々な機能と組み合わせることで多くのブラックボックス最適化の実応用に対応することができるようになりました。

利用方法は簡単で、以下のようにOptunaHub経由でインスタンス化してOptunaのStudyを作成する時に渡すだけです。

# OptunaHubとcmaesライブラリがインストールされていない場合はインストールしてください。
# pip install optunahub "cmaes>=0.11.0"

import optuna
import optunahub

mod = optunahub.load_module(package="samplers/catcma")
sampler = mod.CatCmaSampler()
study = optuna.create_study(sampler=sampler)

CatCMAの詳細については、元論文だけでなく日本語による以下のブログもご覧ください。 【採択論文紹介】CatCMA : Stochastic Optimization for Mixed-Category Problems (GECCO2024) | AI tech studio 

CatCMAの威力

OptunaHubに導入されたCatCMAが実際に連続変数・カテゴリカル変数を含む機械学習のハイパーパラメータ最適化において高い性能を発揮することができるのか検証してみました。

今回は、3層のニューラルネットワークの学習を対象に、活性化関数の種類、隠れ層のユニット数、初期の学習率(それぞれカテゴリカル変数、整数変数、連続変数)などのハイパーパラメータを最適化します。

ベンチマーク問題として、AutoML.orgグループから公開されているHPOBenchに含まれる、表形式データに対する問題を用いました。

具体的には、 https://github.com/automl/HPOBench/wiki/Available-Containerized-Benchmarks にリストされているtabular_benchmarks(+)という問題のNavalPropulsionを使用します。

この問題には以下のように九個の最適化すべきハイパーパラメータが設定されています。

変数名 説明 値の範囲
activation_fn_1 第一層の活性化関数 カテゴリカル [“tanh”, “relu”]
activation_fn_2 第二層の活性化関数 カテゴリカル [“tanh”, “relu”]
batch_size 訓練に用いるバッチサイズ 整数 [8, 16, 32, 64]
dropout_1 第一層のドロップアウト確率 実数(離散値) [0.0, 0.3, 0.6]
dropout_2 第二層のドロップアウト確率 実数(離散値) [0.0, 0.3, 0.6]
init_lr 訓練に用いる学習率の初期値 実数(離散値) [5.0 * 1e-4, 1e-3, 5.0 * 1e-3, 1e-2, 5.0 * 1e-2, 1e-1]
lr_schedule 訓練に用いる学習率のスケジューリング方式 カテゴリカル [“cosine”, “const”]
n_units_1 第一層のユニット数 整数 [16, 32, 64, 128, 256, 512]
n_units_2 第二層のユニット数 整数 [16, 32, 64, 128, 256, 512]

 

この問題に対して、ランダムサーチ、通常のCMA-ES (離散値はサンプリング後に丸めて、カテゴリカルな変数はランダムサーチする方法)、導入されたCatCmaSamplerを用いて最適化を実行しました。1000 trialの最適化を10回実行して、平均と分散をプロットしたグラフが以下です。横軸にTrial数(Budgetと記載されています)をとり、縦軸にその時点までのTrialたちにおける平均二乗誤差のベストな値(最小値)を示します。実際にこの10回の最適化ではCatCMAが通常のCMA-ESに比べて高い性能を誇っていることがわかります。

また、各Trialの実行時間の推移を以下に示します。横軸はTrial数で、縦軸はそのTrialの実行時間を秒で表しています。今回はベンチマークデータセットを用いており、目的関数の評価にかかる時間はほぼゼロであるとみなせるので、この実行時間はCMA-ESやCatCMAが各Trialでパラメータをサンプリングするためにどの程度時間がかかっているかを意味しています。CatCMAはCMA-ESと比べてもほぼ動作速度が変わらないということがわかります。

おわりに

Optuna向け機能共有プラットフォームOptunaHubについ先日導入されたCatCmaSamplerが、実際の機械学習のハイパーパラメータ最適化においても非常に高い性能を発揮することを示しました。みなさんもぜひCatCmaSamplerを利用して、実世界のブラックボックス最適化の応用問題を解いてみてください!

Optuna向け機能共有プラットフォームOptunaHub https://hub.optuna.org/ では新機能を追加してくださるOSSコントリビュータを募集しています。ご自身の手法を世界に広げてみたいという研究者の皆さん、実装してみたアルゴリズムをOptunaコミュニティに公開してみたいという開発者の皆さんの協力をお待ちしています。詳細はこちらのベータリリース紹介ブログをご覧ください。 

  • Twitter
  • Facebook