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

# はじめに
[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) の Course 2, Week 1 (C2W1) の内容です。

# (C2W1L01) Train / Dev / Test sets
## 内容

- Applied ML is a highly iterative process. Idea → Code → Experiment → Idea …のサイクルを効率的に回すのが大事
- Train set / dev set / test set
    - 以前は train : test = 70 : 30 や，train : dev (cross-validation) : test = 60 : 20 : 20 と言われていた
    - 最近はデータが多くなった。データが 100 万件くらいあれば，dev set や test set はそれぞれ 1 万件もあれば十分
    - train : dev : test = 98 : 1 : 1 とか，99.5 : 0.25 : 0.25 など
- train set と dev/test set の distribution を同じにする (Make sure dev and test come from same distribution)
- test set が無くても (dev set だけでも) OK
- dev set のことを "test set" と呼ぶこともある

# (C2W1L02) Bias / Variance
## 内容

- 2 次元だと high bias や high variance を可視化できるが，高次元だと可視化できない

|train set error|dev set error| |
|:-:|:-:|---|
|1% | 11%| high variance|
|15%|16%|high bias|
|15%|30%|high bias & high variance|
|0.5%|1%|low bias & low variance|

- 人が判断したときの error (optimal error or Bayes error) を 0 とした場合

# (C2W1L03) Basic "recipe" for machine learning
## 内容

- high bias の場合 (training data performance でチェック)
    - bigger network
    - train longer
    - (NN architecture search) (有用でないときもある)
    - high bias が解決するまで繰り返す
- high variance の場合 (dev set performance でチェック)
    - more data
    - regularization
    - (NN architecture search) (有用でないときもある)
- 初期の neural network では bias と variance の trade-off が問題となった
- 今はデータが増えたので，bias を悪化させずに variance を改善できるようになった

# (C2W1L04) Regularization
## 内容

```math
J\left(w, b\right) = \frac{1}{m} \sum^{m}_{i=1}L\left(\hat{y}^{(i)}, y^{(i)}\right) + \frac{\lambda}{2m}\|w\|^2_2
```
- $\lambda$ ; 正規化パラメータ (ハイパーパラメータの 1 つ)
- $L_2$ regularization ; $||w||^2_2 = \sum^{n_x}_{j=1} w_j^2 = w^Tw$
- lambda は Python のコマンドなので，Python でプログラムするときは ```lambd``` と書く

```math
J\left(w^{[1]}, b^{[1]}, \cdots , w^{[L]}, b^{[l]}\right) = \frac{1}{m} \sum^{m}_{i=1} L\left(\hat{y}^{(i)}, y^{(i)}\right) + \frac{\lambda}{2m} \sum^{L}_{l=1} \|w^{[l]}\|^2\\
\|w^{[l]}\|^2 = \sum^{n^{[l-1]}}_{i=1}\sum^{n^{[l]}}_{j=1}\left(w_{ij}^{[l]}\right)^2
```
- $w$ の次元は $(n^{[l-1]}, n^{[l]})$
- $|| \cdot ||^2_2$ は Frobenius norm ($|| \cdot ||_F^2$) とも呼ばれる

```math
dw^{[l]} = \left( \textrm{from backprop} \right) + \frac{\lambda}{m}w^{[l]} \\
w^{[l]} = w^{[l]} - \alpha dw^{[l]} = \left(1 - \alpha \frac{\lambda}{m} \right)w^{[l]} - \alpha \left( \textrm{from backprop} \right)
```
- regularization によって $dw^{[l]}$ が小さくなるので， weight decay と呼ばれる


# (C2W1L05) Why Regularization Reduces Overfitting
## 内容


- $\lambda$ が大きいと，$w^{[l]} \sim 0$ になる。すると hidden unit の影響を減らせるので，シンプルなネットワークになったと考えられる。なので，high bias に近づく
- $\lambda$ が大きいと，ロジスティック回帰に近くなる
- $g(z) = \tanh(z)$ の場合，$z$ が小さいと $g(z)$ の線形領域を使うことになる
- activation function を 1 次関数と見なせるようになると，複雑なネットワークを表現することができなくなる。よって high bias に近づく
- 最急降下法で，各繰り返しごとに $J$ が小さくなっていることを確認する際は，第 2 項も含めて $J$ を計算する


# (C2W1L06) Dropout Regularization
## 内容


- 各 unit を，ある確率で dropout させる (ユニットを削除する)
- 減少した neural network で訓練する
- $l = 3$ (layer 3) を想定。keep_prob (= 0.8) を生き残る確率 (1-keep_prob が dropout させる確率) とする。dropout vector を $d3$ とすると

```math
d3 = \mathrm{np.random.rand(} a3 \mathrm{.shape[0], }\, a3 \mathrm{.shape[1])} < \mathrm{keep\_prob} \\
a3 = \mathrm{np.multiply(} a3, d3 \mathrm{)} \\
a3\  /= \mathrm{keep\_prob} \\
a^{[4]} = W^{[4]} a^{[3]} + b^{[4]}
```
- 最後に keep_prob で割ることで，$a^{[3]}$ の期待値を維持する
- 最急降下法の繰り返しごとに dropout vector $d3$ を変える
- test set の計算時には dropout を実装しない (テストで dropout を入れると，ノイズになる)

