Tunny Icon
TunnyDocs

The next-gen Grasshopper optimization tool.

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 はまさにこうした場面に向いた手法です。

Reference