ラビットチャレンジ【深層学習day2】~勾配消失問題~

概要

勾配消失問題は深層学習において重要な問題である。

その問題を解決するために活性化関数、初期値の設定やバッチ正規化などがある

この章では以下の項目を学んだ

・勾配消失問題の基礎(確認テスト1つ含む)

・活性化関数(確認テスト1つ含む)

・初期値の設定方法(確認テスト1つ含む)

・バッチ正規化(確認テスト1つ含む)

・ハンズオン

・例題チャレンジ

勾配消失問題の基礎

誤差逆伝播が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる問題。

勾配は偏微分で計算されるため下位層になるほど連鎖律が続くのでパラメータの更新量が非常に小さくなるからである

f:id:Maruring:20210716130818p:plain

<<確認テスト>>

連鎖律の原理を使いdz/dxを求めよ。z=t2, t=x+yとする

f:id:Maruring:20210716131341p:plain

活性化関数

シグモイド関数

-∞~+∞までの入力を-1~+1に押し込む関数

大きな値では出力の変化が微小なため、勾配消失問題を引き起こしてしまう


f(u) = {1\over1+e^{-u}}

ReLU関数

入力が0以下の時は0、0より大きいときは入力をそのまま出力する恒等関数になる

勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている。

f:id:Maruring:20210716132355p:plain

<<確認テスト>>

シグモイド関数微分した時、入力値が0の場合の出力値は?

0.25

初期値の設定方法

Xavier

重みの要素を、前の層のノード数の平方根で除算した値

各層の出力結果が0or1に偏ることがないため、勾配が消失するリスクを低減する

f:id:Maruring:20210716132855p:plain

He

重みの要素を、前の層のノード数の平方根で除算した値に対し√2をかけ合わせた値

<<確認テスト>>

重みの初期値を0に設定するとどのような問題が発生するか?

正しい学習が行いえない。全ての重みが均一に更新されるため、多数の重みを持つ意味がなくなる

バッチ正規化

ミニバッチ単位で入力値のデータの偏りを抑制する手法

活性化関数に値を渡す前後にバッチ正規化を孕んだ層を加える

f:id:Maruring:20210716134144p:plain

バッチ正規化を数学的に記述すると以下のようになる

f:id:Maruring:20210716134245p:plain

<<確認テスト>>

一般的に考えられるバッチ正規化の効果を2点挙げよ

・中間層の重みの更新が安定化される ⇒ 学習のスピードアップ

過学習抑制 ⇒ データの値を一定の範囲内にスケーリングできるのでバッチごとのデータの異常な偏りを抑制できる

ハンズオン

hidden_size_listの数字の変更

初期のhidden_size_listは[40,20]であるため[20,10]に変更

レイヤーサイズを小さくしたことによって、学習が収束するするまで時間がかかっている

f:id:Maruring:20210716141359p:plain

f:id:Maruring:20210716141414p:plain

f:id:Maruring:20210716141426p:plain

例題チャレンジ

下図の(き)にあてはまるコードを記述せよ

data_x[i:i_end], data_t[i:i_end

f:id:Maruring:20210716142209p:plain