【BOXVIA】ベイズ最適化用GUIアプリケーション【フリーソフト】

## 本記事の内容
[ベイズ最適化用のGUIアプリケーションBOXVIA](https://yamanaka-lab-tuat.github.io/BOXVIA/) (**B**ayesian **O**ptimization E**X**cutable and **VI**sualizable **A**pplication) を開発しました。
本記事では、ベイズ最適化の実行と得られる結果の可視化を**プログラミングなし**に行うことができるBOXVIAの使い方と機能を説明します。

このアプリは，主に次にような人向けです。
・ベイズ最適化を使ってみたいと思いつつも，計算機環境の構築やプログラミングの必要性から躊躇している人
・ベイズ最適化を行って出力された結果の可視化に悩んでいる人
・理論の詳細はさておき、とりあえずベイズ最適化を実行してみたい人

本記事では、ベイズ最適化についての詳しい理論については説明しません。わかりやすくまとめられているQiitaの解説記事も既に多数存在するので、そのうちいくつかを挙げておきます。

【参考記事】
[ベイズ最適化入門](https://qiita.com/masasora/items/cc2f10cb79f8c0a6bbaa)
[ベイズ最適化でハイパーパラメータを調整する](https://qiita.com/Mopepe51/items/dbfc36321e824f0eb654)
[ベイズ最適化に関するまとめ](https://qiita.com/Bell-frontier/items/bf6425e40b0f9273cb12)


また、BOXVIAについての論文も既に出版されていますので、参考にしてください。
["BOXVIA: Bayesian optimization executable and visualizable application", SoftwareX, Vol. 18 (2022/6), 101019.](https://www.sciencedirect.com/science/article/pii/S2352711022000243?via%3Dihub) （オープンアクセス）


## BOXVIAのダウンロードと起動
BOXVIAは基本的にはOSを問わず，Windows, MaxOS, Linuxのいずれでも動作します。
必要なものは，**Webブラウザだけ**です。
つまり今パソコンでこの記事を見ている方は誰でも使うことができます。
パソコンにPythonの環境構築を行う必要はなく，他ライブラリ等のインストール作業も不要です。
(BOXVIAのソースコードは公開しているので，Python環境を整えて動作させることも可能です。)

[BOXVIAのホームページ](https://yamanaka-lab-tuat.github.io/BOXVIA/)に移動し，
「Download an executable application」にあるReleasesをクリックします。
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/7b7b1529-682b-48ec-ed5b-a19fa593604c.png)

すると，GiuHubのリリースページに移動するので，
使用するパソコンのOSの名前が付いたファイルをダウンロードしてください。
![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/10e243c8-205e-2f06-64a0-08dd834a54dd.png)

BOXVIAの基本的な使い方はOSによって変わりませんので,
これ以降は，Windows版を例として説明します。
ダウンロードしたファイルを解凍し，その中の「BOXVIA」フォルダを開きます。
Windows版の場合，このフォルダには以下の画像のように多くのファイルが入っていますが，
その中の「BOXVIA.exe」をダブルクリックすることでアプリケーションが起動します。
(初回起動時には，起動まで少し時間がかかる場合もあります。)
![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/6d254879-c97a-a10b-5a32-9f6fee750af6.png)

なお，Linux版では実行用ファイルは「BOXVIA」という名前となっています。
MacOS版では，解凍ファイル直下に存在する「BOXVIA.app」をダブルクリックしてください。
起動すると、以下のような画面が出てきます。
![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/2a668644-f3f6-7b3e-a714-2d9a82b2a6a3.png)

## 最適化するデータセットの準備
次に、最適化を実行するための事前情報となるデータセットを準備します。
以下の図は、さきほどダウンロードしたファイルに含まれているサンプルファイルを示しています。
![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/9c6dddfc-d798-2ae5-4dd9-de9b3918e984.png)

データセットはCSV形式のファイルとして用意します。
1行目には各パラメータの名称を設定してください。
最適化する入力パラメータ（画像ではx1～x5）を左から順に並べ、
入力パラメータに対応する出力値（画像ではy）を右端の列に書き込みます。
BOXVIAでは、最適化する入力パラメータの数は20個まで対応しています。
また、データセットに含めることのできるデータ数に制限はありません。

## 最適化の実行
起動画面にあるImport dataの枠に、準備したCSVファイルをドラッグ＆ドロップすることで
データセットを読み込むことができます。
正しく読み込まれると、画像のようにCSVファイルの中身が表として表示されます。
表の右上のExportボタンを押せば表をCSVファイルとしてダウンロードできます。
また、右下のDelete bottom dataボタンを押せば、一番下の行を表から消すことができます。
（読み込んだCSVファイルは変わりません）
これらのボタンがなぜついているかは、後述します。
![fig6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/e4e47a39-1c51-4b46-0466-2ac44f354046.png)

表の下には、画像のようにUIが表示されます。
ここで、ベイズ最適化で用いる各種の設定を行います。
![fig7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/49e451c6-d2c3-4e6c-3167-63419c91c2db.png)

設定項目の詳細は以下の通りです。
**・Batch size** - ベイズ最適化によって一度に提案される候補点の数。
**・Aquisition type** - 獲得関数の種類。ベイズ最適化のための代表的な獲得関数である期待値改善率(EI)と下限信頼区間(LCB)の2種類が使用できます。
**・Jitter (またはWeight)** - ベイズ最適化の、局所最適化（活用）と大域探索（探索）のトレードオフの度合いを決定するパラメータ。値が小さいほど活用を重視します。デフォルトでは、EIの場合Jitter = 0.01、LCBの場合Weight = 2です。
**・Kernel function** - カーネル関数の種類。複数の種類を用意していますが、デフォルトでは比較的よく使用されるMatérn5/2が選択されています。
**・Maximize** - 最大化問題の設定。デフォルトでは最小化問題を扱うため、最大化問題を扱いたい場合はチェックを入れてください。
**・Noiseless** - ノイズレス評価の設定。データセットに含まれるデータを誤差のないものとして行う場合にはチェックを入れてください。
**・Avoid re-evaluating** - 再評価の回避設定。データセットに含まれるパラメータの組み合わせと全く同じ場所が提案されることを防ぐ場合にはチェックを入れてください。
**・Constraints** - 制約条件の設定。最適化するパラメータに制約を課す場合には、テキストエリアにPython演算子を使用して、左辺が0以下となるように記述してください（例: x1 >= x2の制約を課す場合は、テキストエリアに「-x1 + x2」と記述する）。改行することで、複数の制約を課すことも可能です。なお、その下の各軸の設定にあるオレンジ色のAddボタンを押せば、軸の名前がテキストエリアに挿入されます。
**・Range** - 提案されるパラメータの範囲。入力した後、Saveボタンを押せば、範囲設定が保存されます。Loadを押すことで保存した範囲設定を呼び出すことが可能です。
**・Type** - 提案されるパラメータが連続的か離散的か。離散的の場合にはその刻み幅も入力してください。

以上の条件を設定し、Run Bayesian Optimizationボタンを押せば、ベイズ最適化が実行されます。
獲得関数の種類、活用と探索のトレードオフ、カーネル関数の設定は、はじめはデフォルト設定のままで問題ありません。

最適化の実行が完了すると、ベイズ最適化で提案されたパラメータが表に表示されます。
![fig8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/d2aa5792-e2ff-cd58-43ee-c7229d9913b7.png)

この表も、右上のExportボタンを押せば表をCSVファイルとしてダウンロードできます。
また、表に出力値を直接書き込むこともでき、さらに右下のボタンを押せば読み込んだデータセットの表の最後尾にこのデータを追加することもできます（そのため、前述のように、読み込んだデータセットの表には一番下の行を消す機能が付いていました）。
入力パラメータに対応する出力値がすぐに得られる場合には、ここでデータセットに新たなデータを追加し、再度Run Bayesian Optimizationボタンを押すことで反復して最適化を行うことができます。

なお、ベイズ最適化の計算自体には、ベイズ最適化用Pythonライブラリの[GPyOpt](https://github.com/SheffieldML/GPyOpt)を使用しています。そのため出力される最適化計算結果は、GPyOptを使用した際に得られる結果と同じものです。

【参考】
[Pythonでベイズ最適化を行うパッケージ GPyOpt](https://qiita.com/marshi/items/51b82a7b990d51bd98cd)

## 最適化結果を可視化する
さて、ベイズ最適化によって入力となるパラメータの候補点を得ることができましたが、この提案点がどのような計算を経て出てきたか、ということを知りたい場合もあると思います。
BOXVIAは計算結果を可視化できるため、候補点がどのように提案されたか、ということを一目で理解できます。

以下の図は、最適化する入力パラメータが1つの場合の最適化（最小化）計算の可視化結果です。
入力となるパラメータが1つの場合は、Run Bayesian Optimizationボタンを押すと自動でこの図が表示されます。
ガウス過程回帰によって計算された平均関数と標準偏差が緑の線とピンクの領域でそれぞれ表されています。
また、平均関数と標準偏差から計算された獲得関数と、その最大値が赤い線で示されています。
このように可視化することで、ベイズ最適化で得られた候補点が、どのように提案されたかを理解することができます。
このグラフは、グラフ右上にあるカメラのマークをクリックすることでダウンロードできます。
また、これらの関数についての生データを、Export graph dataボタンを押すことでダウンロードすることもできます。
![fig9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/5f575748-a7d5-c90c-e2ee-8d96e3370f00.png)

最適化する入力パラメータが2つの場合には、以下の図のような2次元グラフが表示されます。
この例では、x1とx2が、半径3の円の中から提案されるよう制約条件を課しています。
![fig10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/59614601-69d3-872d-942b-836983e07497.png)
左上の3D surfaceスイッチを切り替えれば、値の大小関係をより直感的に見ることがてきるSerfaceグラフとして表示することも可能です。
![fig11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/4ab8c197-8e36-dadd-1442-bcbc1b1c1baf.png)

最適化する入力パラメータが3つ以上の場合は、手動で可視化の設定を行います。
以下の図は、入力パラメータが5つの場合の可視化例です。
![fig12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/f023d215-d249-78d7-3a14-1bdc3578d5fa.png)
Display axisで3次元グラフを構成する3つの軸を選び、Display axis typeで表示する関数の種類を選択します。
また、3次元グラフの断面を見ることもでき、断面の向きをDisplay 2D planeで選ぶことができます。
これらの設定を行い、Make/Reload graphボタンを押せば、グラフが表示されます。
グラフの下には、いくつかのスライダーが表示されます。
![fig13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/916aa1f2-5c26-144a-dcdf-4ea935107e44.png)
1番上のスライダーは、2D断面の位置を指定します。
2番目のスライダーはカラーバーの範囲を設定します。
3番目以降のスライダーは、Display axisで選択されなかった軸の値を設定します。
これらのスライダーを適宜調整することで、多次元空間の中の確認したい位置を可視化することができます。
以下の図は、提案された候補点が存在する空間での平均関数を可視化した結果です。
![fig14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348972/ca7c0a52-5cb7-c303-cb64-1863d9b91685.png)

注意点として、入力パラメータが増えるほど、可視化のための計算時間が長くなります。
そのため現状では、実用的な計算コストで可視化できるのは、入力パラメータの数が5つ程度までです。
また、3Dグラフは数値の分布を確認することを重視しているため、グラフに表示される値と、実際の最適化計算過程で使用された値は差があります（Resolutionを大きくすれば精度は上がりますが、計算時間は長くなります）。

## おわりに
BOXVIAは手軽にベイズ最適化を使用するための強力なツールとなると思います。
が、まだまだ発展途上の部分も多く残ります。
この記事を読んでもし興味を持っていただけましたら、使用した感想やバグ報告・改善要望などコメントいただければ幸いです。