Gradient Checkingを使いこなすための深掘りです。
使えるとこういう結果が出てきます。
左の列にGradinent Checkingで計算したgrad,
右の列にBackpropagationで計算したgradが並びます。
この差が01e-9以下ならBackpropagationの計算は正しいという目安で
2.1e-11なので正しいといえるということになっています。
これを計算しているcheckNNgradients.mは↓の構成になっています。
(出典;『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
が設定されているので絵で表すと↓ですね。
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で行われているので
見てみます。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
eはが望ましいとVIDEOで触れられていましたが
そのまま設定されていますね。
形としてはループシュミレーション取り出しで、
numgradとperturbの2つが空箱で38X1のベクトルとして用意されています。
numgradがGradient checkのそのものです。
perturbはthetaから+εと-εをするために設定されています。
grad1つ目をε分ずらして計算、grad2つ目をε分ずらして計算を繰り返すために
perturbは次元はunrollしたthetaと同じ38X1に設定されています。
そしてloopで1つ目を計算する時は1つ目だけがεで他は0、
2つ目を計算する時は2つ目だけがεで他は0になるように設定されています。
絵にするとこういうイメージです↓
loop1つ1つでperturbは全部0にリセットされています。
loss1 = costFunc(nn_params - perturb)
loss2 = costFunc(nn_params + perturb)
numgrad(p) = (loss2 - loss1) / (2*e)
で↓の絵のイメージが表現されています。
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が計算される関数でした。
Week3/Week2ではCost Functionがこの役割を担っていました↓
Week2やWeek3に応用する時は
costFuncを修正すれば使えるのではないかと思いました。
次回応用にトライしてみます!