ランダム探索

ここでは、ランダム探索を行い Himmelblau関数の最小化問題を解析する方法について説明します。 高次元問題など、グリッドサーチなどの他の手法が困難なときに有効な手法です。 ランダム探索はMPI並列化に対応しています。具体的な計算手順は minsearch の場合と同様です。

サンプルファイルの場所

サンプルファイルは sample/analytical/random_search にあります。 フォルダには以下のファイルが格納されています。

  • input.toml

    メインプログラムの入力ファイル

  • plot_colormap_2d.py

    計算結果を可視化するためのプログラム

  • do.sh

    本チュートリアルを一括計算するために準備されたスクリプト

入力ファイルの説明

メインプログラム用の入力ファイル input.toml について説明します。記述方法の詳細については「入力ファイル」の項を参照してください。

[base]
dimension = 2
output_dir = "output"

[solver]
name = "analytical"
function_name = "himmelblau"

[runner]
[runner.log]
interval = 20

[algorithm]
name = "random_search"
seed = 12345

[algorithm.param]
max_list = [6.0, 6.0]
min_list = [-6.0, -6.0]
num_points = 100

[base], [solver], [runner] のセクションについては Nelder-Mead法による探索(minsearch)の場合と同じです。

[algorithm] セクションでは、使用するアルゴリスムとその設定を行います。

  • name は使用するアルゴリズムの名前です。このチュートリアルでは、ランダム探索による解析を行うので、 random_search を指定します。

  • seed はパラメータ生成に用いる疑似乱数のシードを指定します。

[algorithm.param] セクションで探索するパラメータのグリッドを指定します。

  • min_listmax_list はそれぞれ探索範囲の最小値と最大値を指定します。

  • num_points はランダムに生成するパラメータの個数を指定します。

この例では、\(-6.0 \leq x_1 \leq 6.0\), \(-6.0 \leq x_2 \leq 6.0\) の範囲でランダムに100点のパラメータ \((x_1, x_2)\) を生成して関数値を評価します。

計算の実行

最初にサンプルファイルが置いてあるフォルダへ移動します。(以下、ODAT-SEパッケージをダウンロードしたディレクトリの直下にいることを仮定します。)

$ cd sample/analytical/random_search

メインプログラムを実行します。計算時間は通常のPCで数秒程度で終わります。

$ mpiexec -np 4 python3 ../../../src/odatse_main.py input.toml | tee log.txt

ここではプロセス数4のMPI並列を用いた計算を行っています。 実行すると output ディレクトリとその下に各ランクのフォルダが作成され、ランクごとの計算結果が出力されます。 同時に、以下の様な出力が標準出力に書き出されます。

Make ColorMap
Iteration : 1/100
Iteration : 2/100
Iteration : 3/100
Iteration : 4/100
Iteration : 5/100
Iteration : 6/100
Iteration : 7/100
...

x1, x2 にランダムに生成したパラメータと、その時の関数値が出力されます。 最終的にランダムに生成した全ての点で計算された関数値が output/ColorMap.txt に出力されます。 今回の場合は、

5.155393 -2.203493 187.944291
-3.792974 -3.545277 3.179381
0.812700 1.146536 108.254643
5.574174 1.838125 483.841834
2.986880 1.842838 0.436331
2.972578 5.535681 719.799258
-5.899340 -4.722667 452.469102
-2.415555 1.876934 45.535582
3.717751 4.466111 330.797237
5.575771 2.684224 552.047948
...

のような結果が得られ、 1列目、2列目に x1, x2 の値、3列目に関数値が記載されます。

計算結果の可視化

ColorMap.txt を図示することで、関数の値が小さいパラメータがどこにあるかを推定することができます。そのような 2次元パラメータ空間のプロットを作成するプログラムが plot_colormap_2d.py に用意されています。

$ python3 plot_colormap_2d.py

上記を実行すると ColorMapFig.png が作成され、Himmelblau関数の関数値を表す等高線の上に、各点で評価した関数値がカラーマップとしてプロットされます。

../_images/res_random_search.png

ランダム探索における2次元パラメータ空間上での関数値のカラーマップ。