今回もcofiCostFunc.mのGradient部分に取り組みます。
いや~、やっぱり難しい。
Gradientは答えのイメージが持てないので、どこを目指していいかわからなくて、
いつも右往左往することになりますが、今回もそうでした。。。。
さて、前回はX_gradは5X3,Theta_gradは4X3になるというヒントがあり、
その形の答え↓がでたのでSubmitしましがた不正解というところでした。
ここで問題文を読み込んでいろいろと原因と考えられるものを上げていきます。
①ダブルループがシングルループになるという前回の話はどうなっているのか?
なにかもうすでにシングルループになっている気がします。
X_grad用とTheta_grad用のループがそれぞれできているように見えます。
本当はさらにループが必要なのでしょうか?
必要だとすれば、どういう観点ででしょうか?
Xは各映画のパラメーターで
今回は問題の中で5個の映画について3個のパラメーターが設定されています。
問題文にある↓の式をみても、
Xgrad(i,:)は
Xをi列ごとに計算するのは各映画毎に計算していることになっていて、
特にこれ以上のループは不要に見えます。
一旦シングルループ/ダブルループ問題はできていることにして、
前に進みます。
②転置問題
この↓の問題文の表記の中には(X_grad(i,:))’とあります。
また,こっち↓の最終文に
『Note;The vectorized computation above returns a row-vector instead』
とわざわざ書かれています。
本当は転置しないといけないのでしょうか?
Xの場合は、答えは5X3ですから
1x3が5回累積するのが5X3になる良い道に見えます。
3X1が5回累積すると、3X5になってしまうからです。
転置されたものが1X3になるのか、とも思いましたが、
X_grad(i,:)の式はrow-vectorと書いてるからそれはないと思います。
転置すると3X1になる、それを5X3にもっていけるか、いけない気がします。。。
もう一つ気になるのを見つけました。
ForumのResourceに↓こんな記事がありました。
Thetagradには「A transposition may be needed」と書かれています。
Xgradには書かれていません。Thetagradだけ転置が必要なのかもしれません。
そういえば、↓のThetaの式はXの式をまねて作りましたが、
一度レクチャー資料をみて振り返った方がいいと思いました。
レクチャーより↓
Thetaの式がかなり違うことに気が付きましたので、
プログラムを書き換えました。
Submitしてみましたが不正解でした。
まだ転置の問題は残ったままです。
この式では4X3になっているので、転置すると3X4になってしまいます。。。
どうすればいいんだろう。。
ここで問題文全体ex8_cofi.mを読み進んでいくと、
checkcostfunction.mの中で↓のように答えを確認するセクションがありました。
私が取り組んでいる方法とは別の方法でgradを計算して並べて
差が小さければ正解という仕組みです。
この中では新しいXとThetaをランダムで作って検算しているので、
数字は同じではないですが、計算が合っているかどうかは検証できそうです。
実行したら、↓のエラーがでました。
Xが4X3で5列目がないよというエラーなのですが、
checkcostfunction.mがそもそも↓のように
X_t = rand(4,3)としているから
Xは4X3になっていると思います。
なので
X_t = rand(4, 3)を X_t = rand(5, 3)にかえます。
同様に
Theta_t = rand(5, 3)を Theta_t = rand(4, 3)にかえます。
うまくいきました!
結果がこうなりました↓
X_gradが5X3で、Theta_gradが4X3なので
15個と12個なので27個になっています。
これをみると、15個目までは右左同じなので
X_gradは合っていると判断しました。
ここで一つ気づきました。
私は試行錯誤するのに自前のシートを作成しているのですが
checkcostfunctionのこの部分↓を
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
↓のような構図で入れ込んでいました。
しかし、CheckCostFunctionは今、取り組んでいるcofiCostFunc.mを
参照しているパートがありました。
こういう感じです↓
なので、さっき27行の比較はJimeファイルではなく
cofiCostFuncの計算が基の比較でした。
私はJimaeに入れた変更は同時にcofiCostFuncにも入れる必要がありました。
やっぱり最初にちゃんと式を見ないとだめですね。
Gradientの苦手意識でどうせみても分からないと思って、
手を抜いていたのがトラブルになりました。
幸いなことに結果は同じで、
X_gradは合っていて、Theta_gradが間違えているのは同じです。
Theta_gradの式が間違えているで検証していきます。
1つ見つけました。
jのループなのにiが入っています。
直しましたがまだ正解にはなりません。。。
今回はここまでです。また次回頑張ります。