BoTorch 入門 3.

---
[BoTorch 入門 1.](https://qiita.com/tr-author/items/92c36b874b366d62473e)
[BoTorch 入門 2.](https://qiita.com/tr-author/items/45a2671aa342f9fab680)
BoTorch 入門 3.

[BoTorch 実践 3. ノイズの扱い](https://qiita.com/tr-author/items/4ef1164dd36a6375e668)
[BoTorch 実践4. 制約付きベイズ最適化](https://qiita.com/tr-author/items/94461a3ef5fa61dc2338)

---

今回はBoTorchで実装されているModelについて見ていきます。


BoTorchによる説明を見てみます。

>Models play an essential role in Bayesian Optimization (BO). A model is used as a surrogate function for the actual underlying black box function to be optimized. In BoTorch, a Model maps a set of design points to a posterior probability distribution of its output(s) over the design points.
>
>In BO, the model used is traditionally a Gaussian Process (GP), in which case the posterior distribution is a multivariate normal. While BoTorch supports many GP models, BoTorch makes no assumption on the model being a GP or the posterior being multivariate normal. With the exception of some of the analytic acquisition functions in the botorch.acquisition.analytic module, BoTorch’s Monte Carlo-based acquisition functions are compatible with any model that conforms to the Model interface, whether user-implemented or provided.
>
>Under the hood, BoTorch models are PyTorch Modules that implement the light-weight Model interface. When working with GPs, GPyTorchModel provides a base class for conveniently wrapping GPyTorch models.
>
>Users can extend Model and GPyTorchModel to generate their own models. For more on implementing your own models, see Implementing Custom Models below.


- BoTorchではsurrogate functionにGP(ガウス過程)を利用するが、事後分布は必ずしも正規分布である必要はない、
- そのGPは自分で実装したモデルも利用可能だが(Monte Carlo近似を必要とする獲得関数を用いる場合)Modelのinterfaceの仕様に従う必要がある

といったことが書かれています.

> ## Terminology
> ### Multi-Output and Multi-Task
>
>A Model (as in the BoTorch object) may have multiple outputs, multiple inputs, and may exploit correlation between different inputs. BoTorch uses the following terminology to distinguish these model types:
>
>- Multi-Output Model: a Model with multiple outputs. Most BoTorch Models are multi-output.
>- Multi-Task Model: a Model making use of a logical grouping of inputs/observations (as in the underlying process). For example, there could be multiple tasks where each task has a different fidelity. In a multi-task model, the relationship between different outputs is modeled, with a joint model across tasks.
>
>Note the following:
>A multi-task (MT) model may or may not be a multi-output model. For example, if a multi-task model uses different tasks for modeling but only outputs predictions for one of those tasks, it is single-output.
Conversely, a multi-output (MO) model may or may not be a multi-task model. For example, multi-output Models that model different outputs independently rather than building a joint model are not multi-task.
If a model is both, we refer to it as a multi-task-multi-output (MTMO) model.

ここでのMulti-Outputはベイズ最適化ではなくガウス過程の話です. マルチタスクベイズ最適化や多目的ベイズ最適化とは分けて考える必要があるように思います.

BoTorchでのMulti-OutputとMulti-Taskの違いについて説明があります。
BoTorchのモデルはほとんどが複数の出力に対応しているため、ある同一の入力に対して複数の関数を同時にモデリング可能です。BoTorchではこれをMulti-Outputとしていますが、その関数(タスク)間の関係性をモデリングすることをMulti-Taskとしています.

Multi-Taskは必ずしもMulti-Outputではありません。例えばニューラルネットのK-fold Cross Validationでは、train dataとvalidation dataをK分割しそれぞれ学習と評価を行ないますが最終的には各学習結果の平均値をとります。これをモデリングする場合、K回の学習とその関係性を同時にモデリングするためMulti-Taskですが、最終的な出力は一つのためsingle-outputです.

> ### Noise: Homoskedastic, fixed, and heteroskedastic

※ 観測ノイズについて、は別記事で紹介しているため今回は触れません。

https://qiita.com/tr-author/items/4ef1164dd36a6375e668

### single task
|Single-Task GP|一つの入力と一つ以上の出力があり、各出力に相関がない場合に利用される|
|---|---|
| SingleTaskGP | 最も利用頻度が高いと思います。ノイズはhomoskedasticであるとし、周辺尤度最大化によって推定されます。|
|FixedNoiseGP|出力とともにその観測ノイズも観測できた場合に利用可能。SingleTaskGPでは観測ノイズは推定されるがFixedNoiseGPでは行わず陽に指定する。予測時にはノイズは加味しない。分散はhomoskedasticでない、つまり場所によって異なっていても良い|
|HeteroskedasticSingleTaskGP|`FixedNoiseFP`と同様にノイズが観測できていることが必要であるが、関数値に対するガウス過程と別にノイズを推定するためのガウス過程を用意することで未知の入力点に対してもノイズを加味した予測が可能となる|
|MixedSingleTaskGP|連続変数と離散変数を同時に扱うことができる。離散変数に対してはハミング距離に基づいたカテゴリカルカーネルを使用|
|SaasFullyBayesianSingleTaskGP|SAAS事前分布を指定したベイズモデル。特徴量をうまくスパースに扱うことのできる事前分布を設定しており高次元の問題に向いている。詳しくは論文へ。|

これらのモデルは`BatchedMultiOutputGPyTorchModel`も継承しているため同一の入力に対して一つまたは複数の出力がある場合でも利用できます。しかし各出力が相関を持っている必要はありません。各出力に相関がある場合、MultiTaskなGPを用いることが可能です。

### multi task
|Multi-Task-GP||
|---|---|
|MultiTaskGP|複数の関数を同時にモデリングする場合、その関数(タスク)間に相関がある場合、ICMカーネルを用いてその相関をモデルに組み込むことができる.観測ノイズは要求せず、推定される.|
|FixedNoiseMultiTaskGP|`MultiTaskGP`と同様であるが、観測ノイズを入力に受け取る.|
|KroneckerMultiTaskGP|複数の関数を同時にモデリング可能であることは`MultiTaskGP`と同様であるが、入力に対して、すべての関数(タスク)の出力が観測されている必要がある.そういった構造を`Kronecker Structure`と呼称し、事後分布の計算が高速に行うことができる.[1]|
|SaasFullyBayesianMultiTaskGP|TODO(単純にSAASBOのマルチタスク版だと思う.)|


上記のモデルはすべてデフォルトでは 適当な事前分布を設定したARD + Mater 5/2カーネルを利用しています。これらは入力が単位立方体、出力が平均0、分散1に正規化されている場合が望まれているようです。

### other
|||
|---|---|
|ModeList|複数の入力と複数の出力が独立に存在してまとめてガウス過程を行うときに利用する. 内部ではタスク間の相関が0の`MultiTaskGP`として動作しているようである.|
|SingleTaskMultiFidelityGP|MFBO(Multi-Fidelity Bayesian Optimization)で用いることができる. まだ完全に理解していないが、MFBO自体は`SingleTaskGP`(おそらく`MultiTaskGP`でも)可能. `SingleTaskMultiFidelityGP`は※trace observationを用いることができる場合に効率的な最適化が可能であると思われる.|
|FixedNoiseMultiFidelityGP|省略|
|HigherOrderGP|出力が高階になる場合、例えば画像を出力するようなガウス過程です。出力は高階のテンソルになり、各階のテンソル間の相互作用もカーネルトリックで実現している[1]|
|PairWiseGP|TODO|
|AffineDeterministicModel|TODO|
|AffineFidelityCostModel|TODO|
|GenericDeterministicModel|TODO|
|PosteriorMeanModel|TODO|
|SingleTaskVariationalGP|TODO|

※ trace observation : `SingleTaskMultiFidelityGP`は基本的に[2]を実装しているため、[2]の論文を読む必要がある.
 NNのハイパーパラメータのチューニングにおいて、例えば小さいepoch数と大きいepoch数はそれぞれlow-fidelity, high-fidelityとみなせる. ここで、大きいepoch数(fidelityが高い)で目的関数を評価(ここでいう目的関数は、例えば入力をハイパーパラメータとして出力をvalidation dataでの評価指標としたもの)することは、同時に低いepoch数(fidelityが低い)での目的関数の値を得ることができることを意味する. このように、高いfidelityでの評価が同時に低いfidelityでの評価もする場合、そのfidelityをtrace fidelity,そうでない場合 non-trace fidelityという.
`SingleTaskMultiFidelityGP`では、`trace fidelity`の変数に対し`DownSamplingKernel`を、non-trace fidelityの変数に対して`ExponentialDecayKernel`という特別なカーネルを指定することが可能である.

ちなみに、デフォルトでは`LinearTrucatedKernel`というカーネルが使用されるが、実装された経緯はよくわからないらしい(笑).
https://github.com/pytorch/botorch/discussions/947
https://github.com/pytorch/botorch/discussions/1392


[1] [W. Maddox, M. Balandat, A. Wilson, and E. Bakshy. Bayesian Optimization with High-Dimensional Outputs. 2021]( https://arxiv.org/abs/2106.12997)
[2][Jian Wu Saul Toscano-Palmerin Peter I. Frazier Andrew Gordon Wilson, Practical Multi-fidelity Bayesian Optimization for Hyperparameter Tuning. 2019](https://arxiv.org/pdf/1903.04703.pdf)