深層学習day2 Section1:勾配消失問題

要点まとめ

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

シグモイド関数は勾配消失問題を発生させる代表的な関数である。シグモイド関数微分は最大値が0.25であり、層を重ねるごとに値の更新量が小さくなっていってしまう。

活性化関数による回避

活性化関数としてReLU関数を用いることで勾配消失問題を回避することができる。

重みの初期値をによる回避

重みの初期値をランダムに設定することで、回避する方法として、Xavierという乱数設定方法がある。標準正規分布に基づいた乱数を、前のレイヤのノード数の平方根で割ったものを設定する。

network['W1'] = np.random.randn(input_layer_size, hidden_layer_size) / np.sqrt(input_layer_size)
network['W2'] = np.random.randn(hidden_layer_size, output_layer_size) / np.sqrt(hidden_layer_size)

他にも、Xavierの初期値に\sqrt{2}を掛けたHeの初期値もあるようだ

network['W1'] = np.random.randn(input_layer_size, hidden_layer_size) / np.sqrt(input_layer_size) * np.sqrt(2)
network['W2'] = np.random.randn(hidden_layer_size, output_layer_size) / np.sqrt(hidden_layer_size) * np.sqrt(2)

バッチ正規化

バッチ正規化とは、ミニバッチ単位で入力値のデータの偏りを抑制する方法。 活性化関数に値を渡す前後にバッチ正規化の層を加える。

 \displaystyle{
  \mu_t = \frac{1}{N_t}\sum_{i=1}^{N_t} x_{ni}  \\
  \sigma_t^2 = \frac{1}{N_t}\sum_{i=1}^{N_t} (x_{ni}-\mu_t)^2  \\
  \hat{x}_{ni} = \frac{x_{ni}-\mu_t}{\sqrt{\sigma_t^2+\theta}}  \\
  y_{ni} = \gamma x_{ni} + \beta
}

x_{ni} はミニバッチの各要素データ。 これからミニバッチ全体の平均\mu_tや、標準偏差\sigma_{t}^{2}を求める。 それらを用いて、ゼロを中心とした正規化を施した\hat{x}_{ni}を求める。 更に学習の都合に応じて適当な定数\gamma\betaを用いてy_{ni}を算出する。

実装演習

mnistの学習を初期化条件を変更して実施。

活性化関数はReLU関数。

初期値を0固定にすると学習が進まない。

0.01*標準正規分布は最初の収束が遅いようにも見えるが、Xavier,Heのいずれも学習が進んでいく。

f:id:yui-gen-ron:20211209005342p:plain
mnist

f:id:yui-gen-ron:20211209010627p:plain
初期値0固定

f:id:yui-gen-ron:20211209005405p:plain
標準正規分布*0.01

f:id:yui-gen-ron:20211209005454p:plain
He

f:id:yui-gen-ron:20211209005439p:plain
Xavier

確認テスト等考察

シグモイド関数微分に関して復習兼ねてまとめ。

シグモイド関数

 \displaystyle{
  \sigma(u) = \frac{1}{1+e^{-u}}
}

に対してシグモイド関数微分

 \displaystyle{
 \newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}
  \partialdiff{\sigma}{u} = \sigma(u)(1-\sigma(u))
}

シグモイド関数微分u=0で最大値を取り、\sigma (0) = \frac{1}{2}なので、シグモイド関数微分の最大値は \frac{1}{4}