勾配消失化問題!?
前回の日記でNeural Networkを3階層から4階層にするのができず、
「フリーソフトではじめる機械学習入門」という本を読んでみました。
これを選んだ理由は図書館ですぐ借りれたからです。
(ダメたったら違うのを借りよう/買おうと思ってました。)
思えば今までCourseraのMachine Learningの講座とUdemyのPython講座の2つだけうけて、延々とこの講座の2つの中で学んだことで「これできるかな」「こうやったらできるかな」と猪突猛進でやってたので、機械学習を俯瞰的に見ることができました。
と、前置きはこの辺にして、本を読んでるとニューラルネットワークの章の中に
「勾配消失問題」という項目が出てきました。
ひらたくいうと、『1980年ごろに階層増やすとうまくいかないことが顕在化した。原因はBackpropagation=誤差逆伝播法がうまいいかない』と書いてありました。
ほぅほぅ、と思って読み進めると
「2006年ごろに考案された事前学習法をきっかけに階層の深いディープラーニングニューラルネットワークに関する研究が盛んになり、さまざまな成果を挙げた」とありました。
なるほど、ということは事前学習法なるものを調べればOctaveでもできるのではないかと思ってググってみたら、
勾配消失問題 | AI研究所 - 人工知能に脅かされないために、人工知能を作る側の人間になる
勾配消失問題の原因のひとつの例は活性化関数でした。シグモイド関数などの場合、勾配が0に近い領域が存在するため、勾配消失に陥ると重みがほぼ修正されなくなります。
多層ニューラルネットワークでは一カ所でも勾配が0に近い層が存在すると、それより下層の勾配も全て0に近くなります。このため、層数が増えるほど(特に四層以上において)学習が難しくなっていました。
どうもSigmoid関数だと4層はだめだと書いてあるように見えます。。。
よって、活性化関数の変更は勾配消失問題を改善しました。
シグモイド関数の代わりにランプ関数(ReLUなど)を用いると、勾配消失が起きにくくなったのです。
他には、重みや初期化、勾配降下法の選択などが勾配消失に関係しています
となるとSigmoid関数の代わりにReLU関数を使うという手段がありそうだと思いました。
手段と課題としては
①ReLU関数を使う、但しReLU関数のDerivaveが必要<--今、私は知らない。
②重みや初期化、勾配降下法の選択を考える <--事前学習法だとおもいます。
②よりは①のほうが具体的なんで取り組んでみたいです。
ますは図書館から借りてきた本に色々と練習問題がついていたので、
そちらを先にやってみます。