はじめに
Deep Learning Specialization の 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
内容
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
と書く
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$) とも呼ばれる
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$ とすると
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 する。そうすることで,最急降下法が早く計算できる
\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 が小さくなるようにする
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$ :
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}$ とする)
\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$ が異なるときの対処の考え方など
参考