trybeetle

take it slow!!

DeepLearning.ai course2振り返り


Posted on Aug. 18, 2018, 7:08 a.m.



DeepLearning.aiのコース(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization)では・Regularization・Optimization・Hyperparameter tuningの方法を学びます。


week 1

week 1は、Initialization、Regularization、Nuemerical Checkingについてでした。

Initialization

Initializationには、下記の4つがあります。

  • Zero Initialization (paramsを全て0に揃える)
  • Random Initialization (paramの値をrandomに表示する)
  • Xavier Initialization (tanhに最適)
    $$ \sqrt{\frac{1}{\text{dimension of the previous layer}}} $$
  • He Initialization (reluに最適)
    $$\sqrt{\frac{2}{\text{dimension of the previous layer}}} $$

上記の内、XavierやHe Initializationは、layerのunit数が増えた時に有効です。(例えば画像認識の場合だとunit数が多くなる)
unit数が多くなると、z(=wx + b)を求めるときにsummationした値が大きくなります。
tanhの場合だと、値が大きい場合には、傾きが小さくなりlearning speedが遅くなってしまいます。また結果も不安定になりがちです。
この現象を、exploding gradientと呼びます。

反対に、wの値が小さいと、vanishing gradientを起こし、learning speedが遅くなります。

そのため丁度いいWの値にするために、ランダムで算出したのちに、上述のXavierやHe Initializationの値を掛けてあげます。

L2 Regularization

Regularizationでは、L2 RegularizationとDropoutを主に学びました。

L2は、weightが小さいほど、よりシンプルでoverfittingを起こしにくいという考えです。Cost functionは、下記の様になります。

$$J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost}$$

また、Back propagationでは、下記の様になります。
$$ \frac{\partial J}{\partial w^{[l]}} = \frac{\partial J}{\partial z^{[l]}} * \frac{\partial z^{[l]}}{\partial w^{[l]}} + \frac{\lambda}{m} w^{[l]} $$


Drop out

Drop outは、iteration毎にランダムに幾つかのニューロンをシャットダウン(ゼロにする)することで、毎回異なったネットワークを構成し、外れたデータへの重みを軽減させる方法です。
※input layerとoutput layerは対象外です。

  • ランダムでニューロンをゼロにするためのマスクを作ります。まず、matrix Aと同じシェイプのmatrix Dをランダムな0~1の間で作成します。
  • 続いて、matrix Dの各要素の値がkeep_probより小さくなる場合に1を返し、keep_probより大きくなる場合に0を返すような0 or 1のmatrixに修正します。
  • matrix Aとmatrix Dを要素毎に掛けることで、幾つかのunitをランダムにゼロにします。
  • 最後に、上で修正したmatrix Aの各要素をkeep_probで割ることで、costを求めるときの結果に影響を与えない様に配慮します。

Back propでも同様に、

  • cost function JをAで微分した値matrix dAに対して、matrix Dを要素ごとに掛けます。
  • 上で修正したmatrix dAの各要素をkeep_probで割ります。

※drop outは、training dataにのみ適用し、test dataには使用しません。


Gradient Checking

gradient checkingでは、backpropで求めた傾きの値と、Nuemerical computationで求めた値を比較し、Backpropが正常に導入されているか確認します。

下記の様に、parameterに極小値εを足した値とparameterから極小値εを引いた値から、傾きgradapproxを求めます。
$$ \frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon}$$

次に、backpropにより求めた傾きと、先に求めたgradpropとの差を求めます。この差が10^-7より小さければ、backpropの導入に問題なしと判断します。
$$ difference = \frac {\| grad - gradapprox \|_2}{\| grad \|_2 + \| gradapprox \|_2 } < 10^{-7}$$




week 2

week 2は、Optimizationの手法についてでした。

batch-sizeによる分類

まず、batch-sizeに応じて下記の3つに分けられます。

  • Batch Gradient Descent: training data数mをbatch-sizeとする
  • Mini-Batch Gradient Descent: training dataを分割し、batch-sizeをより小さい単位にして実行する
  • Stochastic Gradient Descent: batch-size=1とし、training data毎に実行する

mini-batchのbatch-sizeには、{64,128, 256, 512}のような値を選ぶのが通例です。
また、Mini-BatchやStochasticでは、最後にoptimalになかなか収束しないため、learning rate decayにより、iteration毎に徐々にlearning rateを下げる方法が有効です。

learning rate decay には下記の様な方法があります。
$$ α = \frac{1}{1 + decayRate * epochNum} α $$
$$ α = 0.95^{t} α $$ $$ α = \frac{1}{\sqrt{t}} α $$


Momentum

