daisukeの技術ブログ

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

【解説】書籍:Optunaによるブラックボックス最適化

日本を代表するAI企業であるPreferred Networks(PFN)さんは、Optunaというオープンソースソフトウェア(OSS)ツールを提供しています。

Optuna(オプチュナと読みます)に関して、PFNさんが解説する書籍「Optunaによるブラックボックス最適化」を読みました。

今回は、その書籍を読む際に、AIや機械学習にまだ慣れていない初心者の方々が理解しにくい内容を補足し、Optunaを実際に使用して得た知見を共有したいと思います。

この情報がお役に立てば幸いです。

また、OptunaはMITライセンスの下で利用可能な商用のOSSです。

【Optuna】

参考文献

参考サイト

◆Optunaの公式サイト

www.preferred.jp

◆Optunaのドキュメント(マニュアル)

optuna.readthedocs.io

◆OptunaのGitHub

github.com

◆Optunaの公式サンプルコードのGitHub

github.com

◆書籍「Optunaによるブラックボックス最適化」のサンプルコード

github.com

www.slideshare.net

はじめに

この本は、ブラックボックス最適化について幅広く取り扱っていますが、技術書としてはページ数は多くありません。

各章や節は簡潔に述べられていますが、導入は必ず分かりやすい具体例で始まり、読者にしっかりイメージを持たせてから、ポイントを付けた解説がされています。非常に読みやすく、手に取ったときにすぐに内容を思い出せる良い本でした。

この本を手に取った目的は、Optunaを使ってAIの学習のハイパーパラメータのチューニングを便利に行いたいと考えていたためです。しかし、実際に読んでみると、私が想定していたOptunaの使い方については2章に書かれており、それ以降はもう少し高度な内容で、現時点では十分に理解できたとは言えませんが、多くの新しい知見が得られる内容でした。

