ある程度DNNを勉強したら、再び原点に戻ってしまいました。
深層ネットにBPすれば、入力端への誤差feedbackは信用できなくなるか、発散したり、0になったりするという話を昔から覚えております。
というのは微分定義の成立はあくまで滑らかな連続関数を条件とします。
画像のような非滑らか、非連続関数に基本は向いていませんね。
それにもかかわらず多層間微分結果を継承的に計算していくと、当然最終的にとんでもない結果になりかねません。
##じゃー、今、DNNは100層以上の実例もあって、どうやってBP問題を克服されたのでしょうか。
① weightに対する 正則化?
norm1正則化とnorm2正則化はみなweight値を小さくする働きで、BP問題自身と数学的なつながりを感じません。
② drop out ? これは①の究極・強引的なやりかたとして見なしても良いと思います。
なので微分誤差伝播問題の解決に貢献できるのは原理的に見えません。
③ ReLU ? sigmoidより微分誤差伝播を抑制する効果があっても決定的な手になるのは信じがたいですね。 ----sigmoidのほうは超滑らか(無限微分可能)なのに。
④ 計算機の性能のアップやGPUなどの高速デバイスの利用も数学原理を変えるわけはありません。
##どうやってBP問題を克服されたのでしょうか。
解説やヒントを頂ければ、幸いと思います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
基本的にはReLUです。勾配消失のしようがない。もちろんちょうど0の点で微分できなくなる訳ですが、そもそも計算機でやる時点で離散値で計算してるんですから、工学的にはどうでも良いんです。
あと、画像で性能が出るようになったのはやはり畳み込みの力でしょうし、「非連続関数関数に基本は向いていない」のをカバーできるくらいたくさんのデータを突っ込んだりして汎化性能を確保できるようになったことも大切ですから、計算機の性能アップも意外と馬鹿にはできません。
追記
ちょっと古いですが、こんな解説があってわかりやすかったです。
https://www.jstage.jst.go.jp/article/jrsj/33/2/33_33_92/_pdf
事前学習(今は廃れた手法だが・・・)と畳み込みで結合が疎になるのが効いている、ということらしいです。
投稿2018/04/07 13:06
編集2018/04/07 13:32総合スコア30933
0
【DNNの勾配(∝誤差)問題をはっきりにします】 間違ったところをご指摘下さい。
DNNのl層目においてcost Cがl層目のweightに関する勾配:
##∂C/∂w[l,j,k] = a[l-1,k]*δ[l,j]
a[l-1,k] : 前層(l-1)のunit kからの出力;
δ[l,j] : 本層(l)のunit jの誤差。
∴ 勾配∝誤差
勾配(∝誤差)の不安定性についてactivation関数の導関数によく注目されていますが、実は
DNNのweightにも同様に関係します。
例えば、i-層に対応するコスト関数の勾配(∝誤差)は以下のよう成分が含まれています。
---------scalar版(各層に一つunitしかない場合):
##w[i]w[i+1]...*w[N]*σ(z[i])σ(z[i+1])...*σ(z[L])
w: DNNのweight, scalar; σ: activation関数の導関数, scalar; L:総層数
なので
case 1: 各σ<1であれば、それらをたくさん掛け算すれば0に近くなるので、各wの値がよっぽど大きくなければ、式全体の値が0に近くなります ⇒ 『勾配(∝誤差)消失』問題発生。
ところが、
case 2: σ>=1 の場合も、w同士がほとんど1以下の場合、
その積がもっと1より小さいので、 ⇒ 『勾配(∝誤差)消失』問題発生。
case 3: σ>=1の場合、 w同士がほとんど1以上の場合(例えば w=10)、
すると、10層があれば W[1]w[2]...w[10] = 1010*10.... = 10^10 order ⇒『勾配(∝誤差)爆発』問題発生。
ましてや100層であれば、前端の勾配値が10^100 order になり、天文数値ですよね ⇒『宇宙爆発』
ReLUの導関数値は1であっても、そしてNNのweightに正則化をかけても、weightの値は皆1以下でなければ、
沢山の積算によって莫大な数値になるのは『必然的な』出来事で、ReLUとはそれほど関係ありません。
なので、NNの層数が多いほどfeedbackしてきた前端への勾配(∝誤差)値は0か天文数値かのような極端な値になりがちです。
これは掛け算の性質によります。
つまり、ReLUにしても, sigmoidにしても、NNの層数が多くなると、前端へfeedbackされてきた勾配(∝誤差)値0と天文数値の間で大きく振れることは
オリジナルタイプのDNNに限り、原理的に避けられません。
ReLUでなくて、ResNet 等は "本当のソリューション"かもしれません。
【ただ、偶然にも、沢山のWの値と沢山のσの値うまく組み合わせ、その積は極端的な値にならなかった場合もありましょう。】
投稿2018/04/13 03:35
編集2018/04/14 00:46総合スコア126
0
①は昔からある手法で議論とされている信用割当問題や勾配消失/勾配爆発問題とは関係ないと思います。
②も①のように正則化として機能しているようですね。ResNetではBatchNormalizationをかわりに使っているようです。
ただもしかしたらですが、出力層の誤差を入力側へ伝搬するときにその誤差の責任を全部のノードが担ってしまう問題である信用割当問題に対し、dropoutのように一部のnodeを働かせないようにすることで割当を明確化できるようにしているのかもしれません
③は勾配消失問題の解決に役立っています。NNの誤差逆伝搬法は入力側へ伝搬すればするほど、出力側の勾配が蓄積されます。sigmoid関数をS(x)
とすれば、誤差逆伝搬では勾配値の計算にS'(x) = S(x)(1-S(X))
が使われ明らかにこれは1より小さい数値です。これが蓄積されるということは1より小さい数値が何度も掛けられるということなのでこれが勾配消失につながります。
Reluであればx>0
においてその微分値は1
なので勾配消失につながりません
④は本議題とは関係ないですね。NNでは多くの行列計算を行いますが、その計算速度がGPUのほうがCPUより速いというだけです。(だけ、とはいってもそれが重要なのですが)
ちなみにですが、ResNetも重要な概念の一つですので関連するpageを紹介しておきます
http://terada-h.hatenablog.com/entry/2016/12/13/192940
こちらも読んでみてください。
さらに追記するとAuto Encoderも勾配消失問題の対応策として有効だったようですね
https://deepage.net/deep_learning/2016/10/09/deeplearning_autoencoder.html
ただ100億という膨大な層につかえるかはよくわかりません。
投稿2018/04/07 13:31
編集2018/04/07 13:45総合スコア123
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/11 04:35
2018/04/11 04:40 編集
2018/04/11 11:32 編集
2018/04/11 14:18
2018/04/11 14:26 編集
2018/04/11 14:28
2018/04/11 14:38
2018/04/11 14:52
2018/04/11 14:55
0
ベストアンサー
100層もどうやって学習させるか、というのが疑問なら、層を深くしても勾配が消えないような仕組みを入れたことが一番大きいと思います。
https://www.slideshare.net/mobile/KotaNagasato/resnet-82940994
100層も伝搬したらうまく計算できないので、ショートカットを入れています。
もちろんその分増加した計算量を実行するGPUも必要ですが。
他に段階的に層を一部固定しながら増やしていく方法もあったはずです。
投稿2018/04/07 13:15
総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/11 04:41
2018/04/11 09:48
2018/04/11 09:50
2018/04/11 11:22
2018/04/11 11:39
2018/04/11 14:31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。