ベイズ最適化 bayes

bayes はベイズ最適化を用いてパラメータ探索を行う Algorithm です。

実装には PHYSBO を用いています。

前準備

あらかじめ PHYSBO をインストールしておく必要があります。:

python3 -m pip install physbo

mpi4py がインストールされている場合、 MPI 並列計算が可能です。

入力パラメータ

[algorithmparam] セクション

探索パラメータ空間を定義します。

mesh_path が定義されている場合はメッシュファイルから読み込みます。 メッシュファイルは1行がパラメータ空間中の1点を意味しており、 1列目がデータ番号で、2列目以降が各次元の座標です。

mesh_path が定義されていない場合は、 min_list, max_list, num_list を用いて、 各パラメータについて等間隔なグリッドを作成します。

  • mesh_path

    形式: string型

    説明: メッシュデータの情報が記載された参照用ファイルへのパス。

  • min_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータが取りうる最小値。

  • max_list

    形式: 実数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータが取りうる最大値。

  • num_list

    形式: 整数型のリスト。長さはdimensionの値と一致させます。

    説明: パラメータが取りうる数。

[algorithm.bayes] セクション

手法のハイパーパラメータを定義します。

  • random_max_num_probes

    形式: int型 (default: 20)

    説明: ベイズ最適化を行う前に行うランダムサンプリングの回数(パラメータとスコアが初めに無い場合にはランダムサンプリングは必須)。

  • bayes_max_num_probes

    形式: int型 (default: 40)

    説明: ベイズ最適化を行う回数。

  • score

    形式: string型 (default: TS )

    説明: スコア関数を指定するパラメータ。 EI, PI, TS より選択可能で、それぞれ "expected improvement", "probability of improvement", "Thompson sampling" を行う。

  • interval

    形式: int型 (default: 5)

    説明: 指定したインターバルごとに、ハイパーパラメータを学習します。負の値を指定すると、ハイパーパラメータの学習は行われません。 0を指定すると、ハイパーパラメータの学習は最初のステップでのみ行われます。

  • num_rand_basis

    形式: int型 (default: 5000)

    説明: 基底関数の数。0を指定した場合、Bayesian linear modelを利用しない通常のガウシアンプロセスが行われます。

アルゴリズム補助ファイル

メッシュ定義ファイル

本ファイルで探索するグリッド空間を定義します。 1列目にメッシュのインデックス、 2列目以降は [solver.param] セクションにある、 string_list で定義された変数に入る値が入ります。

以下、サンプルを記載します。

1 6.000000 6.000000
2 6.000000 5.750000
3 6.000000 5.500000
4 6.000000 5.250000
5 6.000000 5.000000
6 6.000000 4.750000
7 6.000000 4.500000
8 6.000000 4.250000
9 6.000000 4.000000
...

出力ファイル

BayesData.txt

最適化過程の各ステップにおいて、 パラメータと対応する目的関数の値が、 これまでの最適パラメータとそのステップで探索したパラメータの順に記載されます。

#step z1 z2 R-factor z1_action z2_action R-factor_action
0 4.75 4.5 0.05141906746102885 4.75 4.5 0.05141906746102885
1 4.75 4.5 0.05141906746102885 6.0 4.75 0.06591878368102033
2 5.5 4.25 0.04380131351780189 5.5 4.25 0.04380131351780189
3 5.0 4.25 0.02312528177606794 5.0 4.25 0.02312528177606794
...

アルゴリズム解説

ベイズ最適化 (Bayesian optimization, BO) は、機械学習を援用した最適化アルゴリズムであり、特に目的関数の評価に時間がかかるときに強力な手法です。

BO では目的関数 \(f(\vec{x})\) を、評価が早く最適化のしやすいモデル関数(多くの場合ガウス過程) \(g(\vec{x})\) で近似します。 \(g\) は、あらかじめ適当に決められたいくつかの点(訓練データセット) \(\{\vec{x}_i\}_{i=1}^N\) での目的関数の値 \(\{f(\vec{x}_i)\}_{i=1}^N\) をよく再現するように訓練されます。 パラメータ空間の各点において、訓練された \(g(\vec{x})\) の値の期待値およびその誤差から求められる「スコア」 (acquition function) が最適になるような点 \(\vec{x}_{N+1}\) を次の計算候補点として提案します。 \(f(\vec{x}_{N+1})\) を評価し、 訓練データセットに追加、 \(g\) を再訓練します。 こうした探索を適当な回数繰り返した後、目的関数の値が最も良かったものを最適解として返します。

少ない誤差でより良い期待値を与える点は、正解である可能性こそ高いですが、すでに十分な情報があると考えられるので、モデル関数の精度向上にはあまり寄与しません。 逆に、誤差の大きな点は正解ではないかもしれませんが、情報の少ない場所であり、モデル関数の更新には有益だと考えられます。 前者を選ぶことを「活用」、後者を選ぶことを「探索」とよび、両者をバランス良く行うのが重要です。 「スコア」の定義はこれらをどう選ぶかを定めます。

2DMAT では、ベイズ最適化のライブラリとして、 PHYSBO を用います。 PHYSBO は mapper_mpi のように、あらかじめ決めておいた候補点の集合に対して「スコア」を計算して、最適解を提案します。 候補点の集合を分割することでMPI 並列実行が可能です。 また、 訓練データの点数 \(N\) に対して線形の計算量でモデル関数の評価、ひいては「スコア」の計算が可能となるようなカーネルを用いています。 PHYSBO では「スコア」関数として "expected improvement (EI)", "probability of improvement (PI)", "Thompson sampling (TS)" が利用できます。