暇人日記

アラフォーおっさんのコーセラの機械学習の課題を解こうと頑張っています!

Coursera Machine Learning Week5 2周目⑭ Gradinent Checking-中編-

Gradient Checkingを使いこなすための深掘りです。

 

使えるとこういう結果が出てきます。

 

f:id:omoshiroamericanews:20200606234512p:plain

 

左の列にGradinent Checkingで計算したgrad,

右の列にBackpropagationで計算したgradが並びます。

 

この差が01e-9以下ならBackpropagationの計算は正しいという目安で

2.1e-11なので正しいといえるということになっています。

 

これを計算しているcheckNNgradients.mは↓の構成になっています。

 

f:id:omoshiroamericanews:20200606211836p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

Small Neural Networkの部分はdebugInitializeWeights.mとRandom Initializationが

似ていそうなので次回詳しいことはまとめて考えてみます。

 

ここではどういうSmall Neural Networkが設定されているか見ます。

 

input_layer_size = 3
hidden_layer_size = 5
num_labels = 3

 

が設定されているので絵で表すと↓ですね。

 

f:id:omoshiroamericanews:20200606213422p:plain

 

Theta1は4X5で、Theta2が6X3なので

Theta1_gradは4X5で、Theta2_gradで6X3になります。

unrollして1直線にするとgradは38個ということですね。

 

nn_params = [Theta1(:) ; Theta2(:)]

 

nn_paramsは38X1です。

 

次にGradient Checkingの部分はcomputeNumericalGradient.mで行われているので

見てみます。

 

f:id:omoshiroamericanews:20200606212121p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

eはf:id:omoshiroamericanews:20200524114404p:plainが望ましいとVIDEOで触れられていましたが

そのまま設定されていますね。

 

 

形としてはループシュミレーション取り出しで、

 numgradとperturbの2つが空箱で38X1のベクトルとして用意されています。

 

numgradがGradient checkのf:id:omoshiroamericanews:20200524114306p:plainそのものです。

perturbはthetaから+εと-εをするために設定されています。

 

grad1つ目をε分ずらして計算、grad2つ目をε分ずらして計算を繰り返すために

perturbは次元はunrollしたthetaと同じ38X1に設定されています。

そしてloopで1つ目を計算する時は1つ目だけがεで他は0、

2つ目を計算する時は2つ目だけがεで他は0になるように設定されています。

絵にするとこういうイメージです↓

loop1つ1つでperturbは全部0にリセットされています。

 

f:id:omoshiroamericanews:20200606232340p:plain

 

loss1 = costFunc(nn_params - perturb)
loss2 = costFunc(nn_params + perturb)

numgrad(p) = (loss2 - loss1) / (2*e)

で↓の絵のイメージが表現されています。

f:id:omoshiroamericanews:20200524113931p:plain

 

costFuncは

costFunc = @(t) nnCostFunction(t, input_layer_size, hidden_layer_size, ...
num_labels, X, y, lambda)

となっており、nnCostFucntion.mで計算されるJが設定されています。

thetaを代入するとJが計算されます。

 

なのでtheta + ε、theta-εを放り込むとJ(theta + ε)とJ(theta-ε)が計算される

設定になっています。

 

nnCostFunction.mはJとgradが計算される関数でした。

f:id:omoshiroamericanews:20200606234124p:plain

 

Week3/Week2ではCost Functionがこの役割を担っていました↓

 

f:id:omoshiroamericanews:20200606234226p:plain

f:id:omoshiroamericanews:20200606234254p:plain

Week2やWeek3に応用する時は

costFuncを修正すれば使えるのではないかと思いました。

 

次回応用にトライしてみます!