深層学習 Day2

E資格講座

動画講義の要約

Section1: 勾配消失問題について

勾配消失問題とは、逆伝搬でどんどん下位層(出力層に近づく)に行くに連れて、微分 \dfrac{\partial E}{\partial w} が、どんどん0になっていく事がある。そうなると、 w​(t+1)​​ =W​(t)​​ −e∇E による重みの更新がされず、学習が行われなくなることを言う。 活性化関数にシグモイド関数を用いるとなりやすい。

シグモイド関数を使用すると勾配消失が起きやすい理由

シグモイド関数 
f(u) = \dfrac{1}{1-e^{-u}}
微分すると

(1- f(u))(f(u))

となる訳だが、この場合f(u)の値が1か0に近い場合、微分値が0に近くなる。 逆伝搬でこの微分値が下流に渡っていく訳だから、重みの更新がされにくくなる。

解消するために以下のようなやり方がある

  • 活性化関数をReLUにする。
  • 重みの初期値設定でXavier,Heを使用する
  • バッチ正規化

Xavier

重みの初期化において、重みの乱数を前層のノード数のルートで割る。

入力層,中間層1,中間層2の各ノード数を784,40,20の場合 $$ network['W1'] = \frac{np.random.randn(784,40)}{\sqrt{784}} $$ $$ network['W2'] = \frac{np.random.randn(40,20)}{\sqrt{40}} $$

He

重みの初期化において、重みの乱数を前層のノード数のルートで割り√2を掛ける

入力層,中間層1,中間層2の各ノード数を784,40,20の場合 $$ network['W1'] = np.random.randn(784,40) * \sqrt\frac{2}{{784}} $$ $$ network['W2'] = np.random.randn(40,20) * \sqrt\frac{2}{{40}} $$

バッチ正規化

平均0,分散1になるように正規化し、入力値に偏りをなくす。

Section2: 学習率最適化手法について

いかにして、損失関数が極小になる重み、バイアスを見つけ出すか。 それを効率的に探す方法が必要になってくる。

今までの求め方 $$ w^{(t+1)} = W^{(t)} - \epsilon\nabla E $$ はSGDと呼ばれる方法で、この方法で重みを更新していくと、非効率な経緯をたどり、極小点に行き着く事がある。 これを解消し、効率的に重みを更新していく方法を示す。

  • モメンタム
  • AdaGrad
  • RMSProps
  • Adam

モメンタム

2_4_optimizer.ipynbのソースコードを噛み砕いて表現すると、以下の式になる。

network.params[key] = network.params[key] + momentum * v[key] - learning_rate * grad[key]

次回の重み = 前回の重み - 学習率 * 勾配  + momentum * 前回の重みの更新量

AdaGrad

学習率を過去の勾配から最定義して、学習を繰り返す。 $$ \epsilon => \epsilon \frac{1}{\sqrt{h_t} + 1} $$ $$ h_t = h_{t-1} + (\nabla E)^{2} $$ $$ h_0 = \theta $$

との事なので
$$ h_t = (\nabla E) _ {t-1}^{2} + (\nabla E) _ {t-2}^{2} + ...+ \theta $$

となるので(便宜的に勾配の微分に添字使用)、学習率の再定義に使用されているhtは、過去の勾配の値を保持している。 鞍点問題には弱い

AdaGripのメリット・・・ 勾配の緩やかな斜面に対して、最適値に近づける。

AdaGripのデメリット・・・ 鞍点問題には弱い。

RMSprops

αはハイパーパラメータ。どれくらい前回までの情報を使い、今回の更新による情報を使うか。みたいなイメージ。 $$ h_t = \alpha h _ {t-1} + (1 -\alpha)(\nabla E)^{2} $$ 学習率の置き換え自体はAdaGridと変わらない、 $$ \epsilon => \epsilon \frac{1}{\sqrt{h_t} + 1} $$

RMSPropのメリット

  • 局所的最適解にはならず、大域的最適解となる。

  • ハイパーパラメータの調整が必要な場合が少ない。

極小値への軌道のグラフィックは、これが分かりやすい。

https://github.com/Jaewan-Yun/optimizer-visualization

Adam

モメンタムとRMSPropのいいとこどり

Section3: 過学習について

過学習とは、学習が訓練データに特化し過ぎてしまい、テストデータに対してそのモデルがうまくフィットしない事。 訓練データに対するラベルの正解率の精度は高いが、テストデータに対しての正解率は高くない現象のことを示す。

過学習が起きやすい原因・

  • 層の数が多い
  • ノード数が多い
  • 重みの値が大きい。

つまりモデルに自由度が高過ぎる時に過学習が起きやすい。 それらを数を抑制、制約すること。そのために正則化ドロップアウトを使用する。  

正則化

