はじめに
Deep Learning Specialization の Course 2, Week 2 (C2W2) の内容です。
(C2W2L01) Mini-batch gradient descent
内容
- $m = 5000000$ くらいのとき,training set を mini-batch に分けて,mini-batch 毎に forward propagation と back propagation を計算する
- mini-batch のほうが早く収束する
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$) を変換する
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$ がとても小さくなる
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$ を計算する
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$ を計算する
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$ を計算
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 という)
\alpha = \frac{1}{1 + \textrm{decay_rate} \ast \textrm{epoch_num}} \alpha_0
- その他の方法としては,下記など
\alpha = 0.95^{\textrm{epoch_num}} \alpha_0\\
\alpha = \frac{k}{\sqrt{\textrm{epoch_num}}} \alpha_0