# (C2W1L07) Understanding dropout
## 内容
- Intuition ; Can't rely on any one feature, so have to spread out weights
- 特定の入力に重みを掛けない → 重みを分散させる → 重みの効果を減らす → $L_2$ regularization と同様の効果
- layer 毎に keep_prob の値を変えることもできる。次元の大きな $W^{[l]}$ に対しては，keep_prob を小さくする
- computer vision では dropout の成功事例が多い (ピクセル数 = feature が多く，data が相対的に少ないため，high variance になりやすい)
- 欠点 ; cost function $J$ が正しく計算されているか check するのが難しい
- 対策 ; keep_prob = 1 で $J$ が減少する (coding に問題がない) ことを確認してから，keep_prob を有効にする

# (C2W1L08) Other Regularization Methods
## 内容

- Data augmentation
    - 画像を左右反転したり，回転・拡大によりデータを増やすことで，overfit を防ぐ
    - 完全に独立したデータを増やすような効果は期待できないが，低コストでデータを増やすことができる
- Early stopping
    - 各繰り返しで training error (or $J$) と dev set error の両方をチェックし，dev set error が減少から上昇に転じたところで繰り返し計算をストップする
    - 欠点は，$J$ と overfit を同時に考えてしまい，問題を複雑にしてしまうこと。
    - 対策は，$L_2$ regularization を使う (この欠点は $\lambda$ の値を気にする必要があること)



# (C2W1L09) Normalizing inputs
## 内容

- input feature の scale が大きく違うときに，input feature を normalize する。そうすることで，最急降下法が早く計算できる

```math
\mu = \frac{1}{m} \sum^{m}_{i=1} x^{(i)} \\
x := x - \mu \\
\sigma^2 = \frac{2}{m} \sum^{m}_{i=1} x^{(i)} \ast\ast 2 \\
x \ /= \sigma^2
```
- dev set を normalize するときも，train set の $\mu$ と $\sigma$ を使うこと

# (C2W1L10) Vanishing / exploding gradients
## 内容

- 非常に深い neural network を train しているとき，微分地が非常に小さくなったり大きくなったりする。特に小さくなると，最急降下法に時間がかかる
- 現在の neural network は 150 層くらいある

# (C2W1L11) Weight initialization for deep networks
## 内容

- input feature が多くなると，$z = wx + b$ で計算される $z$ が大きくなる。そこで，input feature が多いときは，初期化の際に w が小さくなるようにする

```math
W^{[l]} = \mathrm{np.random.randn} \left( \cdots \right) \ast \mathrm{np.sqrt} \left( \frac{2}{n^{[l-1]}} \right)
```

- ReLU のときは $\sqrt{\frac{2}{n^{[l-1]}}}$ がうまくいく
- $\tanh$ は $\sqrt{\frac{1}{n^{[l-1]}}}$ とする (Xavier initialization)


# (C2W1L12) Numerial Approximation of Gradients
## 内容

- 微分の近似値は，$\epsilon$ を小さな数値として $\frac{f(\theta + \epsilon) - f(\theta - \epsilon)}{2\epsilon}$ となる
- 誤差のオーダは $O(\epsilon^2)$

# (C2W1L13) Gradient checking
## 内容

- Take $W^{[1]}$，$b^{[1]}$，$\cdots$ ，$W^{[L]}$，$b^{[L]}$ and reshape into a big vector $\theta$
- Take $dW^{[1]}$，$db^{[1]}$，$\cdots$ ，$dW^{[L]}$，$db^{[L]}$ and reshape into a big vector $d\theta$
- for each $i$ :

```math
d\theta_{approx}^{[i]} = \frac{J(\theta_1, \cdots, \theta_i+\epsilon, \cdots) - J(\theta_1, \cdots, \theta_i-\epsilon, \cdots)}{2\epsilon} \sim d\theta^{[i]}
```

- check ($\epsilon = 10^{-7}$ とする)

```math
\frac{\|d\theta_{approx} - d\theta\|_2}{\|d\theta_{approx}\|_2 + \|d\theta\|_2}
```

|value|judgement|
|:-:|---|
|$10^{-7}$| great!|
|$10^{-5}$| OK かもしれないけど，check する|
|$10^{-3}$| バグの可能性 |

- バグっぽいときは，特定の $i$ について $d\theta_{approx}$ と $d\theta$ の差が大きいところをチェックする

# (C2W1L14) Gradient Checking Implementation Notes
## 内容


- gradient checking の使い方や，$d\theta_{approx}$ と $d\theta$ が異なるときの対処の考え方など










# 参考
- [Deep Learning Specialization (Coursera) 自習記録 (目次)](https://qiita.com/satomshr/items/dc4ae752c558798bbef6)