誤差関数に正則化項を加える。pノルムとは距離の事。 以下の数式は入力層、中間層、出力層が1つずつのネットワークの場合(重みwが二つ) $$ Ez(w)=Ez(w) + \frac{1}{p}\lambda||x||_{p} $$

$$ ||x|| _ {p} = ||w^{(1)}|| _ {p} + ||w^{(2)}|| _ {p} $$

$$ ||w^{(1)}|| _ {p} = (|w^{(1)} _ {1}|^{p} + |w^{(1)} _ {2}|^{p} + ... + |w^{(1)} _ {n}|^{p})^\frac{1}{p} $$

$$ ||w^{(2)}|| _ {p} = (|w^{(2)} _ {1}|^{p} + |w^{(2)} _ {2}|^{p} + ... + |w^{(2)} _ {n}|^{p})^\frac{1}{p} $$

$$ Ez(w)=Ez(w) + \frac{1}{2}\lambda (||w^{(1)}|| _ {2} + ||w^{(2)}|| _ {2} ) $$

$$ ||x|| _ {p} = ||w^{(1)}|| _ {p} + ||w^{(2)}|| _ {p} $$

p = 1 の時がL1正則化 P = 2 の時がL2正則化

正則化項を加える事で誤差関数の最小値を少しずらす。(元々の最小値では過学習が起きるので、最小値を少しずらす。)

ドロップアウト

ノードの数が多い時に過学習が起きやすいので、ノードの数を減らす。

該当ソースはlayers.pyのDropoutクラス

xの行列から、乱数行列を作成し、dropout_ratioのしきい値を設定(boolean行列)
self.mask = np.random.rand(*x.shape) > self.dropout_ratio

上の条件式を満たさない要素はすべて0にする事で、ノード数を減らす事を表現している。
return x * self.mask

Section4 CNN 畳み込みニューラルネットワークの概念

CNNを使う理由としては、例えば画像のニューラルネットワークの場合。 位置情報(2dim),色情報(r,g,bの3チャンネル)がある。 この情報を1dimに変換して学習を行うと、いろいろ学習する上で大事な情報が抜けてします。 なるべく次元を保ったまま、学習させるのが良い。そのために畳み込みニューラルネットワークを使う。

畳み込み層

畳み込みの演算概念としては、以下の図となる。strideが1の場合

f:id:foino74:20201224013556p:plain
CNN

バイアス

通常のニューラルネットワークと同じ概念。入力画像の一部にフィルターを通した後の行列に、バイアスを加える。

パディング

入力画像の行列の周囲に行列を足すイメージ。

たとえば以下の2✖︎2行列が、パディングによって周囲を0埋めされて4✖︎4行列になる。

beforePadding = np.array([[2,3],[4,5]]) → 
afterPadding = np.array([[0, 0, 0, 0], [0, 2, 3, 0], [0, 4, 5, 0], [0, 0, 0, 0]])
print(afterPadding.shape) (4,4)
ストライド

入力画像とフィルター(重み)の計算の際に、入力画像をどれだけ移動させるか。以下はストライド2の例。

f:id:foino74:20201224013810p:plain
stride2

チャンネル

フィルターの数の事。 色付き画像のディープラーニングでいうと、縦横は2次元、色も(r,g,bの3チャンネル)も次元を持つので3チャンネル、という事になる。

ブーリング層

入力画像の決められた範囲内で、平均とか最大値とがで抽出させてサイズを減らす処理。 概念図は以下。2 * 2 のMAX プーリングの場合。 f:id:foino74:20201224013932p:plain

畳み込み演算の計算速度を早めるテクニック

dot積で計算出来るように、行列を変換させる。 具体例として、以下の入力画像行列(4*4のチャンネル数1の画像が2枚)があるとする

input_data = np.random.rand(2, 1, 4, 4)*100//
↓
 [[[[61. 44. 91. 71.]
   [31.  1. 94. 60.]
   [97. 63. 44. 28.]
   [ 1. 64. 29. 51.]]]


 [[[33. 68.  1. 43.]
   [90. 59. 27. 96.]
   [ 6. 86.  8. 55.]
   [26. 32. 75. 99.]]]]

この入力画像を、3*3のフィルター、ストライド1, パディング0で演算させる場合、 2_6_simple_convolution_network.ipynbのim2colメソッドによって 以下の(8,9)行列に変換される

col = im2col(input_data, filter_h=filter_h, filter_w=filter_w, stride=stride, pad=pad)
↓
 [[61. 44. 91. 31.  1. 94. 97. 63. 44.]
 [44. 91. 71.  1. 94. 60. 63. 44. 28.]
 [31.  1. 94. 97. 63. 44.  1. 64. 29.]
 [ 1. 94. 60. 63. 44. 28. 64. 29. 51.]
 [33. 68.  1. 90. 59. 27.  6. 86.  8.]
 [68.  1. 43. 59. 27. 96. 86.  8. 55.]
 [90. 59. 27.  6. 86.  8. 26. 32. 75.]
 [59. 27. 96. 86.  8. 55. 32. 75. 99.]]

