Edited at

ニューラルネットの重みを実数値遺伝的アルゴリズムで最適化してみる ~その1:関数近似~


はじめに

前回の記事では、実数値遺伝的アルゴリズム(以下、実数値GA)を用いて大域的最適解の探索を行いました。

ディープラーニングの重み最適化手法としては誤差逆伝搬法(BP法)が主流ですが、時代に逆行して?(※)ニューラルネットの重みを実数値GAで最適化してみます(以下、NNGA(たぶん正式名称ではない))。

今回のお題は、NNGAがちゃんと実装されているか確認する意味で関数近似です。

※そもそもBP法だと局所解にはまりやすいので、NNGAなどの色々なニューラルネット重み最適化手法が生まれたのですが、BP法も改良されてそこに落ち着いたみたいですね。

[2019/8/21追記] 正式名称は、Neuroevolutionらしいです。いつの間にか、こんなかっこいい名前が付いていた:clap:


関数近似

近似する関数は2次元のRosenBrock関数です。

RosenBrock関数の特徴。

- 単峰性関数

- 探索範囲:-2.048~2.048

- 大域的最適解 : =0 、(x[i] = 1)

- 数式 : ニューラルネットの重みを大きくしなくてもすむように、通常のRosenBrockを3500で割っています。

f(x_{1} \cdots x_{n-1})=\sum_{i=1}^{n}(100(x_{i+1}-x_{i}^2)^2+(x_{i}-1)^2) / 3500


  • 2次元のグラフ

NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_3DCorrect.png


ニューラルネットの構成

3層のニューラルネットを用いました。

- 入力層 :2ニューロン

- 隠れ層 :10ニューロン (活性化関数:シグモイド関数)

- 出力層 :1ニューロン (活性化関数:なし)

ニューラルネット2.JPG


実数値GAの構成


  • 世代交代モデル:MGG


    • 世代交代数:2個体(エリート選択:1個体、ルーレット選択:1個体)

    • 致死個体(任意のパラメータが探索範囲を超えた個体) への対応:評価対象から外す



  • 交叉法:UNDX (α=0.5、β=0.35)

  • 学習パラメータ


    • 最大世代数:5000世代

    • 集団数:50個体

    • 生成子個体数: 100個体/世代



  • 各世代での入力サンプリング数:RosenBrock関数の探索範囲の中から各世代ランダムで50点選択

  • 損失関数(=GAの適合度):2乗和誤差。サンプリング数50個の和になります。

E = \frac{1}{2} \sum_{k=1}^{50} (y_k - t_k)^2

$y_k$:ニューラルネットワークの出力、$t_k$:訓練データ(サンプリングした点をRosenBrock関数の入力としたときの出力)です。


学習結果

0世代の近似グラフ
5000世代の近似グラフ
適合度遷移

NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_sig_3D_0世代.png
NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_sig_3D.png
NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_sig.png

$x[0]=-2,x[1]=-2やx[0]=2,y[1]=-2$付近では正解から0.6程度ずれてしまっていますが、全体的な関数の形状は実際のRosenBrock関数に近い形になっているのではないでしょうか。


補足

隠れ層の活性化関数をシグモイド関数からReLU関数に変えた場合は、以下のようになります。

適合度はシグモイド関数より良好な結果ですが、平らでこれじゃない感が。。。

ReLU関数は$x>=0$だけで見れば、線形なので層が少ないと表現能力が低いかな?

0世代の近似グラフ
5000世代の近似グラフ
適合度遷移

NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0102_ReLU_3D_0世代.png
NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0102_ReLU_3D.png
NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0102_ReLU.png


次回予告

モデルを強化学習にも適用できるのがNNGAのいいところ!ということで、倒立振子に挑戦してみたいと思います。