はじめに
ベイズ最適化 ー適応的実験計画の基礎と実践ー | 近代科学社を読んだので書評を投稿します。
この記事では、本書の概要と、どのような点が学びになったのか、そしてどんな人におすすめできるかをまとめています。
- 対象読者: これから[ベイズ最適化 ー適応的実験計画の基礎と実践ー]を読もうか検討している方
-
この記事を読むとわかること:
- 本書の全体像と学べること
- 筆者から見た本書の難易度や感想
- 本書を読み終えた後の次のステップ
増補改訂版が出版されます!
2025年7月31日に増補改訂版 ベイズ最適化が出版されます。Optunaのバージョンアップに合わせた第4章の修正・加筆と「リグレット解析」の理論が追加されるようです。これから読もうと考えている方は、増補改訂版を待つと良いと思います。
1. 本書の3行まとめ
- ベイズ最適化について、理論的な背景からOptunaによる実装までを網羅的に解説した一冊
- 特に2章ではガウス過程回帰モデルについて、3章ではさまざまな獲得関数について理論的な基礎がしっかりと解説されているのが特徴
- ベイズ最適化について、特に理論をしっかり学びたい方におすすめ。逆に、実装や応用に特化した内容ではないため、実務ですぐに活用したい方には重いかもしれません。
この記事の筆者について:
- 情報系の大学院生。専門は数理最適化(特に制約付き非線形最適化)。しかしベイズ最適化やガウス過程回帰モデルについては初学者
- プログラミング経験: Python, Julia, Goなど。OptunaもKaggleのコンペで使ったことがあるが、ベイズ最適化の理論的な背景は知らなかった。
2. 本書の構成と学びのハイライト
本書は全8章で構成されています。個人的に特に学びが深かった章や、重要だと感じた点をいくつか紹介します。基本的な概念については第1章で解説されており、特に2章と3章が本書の基礎となる内容です。
基本的な用語
- ブラックボックス関数とは、内部の構造が不明で、入力に対する出力を観測データとして得ることによってのみ評価できる関数のことです。
- ベイズ最適化とは、ブラックボックス関数の最適化問題を解くための手法です。ブラックボックス関数に「事前分布」を仮定し、観測データをもとに定めた「事後分布」からブラックボックス関数を推定します。
-
第2章: ブラックボックス関数のベイズモデリング
- ここではベイズ線形回帰モデルとガウス過程回帰モデルについて学ぶことができます。特に「ガウス過程」を理解することは、本書全体を理解する上で大切だと感じました。
- ガウス過程は、「平均関数$\mu$」と「カーネル関数$k$」の2つの関数で定義される確率過程1です。おおざっぱにいうと、関数の従う確率分布として捉えることができます。
- ガウス過程では平均関数は通常0に設定されます。平均関数は、ガウス過程のサンプルパスに与える影響が小さい2からです。
- ガウス過程は、特に「カーネル関数」が重要で、これは入力空間の点同士の類似度を表現します。カーネル関数が異なると、ガウス過程の性質も大きく変わります。
- 「カーネル関数」は、入力空間の点に非線形な変換を加えて内積をとったものとして見ることができます。
- ベイズ最適化のハイパーパラメータ選択についても丁寧に解説されていて素晴らしいと感じました。
- OptunaのGPSamplerではMatern 5/2カーネルが使用されているようです。(optuna.samplers.GPSampler — Optuna 4.4.0 documentationを参照)
-
第3章: ベイズ最適化のアルゴリズム
- この章では、さまざまな獲得関数(EI, PI, UCB、PESなど)について詳しく解説されています。
- EI(Expected Improvement)やPI(Probability of Improvement)、UCB(Upper Confidence Bound)は関数値とその勾配が解析的に計算できるため、勾配法3を用いれば比較的高速に最大化できるのがメリットです。
- PIは「探索」よりも「活用」に偏ったサンプルを選ぶ傾向があり、EIは「探索」と「活用」のバランスをとることができるため、実用上はEIがよく使われるようです。
- 理論的な解析にはUCBがよく使われるようです。
- 直感的には「期待値の小さいところ」を選ぶのは「活用」的で、「分散の大きいところ」を選ぶのは「探索」的なサンプル選択だと理解しました。
-
第8章:並列ベイズ最適化
- この章では、ベイズ最適化の並列化に関する手法が簡潔に紹介されています。
- 「嘘つき法」、「局所ペナルティー法」:現在実行中のトライアルの情報を推定しながら並列で探索点を選ぶ手法。(各トライアルで選ぶ探索点は1つ)
- モンテカルロ獲得関数:複数の探索点を同時に選択する獲得関数を考える。多重積分は解析的に計算できないため、モンテカルロ法を用いて数値積分する。
- 上記の手法は「探索点の選択」を並列化する手法ですが、ベイズ最適化では他にもさまざまなところで並列化する余地があり、それぞれに色々な手法があるようです。例えば獲得関数の最大化を複数の初期点から並列に行うことや、トライアルの実行自体を並列化することなどです。
- Batching | BoTorchも参考になります。
3. 感想
良かった点
- なにより、全体を通じて理論がしっかりと解説されている点が素晴らしいです。特にガウス過程回帰モデルや獲得関数の理論的な背景が詳しく解説されており、「なんとなく最適化される」ではなく、「なぜ最適化されるのか」が理解できるようになっています。理論がわかれば色々な手法のトレードオフも見えてくるので、実務での応用にも役立つと感じました。
- また、扱っているトピックが広範囲にわたる(制約付き最適化、多目的最適化、並列最適化、ハイパーパラメータ調整など)ため、網羅的に学ぶことができるのもありがたいと感じました。参考文献も多く示されているので、より詳しく学びたくなった場合に参照できます。
気になった点・注意点
- 冒頭にも書きましたが、実装や応用に特化した内容ではないため、実務ですぐにベイズ最適化を活用したい方には重いかもしれません。理論をしっかり学びたい方には非常に有益な一冊ですが、実装や応用に特化した内容を求める方には理論が重すぎて序盤で挫折する可能性があります。もう少し簡単にトピックを知りたい方は、Optunaによるブラックボックス最適化などが良いかもしれません。
- あくまで「ベイズ最適化」が主題で、特にガウス過程回帰モデルに重点が置かれています。そのため、他の最適化手法(例えば進化的アルゴリズムやTPE Samplerなど)についてはあまり触れられていません。他の手法も含めて幅広く学びたい方には物足りないかもしれません。また、ガウス過程自体についてもさらりと導入されているため、ガウス過程についてより詳細を学びたい方は、MLPのガウス過程と機械学習などを参照することをおすすめします。ちなみにこちらのMLPの書籍は第0章にてガウス過程のイメージが易しく解説されているので、ガウス過程のイメージを掴むのにも役立ちます。
- 加えて、細かいことですが数式の誤植がときどきありました。公式にも正誤表は公開されていないので、気になる方は自分で確認する必要があります。
ここからは少し専門的な内容になりますが、数式の誤植や計算量について気になった点を共有します。もし間違っていればご指摘いただけると幸いです。
こちらのブログでもいくつかの誤植が指摘されています。そちらでは指摘されていないものは以下の通りです。
2章
- (2.35)の式の係数に2が必要
3章
- (3.14)式で消えるはずの第4項が残っていて、代わりに残るはずの第3項が消えている。
記載内容
$$
\frac{\partial \alpha_{EI}}{\partial x^{(j)}}
= -\frac{\partial \mu_n(x)}{\partial x^{(j)}} \Phi\left(\frac{y_n^* - \mu_n(x)}{\sigma_n(x)}\right)+
\sigma_n(x) \phi'\left(\frac{y_n^* - \mu_n(x)}{\sigma_n(x)}\right) \frac{\partial}{\partial x^{(j)}} \left(\frac{y_n^* - \mu_n(x)}{\sigma_n(x)}\right)
$$
修正案
$$
\frac{\partial \alpha_{EI}(\boldsymbol{x})}{\partial x^{(j)}}
= -\frac{\partial \mu_n(\boldsymbol{x})}{\partial x^{(j)}} \Phi\left(\frac{y_n^* - \mu_n(\boldsymbol{x})}{\sigma_n(\boldsymbol{x})}\right)+
\frac{\partial \sigma_n(\boldsymbol{x})}{\partial x^{(j)}} \phi\left(\frac{y_n^* - \mu_n(\boldsymbol{x})}{\sigma_n(\boldsymbol{x})}\right)
$$
さらに、3.2, 3.3節の獲得関数の計算量解析についても疑問が残りました。
1.各トライアルの計算量
次のような書籍の記述に対し、この計算量はもう少しタイトに評価できると考えました。
行列$K_n+\sigma^2 I_n$の逆行列を前もって計算しておけば$O(n^2)$で計算できます。従って、確率改善量の勾配はトライアルの初めに$O(n^3)$、その後各点$x$の次元ごとに$O(n^2)$で計算できます。
3.3 p.64
行列$K_n+\sigma^2 I_n$の各要素の計算に$O(d)$かかる(これはカーネル関数に依ります)として、その逆行列を計算するのに$O(dn^3)$かかる
(中略)
トライアル$n$までに得られた履歴$D_n$に対して、次の候補点を選ぶのにかかる時間は $O(d(n^3+Tn^2))$
3.3 p.64
行列$K_n+\sigma^2 I_n$の計算には合計$O(dn^2)$かかりますが、逆行列を求めるのは$O(n^3)$でできるので、合計で$O(dn^2+n^3)$でできると思います。それにともなって次の候補点を選ぶのにかかる時間も $O(n^3+dTn^2)$となると思います。(もちろんBig-O記法なので、$O(dn^3)$も正しい上界です。)
2.ベイズ最適化全体の計算量
次のような書籍の記述に対し、全体の計算量は$O(N^4)$になるのでは?という疑問を持ちました。
全部で$N$トライアル行うとして、ベイズ最適化のアルゴリズム全体では...(中略)...$N$トライアル行うためにかかる時間計算量は$O(CN+dN^3+dTN^2)$となります。
3.3 p.65
各トライアル$n=1,\dots,N-1$に対して、
- 次の候補点$x_{n+1}$を選ぶのにかかる時間は(書籍通りなら)$O(d(n^3+Tn^2))$(もう少しタイトに評価すれば$O(n^3+dTn^2)$)
- 目的関数値$y_{n+1}$の評価にかかる時間は$C$
- これは書籍で$n$に依らないと仮定されている
これらを単純に合計すると
$$
\sum_{n=1}^{N-1} \left(O(d(n^3+Tn^2))+C\right)=O(CN+dN^4+dTN^3)
$$
となると思いました。候補点を選ぶ時間をタイトに評価したとしても
$$
\sum_{n=1}^{N-1} \left(O(n^3+dTn^2)+C\right)=O(CN+N^4+dTN^3)
$$
となり$O(N^4)$は避けられないと思います。もし分割行列に対する逆行列の公式などを用いて、履歴を更新するたびに更新分のみ効率よく逆行列を求めれば各トライアル$n$での逆行列の計算時間が$O(dn+n^2)$で抑えられて、結果
$$
\sum_{n=1}^{N-1} \left(O(dn+n^2+dTn^2)+C\right)=O(CN+dTN^3)
$$
となるのかなとも思いました。
4. 本書をおすすめしたい人
- 理工系の大学1,2年生が学習する程度の数学的な基礎知識(微分積分、線形代数、確率統計など)がある方
- 数理最適化の基礎知識があるとより理解が深まると思いますが、必須ではないと思います。
- ベイズ最適化について、特に理論をしっかり学びたい方
- Optunaの使い方や実装方法を学びたい方には、Optunaによるブラックボックス最適化などが良いかもしれません。
5. 次に読みたい本や学びたいこと
-
『ガウス過程と機械学習』
- 理由: ガウス過程についてより詳しいことを学びたいからです。
- 簡単に自分でベイズ最適化を実装する
- 理由: ミニマルな実装を自分でしてみることで、理論の理解がより深まると思うからです。
- OptunaやBoTorchのソースコードを読む
- 理由: 理論はある程度理解できたので、次は実際どう実装されているのかを見てみたいと思いました。