深層学習作りたい その2: 1ヶ月かかってやっと3層ニューラルネットワークができた
ディープラーニング制作日記その2です。
あらすじ
10月ごろに、大学で深層学習のプログラムを作る課題を出され、何を血迷ったか挑戦してみることにしました。深層学習っていう本をひたすら読んでやっとのこと理解したつもりになって、さあいざ画像認識プログラムを作ろうとしたのですが、まともに動かなくて絶望の淵に追いやられました。
いくら学習データを与えても認識してくれなくて、間違えている部分を探そうとしたのだけどプログラムが大規模すぎてどこが間違っているのか分かりませんでした。もう、打つ手なし。諦ようと思ったのですが、、、
アイリスデータへの挑戦
試しに今日、もっと簡単なプログラムを書いてみることにしました。
アイリスデータっていう有名なデータセットを用いてアイリスを見分けるっていう、HelloWorld的な問題です。
最初はうまく動かなかったのですが、今回はプログラムが短いのでどこがおかしいのか把握しやすくなりました。
結局問題点を二つ見つけられました。
・データの前処理
・学習係数の調整
の2点です。
データの前処理っていうのは、0から1までの間に全ての数値を前もって収めておく処理です。これをやるだけで、順伝播の際に全てのシナプスが反応しなくなるっていうことがなくなりました。
学習係数の調整っていうのは、1ステップあたりにどれくらい学習を進めるかを決める調整です。大きくすればするほどいいように感じますが、大きくしすぎると振り切れてうまく学習できません。例えるならば、スピードが速すぎて落ちたい穴に落ちれないというような感じです。これをうまく調整して、正解率を上げることができました。(今回の場合、学習率は0.15にしました)
これをやってテストデータの正解率が80パーセントくらいになりました。
↓学習時の正解との誤差の曲線です。学習を進めるごとにだんだんと誤差が小さくなっていってるのがわかると思います。
こんな感じで今日でかなり進展しました。
問題を探る際、なるべく余分な動作を削ぎ落とした状態で探っていけば問題をみつけやすくなるってことが実際に体感できてよかったです。
今後の展望
さらに、パッチ学習やドロップアウトを実装すればさらに正答率も上がると思います。
これでうまくいったら、構造化してその土台の上に畳み込みネットワークっていうのを搭載して、画像認識タスクをこなせるプログラムを作っていきたいと思います。
ではでは。
この記事が気に入ったらサポートをしてみませんか?