関数ネットワークベイズ最適化;論文中のDropwave関数の問題設定

:::note info
**TLDR:** 関数ネットワークにベイズ最適化を用いて、既知の関数ネットワークの情報を、入力と最終出力と合わせて利用するグレイボックス最適化を提案する論文[2]を読んでいた。その際、論文では、関数ネットワークの単純な例として、Global optimizationですでに知られた二変数のたくさんのlocal optimaがあるが数式がシンプルなDropwave関数を利用されていた。そこでは一つ目の変数が二つ目の変数に影響するというグラフの構造を実験のために仮定した。この関数はベンチマークなので、深掘りするのは本質ではないが、扱いやすい便利なテスト関数であることを理解した。
::::

#### 個人的なモチベーション

因果をモデリングするCausal graphにて、ベイズ最適化（以下BOとする）をする論文([[1] Graph Agnostic Causal Bayesian Optimisation, Mukherjee et al.](https://arxiv.org/abs/2411.03028))を見ていたところ、その論文が参照していた論文([[2] Bayesian Optimization of Function Networks, Astudillo et al.](https://arxiv.org/abs/2112.15311), （以下、BOFN論文とする）)と[1]のどちらの論文でも、シミュレーションとして、**Dropwave** というテスト関数が用いられていて、それに関して知りたいと思ったので、この記事を書いています。[2]には他にも別のテスト関数・データがあるものの、[2]を理解するために一旦Dropwaveについて切り取ってメモを残します。

:::note warn
記事に誤りがありましたら、コメントお願いします。お叱りのコメントから僕の脳にbackpropして、コスト関数が最小化されて、僕の脳が更新されて学びになります。
:::

#### 論文を遡っていく

BOFN論文[2]の*5.1  Synthetic Test Functions*というセクションでは、著者らがglobal opitimizationの文献で標準となる手法から、このFunction Networkの文脈において、テストに使えるテスト関数を作成したとあります。この箇所に数行のDropwaveについて書いてありました。

要約:
- 2つのノードがある $n_1$, $n_2$
- $n_1$: 2次元ベクトル$\boldsymbol{x}$を入力としてとる
- $n_2$: $n_1$の出力を入力として受け取り、値を出力する
- 様々な工学デザイン（航空工学など）の分野で利用されている

今回のFunction Networkのモデリングで、２つのノードを持ったDAG (Directed Acyclic Graph, 有向非巡回グラフ)を仮定した状態で、後述するテスト関数が利用されるようです。

#### 自分の中の疑問

- Q1: 具体的なDrop-waveの数式はどうなのか？
- Q2: Global opitimizationにおけるDropwave関数はどのようなものなのか？
- Q3: Dropwave関数をFunction Networkの文脈ではどう使われたか？

#### Q1: 具体的なDrop-waveの数式はどうなのか？


##### BOFN論文のコード

まずはBOFN論文[2]の[著者が公開したコード](https://github.com/RaulAstudillo06/BOFN/blob/main/experiments/dropwave.py)の`dropwave.py`にて、`class Dropwave`の定義箇所に次の数式があります。シンプルです。




```
output[..., 1] = (1.0 + torch.cos(12.0 * norm_X)) /(2.0 + 0.5 * (norm_X ** 2))
```
Wolfram Alphaでこの関数をプロットしてみると、ギザギザの複雑な図形が出力される。x, yの範囲は[-5.12, 5.12]に絞られているとBOFN論文[2]のAppendix D.2.4にあったので、その範囲のみ示した。

![スクリーンショット 2024-12-31 13.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/8b63ba92-5cd9-150a-1340-c9754dc42dfd.png)

##### Dropwaveの元ネタ

[2]の論文にあった引用エントリを見つけた。これは論文ではないらしい。

> Surjanovic, S. and Bingham, D. (2013). Drop-Wave function

上記をネットで検索すると以下のホームページが出てきた。

https://www.sfu.ca/~ssurjano/drop.html

(このホームページが参照しているURLから、[Global optimizationのテスト関数としてDropwaveをのせたページ](http://infinity77.net/global_optimization/test_functions_nd_D.html#go_benchmark.DropWave
)を見つけたが、画像がリンク切れしているので有用でない。)

上記のウェブサイトを参照するとDropwave関数は以下で表される。

```math
f(\boldsymbol{x}) = - \frac{1+cos(12\sqrt{x_1^2+x_2^2})}{0.5(x_1^2+x_2^2)+2}
```

これは`class DropWave`と正負が異なる以外は一致する。これは、この数式が載せられているウェブサイトでは最小問題を扱っているのに対し、BOFN論文[2]の文脈では、best objective valueの最大化という文脈でDropwaveを利用しているので、マイナスの符合がついているようだ。

またGlobal Minimumは以下である。

```math
f(\boldsymbol{x^*}) = -1, \text{ at } \boldsymbol{x^*} = (0, 0)
```

#### Q2. Global opitimizationにおけるDropwave関数はどのようなものなのか？

所感：

- 2次元の入力なため、3次元で可視化でき、シミュレーションとして扱いやすい
  - そうでない3次元以上だと直感的にギザギザ度合いがわかりにくい
  - [可視化する方法](https://arxiv.org/pdf/1712.09913)もあるが、手間が多いので使いづらい。
- 大量のlocal optimaがあり、$\boldsymbol{x^*} = (0, 0)$のglobal optimaに辿り着きづらい
  - Global optimizationの問題設定としてこれは良い


#### Q3: Dropwave関数をFunction Networkの文脈ではどう使われたか？

- BOFN論文[2]は、既知のFunction Networkについて、その最初の入力と、最後の出力だけでなく、その中間の値も最適化に利用したい（ブラックボックス最適化よりも、グレイボックス最適化）という背景がある。
- それによって、テスト関数の作成では、すでにGlobal optimizationで存在するDropwave関数に対して、$x_1$の入力が$x_2$に影響するという問題設定を追加して、２つのノードのあるFunction Networkのテストケースにしたと理解できる。
- （BOFN論文[2]では、この構造は既知として、固定されたものと扱われる。[1]では、このネットワーク構造は未知、または部分的に知られていると仮定される。）

- BOFN論文[2] Figure 2は objective valueとして最大化問題としてのDropwaveの評価回数が増えるにつれて値が増えていくことを図示している。
- そもそも、BOFN論文[2]のFigure 1で問題設定の例が挙げられている。ワクチンの製造工程で既知のFunction Networkに対して、最終的な出力値を最大にする例がある。ここの最終の出力がDropwaveの$f(\boldsymbol{x})$であり、$x_1$は最初の入力、$x_2$は中間の変数と当てはめることができる。最適化として、objective valueの最大化がFigure 2で行われている。これらはあくまでも例であって、最小化をする時も同様だろう。


#### まとめ

:::note info
BOFN論文[2]では、関数ネットワークの単純な例として、Global optimizationですでに知られた二変数のたくさんのlocal optimaがあるが数式がシンプルなDropwave関数を利用し、そこに一つ目の変数が二つ目の変数に影響するというグラフの構造を実験のために仮定した。この関数はベンチマークなので、深掘りするのは本質ではないが、扱いやすい便利なテスト関数であることを理解した。
:::

#### 関数ネットワークのベイズ最適化全般でわからないこと（今後理解したいこと）

引き続き論文 [[2] Bayesian Optimization of Function Networks, Astudillo et al.](https://arxiv.org/abs/2112.15311) を読んで、どのようにガウス過程(GP)が関数ネットワークに適用されていくのかの全体像を把握したい。それができたら、[2]の関数ネットワーク向けに提案された獲得関数EI-FNの数式を詳しくみていきたい。

- Figure 1でEvaluationが進むとはどういうこと？
- Function networkのノードごとに独立してGPをするとある具体的にどういうこと？
- 多分、通常のGPの問題設定と数式について慣れる必要がある？