1. SwitchBlade

    Posted

    SwitchBlade
Changes in title
+ニューラルネットの重みを実数値遺伝的アルゴリズムで最適化してみる ~その1:関数近似~
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,82 @@
+
+#はじめに
+[前回の記事](https://qiita.com/SwitchBlade/items/8f07b78f3922607a7ca3)では、**実数値遺伝的アルゴリズム**(以下、実数値GA)を用いて大域的最適解の探索を行いました。
+
+ディープラーニングの重み最適化手法としては誤差逆伝搬法(BP法)が主流ですが、時代に逆行して?(※)**ニューラルネット**の重みを実数値GAで最適化してみます(以下、NNGA(たぶん正式名称ではない))。
+今回のお題は、NNGAがちゃんと実装されているか確認する意味で**関数近似**です。
+
+※そもそもBP法だと局所解にはまりやすいので、NNGAなどの色々なニューラルネット重み最適化手法が生まれたのですが、BP法も改良されてそこに落ち着いたみたいですね。
+
+#関数近似
+近似する関数は2次元のRosenBrock関数です。
+RosenBrock関数の特徴。
+- 単峰性関数
+- 探索範囲:-2.048~2.048
+- 大域的最適解 : =0 、(x[i] = 1)
+- 数式 : ニューラルネットの重みを大きくしなくてもすむように、通常のRosenBrockを3500で割っています。
+
+```math
+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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/c88eb5bd-d4ea-f93b-e377-0d5e3f404589.png)
+
+
+
+
+#ニューラルネットの構成
+3層のニューラルネットを用いました。
+- 入力層 :2ニューロン
+- 隠れ層 :10ニューロン (活性化関数:シグモイド関数)
+- 出力層 :1ニューロン (活性化関数:なし)
+
+![ニューラルネット2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/a6400a15-02fa-e5fb-0d22-7ba4f2c3ef2c.jpeg)
+
+
+
+#実数値GAの構成
+- 世代交代モデル:MGG
+ - 世代交代数:2個体(エリート選択:1個体、ルーレット選択:1個体)
+ - 致死個体(任意のパラメータが探索範囲を超えた個体) への対応:評価対象から外す
+- 交叉法:UNDX (α=0.5、β=0.35)
+- 学習パラメータ
+ - 最大世代数:5000世代
+ - 集団数:50個体
+ - 生成子個体数: 100個体/世代
+- 各世代での入力サンプリング数:RosenBrock関数の探索範囲の中から各世代ランダムで50点選択
+- 損失関数(=GAの適合度):2乗和誤差。サンプリング数50個の和になります。
+
+```math
+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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/d78f694b-049e-a91c-ff6b-b478a50504b2.png)|![NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_sig_3D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/c884315b-d91a-6d20-61c5-b784d686ef9f.png)|![NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0105_sig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/1ef745af-e25b-2310-3620-3d4096073303.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/8da2667e-88e1-b1fd-7cfb-e3cf3a683b05.png)|![NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0102_ReLU_3D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/46b372fe-decf-d128-0a52-fa365527ca97.png)|![NNGA_RosenBrock_L2-[10]-1_S50_g5000_UNDX_20190720_0102_ReLU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/b90787f2-ac42-2b5b-7047-a75781c85f42.png)|
+
+#次回予告
+モデルを機械学習にも適用できるのがNNGAのいいところ!ということで、[倒立振子](https://ja.wikipedia.org/wiki/%E5%80%92%E7%AB%8B%E6%8C%AF%E5%AD%90)に挑戦してみたいと思います。
+
+今のところこんな感じ。
+![simulate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/34f33315-844e-ae2b-48c5-8c285ba59590.gif)
+グルグルしてます(笑)
+
+