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

# はじめに

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

# (C2W2L01) Mini-batch gradient descent
## 内容

- $m = 5000000$ くらいのとき，training set を mini-batch に分けて，mini-batch 毎に forward propagation と back propagation を計算する
- mini-batch のほうが早く収束する

```math
X^{\{1\}} = \left[ X^{(1)} \, X^{(2)} \, \cdots \, X^{(1000)}\right] \\
Y^{\{1\}} = \left[ Y^{(1)} \, Y^{(2)} \, \cdots \, Y^{(1000)}\right] \\
X^{\{2\}} = \left[ X^{(1001)} \, X^{(1002)} \, \cdots \, X^{(2000)}\right] \\
Y^{\{2\}} = \left[ Y^{(1001)} \, Y^{(1002)} \, \cdots \, Y^{(2000)}\right] 
```


# (C2W2L02) Understanding Mini-batch Gradient Descent
## 内容

- mini-batch gradient descent の場合，cost function $J^{\\{t\\}}$ は各 mini-batch の繰り返しに対して振動しながら減少する
- mini-batch の適切なサイズは，vectorization による計算の効率化の恩恵が得られる程度の大きさにする
- 典型的なサイズは $2^6$，$2^7$，$2^8$，$2^9$ など (メモリを効率的に使うために，2 の累乗)
- CPU/GPU のメモリサイズに収まらない mini-batch サイズだと，効率が悪い
- 2 の累乗をいくつか試して，効率的に計算できるサイズを探す


# (C2W2L03) Exponentially Weighted Average
## 内容

- exponentially weighted (moving) average (指数加重 (移動) 平均，で日本語合ってますか?) の説明
- 元のデータ ($\theta_0$，$\theta_1$，$\cdots$) を変換する

```math
V_0 = 0 \\
V_t = \beta V_{t-1} + \left( 1-\beta \right) \theta_t
```

- $V_t$ は，おおよそ $\frac{1}{1-\beta}$ 個のデータの平均と見なせる
- $\beta$ が大きいと，より多くのデータを使って計算するので，データがスムーズになる
- $\beta$ が小さいと，ノイズが大きく，異常値に敏感

# (C2W2L04) Understanding exponentially weighted average
## 内容

- exponentially weighted average の実装方法
- $V_0 = 0$
- 以下を繰り返す
    - Get next $\theta_t$
    - $V_t = \beta V_{t-1} + (1-\beta)\theta_t$
- メモリが少なくて済むのが利点


# (C2W2L05) Bias correction in exponentially weighted average
## 内容

- exponentially weight average では，初期段階で $V_t$ がとても小さくなる

```math
V_0 = 0 \\
V_1 = 0.98 V_0 + 0.02 \theta_1 = 0.02 \theta_1 \\
V_2 = 0.98 V_1 + 0.02 \theta_2 = 0.0196\theta_1 + 0.02\theta_2
```
- そこで，$V_t$ を $\frac{V_t}{1-\beta^t}$ で補正する。t が大きくなると $\beta^t \sim 0$ となり，補正の効果がほとんどなくなる
- 多くの場合，bias correction は実装されない (初期段階以降のデータを使う)


# (C2W2L06) Gradient descent with momentum
## 内容

- iteration $t$ において
    - 現在の mini-batch で $dW$，$db$ を計算する

```math
V_{dw} = \beta V_{dw} + \left( 1-\beta \right) dW \\
V_{db} = \beta V_{db} + \left( 1-\beta \right) db \\
W := W - \alpha V_{dW} \\
b := b - \alpha V_{db}
```

- 最急降下法の振動をスムーズにする
- $\beta$ と $\alpha$ はハイパーパラメタだが，$\beta = 0.9$ が良い
- bias correction はほとんど使わない。10 回も繰り返すと $\beta^t \sim 0$ になる
- $V_{dW} = \beta V_{dW} + dW$ とする文献もある。この場合は，$\alpha$ が $\frac{1}{1-\beta}$ でスケーリングされていると見なせる

# (C2W2L07) RMSProp
## 内容

- RMS = Root Mean Square
- iteration $t$ において
    - 現在の mini-batch で $dW$，$db$ を計算する

```math
S_{dW} = \beta S_{dW} + \left( 1-\beta \right) dW^2 \ (\textrm{要素ごと}) \\
S_{db} = \beta S_{db} + \left( 1-\beta \right) db^2 \ (\textrm{要素ごと}) \\
W := W -\alpha \frac{dW}{\sqrt{S_{dW}} + \epsilon} \\
b := b -\alpha \frac{db}{\sqrt{S_{db}} + \epsilon} \\
```
- 分母が 0 にならないように，$\epsilon=10^{-8}$ を入れる



# (C2W2L08) Adam optimization algorithm
## 内容

- Adam optimization = momentum + RMSProm
- Adam = Adaptive momentum estimation
- iteration $t$ において
    - 現在の mini-batch を使って $dW$，$db$ を計算

```math
V_{dw} = \beta_1 V_{dw} + \left( 1-\beta_1 \right) dW \\
V_{db} = \beta_1 V_{db} + \left( 1-\beta_1 \right) db \\
S_{dW} = \beta_2 S_{dW} + \left( 1-\beta_2 \right) dW^2  \\
S_{db} = \beta_2 S_{db} + \left( 1-\beta_2 \right) db^2  \\
V^{corrected}_{dW} = \frac{V_{dw}}{1-\beta_1^t} \\
V^{corrected}_{db} = \frac{V_{db}}{1-\beta_1^t} \\
S^{corrected}_{dW} = \frac{S_{dw}}{1-\beta_2^t} \\
S^{corrected}_{db} = \frac{S_{db}}{1-\beta_2^t} \\
W := W -\alpha \frac{V^{corrected}_{dW}}{\sqrt{S^{corrected}_{dW}}+\epsilon} \\
b := b -\alpha \frac{V^{corrected}_{db}}{\sqrt{S^{corrected}_{db}}+\epsilon} \\
```

- ハイパーパラメタ
    - $\alpha$ ; needs to be tuned
    - $\beta_1$ ; 0.9
    - $\beta_2$ ; 0.999
    - $\epsilon$ ; $10^{-8}$ (あまり影響しないが，大抵 $10^{-8}$ )





# (C2W2L09) Learning rate decay
## 内容

- mini-batch では， $\alpha$ 一定だと収束しない。徐々に $\alpha$ を小さくすると，最小値近傍に収まってくれる
- epoch ; 1 pass through data (mini-batch に分けたとき，全部の mini-batch データを扱う単位を epoch という)

```math
\alpha = \frac{1}{1 + \textrm{decay_rate} \ast \textrm{epoch_num}} \alpha_0
```
- その他の方法としては，下記など

```math
\alpha = 0.95^{\textrm{epoch_num}} \alpha_0\\
\alpha = \frac{k}{\sqrt{\textrm{epoch_num}}} \alpha_0
```








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