前回の予測がなぜ間違えているかわかりました。
nnCostFunction.mを修正し忘れていました。
Week5の課題のプログラムは↓のような構造をしていました。
Gradinent CheckingをしてるCheckNNgradients.mは
nnCostFunction.mを参照しているのですが、
前回の日記で書いていたWeek2の課題用のプログラミングを
nnCostFunction.mに反映させていませんでした。
ということは前回の日記でうまくいっていたようにみえた
Gradinent CheckingはWeek5の正答例そのものなので合っていて
当然ということになります。
ということでnnCostFunction.mを修正してGradinent Checkingをしてみます。
というわけでnncostFunction.mに前回の日記の私の仮説を反映して
Gradinent Checkingを行ってみました。
やはりダメでしたorz
誤差が1e-9以下となってほしいところ、もっと大きい数字になっています。
ただ、ふっと↑で見えている範囲は右の行と左の行が一致しています。
全部を見てみることにしました↓
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)'となります。
θが間違ってるんでダメそうですが、予測までやってみました↓
やはりだめです。
このGradinent Checkingがうまくできないと駄目な気がします。
ということで改めてδ(2)をまた考えることにします。
①次元から考える (文系的発想)
②理論から考えてみる (ダメそう)
③Videoを見返してみる
まず①次元から考えてみます。
δ(2)は↑の式で表されていました。
δ(3)はa(3)-yなので47X1です。
Theta2は26X1です。
の部分は47X26 or 26X47になります。
が、Week5ではここはθのBias用の1行を取り除く必要があったので、
47X25 or 25X47になるはずです。
はSigmoidこそなくなりましたが、47X25になる必要があります。
z2=X *Theta1は47X3 X 3 X25なので47X25になります。
本当はなのでだめそうですが、Directにz2を放り込んで
Gradinent Checkingしてみました↓
やはりだめです。
ただ次元的にはの47X25として考えていきます。
の前段の
はz2をSigmoid関数に放り込むことでした。
は
の微分という解説だったと思います。
sigmoidGradientという関数がWeek5では使われていたのですが、
SigmoidFunctionのGradientと書かれていました↓
SigmoidはLogistic Regressionのために導入している関数で
Linear Regressionの今回は使用しない前提で進めています。
使用すると答えが0から1の間になってしまい、
家の値段の予測にはならないと思ったからです。
ここまでは合っていると思います。
そうなるとz2を微分しなければならないと思うのですが、
それがわからないです。
z2はX * Theta1なので、これをXについて微分するとTheta1になると思います。
Theta1は3X25なので、次元が合いません。
ただ次元的には
の47X25として考えていきます。
無理やり実行しましたがやはりErrorでした。
全然検討つかないので見えるものは全部試していきます。
Videoのスライドに↓がありました。
Sigmoid用だと思いますが、当てはめる方向で考えます
a(2) . X (1-a(2))とあります。a(2)とz(2)の差はWeek5ではBiasの1を足していることと
Sigmoidでした。
a(2)は47X26で次元が合わないため、z2 . X (1-z2)にしてみました。
全く同じ結果に見えます。
少なくとも前回代入のz2とz2 . X (1-z2)の値は違うので
違う値になってもいいのではと思いました。
何か違うところも間違えていそうです。
また次回取り組みます!