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

# はじめに

[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) の Course 2, Week 3 (C2W3) の内容です。


# (C2W3L01) Tuning process
## 内容

- Hyperparameter のチューニング方法の説明
- Hyperparameter の重要度は，下記の通り
    - 1 番大事
        - $\alpha$
    - 2 番目に大事
        - $\beta$ ($\sim 0.9$)
        - #hidden_units
        - mini-batch size
    - 3 番目に大事
        - #layers
        - learning rate decay
    - チューニングしない
        - Adam optimization algorithm の $\beta_1$，$\beta_2$，$\epsilon$

- Hyperparameter を試すときは，try random values, don't use a grid
- Coarse to Fine ; 良さそうな値が見つかったら，その近傍で細かく (fine) 調べる



# (C2W3L02) Using an appropriate scale to pich hyperparameter
## 内容

- リニアスケールでランダムに値を選択できる hyperparameter
    - $n^{[l]}$
    - #layers $L$
- ログスケールでランダムに値を選択すべき hyperparameter
    - $\alpha$ ; 0.0001 ～ 1
    - $\beta$ ; 0.9 ～ 0.999

```math
r = -4 \ast \textrm{np.random.rand()} \\
\alpha = 10^r \\
r = -2 \ast \textrm{np.random.rand()} - 1 \\
1-\beta = 10^r\\
\beta = 1-10^r
```


# (C2W3L03) Hyperparameter Tuning in Practice : Panda vs. Caviar
## 内容

- Re-test hyperparameters occasionally
- Intuitions do get stale. Re-evaluate occasionally

- 1 つのモデルに集中してチューニングする ; babysitting one model (Panda)
- たくさんのモデルで並行してチューニングする ; Training many model in parallel (Caviar)

- 十分なリソースがあるとき ; Caviar
- データがたくさん，モデルが大きい ; Panda


# (C2W3L04) Normalizing Activations in a Network
## 内容

- input data に適用していた normalizing を，hidden layer にも適用することで，$W$ や $b$ の学習速度を高める
- hidden layer $l$ の $z^{(i)}$ に対して，

```math
\mu = \frac{1}{m}\sum_{i} z^{(i)} \\
\sigma^2 = \frac{1}{m} \sum_{i} \left( z^{(i)} - \mu \right)^2 \\
z^{(i)}_{norm} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \epsilon}} \\
\tilde{z}^{(i)} = \gamma z^{(i)}_{norm} + \beta
```

- $\gamma$ と $\beta$ は learnable parameters
- $z^{(i)}$ の平均と分散を，$\gamma$ と $\beta$ で望ましい値にセットする


# (C2W3L05) Fitting Batch Norm into a Neural Network
## 内容
- Batch Norm を使った計算方法の説明
- 通常 ; $z^{[l]} \rightarrow a^{[l]}$
- Batch Norm ; $z^{[l]} \rightarrow \tilde{z}^{[l]} \rightarrow a^{[l]}$
- パラメタは $W^{[l]}$, $b^{[l]}$, $\beta^{[l]}$, $\gamma^{[l]}$ だが，$z^{[l]}$ の平均を計算すると，定数項の $b^{[l]}$ の影響がなくなるので，$b^{[l]}$ は不要になる
- $z^{[l]}$, $\beta^{[l]}$, $\gamma^{[l]}$ の次元は $\left( n^{[l]}, 1 \right)$
- Implementing gradient descent
    - for t=1 … numMiniBatches
        - Compute forward prop on $X^{\\{t\\}}$
            - In each hidden layer, use BN (Batch Norm) to replace $z^{[l]}$ with $\tilde{z}^{[l]}$
        - Use backprop to compute $dW^{[l]}$, $d\beta^{[l]}$, $d\gamma^{[l]}$
- Works w/ momentum, RMSProp, Adam
- TensorFlow なら ```tf.nn.batch_normalization``` でできるけどね

## 感想
- いろんな計算方法が出てきたので，正直，消化しきれてない (内容は難しくないが，ボリュームが多い)

# (C2W3L06) Why Does Batch Norm Work?
## 内容

- なぜ batch norm を使うのか? の直感的な説明
- 着目している mini-batch に対して batch norm を適用すると，多少のノイズを混ぜる効果がある (dropout のように)

## 感想

- 正直，よく分からなかった

# (C2W3L07) Batch Norm at Test Time
## 内容

- $\mu$ と $\sigma^2$ は mini-batch 毎に計算する。
- しかしテストのときにデータ数が少ない場合，$\mu$ と $\sigma^2$ は exponentially weighted average (across mini-batch) を利用する

# (C2W3L08) Softmax regression
## 内容

- multi-class classification の問題
- $C$ ; #classes
- Neural network の最終層 (第 $L$ 層) を softmax layer とする

```math
z^{[L]} = W^{[L]} a^{[L-1]} + b^{[L]} \\
t = e^{z^{[L]}} \ \textrm{(element-wise)}\\
a^{[L]} = \frac{e^{z^{[L]}}}{\sum^C_{j=1}t_i}
```

- hidden layer が無い場合は，領域を直線で分けるイメージ
- 複雑な neural network なら，複雑な境界になる

# (C2W3L09) Training a softmax classification
## 内容

- Softmax regressoin generalizes logistic regression to $C$ classes.
- If $C=2$, softmax reduces to logistic regression.

```math
L\left( \hat{y}, y \right) = - \sum^{C}_{j=1} y_j \log \hat{y}_j\\
J = \frac{1}{m} \sum^m_{i=1} L\left( \hat{y}^{(i)}, y^{(i)} \right)

```

# (C2W3L10) Deep Learning Frameworks
## 内容

- Deep Learning Frameworks
    - Caffe / Caffe2
    - CNTK
    - DL4J
    - Keras
    - Lasagne
    - mxnet
    - PaddlePaddle
    - TensorFlow
    - Theano
    - Torch
- Deep Learning Framework を選択する際には
    - Ease of programming (development and deployment)
    - Running speed
    - Truly open (open source with good governance)


# (C2W3L11) Tensorflow
## 内容
- $J(w) = w^2 -10w + 25$ を最小化する $w$ を求めることを題材に，TensorFlow の使い方を説明
- コスト関数を設定すれば，back prop は自動で実装してくれる


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