3*3の1ストライドで囲んだ行列を1行にまとめていく。
input_dataの(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)・・・(3,3) => col(1,1)(1,2)・・・(1,9)
input_dataの(6,2)(6,3)(6,4)(7,2)(7,3)(7,4)・・・(8,4) => col(8,1)(8,2)・・・(8,9)
で、colの行列とdot積演算が出来るように、フィルターの行列を変換する。

col_W = W.reshape(フィルターの数, -1)の転置行列
↓
出力 = np.dot(col, col_W) + バイアス
↓
元の行列形に戻す
↓
元の出力 = 出力.reshape(・・・)

Section5 最新のCNN

モデルの構造5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。 過学習を防ぐ施策として、サイズ4096の全結合層の出力にドロップアウトを使用している

f:id:foino74:20201224014133p:plain
AlexNet

畳み込みとプーリングによって、画像の行列の形が以下のように変化していく。 (224,224,3) => (55,55,96) => (27,27,256) => (13,13,384) => (13,13,256) =>  (4096,1) =>  (4096,1) =>  (1000,1)

確認テスト

【P12】連鎖率の原理を使い,dz/dyを求めよ。 

$$ z = t^{2} $$

$$ t = x + y $$

$$ \frac{dz}{dy}=\frac{dz}{dt}\frac{dt}{dy} = 2t * 1 = 2t $$

【P20】シグモイド関数微分した時、入力値が0の時に最大値をとる。その値として正しい物を選択肢から選べ

  1. 0.15
  2. 0.25
  3. 0.34
  4. 0.45

シグモイド関数が $$ f(u) = \dfrac{1}{1-e^{-u}} $$ で、それをを微分すると

(1- f(u))(f(u))

となる。u = 0を代入すると 0.25となる。 $$ (1- \dfrac{1}{1-e}) * \dfrac{1}{1-e} = 0.25 $$

【P28】重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に答えよ。

(answer) 重みを0で初期化すると、正しい学習が行えない。 全ての重みの値が均一に更新されるため、多数の重みを持つ意味がなくなる。

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

  • 学習のスピードアップ
  • 過学習を抑える事が出来る。

【P35】例題チャレンジ バッチアルゴリズムとミニバッチアルゴリズム

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

バッチサイズだけデータを取り出す処理である。

【P47】モメンタム・AdaGrid・RMSPropの特徴をそれぞれ簡潔に答えよ。

  • モメンタム・・・ 谷間についてから最も低い位置(最適値)にいくまでの時間が早い。大域的最適解となりやすい。
  • AdaGrid・・・ 勾配の緩やかな斜面に対して最適地値に近づける。鞍点問題には陥りやすい。
  • RMSProp・・・鞍点問題になりにくい。ハイパーパラメータの調整が少なくて済む。

【P63】正則化手法の中のリッジ回帰(L2正則化)という手法についてただしいものを選べ

(answer) (a) ハイパーパラメータを大きくすると、重みは限りなく0に近づく。

理由は、ハイパーパラメータを大きくすると、学習を重ねるごとに誤差関数の値は増えていく。 しかし、学習を重ねるごとに本来は誤差関数は小さくなる方法に向かう訳だから、 そのためには重みを0に近づけていくしか誤差関数が小さくなる方に向かう方法がなくなる。 と言う事だと思われる。

【P68】L1正則化を表しているグラフはどちらか答えよ。

f:id:foino74:20201224020044j:plain
L1

横軸の重みが0になっているので、スパース化されている。

【P69】例題チャレンジ L2パラメータ正則化

(ans) param

L2ノルムは、||param||^2なのでその勾配が誤差の勾配に加えられる。つまり、2 * paramであるが、係数2は正則化の係数に吸収されても変わらないのでparamが正解である。

【P71】例題チャレンジ L1パラメータ正則化

(ans) sign(param)

L1ノルムは、|param|なのでその勾配が誤差の勾配に加えられる。つまり、sign(param)である。signは符号関数である。

【P73】例題チャレンジ データ集合の拡張

(ans)

image[top:bottom, left:right, :]

imageの形式が(縦幅, 横幅, チャンネル)であるのも考慮する

【P100】サイズ66の入力画像をサイズ22のフィルタで畳み込んだ時の入力画像のサイズを答えよ。 ストライドとパディングは1とする

(ans) 7 * 7

下記数式に当てはめれば解ける。

out_w = 1 + int((6 + 2 * 1 - 2) / 1) = 7
out_h = 1 + int((6 + 2 * 1 - 2) / 1) = 7