読者です 読者をやめる 読者になる 読者になる

室村日記

日々、試行錯誤したことを備忘録的にまとめていきます

ニューラルネットワークにおける勾配法と学習率

1.はじめに

 初めに注意.
 この文章は「ゼロからつくるDeep Learning」の第5章「誤差逆伝搬法」までを学習した者により,備忘録の意を込めて書かれています.しかもそいつはプログラミングすらほとんど真面目に勉強したことがありません.よって,抜け漏れや勘違いは非常に多いと思われます.

 さて.1週間で終わらせると息巻いていたものの,予定は未定とはよく言ったもので,結局1週間経ったというのにまだ終わる見込みがありません.
 とりあえず現在初めて,ニューラルネットによる文字認識の学習を回しているのですが,それがあまりにも遅いので,その間にいくつかまとめておこうと思います.例のごとく間違った認識かもしれませんが,あくまで自分用ということで……
 
 今回は勾配法と学習率について簡単にまとめようと思います.
 文字(手書き数字)認識というのは,要はコンピュータに人間が書いた手書きの,つまり時として汚かったり癖があったりする数字を認識してもらい,果たしてその文字が1~9のどれなのかを判別してもらうというものです.
f:id:muromura:20170424230236j:plain
 そのときにコンピュータの内部では様々なパラメータが動いていて,例えば
「これは丸があって上に棒が飛び出ているから”6”かな」
「これは丸が二つあるから8かな」
「これは二回折れ曲がっている棒だから7かな」
のような判断をしているようです.
例えばこの「二回折れ曲がっている」などを判別しするために大量のパラメータが用意されています.
このパラメータをいい感じに調整して,1は1,7は7として認識してくれるようにするのが,学習ということになります.
 今回はその学習の方法として勾配法を用いるようです.
 
*正確には丸とか棒ではなくもっと抽象的に捉えているのだと思いますが,わかりやすい例としてあげました.さらに正確に言えば,今回の手法では文字の画像を個別のピクセルレベルに分解して捉えています.



2.勾配法

 学習のためには,どちらに向かって進めばいいのか,つまり道しるべが必要になってきます.
 その道しるべとして,訓練用データと正解データの損失関数(ここでは交差エントロピー誤差)を用いるのが勾配法です.

 なぜ,正解/不正解の数という認識精度をそのまま道しるべとして用いてはいけないのかという疑問が生じます.こちらの方が筋道が通っているようにみえます.
 
 しかし,これだと学習がうまくいかないのです.なぜなら認識精度は非連続だからです.
 つまり,100枚中90枚正解したとするとその値は90%となります.90%の次は91%です.この場合には90.7%正解しました,などということはありません.

 その場合,どのような問題が起きるか?
 例えば,少し精度がよくなる方にパラメータが調整できたとします.しかしそれが,確かに向上はしているのですが,1枚分正解を増やすほどの向上ではなかったとします.そのとき,認識精度を目的とした学習だと,今回の調整はうまくいかなかったとして破棄してしまうのです.
 つまり,実際には少しずつでももっと精度を上げていくことができるのに,精度を評価する道しるべが荒いために,そこで立ち止まるしかなくなってしまうのです.

 ここで登場するのが交差エントロピー誤差などの損失関数です.これらの損失関数は連続です.
 連続ということは,パラメータ調整によるわずかな向上も勘定に入れることができるということです.
 さっき0.98424...だった値が0.98512...になっていれば,それは今回の調整がうまくいったということを表しているので,それを元に次なる調整に進むことができます.

*交差エントロピー誤差とは結局のところどうやって生まれた何なのかとか,なぜそれを用いるのかとかについては詳しくわかっていないので,別の機会に調べます.ごめんなさい.


3.学習率

 勾配法では,勾配,すなわち微分の情報を用いて進むべき方向を決定します.
 この場合,損失関数を最小化するのが目的なので,道しるべの例になぞらえれば,高低差のある地形を探索してとにかく窪地=一番低い場所を探して進んでいくのです.
 その進むべき方向の決定は,一歩ごとに行われます.すなわち,一歩分進んだら周りを見渡して一番低い場所に続きそうな方向に足を向け,また一歩進んで周りを見渡してということを繰り返すわけです.

 このときの一歩の大きさにあたるのが学習率です.
 容易に想像できることですが,一歩の幅があまりに小さければ,遅々として進まず,東京から大阪を目指す蟻のように,いつまでたっても目的地に辿りつけなさそうです.逆に一歩の幅があまりに大きければ,巨人のように,目的地を飛び越えてしまうことになって,これまたうまくいかなさそうです.
 
 というわけで,この学習率の大きさを適切に定めることも重要な仕事となってきます.
 (この学習率のような,パラメータを決める学習のためのパラメータのことをハイパーパラメータというようです)
 じゃあ学習率を決めるのにもうまい方法があるのかと勢い込んで読んだのですが,どうも人の手によってあれこれ試しながら探すしかないとのことです.
 ちょっとがっくりきましたが,ざっと調べてみたところ,よくわからないながらも,これを自動的に決める学習方法もあるようです.しかし何せ本元のニューラルネットワークについてもよくわかっていない身で手を出すのはあまりにもアレなので今回はスルーしました.


4.まとめ

 学問的にあっているんだか間違っているんだか自信がありませんが,少なくとも将来自分が見返したときに役立つ資料とはなりました.
 ひとまず満足です.

 問題点があるとすれば,これを書いたり夜ご飯の二郎系ラーメンを食べに行ったりしていてなおニューラルネットワークによる学習が終わらないということです.Rのパッケージで試した時から線形回帰に比べ大幅に遅いことには気づいていましたが,まさかこれほどとは.どうなることやら.

*追記:あまりに遅いので中身のぞいてみたらエラー吐いてました.こういうのに気づくのも経験ですかね……

 それでは.