Deep Learning Specialization (Coursera) 自習記録 (C1W3)


はじめに

Deep Learning Specialization の Course 1, Week 3 (C1W3) の内容です。

(C1W3L01) Newral Network Overview

内容

  • Week 3 は neural network の実装に関する説明
  • Newral Network の 1 層目について
    • $W^{[1]}$, $b^{[1]}$ ; パラメタ
    • $z^{[1]} = W^{[1]} x + b^{[1]}$
    • $a^{[1]} = \sigma(z^{[1]})$
  • Neural Network の 2 層目について
    • $z^{[2]} = W^{[2]} a^{[1]} + b^{[2]}$
    • $a^{[2]} = \sigma(z^{[2]})$
    • $L(a^{[2]}, y)$ を計算
  • back propagation は
    • $da^{[2]}$ → $dz^{[2]}$ → $dW^{[2]}$, $db^{[2]}$ → …

(C1W3L02) Neural Network Representation

内容

  • single hidden layer (= 2 layer neural network,layer を数えるときは,input layer はカウントせず,hidden layer と output layer をカウントする) の説明
  • input layer ; $x = a^{[0]}$
  • hidden layer
    • パラメタは $w^{[1]}$ ((4, 3) 行列) と $b^{[1]}$ ((4, 1) 行列)
    • $a^{[1]}$ は 4 ノードとする
  • output layer
    • パラメタは $w^{[2]}$ ((1, 4) 行列) と $b^{[1]}$ ((1, 1) 行列)
    • $\hat{y} = a^{[2]}$

(C1W3L03) Computing a Neural Network Output

内容

  • neural network の計算方法の説明
  • $a_i^{[l]}$ ; $l$ layer の,$i$ 番目のノード
  • vectorizing (ベクトル化) して計算する
z^{[1]} = W^{[1]} x + b^{[1]} \\
a^{[1]} = \sigma(z^{[1]}) \\
z^{[2]} = W^{[2]} a^{[1]} + b^{[2]} \\
a^{[2]} = \sigma(z^{[2]}) \\

(C1W3L04) Vectorizing Across Multiple Examples

内容

  • 複数の training example の計算方法
  • $X = [x^{(1)} \, x^{(2)} \, \cdots x^{(m)}]$ とする ($(n_x, m)$ 行列,$m$ は training example の数)
Z^{[1]} = W^{[1]} X + b^{[1]} \\
A^{[1]} = \sigma\left(Z^{[1]}\right) \\
Z^{[2]} = W^{[2]} Z^{[1]} + b^{[2]} \\
A^{[2]} = \sigma\left(Z^{[2]}\right)
  • $Z^{[1]}$ , $A^{[1]}$ は
    • 行 ; hidden unit の数
    • 列 ; $m$
Z^{[1]} = \left[ z^{[1](1)} \, z^{[1](2)} \, \cdots z^{[1](m)} \right] \\
A^{[1]} = \left[ a^{[1](1)} \, a^{[1](2)} \, \cdots a^{[1](m)} \right]

感想

  • 非常にゆっくり,丁寧に説明している。ここが大事だし,躓くと後々大変困るのだろう

(C1W3L05) Explanation For Vectorized Implementation

内容

X = \left[x^{(1)} \, x^{(2)} \, \cdots x^{(m)}\right] \\
Z^{[1]} = \left[z^{[1](1)} \, z^{[1](2)}\, \cdots z^{[1](m)}\right] \\
Z^{[1]} = W^{[1]} X + b^{[1]}
  • $b^{[1]}$ は Python のブロードキャストを使ってマトリックスになる

(C1W3L06) Activation functions

内容

  • sigmoid 関数

    • $a = \frac{1}{1+e^{-z}}$
    • バイナリ分類のときくらいしか使わない
  • tanh 関数

    • $a = \tanh z = \frac{e^z - e^{-z}}{e^z + e^{-z}}$
    • sigmoid 関数よりベター。平均値がゼロになるから。
    • ただし,sigmoid 関数と tanh 関数の共通の欠点は,$z$ が大きいところで傾きが 0 に近づくため,最急降下法の収束が遅くなる
  • ReLU 関数

    • $a = \max(0, z)$
    • $z=0$ で微分を定義できないが,計算時に厳密に $z=0$ になることはないので,問題ない。
    • ReLU が neural netwok ではデフォルトで使われる (たまに tanh)
    • $z \lt 0$ で傾きが 0 になるのが欠点
  • Leaky ReLU

    • $a = \max(0.01z, z)$
    • $z \lt 0$ でもわずかに傾きを持たせる
    • 0.01 を学習パラメタの 1 つと見なすこともできるが,それを実装する人はほとんどいない
  • layer によって activation function を変えることもある (hidden layer を tanh,output layer を sigmoid など)

  • Neural network には選択するものが多い (activation function の種類,パラメタの初期化方法,など) が,そのガイドラインを示すことは難しい

(C1W3L07) Why do you need non-linear activation function

