暇人日記

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

Coursera Machine Learning Week5 2周目⑬ Gradinent Checking-前半-

課題にはなっていないんですが、他のデータでNeuralNetworkを

使いたいと思った時にとても重要になっているGradient Checkingを

深堀してみます。

 

 

 

の流れで取り組みます

 

VIDEO

概念と計算式と具体的なコードが触れられています。

 

f:id:omoshiroamericanews:20200524113931p:plain

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

 

gradは微分だからgradは↑のような形でも取り出すことができる、

そしてそれは

Backpropagationのような理論から計算したgradと

ほぼ同じになるはずだから検算として使用できる、

と説明されていました。

 

この↑の絵の形でのgradの具体的な計算式が

f:id:omoshiroamericanews:20200524114306p:plain

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

 

でεの値はf:id:omoshiroamericanews:20200524114404p:plainくらいが望ましいと説明されています。

 

ちなみに片側だけ変化分をとってくるのは推奨しないと説明されていました↓f:id:omoshiroamericanews:20200524114502p:plain

 

具体的なプログラミングコードが↓です。

f:id:omoshiroamericanews:20200524114652p:plain

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

 

これで確かにf:id:omoshiroamericanews:20200524114306p:plainが計算できそうです。

 

ただ、これがBackpropagationのgradのTheta1_grad/Theta2_gradと

ほぼ同じということですが、同じ次元の25X401や10X26になるんだろうか?

と思いました。

 

しかし、これをみてわかりました。

f:id:omoshiroamericanews:20200524115217p:plain

Theta1 25X401とTheta2 10X26ですが、unrollで一直線にして

1つずつεずらしてgradを計算するということですね。

 

具体的にはTheta1は25X401で10,025、Theta210X26は260の2つを足して

10,285の1直線のθを作って、

10,285の1つずつεずらしてgradを計算していくことだと思います。

 

そうすると10,285のgradが計算されて、それをreshapeで25X401と10X26の形にして

Theta1_gradとTheta2_gradと突き合わせするということですね。

 

問題文

 

VIDEOと同じ説明が書かれています。

 

f:id:omoshiroamericanews:20200524120130p:plain

 

具体的なf:id:omoshiroamericanews:20200524114306p:plainの計算は

computeNumericalGraident.mでされていると書かれてあります。

 

f:id:omoshiroamericanews:20200524120524p:plain

また、Gradinent Checkingは先ほど書いたような

Theta1は25X401で10,025、Theta210X26は260の2つを足して10,285全部について

ではなく部分を取り出して検証すると書いてあります。

 

f:id:omoshiroamericanews:20200524120731p:plain

実行上のTipでも全体で行うと計算負荷が大きくなるので

部分で行うことが勧められています。

 

プログラム全体/詳細

 

階層が深くマトリョーシカっぽく感じたので絵にしました↓

f:id:omoshiroamericanews:20200606210809p:plain



 

ピンクのCheckNNgradientsの中で

Backpropagationのgrad

Gradinent Checkingのgrad
を突き合わせする構造になってます。

 

今回はここまでです。次回は実行したり試行錯誤してプログラミングをみていきます。