社畜エンジニア発掘戦線

駆けだしAIエンジニア

MNIST画像認識のNN正解率の検討

おつかれさまです。

入力と出力のみから構成されるシンプルなニューラルネットワーク、そしてそれに隠れ層を追加したニューラルネットワークで正解率の比較を行いました。しかしながら、結果は同じくらいの正解率にとどまり、あまり違いが見れませんでした。

シンプルニューラルネットワーク:86.64 %
隠れ層追加ニューラルネットワーク:87.08 %

ただ、学習経過のグラフを確認すると、もっとイテレーションを回すことでまだまだ正解率が上昇しそうな傾向が見られました。この検証はイテレーション回数を3000回でトライしたので、学習がまだまだ足りなかった可能性が考えられます。

f:id:sutokun:20190401024045p:plain:w500
シンプルニューラルネットワークの学習グラフ
f:id:sutokun:20190417102000p:plain:w500
隠れ層追加ニューラルネットワークの学習グラフ

とりあえず、単純にイテレーション回数を増加させてみるとどうなるのか確認してみたいと思います。

イテレーション回数の検証

これまでに作った2つのプログラムをくっつけてみます。これで同じ初期パラメータ、バッチ画像となるようにして、2つのニューラルネットワークを比較させてみました。

イテレーション回数は2000回〜500000回で適当に振り分けてみました。ちなみに、このときの学習率は0.001です。

こちらがその結果、左側が2000回のグラフで、右側が500000のグラフです。赤色が「シンプルニューラルネットワーク」、青色が「隠れ層追加ニューラルネットワーク」になります。

f:id:sutokun:20190504105957p:plain:w400f:id:sutokun:20190504110017p:plain:w400

2000回のグラフは、まあ見たことあるわって感じですが、500000のグラフはなんじゃこりゃってなりますね。赤色の正解率は完全に飽和してしまっていますが、青色のグラフは、文字通り「青天井」でどんどん上がっています。何なら100%超えとるやんけ。

2000〜500000の間をアニメ化してみます、まぁ特に深い意味はないですが、隠れ層の正解率がぶりぶり上昇しているのが分かります。

f:id:sutokun:20190504110635g:plain:w400


ではそれぞれの学習で得たパラメータ(WとB)を使ってテスト画像で正解率を求めてみます。…これは気が遠くなる作業でした、まぁプログラムでだいたい自動化してたので待つだけでしたが。さすがに500000の計算は時間がかかった、一晩中CPUをあっちっちで走らせて計算させました(GPU使えたら楽になるんかなぁ、と初めて実感)。

こちらがその結果、

f:id:sutokun:20190504111853p:plain:w400

これは分かりやすい結果が得られました、この結果から得られる情報は以下の通り。

・ 訓練では青天井で正解率が上昇していますが、テスト結果では飽和します。
・ 赤グラフは92%ほどで飽和しているのに対して、青グラフは96%まで上昇して飽和しています。
・ 学習結果は100000〜150000回で飽和します。

やっぱり学習回数を増やせば結果は上昇するんですね、86%程度でわーいって言ってた頃が私にもありますた。

学習率の検証

正解率が飽和することが分かってくると、「じゃあさっさと飽和してくれよ、時間かかりすぎるんだよ」と思うのが世の常です。短い時間で学習を終えようとするなら、とりあえず学習率を上げてみることにします。最初のトライは学習率が0.001だったので、0.002で同じように計算してみます。

こちらがその結果、

f:id:sutokun:20190504114307p:plain:w400

おお、正解率は変わりませんが、なんだか飽和が早くなった気がします。このまま学習率を上げていってみましょう。めっちゃ時間かかるので、イテレーション回数は200000回にしています。

f:id:sutokun:20190504115109p:plain:w400
学習率:0.003
f:id:sutokun:20190504115149p:plain:w400
学習率:0.005
f:id:sutokun:20190504115222p:plain:w400
学習率:0.01

学習率を0.01まで上げると形が崩れてき始めているので、このあたりが限度なんですかね。
(もっと突っ込んで調べてみてもいいんですが、計算に時間がかかりすぎるんでこのあたりにしておきます)

まとめ

今回の検証で、最初に行ったテストは全然学習が足りていないことが分かりました。最終的な正解率は、シンプルニューラルネットワークだと約92%、隠れ層を追加すると96%まで上昇するようです、これってもうほとんど人間やんけ、ディープラーニングすげーな。

あとは、学習率を最適化することで、飽和する正解率に到達するまでの時間も短縮できることが分かりました。学習時間を短縮する他のアイディアとしては、パラメータの更新を勾配法からモーメンタム法などに変更してみるのも効果的かもしれません。またいつかトライしてみたいと思います。

しかしながら、96%を叩き出したこのニューラルネットワークも専門家からするとまだまだのようです。CNNという手法でこの正解率は99%を超えるところまで上昇できるようです。この後、CNNも頑張ってトライしてみよう。


元の記事
週末のディープラーニング - 社畜エンジニア発掘戦線

Twitter
世界の社畜 (@sekai_syachiku) | Twitter