暇人日記

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

Coursera Machine Learning Week9 課題 苦闘日記⑤ -Gradientはやっぱり苦手-

今回もcofiCostFunc.mのGradient部分に取り組みます。

 

f:id:omoshiroamericanews:20191212112335p:plain

いや~、やっぱり難しい。

Gradientは答えのイメージが持てないので、どこを目指していいかわからなくて、

いつも右往左往することになりますが、今回もそうでした。。。。

 

さて、前回はX_gradは5X3,Theta_gradは4X3になるというヒントがあり、

その形の答え↓がでたのでSubmitしましがた不正解というところでした。

 

f:id:omoshiroamericanews:20191212172354p:plain

f:id:omoshiroamericanews:20191212172450p:plain

 

ここで問題文を読み込んでいろいろと原因と考えられるものを上げていきます。

①ダブルループがシングルループになるという前回の話はどうなっているのか?

 なにかもうすでにシングルループになっている気がします。

 X_grad用とTheta_grad用のループがそれぞれできているように見えます。

 本当はさらにループが必要なのでしょうか?

 必要だとすれば、どういう観点ででしょうか?

 Xは各映画のパラメーターで

 今回は問題の中で5個の映画について3個のパラメーターが設定されています。

    問題文にある↓の式をみても、

 Xgrad(i,:)は

    Xをi列ごとに計算するのは各映画毎に計算していることになっていて、

 特にこれ以上のループは不要に見えます。

f:id:omoshiroamericanews:20191212164502p:plain

一旦シングルループ/ダブルループ問題はできていることにして、

前に進みます。

 

②転置問題

 

この↓の問題文の表記の中には(X_grad(i,:))’とあります。

f:id:omoshiroamericanews:20191212115016p:plain

また,こっち↓の最終文に

『Note;The vectorized computation above returns a row-vector instead』

とわざわざ書かれています。

f:id:omoshiroamericanews:20191212164502p:plain

本当は転置しないといけないのでしょうか?

Xの場合は、答えは5X3ですから

1x3が5回累積するのが5X3になる良い道に見えます。

3X1が5回累積すると、3X5になってしまうからです。

転置されたものが1X3になるのか、とも思いましたが、

X_grad(i,:)の式はrow-vectorと書いてるからそれはないと思います。

転置すると3X1になる、それを5X3にもっていけるか、いけない気がします。。。

 

もう一つ気になるのを見つけました。

ForumのResourceに↓こんな記事がありました。

 

f:id:omoshiroamericanews:20191213121916p:plain

 

 Thetagradには「A transposition may be needed」と書かれています。

Xgradには書かれていません。Thetagradだけ転置が必要なのかもしれません。

 

そういえば、↓のThetaの式はXの式をまねて作りましたが、

一度レクチャー資料をみて振り返った方がいいと思いました。

 

f:id:omoshiroamericanews:20191212172243p:plain

 

レクチャーより↓

f:id:omoshiroamericanews:20191213122322p:plain


 Thetaの式がかなり違うことに気が付きましたので、

プログラムを書き換えました。

 

f:id:omoshiroamericanews:20191213122638p:plain

Submitしてみましたが不正解でした。

まだ転置の問題は残ったままです。

この式では4X3になっているので、転置すると3X4になってしまいます。。。

どうすればいいんだろう。。

 

ここで問題文全体ex8_cofi.mを読み進んでいくと、

checkcostfunction.mの中で↓のように答えを確認するセクションがありました。

 

f:id:omoshiroamericanews:20191213215203p:plain

 

私が取り組んでいる方法とは別の方法でgradを計算して並べて

差が小さければ正解という仕組みです。

 

この中では新しいXとThetaをランダムで作って検算しているので、

数字は同じではないですが、計算が合っているかどうかは検証できそうです。

 

実行したら、↓のエラーがでました。

f:id:omoshiroamericanews:20191213220810p:plain

 

Xが4X3で5列目がないよというエラーなのですが、

checkcostfunction.mがそもそも↓のように

X_t = rand(4,3)としているから

Xは4X3になっていると思います。

 

f:id:omoshiroamericanews:20191213220947p:plain

 

なので

X_t = rand(4, 3)を X_t = rand(5, 3)にかえます。

同様に

Theta_t = rand(5, 3)を Theta_t = rand(4, 3)にかえます。

 

うまくいきました!

結果がこうなりました↓

f:id:omoshiroamericanews:20191213221940p:plain

 

X_gradが5X3で、Theta_gradが4X3なので

15個と12個なので27個になっています。

 

これをみると、15個目までは右左同じなので

X_gradは合っていると判断しました。

 

ここで一つ気づきました。

私は試行錯誤するのに自前のシートを作成しているのですが

checkcostfunctionのこの部分↓を

f:id:omoshiroamericanews:20191214101530p:plain

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

 ↓のような構図で入れ込んでいました。

f:id:omoshiroamericanews:20191214101709p:plain

 

しかし、CheckCostFunctionは今、取り組んでいるcofiCostFunc.mを

参照しているパートがありました。

こういう感じです↓

f:id:omoshiroamericanews:20191214101830p:plain

 

なので、さっき27行の比較はJimeファイルではなく

cofiCostFuncの計算が基の比較でした。

 

私はJimaeに入れた変更は同時にcofiCostFuncにも入れる必要がありました。

やっぱり最初にちゃんと式を見ないとだめですね。

Gradientの苦手意識でどうせみても分からないと思って、

手を抜いていたのがトラブルになりました。

 

幸いなことに結果は同じで、

X_gradは合っていて、Theta_gradが間違えているのは同じです。

 

Theta_gradの式が間違えているで検証していきます。

f:id:omoshiroamericanews:20191213223423p:plain

1つ見つけました。

jのループなのにiが入っています。

直しましたがまだ正解にはなりません。。。

 

今回はここまでです。また次回頑張ります。