内容

  • なぜ,activation function に非線形関数を使うのか? → 線形関数にすると,hidden layer を増やしても,結局のところ線形関数にしかならないので,役に立たない

(C1W3L08) Derivatives of activation functions

内容

  • sigmoid activation function
g(z) = \frac{1}{1+e^{-z}} \\
g^\prime(z) = g(z) \left( 1-g(z) \right)
  • Tanh activation function
g(z) = \tanh (z) \\
g^\prime(z) = 1-\left( \tanh(z) \right)^2
  • ReLU
g(z) = \max\left(0, z\right) \\
g^\prime(z) = 0 \ (\text{if}\  z \lt 0) \\
g^\prime(z) = 1 \ (\text{if}\  z \ge 0)
  • Leaky ReLU
g(z) = \max\left(0.01z, z\right) \\
g^\prime(z) = 0.01 \ (\textrm{if}\  z \lt 0) \\
g^\prime(z) = 1 \ (\textrm{if}\  z \ge 0)
  • ReLU や Leaky ReLU の $z=0$ の微分については,0 でも 1 でも不定でも構わない (計算中に厳密に $z=0$ になる確率は低いため)

(C1W3L09) Gradient descent for neural network

内容

  • $n^{[0]} = n_x, n^{[1]}, n^{[2]} (=1)$ とする
  • パラメタは $W^{[1]}$ ($(n^{[1]}, n^{[0]})$ 行列),$b^{[1]}$ ($(n^{[1]}, 1)$ 行列),$W^{[2]}$ ($(n^{[2]}, n^{[1]})$ 行列),$b^{[2]}$ ($(n^{[2]}, 1)$ 行列)
  • cost function ; $J(W^{[1]}, b^{[1]}, W^{[2]}, b^{[2]}) = \frac{1}{m}\Sigma_{i=1}^{m}L(\hat{y}, y)$
  • Forword propagation (output layer はバイナリ分類 → シグモイド関数)
Z^{[1]} = W^{[1]} X + b^{[1]} \\
A^{[1]} = g^{[1]}\left( Z^{[1]} \right) \\
Z^{[2]} = W^{[2]} A^{[1]} + b^{[2]} \\
A^{[2]} = g^{[2]}\left( Z^{[2]} \right) = \sigma \left( Z^{[2]} \right) 

-backpropagation

dZ^{[2]} = A^{[2]} - Y \ \ \left( Y = \left[ y^{(1)} \, y^{(2)} \, \cdots y^{(m)} \right] \right) \\
dW^{[2]} = \frac{1}{m} dZ^{[2]} A^{[1]\textrm{T}}\\
db^{[2]} = \frac{1}{m} \textrm{np.sum} \left( dZ^{[2]} \textrm{, axis=1, keepdims=True} \right)\\

dZ^{[1]} = W^{[2]\textrm{T}}dZ^{[2]} \ast g^{[1]\prime} \left(Z^{[1]}\right) \\
dW^{[1]} = \frac{1}{m}dZ^{[1]} X^{\text{T}} \\
db^{[1]} = \frac{1}{m} \textrm{np.sum} \left( dZ^{[1]} \textrm{, axis=1, keepdims=True} \right)\\
  • np.sumkeepdims=True を付けないと,$(n^{[i]}, )$ ベクトルになる。keepdims=True を付けると $(n^{[i]}, 1)$ ベクトルになる。
  • keepdims=True を付けないなら,reshape する
  • $dZ^{[1]}$ の式の $\ast$ は,要素ごとの積

感想

  • さりげなく np.sum の Tips を織り交ぜている (dimension を意識するのは大事)

(C1W3L10) Backpropagation Intuition (optional)

内容

  • logistic regression の backpropagation の vectorized implementation の直感的な説明
  • 「neural network のもっとも数学的に難しいところ」とのこと

(C1W3L11) Random Initialization

内容

  • logistic regression のときは重みを 0 で初期化しても OK
  • neural network では重み W を 0 で初期化するのは NG
  • 仮に $W^{[1]}$ の要素が全て 0,$b^{[1]}$ の要素も全て 0 とすると,hidden layer のユニットがいくつあっても,すべて同じ計算をすることになる。そうなると複数のユニットを持つ意味がなく,単一のユニットしかない場合と同じになってしまう
  • 初期化方法
W^{[1]} = \textrm{np.random.randn(2, 2)} \ast 0.01 \\
b^{[1]} = \textrm{np.zero((2, 1))}
  • $W^{[1]}$ がランダムに初期化されれば対称性が崩れるので,$b^{[1]}$ は 0 でも良い
  • $W$ の初期値は小さいほうが良い。$W$ が大きいと,$Z = Wx + b$ が大きくなるが,sigmoid や $\tanh$ は値が大きいと傾きが小さくなり,最急降下法の学習速度が遅くなる
  • hidden layer が 1 つなど浅い neural network では,0.01 で OK。深い neural network のときは,0.01 以外の値の場合もある

参考