暇人日記

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

Week2の課題(家の値段)をNeural Networkで解いてみる-中編-

前回の予測がなぜ間違えているかわかりました。

 

nnCostFunction.mを修正し忘れていました。

 

Week5の課題のプログラムは↓のような構造をしていました。

 

f:id:omoshiroamericanews:20200705212401p:plain

 

Gradinent CheckingをしてるCheckNNgradients.mは

nnCostFunction.mを参照しているのですが、

前回の日記で書いていたWeek2の課題用のプログラミングを

nnCostFunction.mに反映させていませんでした。

 

ということは前回の日記でうまくいっていたようにみえた

Gradinent CheckingはWeek5の正答例そのものなので合っていて

当然ということになります。

 

ということでnnCostFunction.mを修正してGradinent Checkingをしてみます。

 

 

 

というわけでnncostFunction.mに前回の日記の私の仮説を反映して

Gradinent Checkingを行ってみました。

 

f:id:omoshiroamericanews:20200704231747p:plain

 

やはりダメでしたorz

誤差が1e-9以下となってほしいところ、もっと大きい数字になっています。

 

ただ、ふっと↑で見えている範囲は右の行と左の行が一致しています。

 

全部を見てみることにしました↓

f:id:omoshiroamericanews:20200704231826p:plain

f:id:omoshiroamericanews:20200704231854p:plain

f:id:omoshiroamericanews:20200704232336p:plain

gradは1X101なので全部で101行あるのですが、

赤線より下はドンピシャで合って、赤線より上はボロボロです。

 

数えると赤線が下から26行目なのでTheta2_gradの1X26は合っていて、

Theta1_gradがボロボロという絵姿になっていると判断しました。

 

Theta2_gradは↓の計算式でδ(3)とa(2)だったんで合っていたんだなぁと思いました。

Theta1_gradは悩んだδ(2)が絡んでいるので間違えているということだと思います。

Theta2_grad=δ(3) X  a(2)となります

Theta1_grad=δ(2) X  a(1)'となります。

 

 θが間違ってるんでダメそうですが、予測までやってみました↓

 

f:id:omoshiroamericanews:20200704232657p:plain

やはりだめです。

 

このGradinent Checkingがうまくできないと駄目な気がします。

 

ということで改めてδ(2)をまた考えることにします。

①次元から考える (文系的発想)

②理論から考えてみる (ダメそう)

③Videoを見返してみる

 

まず①次元から考えてみます。

f:id:omoshiroamericanews:20200705214047p:plain

δ(2)は↑の式で表されていました。

δ(3)はa(3)-yなので47X1です。

Theta2は26X1です。

 

f:id:omoshiroamericanews:20200705214430p:plainの部分は47X26 or 26X47になります。

が、Week5ではここはθのBias用の1行を取り除く必要があったので、

47X25 or 25X47になるはずです。

 

f:id:omoshiroamericanews:20200705214543p:plainはSigmoidこそなくなりましたが、47X25になる必要があります。

 

z2=X *Theta1は47X3  X 3 X25なので47X25になります。

本当はf:id:omoshiroamericanews:20200705214543p:plainなのでだめそうですが、Directにz2を放り込んで

Gradinent Checkingしてみました↓

 

f:id:omoshiroamericanews:20200705220201p:plain



やはりだめです。

ただ次元的にはf:id:omoshiroamericanews:20200705214543p:plainの47X25として考えていきます。

 

f:id:omoshiroamericanews:20200705214543p:plainの前段のf:id:omoshiroamericanews:20200705220434p:plainはz2をSigmoid関数に放り込むことでした。

f:id:omoshiroamericanews:20200705214543p:plainf:id:omoshiroamericanews:20200705220434p:plainの微分という解説だったと思います。

 

sigmoidGradientという関数がWeek5では使われていたのですが、

SigmoidFunctionのGradientと書かれていました↓

 

f:id:omoshiroamericanews:20200705220620p:plain



SigmoidはLogistic Regressionのために導入している関数で

Linear Regressionの今回は使用しない前提で進めています。

使用すると答えが0から1の間になってしまい、

家の値段の予測にはならないと思ったからです。

 

ここまでは合っていると思います。

 

そうなるとz2を微分しなければならないと思うのですが、

それがわからないです。

 

z2はX * Theta1なので、これをXについて微分するとTheta1になると思います。

Theta1は3X25なので、次元が合いません。

 

 

ただ次元的にはf:id:omoshiroamericanews:20200705214543p:plainの47X25として考えていきます。

 

無理やり実行しましたがやはりErrorでした。

f:id:omoshiroamericanews:20200705221219p:plain

 

全然検討つかないので見えるものは全部試していきます。

Videoのスライドに↓がありました。

Sigmoid用だと思いますが、当てはめる方向で考えます

f:id:omoshiroamericanews:20200705221444p:plain

a(2) . X (1-a(2))とあります。a(2)とz(2)の差はWeek5ではBiasの1を足していることと

Sigmoidでした。

a(2)は47X26で次元が合わないため、z2 . X (1-z2)にしてみました。

 

f:id:omoshiroamericanews:20200705222221p:plain

全く同じ結果に見えます。

 

少なくとも前回代入のz2とz2 . X (1-z2)の値は違うので

違う値になってもいいのではと思いました。

 

何か違うところも間違えていそうです。

 

また次回取り組みます!