Gradient Descent with Momentumでは、それまでのiteration中に求めたparameterのderivative(傾き)の値も活かすことで、最適値までより正しい方向性のparameterのderivativeを求めることができます。
$$ \begin{cases} v_{dW^{[l]}} = \beta v_{dW^{[l]}} + (1 - \beta) dW^{[l]} \\ W^{[l]} = W^{[l]} - \alpha v_{dW^{[l]}} \end{cases}$$ $$\begin{cases} v_{db^{[l]}} = \beta v_{db^{[l]}} + (1 - \beta) db^{[l]} \\ b^{[l]} = b^{[l]} - \alpha v_{db^{[l]}} \end{cases}$$

どの程度、それまでのVdwやVdbの値に引っ張られるかというと下記の値で引っ張られます。
$$ \frac{1}{1-β} ~~~~~~~\text(t=iteration) $$
VdwとVdbの初期値は0とします。

例えば、β=0.9とした場合は、上記の値は、10となります。それまでの10回のiterationで求まったVdwやVdbの重みに引っ張られます。

また、先の例でiterationが10回未満の場合は、初期値0に引っ張られます。そのため、下記の様に補正した値で計算します。
$$ v^{corrected}_{dW^{[l]}} = \frac{v_{dW^{[l]}}}{1 - (\beta)^t} \\ v^{corrected}_{db^{[l]}} = \frac{v_{db^{[l]}}}{1 - (\beta)^t} $$

通常、Momentum等のexponential weighted averageを実施するのはdwのみで、dbは対してはdwと比してあまり意味が無いのでしません。(dbの初期値はゼロで対処します。)


RMS prop

続いて、Root Mean Square propについてです。

RMS propはMomentumと同様に、それまでのiteration中に求めた値に引っ張られます。下記の通りに求めます。
$$ \begin{cases} s_{dW^{[l]}} = \beta_2 s_{dW^{[l]}} + (1 - \beta_2) (\frac{\partial \mathcal{J} }{\partial W^{[l]} })^2 \\ s^{corrected}_{dW^{[l]}} = \frac{s_{dW^{[l]}}}{1 - (\beta_1)^t} \\ W^{[l]} = W^{[l]} - \alpha \frac{dW^{[l]}}{\sqrt{s_{dW^{[l]}}}} \end{cases}$$


Adam Optimization

Adam Optimizationは、MomentumとRMSpropとの合わせ技の様な形です。下記の通りに求めます。
$$\begin{cases} v_{dW^{[l]}} = \beta_1 v_{dW^{[l]}} + (1 - \beta_1) \frac{\partial \mathcal{J} }{ \partial W^{[l]} } \\ v^{corrected}_{dW^{[l]}} = \frac{v_{dW^{[l]}}}{1 - (\beta_1)^t} \\ s_{dW^{[l]}} = \beta_2 s_{dW^{[l]}} + (1 - \beta_2) (\frac{\partial \mathcal{J} }{\partial W^{[l]} })^2 \\ s^{corrected}_{dW^{[l]}} = \frac{s_{dW^{[l]}}}{1 - (\beta_1)^t} \\ W^{[l]} = W^{[l]} - \alpha \frac{v^{corrected}_{dW^{[l]}}}{\sqrt{s^{corrected}_{dW^{[l]}}} + \varepsilon} \end{cases}$$

上記の中のHyper parameterのデフォルト値としては、下記のとおりです。

  • α: need to be tuned
  • β_1: 0.9
  • β_2: 0.999
  • ε: 10^-8



week 3

Hyperparameter tuningについてです。

Hyperparameter tuning

Hyper parameterをチューンイングする際には、parameterの一般的な範囲の中から、randomでparameterを選びます。
randomで選ぶ場合は、randomの値ができるだけ狭い範囲で実施します。
例えば、0.0001 ~ 1の間で値を選ぶ場合には、10^-4 ~ 10^0 と考え、0-4の値のなかからrandomな値を取り出します。


Batch normalization

Linear functionにより求めた値Zに対してNormalizationを行う手法です。パフォーマンスの向上が期待できます。
下記の様にnormalization後のzの値を求めます。
$$ \begin{cases} z_{norm} = \frac{z - μ}{\sqrt{δ^{2}+ε}} \\ z = γ ~z_{norm} + \beta \end{cases}$$ ※γとβは、hyper parameterです。

また、パフォーマンス向上だけでなく、ニューロンを低減しているため、Dropoutの様にreguralizationの効果もある様です。


Multi Classification

binary classificationでは、output layerにsigmoid functionを使用していましたが、Multi classificationでは、Softmaxを使用します。Zを活性化させたい場合は、下記の様になります。
$$ \begin{cases} a^{[L]} = g'(z) = \frac{e^{z}}{\sum_{k=1}^C e^{z{[k]}}} \\ J = \frac{1}{m} \sum_{i=1}^m y^{(i)} \log{a^{[L](i)}} \\ dz^{[L]} = a^{[L]} - y \end{cases}$$

以上、softmax関数の計算方法です。


Category:ML
Tag: ML python
Aug. 18, 2018, 7:08 a.m.

Comments