暇人日記

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

Coursera Machine Learning week5 2周目⑪Backpropagation ループ無 後半

さて、今回も前回に引き続きBackpropagationの課題に取り組みます。

 

f:id:omoshiroamericanews:20200523110934p:plain

ループ無しバージョンで解いたので、今はループ有りバージョンで解くことを

目指しています。

 

前回の日記でのおおきなきづきは

0-9の10通りのループと1-5000のループを2重にするとうまくいかない。

f:id:omoshiroamericanews:20200523111111p:plain

 

しかし、a(3)は1X10だから↓

f:id:omoshiroamericanews:20200523111245p:plain

δ(3)も1X10、yも1X10とすれば、0-9の10通りのループは不要ではないかと思いました

 

f:id:omoshiroamericanews:20200522122753p:plain

 

δ(3)についてだけいえば、1X10 - 1X10 = 1X10というように

次元を合わせれるなと思いました。

 

yは5000X1ですが5000X10の0,1のベクトルに変更可能です。

前回の日記で書いたのがこれです↓

Coursera Machine Learning Week5 課題 2周目⑤ Costfunction ループ無し - 暇人日記

 

a(3)も5000X10で作成可能です。

 

この5000X10同士を1行目だけ抜き出して引き算するというループにしようと

考えました。

 

絵にすると↓の感じです。

 

f:id:omoshiroamericanews:20200523113215p:plain

 

もう少し細かい絵にするとこうです↓

f:id:omoshiroamericanews:20200523112433p:plain

 

これでδ(3)は何とかなりそうです。

 

次にδ(2)です。

f:id:omoshiroamericanews:20200523113731p:plain

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では分からなかったことに気づかせてくれたのが、↓の部分です。

f:id:omoshiroamericanews:20200427234144p:plain

前回の日記で↓と書きました。

*************************************************************

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で割ります。

 

プログラミングして実行してみました。

ループ有とループ無しの結果の比較です。

 

f:id:omoshiroamericanews:20200523121127p:plain

 

Theta2_gradの見た目が違うので間違いかと思いましたが

表記がちがうだけで同じ値でした。

 

loop有りでも正解にたどり着けました。

1周目のときはよくわからずにとりあえずGithubのコードを参考に

正解しただけったので、今回の方が充実感達成感がすごいあります!

 

今後ゆっくりとregularized gradient/Random Initializaion/checkNNGradientcheckに

取り組んでいきます。

 

また次回よろしくお願いいたします。