さて、今回も前回に引き続きBackpropagationの課題に取り組みます。
ループ無しバージョンで解いたので、今はループ有りバージョンで解くことを
目指しています。
前回の日記でのおおきなきづきは
0-9の10通りのループと1-5000のループを2重にするとうまくいかない。
しかし、a(3)は1X10だから↓
δ(3)も1X10、yも1X10とすれば、0-9の10通りのループは不要ではないかと思いました
δ(3)についてだけいえば、1X10 - 1X10 = 1X10というように
次元を合わせれるなと思いました。
yは5000X1ですが5000X10の0,1のベクトルに変更可能です。
前回の日記で書いたのがこれです↓
Coursera Machine Learning Week5 課題 2周目⑤ Costfunction ループ無し - 暇人日記
a(3)も5000X10で作成可能です。
この5000X10同士を1行目だけ抜き出して引き算するというループにしようと
考えました。
絵にすると↓の感じです。
もう少し細かい絵にするとこうです↓
これでδ(3)は何とかなりそうです。
次にδ(2)です。
loop無しの時は
( δ(3) =5000X10 X Theta2’1行削除=10X25 ) . X sigmoid(z2) = 5000X25
で5000X25でした。
1-5000のloopをしているのでδ(2)は1X25でいいかもしれません。
ループではδ(3)は1X10になっているので式の前半部分が↓になり、
( δ(3) =1X10 X Theta2’1行削除=10X25 )
1X25になります。
式の後半のsigmoid(z2) = 5000X25もsigmoid(z2(j,:)) = 1X25
とできるので、
δ(2)の1X25ができます。
δ(3),δ(2)ができたので、Theta1_grad,Theta2_gradができるはずです。
Theta1_gradは25X401になることがわかっています。
計算式はTheta1_grad = δ(2) X a(1)'でした。
δ(2)=1X25でa(1)=5000X401です。
a(1)もa(1)(j,:)と1X401を取り出せば、
Theta1_gradで25X401を作ることができます。
Theta2_gradも同様です。
こちらは10X26になることがわかっています。
計算式はTheta2_grad = δ(3) X a(2)'でした。
δ(3)=1X10でa(2)=5000X26です。
a(2)もa(2)(j,:)と1X26を取り出せば、
Theta2_gradで10X26を作ることができます。
これで私的にはようやくδの合計がΔになるという
Videoや問題文の意味が分かりました。
1-5000のSampleごとにTheta1_grad 25X401とTheta2_grad 10X26
が生成されます。
なので5000のTheta1_gradとTheta2_gradがあるので、
それを合計してm=5000で割れということだと思います。
Coursera Machine Learning Week5 2周目⑧ Backpropagation - 暇人日記
この日記の時に↓を書いていました。
Videoでは分からなかったことに気づかせてくれたのが、↓の部分です。
前回の日記で↓と書きました。
*************************************************************
Dは大文字デルタの意味で小文字デルタΔの累積とあります。
**************************************************************
この問題文を読んだときにΔはθ1つ1つに対する微分でDはΔの合計かなと思いました。
だからmで割るのかなと。
これがようやく肚落ちしました!
かなり正確に理解できたと思います!
となるとあとはループシュミレーション取り出しですね。
1-5000ごとにTheta1_grad 25X401とTheta2_grad 10X26が
計算されるので、その合計を保持したいというのが目的になります。
1回1回取り出すTheta1_grad/Theta2_gradをそれぞれ
Theta1_gradpart/Theta2_gradpartと名付けてこれを1回1回の値とします。
保持したいのは合計なので
Theta1_grad =Theta1_grad + Theta1_gradpart
としました。
m=1のときは
Theta1_grad= 0 +Theta1_gradpart(1回目)
となります。
m=2のときは
Theta1_grad= Theta1_gradpart(1回目) +Theta1_gradpart(2回目)
とあり、
m=2のときは
Theta1_grad= (Theta1_gradpart(1回目) +Theta1_gradpart(2回目))
+Theta1_gradpart(3回目)
と次々に足されていきます。
そして最後のmで割ります。
プログラミングして実行してみました。
ループ有とループ無しの結果の比較です。
Theta2_gradの見た目が違うので間違いかと思いましたが
表記がちがうだけで同じ値でした。
loop有りでも正解にたどり着けました。
1周目のときはよくわからずにとりあえずGithubのコードを参考に
正解しただけったので、今回の方が充実感達成感がすごいあります!
今後ゆっくりとregularized gradient/Random Initializaion/checkNNGradientcheckに
取り組んでいきます。
また次回よろしくお願いいたします。