機械学習で回帰した2つの応答曲面を多目的最適化で探査してみた

  • このエントリーをはてなブックマークに追加

単一の応答曲面上を遺伝的アルゴリズムで探査するコードを書いたので、次はトレードオフ関係を持つ2つの応答曲面間の多目的最適化に挑戦します。ここではPyTorchによる応答曲面の作成からPlatypusによる多目的最適化、結果の可視化まで全てPythonで書いた内容を紹介します。

こんにちは。wat(@watlablog)です。ここでは機械学習によって得られた2つの応答曲面間で多目的最適化をやってみます

応答曲面とは?

応答曲面とは、何かしらのシステム(シミュレーションモデルや実験)の応答値によって構築された曲面です。

設計変数を駆動させてシステムの応答を取り、すき間を補間してモデルを作成します。実現象が複雑な場合は応答曲面を作る事自体にも難しさがあります。

応答曲面の例
参考:応答曲面の例

応答を得るには時間がかかるシステムでも一度事前に応答曲面を作っておけば、その後の探査が高速で実行できるというメリットがあります。

探査の例
参考:応答曲面上の探査の例

応答曲面の概要や単一の応答曲面上の最適化については「1つの応答曲面を遺伝的アルゴリズムで探査するPythonコード例」に詳細を記載しましたので、是非こちらの記事をご覧ください。

多目的最適化とは?

世の中は多目的最適化問題で溢れています。例えば以下の図は、設計変数\(x_{1}, x_{2}\)が取り得る範囲で特性値をプロットした例を示しています。

通常、何かを設計する時は単一の特性値だけを目的にするのではなく、複数の特性が同時に要件を満たすように調整を行います(性能、コスト、デザイン性…等)。

考慮する特性が多ければ多いほどその設計は難解な物になり、このような問題を最適化する事を多目的最適化と呼びます。

多目的問題の例

多目的最適化で複数の目的関数の最小化や最大化を行う事で、パレート解を得る事ができます。これらの用語は「Platypusで多目的最適化からパレートフロントを求める方法」で解説していますので、是非こちらも併せて参考にしてください。

多目的最適化の例
参考:多目的最適化の例

複数の応答曲面間で多目的最適化を行うPythonコード

問題設定

ここでは2つの応答曲面を構築して多目的最適化を行います。

一つ目の関数は式(1)で示すFive-Well Potential Functionです。

\[ \begin{eqnarray} f(x, y)=(1 &-& \frac{1}{1+0.05(x^{2}+(y-10)^{2})} \\ &-& \frac{1}{1+0.05((x-10)^{2}+y^{2})} \\ &-& \frac{1.5}{1+0.03((x+10)^{2}+y^{2})}\\ &-& \frac{2}{1+0.05((x-5)^{2}+(y+10)^{2})}\\ &-& \frac{1}{1+0.1((x+5)^{2}+(y+10)^{2})})(1 + 0.0001(x^{2}+y^{2})^{1.2}) \end{eqnarray} \tag{1} \]

複雑な式の通り、以下のような多峰な形状をしています。

Five-Well potential function

2つ目は式(2)に示すEggholder functionです。

\[ f(x, y) = -(y+47)\sin(\sqrt{|y+\frac{x}{2}+47|}) - x\sin{(\sqrt{|x-(y+47)|})} \tag{2} \]

こちらは絶対値とかも入っているからか、結構ギザギザ(コード間違ったかな?)。

eggholder functionの例

応答曲面モデルを作るコード(PyTorch)

これらの関数をただ多目的最適化にかけたい場合は、特に機械学習で回帰を行う必要もなく、単純に数式をモデルとして扱えば良いのですが、PyTorchとの連携を練習したいがためにあえてニューラルネットワークによるトレーニングを行います。

PyTorchによる学習モデルを使って探査ができるようになると、色々役立ちそうです。

Five-Well Potential functionのトレーニングコード

PyTorchで色々な非線形関数を回帰してみたらすごかった」で紹介した方法を使って作成する回帰モデルを応答曲面モデルとしています。ここでは動画の作成も一緒にやっているので、ちょっと動作は遅いです。気になる方は動画作成部分を削除したりコメントアウトしたりする事をおすすめします。

動画はこちら。10000iterationの学習をしています。

応答曲面モデルはmodel-A.ptというファイルで保存されます。

Five-well functionの応答曲面

Eggholder functionのトレーニングコード

コードはほぼ同じですが、こちらの関数の方が複雑なため中間層の数を増やし、RMSPropの学習率も調整しています。

以下が学習中の動画です。色々調整しましたがあまり誤差関数が低くなりませんね…。今回は凹凸があれば良いというレベルなのでこのまま使います(難しい!)。

応答曲面はmodel-B.ptというファイルに保存されます。

Eggholder functionの応答曲面

多目的最適化を行うコード(Platypus)

以下が多目的最適化を行うコードです。「Platypusで多目的最適化からパレートフロントを求める方法」で紹介したコードで最適化問題の設定を行い、目的関数objectiveの部分で「1つの応答曲面を遺伝的アルゴリズムで探査するPythonコード例」で紹介したモデル記法を使っている構造です。

以下は目的関数1(Five-Well Potential function)を横軸、目的関数2(Eggholder function)を縦軸にとった時の実現可能解(グレー)とパレート解(黄)をプロットした結果です。一応解が出てきました。

最適化結果

まとめ

この記事ではこれまで学んだニューラルネットワークによる回帰モデル生成、モデルのファイル保存と読み出し、遺伝的アルゴリズムによる多目的最適化、パレート解のプロット…を総動員した内容になりました(ちょっとごちゃごちゃした内容になってしまいました💦)。

ここまでの内容で、データ点からモデルを作ってその曲面上を探査する方法は大分わかってきたのではないかと思います。

本日はモデル生成、最小値探査、プロットと一連の応用記事となりました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*