jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「ベイズ最適化」を読む ~第4章 Optunaによるベイズ最適化の実装方法 ⑧Optunaの発展的な使い方(3)~

はじめに

データを使って仮説の生成と検証を行なうための方法であるベイズ最適化を学ぶために,今村秀明・松井孝太 著「ベイズ最適化 ー適応的実験計画の基礎と実践ー」を読むことにした。

本記事は,「第4章 Optunaによるベイズ最適化の実装方法」における,多目的最適化に関する読書メモである。

  • 本書の紹介ページ

www.kindaikagaku.co.jp

4.6 Optunaの発展的な使い方

本節では,Optunaの発展的な使い方,すなわち高度な分析や状況に合わせた最適化,発展的な問題設定を扱う方法について説明している。

4.6.5 多目的最適化

多目的最適化は,最小化(または最大化)したい目的関数が複数存在する設定のことである。

多目的最適化問題の実装方法は,以下のoptuna_multi_objective.pyにて紹介されている。
github.com

多目的最適化の問題設定

本項で取り上げる目的設定は,以下のような問題設定である。


 \begin{align}
& f_0(x, y) = \sin x - y \\ \\
& f_1(x, y) = \cos x + y^2 \\ \\
& 0 \leq x \leq 6, 0 \leq y \leq 6 \\
\end{align}

ランダムにたくさんの点[tex; (x, y)]を選んで, f_0(x, y), f_1(x, y)の値を計算し,横軸に f_0,縦軸に f_1の値を取ってプロットしたものが下の図となる。


多目的最適解において,すべての目的関数の値(今回の目的設定では f_0の値と f_1の値)の両方を改善する点が他に存在しないような解をパレート解とよぶ。

多目的最適化の実装

上記のサンプルコードにおいて,多目的最適化の実装部分は以下のようになる。

sampler = optuna.integration.BoTorchSampler()
study = optuna.create_study(
  directions=["minimize", "minimize"],
  sampler=sampler,
)

Optunaは多目的最適化を非常に重要視しているため,多目的最適化のサンプルコードは,上記のような非常にシンプルな形で書くことができる。


サンプルコードの実行結果は以下の通りである。なお手元の環境では,サンプルコードの実行(100トライアル)に15分ほどかかった。
100回のトライアルのうち,91回がパレート解であった。

  • 計算結果
...
(中略)
Number of finished trials:  100
Pareto front:  91
(以下略)
...
  • 描画結果

すべてパレート解からなる集合を,パレートフロントと呼ぶ。

実際の応用では,このようにして得られたパレート解の中から,更に条件を追加して最適化を選ぶことになる。

まとめと感想

今回は,「第4章 Optunaによるベイズ最適化の実装方法」のうち,多目的最適化について学んだ。

Optunaを用いると,多目的最適化のコードをとてもシンプルに書くことが理解できた。
ベイズ最適化の利用シーンとして,マテリアルズ・インフォマティクス(MI)が考えられる。材料の開発においては,性能とコストを同時に追求することが多いと思うが,その際には多目的最適化が有用であるし,シンプルに実装できるOptunaはとても有用であると感じた。


本記事を最後まで読んでくださり,どうもありがとうございました。