GPyとScipyで実装するベイズ最適化 -最適化プロセスの可視化-

2020年1月7日

前回の記事で、

・ベイズ最適化に使用するメソッドの作成
・Ackley関数の最適解を探索していく中で、ガウス過程回帰によってなされている関数推定を可視化

を行いました。

今回は、前回出力した関数推定のヒートマップに、

・今までのデータ点
・ベイズ最適化によって提案された次のデータ点

をプロットし、Ackley関数の最適解の探索がどのように進んでいるのかを可視化します。

可視化には前回と同じくmatplotlibを用います。

予測平均のヒートマップに、探索点のプロットを追加。

・初期点20個。ベイズ最適化のIterationは40回。

・add_scatterという関数を新たに追加。
それまでのデータ点を青色の点、次の提案値を赤色の点としてプロットしています。

出力結果

ベイズ最適化の繰り返しの数に対応した、ヒートマップとプロットが出力されます。

繰り返し二回目だと以下。

右下が小さい(右下に最適解がありそう)ような予測がされており、次の提案値として右下の赤丸が提案されています。

さらに探索を続けて、9回目だと以下。

大まかな関数形が予測されており、真ん中あたりに最適解があると予測しています。

そしてここらへん(9回目以降)から、真ん中あたりを重点的に探索し始めます。

探索の様子をgif画像にする

イテレーションごとの最適化の様子を出力できたので、最適解探索の様子をより見やすくするために、gifにしてやりましょう。

コードは以下。外部ライブラリのpillowを使用します。

・IMAGE_DIRでは、画像を保存した一つ上のディレクトリのパスを保存しておきます。

・.saveで、一枚目の画像にそれ以降の画像を連番で保存しgif化しています。
durationの数値は一枚の画像の表示時間(ミリ秒)。
もっと大きくすれば、より「ゆっくりなgif」になります。

出力結果

・左上に表示されている数字がベイズ最適化の繰り返しの数です。
最初の方はまだ探索されていない端っこの方を調べ、関数形の予測がある程度定まってからは、最適解の存在する(0, 0)付近を重点的に探索しています。

・最後の方は一見同じところを探索しているように見えますが、小数点以下のオーダーで違う位置を探索しています。
gif上でも良く見ると、探索位置や予測分布が微妙に変化しているのが確認できます。

まとめ

今回は、ベイズ最適化による最適解の探索の様子を可視化しました。
次回は、「EI以外の獲得関数を用いた最適化」か「ベイズ最適化の各イテレーションにおける獲得関数の可視化」を行いたいと思います。

では。

(コードが動かない・コードがおかしい・コードのここが分からない等ありましたら、コメントお願いします。)

↓1日1タップで応援よろしくお願いします!

にほんブログ村 にほんブログ村へ

Python

Posted by arabica