ネットワークを深くしたら、出力に近い層は学習してるのに、入力に近い層の重みがほとんど変わらん
何が起きてるん?
【疑問】層を深くしたら前のほうの層だけ学習せん。勾配消失と勾配爆発、原因と対策の全体像【G検定】
前提のおさらい。誤差逆伝播法では、出力側から入力側へ、各層の傾きを連鎖律で掛け算しながら勾配を伝える
>>1
勾配消失問題。掛け算する傾きが1より小さいと、層を戻るたびに勾配が縮む
シグモイド関数の微分は最大でも0.25やから、10層ぶん掛けると 。入力に近い層にはほとんど勾配が届かん
>>3
逆に、掛ける値が1より大きいとどうなるん?
>>4
勾配爆発問題。1.5が30回掛かると 万。重みが一気に大きく動いて、誤差が発散したり、計算が数値として扱えなくなったりする
0.9でも30回なら まで縮む。1からほんの少しずれるだけで、深いと効いてくる
>>5
RNNで特に問題になるのも同じ理由やな。時間をさかのぼって伝えるから、長い系列は深いネットワークと同じになる
原因は大きく2つ。活性化関数の傾きと、重みの大きさ。深さはそれを何回掛けるかを決める
>>7
対策の全体像をまとめとく
活性化関数:隠れ層にReLUを使う。正の側の傾きが1で縮まない
重みの初期値:層の入力の数に合わせて大きさをそろえる(Xavierの初期値、Heの初期値)
正規化:バッチ正規化などで、層ごとの値の大きさを整える
構造:スキップ結合で、層を飛ばして勾配を直接伝える道を作る(ResNet)
RNNでは:ゲート機構を持つLSTMやGRUを使う
爆発には:勾配の大きさに上限をつける(勾配クリッピング)
>>8
ReLUにすれば全部解決ちゃうの?傾き1なら縮まんやん
>>9
ReLUの傾きは1やけど、勾配には重みも掛かる。重みが大きすぎたり小さすぎたりしたら、やっぱり爆発も消失もする。だから初期値や正規化と組み合わせる
ReLUは負の側で傾きが0になって、そのユニットが学習せんくなる問題もある
>>10
100層を超えるネットワークを学習できるようになったのは、ReLU、初期値、正規化、スキップ結合を組み合わせた結果やと考えとけばええ。どれか1つで解決したわけやない
管理人のひとこと
- 勾配消失は、1より小さい傾きを層ごとに掛けて勾配が縮む現象。シグモイドの最大0.25が10層で約0.00000095。
- 勾配爆発は1より大きい値が重なる現象(万)。0.9でも30回で約0.04。RNNは時間方向に深くなるので起きやすい。
- 原因は活性化関数の傾きと重みの大きさで、深さがそれを掛ける回数を決める。
- 対策:ReLU、Xavier・Heの初期値、バッチ正規化、スキップ結合(ResNet)、LSTM・GRU、勾配クリッピング。どれか1つではなく組み合わせで効く。