【Chainer基礎おまけ】ステップ関数ディープラーニングを改造してより深く理解してみよう。

【Chainer基礎おまけ】ステップ関数ディープラーニングを改造してより深く理解してみよう。

突如インポートエラーが出たおかげで、書いたコードが実行できなくなり、調査しても原因が特定できなかったので、Anaconda3を再インストールしてきました。アイーンです。

人工知能開発の終焉かと思いました。危なかった。

 

前回の記事「15分で組んでみよう。はじめてのChainerを解説」は読んでいただけましたか?

前回書いたコードの結果を見て、私はある疑問が浮かびました。

「10万回もやってんのに、全然キレイなグラフになってねぇじゃん」

ならば改造してみましょう。

どうすれば効率よく、キレイな学習結果を出せるんだろう。

この疑問を解決してみたいと思います。

 

今回使うコードは、下に表示した前回の記事から持ってきてください。

また、前回の記事をお読みでない方は、ぜひご笑納ください。

 

【Chainer基礎最終】15分で組んでみよう。はじめてのChainerを解説

それではいってみましょ~

まずはどこからいじってみようかなぁ~

 

いじってみた:10万回から15万回に学習回数を増やす

まずは単純に実行回数を増やせば、キレイなステップ関数が作られるのではないかという疑問です。

38行目のコードを10万から15万に書き換えて実行してみます。

改造前:

for i in range(150000):  

改造後:

for i in range(150000): 

さて、結果の表示です。

前回のLastである10万回目から表示します。(1~9万回目まで結果は同じでした)

なんかちゃぶついてんな~

回数を単純に増やすだけでは、いい結果が得られないということでしょうか。

時間もかかるし、コレジャナイ感がすごい。

 

いじってみた:optimizersをAdamからSGDへ変更

最適化の方法をいじれば、得られる結果も変わるでしょうよ。

なんかいっぱい種類あるみたいですけど、俺が知ってるのはSGDとAdamくらいなので、知ってるもんに変更して10万回学習させてみたいと思います。

33行目のAdam()をSGD()に変更しました。

改造前:

改造前 opt = chainer.optimizers.Adam()

改造後:

改造後 opt = chainer.optimizers.SGD()

いってみよ~

 

 

大差がないため大幅カット

ひっどい・・・ちゃぶつきどころかダッルンダルン。

Adamがいかに効率よく学習してくれるかよくわかりました。

 

SGD(確率的降下勾配法)の欠点は、関数の形状が等方向でないと非効率な経路で探索するとのことです。

曲がったグラフには対応しきれませんってか、使えんヤツめ。

スグにAdamに戻しました。

 

いじってみた:ニューラルネットワークを1層増やしてみた。

ここまで結果が振るわないので、なんとかいい結果を出したい。

なら層を増やしてみたらどうでしょうか。

そんなわけで、中間層を1層増やしてみましょう。

現在は1-10-1の3層で動かしてます。

これを1-10-5-1の4層にしてみたらどうなるでしょう。

ちなみに、3層目を5個にした理由は野生の勘(てきとう)です。

改造前:

class chain1(Chain):
    def __init__(self):
        super(chain1, self).__init__(
            l1=L.Linear(1, 10),
            l2=L.Linear(10, 1),
        )

    def predict(self, x):
        h1 = F.sigmoid(self.l1(x))
        return self.l2(h1)

改造後:

class chain1(Chain):
    def __init__(self):
        super(chain1, self).__init__(
            l1=L.Linear(1, 10),
            l2=L.Linear(10, 5),
            l3=L.Linear(5, 1)
        )

    def predict(self, x):
        h1 = F.sigmoid(self.l1(x))
        h2 = F.sigmoid(self.l2(h1))
        h3 = self.l3(h2)
        return h3

うおっ!早くね?

 

2万回で9万回目くらいと同じ結果に見える。

10万回も必要?これ。

もう学習終われるよ?

これもうパーフェクトでしょ。ゆるぎなくパーフェクトでしょ。

4万回目と変わらんし。

層の力ぱねぇ。どうしてこうなるのかハッキリとは分からんが層すげぇ。

 

まとめ:

手っ取り早くいい結果を求めるには、層を増やすべき

 

分かりやすい結果でよかったです。

まぁ、教師なし学習など難しい問題を解く際には一概にそうとは言えないんでしょうけど、なかなか面白い実験だったと思います。

 

これで貴方の肩書は「とりあえず層を増やすヤツ」です。

クロワッサンを焼くときに重宝されます。

それでは。