GP
Gaussian Process
本セクションでは、ベイズ最適化のもう一つの代表的な手法である Gaussian Process (GP) を紹介します。
Gaussian Process (GP) は、TPE と同様にベイズ最適化の手法です。 TPE のセクションで紹介したように、どちらもベイズ最適化を使用しますが、パラメータと目的関数値の関係をどのようにモデル化するかが異なります。
- GP はパラメータ値が与えられたときの目的関数値の分布、つまり
p(y|x)を直接モデル化します。 - TPE は
p(x|y)とp(y)を別々にモデル化します。
Gaussian Process とは
Gaussian Process は、関数に対する確率分布を定義します。 観測された試行の集合が与えられると、GP はサロゲートモデルをフィッティングし、探索空間内の未観測の点における平均(期待値)と不確実性(分散)の両方を予測します。
これが TPE に対する重要な利点です。 GP は未観測の点で期待される値だけでなく、その予測にどれだけ自信があるかも把握しています。 そのため、まだ試していない領域を「良い値が期待できるから試す」のか「まだよくわかっていないから試す」のかを区別して選べます。
GP ベースのベイズ最適化の仕組み
GP による最適化は、STEP2 から STEP3 を繰り返し実行することで行われます。
STEP1
TPE と同様に、まず初期の観測データを収集するためにランダムサンプリングが行われます。 サロゲートモデルは観測に当てはめる形で作られるので、当てはめる対象がない最初の段階ではモデルを作れません。
初期試行の数は「Number of startup trials」設定によって制御されます。
STEP2
観測データが与えられると、GP はサロゲートモデルをフィッティングします。
探索空間内の各候補点 x について、モデルは以下を提供します。
- 予測平均
μ(x):xにおける目的関数の期待値 - 予測分散
σ²(x):xにおける予測の不確実性
STEP3
獲得関数(acquisition function)が次に評価すべき点を選択します。 v1.5.0 以降、GP Optuna では期待改善量(Expected Improvement, EI)に加えて、改善確率(Probability of Improvement, PI)、上側信頼限界(Upper Confidence Bound, UCB)、トンプソンサンプリング(Thompson Sampling)の 4 種類から獲得関数を選べます。 いずれの獲得関数も、次の 2 つのバランスを取るという点では共通しています。
- 活用(Exploitation): 既知の良い点の近くを探索(
μ(x)が低い箇所) - 探索(Exploration): 不確実性の高い領域を探索(
σ(x)が高い箇所)
次の試行は、選択した獲得関数を最大化する点で実行されます。 STEP2 で平均と分散の両方を求めておくことで、この 2 つを 1 つの指標にまとめて比較できます。
制約条件付き最適化や多目的最適化に対応しているのは EI だけなので、これらの条件下では獲得関数の選択肢が EI に固定されます。 残り 3 つの獲得関数を選べるのは、単目的かつ制約なしの場合に限られます。 またこの獲得関数の選択は GP Optuna に固有の機能で、GP BoTorch は常に BoTorch 側の獲得関数を使用します。
GP Optuna vs GP BoTorch
Tunny には 2 種類の GP 実装があります。
| GP Optuna | GP BoTorch | |
|---|---|---|
| Backend | Optuna native | BoTorch library |
| Multi-objective | 対応 | 対応 |
| Constraints | 対応 | 対応 |
| Speed | 高速 | 低速 |
多目的最適化と制約条件はどちらの実装でも扱えるため、選ぶ基準は速度と最適化品質のどちらを優先するかになります。 まずは高速な GP Optuna から試すことをおすすめします。 GP BoTorch は高度な獲得関数を備えている分だけ処理が重くなりますが、速度よりも最適化の品質を優先する場合に選ぶとよいでしょう。
計算量
GP
は各ステップでカーネル行列の逆行列を計算する必要があり、その時間計算量は観測数
n に対して O(n³) となります。 そのため、試行回数が増えるにつれて GP は
TPE(O(dn log n))よりも低速になります。 試行回数が多い場合は、TPE
の方が実用的なことが多いです。
たとえば観測数が 10 倍になると、1 ステップあたりの計算量はおよそ 1000 倍になります。 サンプラーの選び方のページで、GP を試行回数が多くない範囲での候補として挙げているのは、このためです。
GP を使うべき場面
- 1 回の試行にコストがかかり、最大限のサンプル効率が求められる場合
- 目的関数が滑らかで連続である場合
- 変数の数が比較的少ない場合(GP は次元数が増えるとスケーラビリティが低下します)
たとえば Grasshopper 側で構造解析や環境解析を挟む場合は、1 回の評価そのものに時間がかかることもあります。 このように 1 試行が重い場合は、サンプラー側の計算が多少重くなっても、試行回数を減らせるほうが有利になります。 GP はまさにこうした場面に向いた手法です。