まず、Optunaで使われる用語について、「最新リリース:Optuna V3 の全て(https://www.slideshare.net/pfi/optuna-v3-20221210-optuna-meetup-2)」を参考に示します。

用語 説明
Storage(ストレージ) スタディを保存し、永続化するための抽象化
Study(スタディ) 一連のトライアルを含む、一回の実験(ブラックボックス最適化)の単位
Trial(トライアル) 目的関数の一回の評価(一回の学習とテスト)の単位
Sampler(サンプラー) 最適化アルゴリズム(デフォルトはTPESampler)のこと
Pruner(ブルーナー) 最適化効率を改善するため、性能が出そうにないトライアルを途中で打ち切るためのもの

以下は、Optunaの記事一覧です。良かったら参考にしてください。

Optunaの記事一覧
開発環境の構築:開発環境の構築手順(用途:AI関連、Python)
Optunaの全体像:書籍の解説:Optunaによるブラックボックス最適化 ← 今回
単目的最適化:Google ColaboratoryでOptunaを実行(Study再現性の確保)
可視化:Google ColaboratoryでOptuna Dashboardを使う方法
Optunaのデータベース:DB4Sのインストール方法、データベースの操作方法

ここからは、「Optunaによるブラックボックス最適化」の章立てにならって書くことにします。理解が進んだところから随時追記を行っていきます。

1章:ブラックボックス最適化の基礎

この本は、ブラックボックス最適化について幅広く取り扱っています。AIの学習のハイパーパラメータのチューニングだけでなく、さまざまな用途に使えることが説明されています。

SMBOの位置づけと、ベイズ最適化との違いが少し分かりにくかったです。言葉の定義については、あまり気にしなくても良いと思いますが、以下に私の理解を書いておきます。

  • SMBO(sequential model-based optimization)は、ブラックボックス最適化を効率的に行うためのアプローチの一つであり、具体的には「パラメータの推定→モデルを更新→モデルを評価」というステップを逐次的に繰り返し、有望なパラメータを自動で探索していく考え方(この言葉の理解が難しく、正しいかは自信がありません)
  • ベイズ最適化(Bayesian optimization)は、有望なパラメータを推定するアルゴリズムの一つ

2章:はじめてのOptuna

ここでは、Optunaの導入方法や簡単な例を使ったOptunaの使い方(実装方法)、さらにOptunaが出力した結果の見方や可視化方法について説明されています。AIの学習のハイパーパラメータのチューニングが目的であれば、この章を読むだけで、使い方や結果の分析方法が理解できると思います。

なお、この章は単目的最適化を対象としており、3章は多目的最適化でのOptunaの使い方を説明しています

書籍「Optunaによるブラックボックス最適化」のサンプルコードを使って、実際に、ハイパーパラメータのチューニングと、その結果分析をやってみた記事を書いたので、良かったら参考にしてください。

daisuke20240310.hatenablog.com

3章:Optunaを使いこなす

ここでは、2章で扱わなかったOptunaの応用的な使い方について説明されています。

3.1 多目的最適化

一般的なAIの学習のハイパーパラメータのチューニングは、画像分類や回帰問題などの場合、ロスの最小化という1つの目的だけを対象としています。このような単一の目的を追求する最適化を単目的最適化と呼びます。

一方、同じAIの学習のハイパーパラメータのチューニングでも、目的が推論精度の向上だけでなく、推論時間の短縮も目指す問題を設定することができます。このように、複数の目的を同時に考慮する場合は、多目的最適化と呼ばれます

多目的最適化の場合、複数の目的の全てで最高の結果を得ることは難しく、しばしばトレードオフの関係になります。Optunaは多目的最適化に対応しており、具体的には、単目的最適化ではベストな1つの候補を出力するのではなく、複数の良さそうな候補を提供し、ユーザに最適な選択をさせてくれます。さらに、その選択をサポートするための可視化機能も提供しています。

3.2 制約付き最適化

まず、制約付き最適化は、多目的最適化の場合に使われる機能であり、単目的最適化の場合には必要ありません。多目的最適化のところで述べたように、複数の目的に対して、ベストな結果というのはユーザだけが知っています。この制約付き最適化は、あらかじめ、目標とする結果の範囲(ユーザが好ましいと思う結果の範囲)を指定しておくことで、なるべくその範囲の結果になるように、パラメータを選択してくれる機能です。

もちろん、学習を行う前から結果は分からないので、学習の結果が、必ず指定した範囲におさまるわけではありませんが、そうなるようなパラメータを選択してくれる機能のようです。

3.3 可視化機能を用いた探索空間の調整

ここでは、対象の問題について、どのハイパーパラメータが重要かについて、勘所(ドメイン知識)がない場合に、有効にOptunaのブラックボックス最適化を活用する方法について説明されています。もちろん、ドメイン知識がある場合でも、取り組む問題は毎回異なるはずなので、どのハイパーパラメータが重要なのかを把握しながら、モデルの改善を行っていくことは重要です。

具体的な問題を対象として、ドメイン知識がない場合を想定して、重要なハイパーパラメータのサンプリングした値に対する精度を可視化して、精度が高くなりそうな探索空間に絞っていき、精度を向上させていく方法を説明しています。

Optuna Dashboardで、同じような可視化が、自動で確認できたと思うので、Optuna Dashboardを導入してから、この節を見直すことにします。

3.4 探索点の手動指定

ここでは、既に、有効なハイパーパラメータの値が分かっている場合に、その値をOptunaに優先的に使用させることで、効率的にブラックボックス最適化を実行する方法について説明されています。

3.5 分散並列最適化

Optunaはスタディとストレージを、複数のプロセスで共有することに対応しており、一台のPC内で複数プロセスで実行する場合から、複数PCで複数プロセスで実行する場合まで、幅広く対応しています。

ここでは、同時アクセスには耐えられないSQLiteではなく、MySQLサーバを使用して、具体的に分散並列最適化を実行する方法について説明されています。

3.6 サンプラーの選択

サンプラーとは、ブラックボックス最適化を解くための具体的なアルゴリズムのことです。

Optunaのマニュアルにサンプラーの一覧(https://optuna.readthedocs.io/en/stable/reference/samplers/index.html#module-optuna.samplers)が書かれています。各サンプラーが対応している機能(枝刈り、多目的最適化、制約付き最適化など)についても書かれています。

Optunaのサンプラー一覧
Optunaのサンプラー一覧

3.7 枝刈り

枝刈りとは、学習途中の評価結果から、これ以上学習を続けても、良好な結果が得られる見込みのない場合に、学習を途中で打ち切る機能のことです。Optunaは、この枝刈りを自動で行う機能を持っています。

具体的に、Optunaがどのようにして枝刈りを行うかというと、複数ある枝刈り機能のうち、MedianPrunerの場合、学習途中での評価結果が、過去のトライアルの中央値よりも低い場合に枝刈りを行います。

4章:ブラックボックス最適化の応用例

ここでは、3つのブラックボックス最適化の応用例について、説明されています。

5章:Optunaの最適化の仕組み

ここでは、Optunaがパラメータを選択する仕組みについて説明されています。

5.1 Optunaの柔軟なインタフェース

この節の要約は、以下の通りです。

  • 多くのブラックボックス最適化では、目的関数が実行される前に、全てのパラメータの探索空間が定義されている必要があります
  • Optunaでは、この制約を持たないため、柔軟に探索空間を変化させることが可能です

Optunaでは、デフォルトで使用される最適化アルゴリズムは、TPEです。

同じく、TPEを使っているブラックボックス最適化のフレームワークである「Hyperopt」の場合、最適化を実行するメソッドは「fmin」であり、この引数に、目的関数と、探索するパラメータの探索空間を指定する必要があります。つまり、最適化を実行するときには、探索空間は決定されており、途中で探索空間の変更はできません。

一方、Optunaの場合、最適化を実行するメソッドは「optimize」であり、この引数に指定するのは、目的関数だけであり、探索空間の指定は、目的関数内で定義することを可能にしています。

目的関数内で定義できることの利点について、以下の3点をあげています。

  • 複数のモデル(例えば、ランダムフォレストと勾配ブースティング)を対象に、それぞれ探索空間を定義することができる(この実装例のこと)
  • 探索空間がfor文による繰り返しを含んでいる(実装例
  • スタディの実行中に、新しいパラメータの探索空間を追加することができる(実装例:この実装でスタディを完了し、この実装でスタディを再開させることができる)

特に一番目の異なるパラメータを持つ複数のモデルを対象に最適化できることは大きなメリットです。

以上より、Optunaは使いやすいインタフェースを実現しています。

5.2 独立サンプリング

Optunaは、複数のパラメータを対象にブラックボックス最適化を行うとき、それぞれのパラメータで、次の探索候補を選ぶ機能を持っており、Optunaでは、これを独立サンプリングと呼んでいます(独立サンプリングは一般的? → 「independent sampling genetic algorithms」でWeb検索すると、それらしい論文がヒットしたので、完全なOptuna独自の定義ということではなさそうです)。

探索候補の選び方は、あるパラメータにおいて、これまでのトライアルで選択された探索点と評価値から、指定のアルゴリズム(TPEなど)で、次のトライアルの探索点を選択します。

この独立サンプリングにより、「5.1 Optunaの柔軟なインタフェース」で説明した柔軟なインタフェースを実現しています。

5.3 独立サンプリングの課題

独立サンプリングの課題について説明しています。

具体的には、2つの谷をもつ目的関数(書籍の図を参照)の場合は、2つのパラメータを独立サンプリングで次の探索点を選択してしまうと、谷のない場所を探索点として選択してしまう可能性があることです。

5.4 同時サンプリング

独立サンプリングの課題の対策である同時サンプリングについて説明しています。簡単に言うと、同時サンプリングと、独立サンプリングの二段構えで解決しています。

具体的には、トライアルの開始時に、過去のトライアルを持つパラメータについて、同時サンプリングで、正しく次の探索点を選択します。その後、新しく追加されたパラメータなどを見つける(サジェストAPIが呼ばれる)と、その時点で独立サンプリングを使って、次の探索点を選択します。

これらにより、Optunaは柔軟なインタフェースを実現できています。

5.5 パラメータ選択の全体像

ここでは、図を使って、同時サンプリングと、独立サンプリングを、どう使い分けているかを説明しています。また、サンプラーによって、同時サンプリング、独立サンプリングの両方、あるいは、いずれかに対応しており、使用するときには注意する旨が書かれています。

ここで、以下のように、非常に気になることが書かれていました。

  • デフォルトで使われるTPEサンプラーは、独立サンプリングしか提供していない
  • TPEサンプラーで、同時サンプリングの機能を利用したい場合は、TPEサンプラーの引数のmultivariateをTrueに設定する必要がある

TPEサンプラー(TPESampler:https://optuna.readthedocs.io/en/stable/reference/samplers/generated/optuna.samplers.TPESampler.html)を見ます。

引数の説明を見ると、確かに、multivariateのデフォルト値はFalseであり、この引数は、Optuna v2.2.0で、実験的に追加されたと書かれています。

これまでの話の流れとしては、独立サンプリングを採用したので柔軟なインタフェースにすることが出来た → しかし、独立サンプリングには最適化に適切ではないパラメータを選択する課題あり → 同時サンプリングだと独立サンプリングの課題は発生しない → Optunaは同時サンプリングを基本として、独立サンプリングの機能も持つことで、適切な最適化と、柔軟なインタフェースを両立している、という流れだったはずです。

この話の流れであれば、TPEサンプラーは、同時サンプリングを使うのが当然だと思われますが、Optunaがデフォルトで使用するTPEサンプラーは、デフォルトで独立サンプリングだけを使う設定になっており、疑問が残るところでした

6章:ブラックボックス最適化のアルゴリズム

各種アルゴリズムの理論について説明されています。