Coursera Machine Learning Week5 課題 2周目⑰ 予測
もう随分とWeek5のNeural Networkに取り組んでますが振り返りたいと思います。
Week2-4で学んだ黄金の流れ
①予測式-->②Cost Function-->③Gradient-->④最適θ-->⑤予測
でいくと①-③がこれまでの日記で完了しています。
Linear Regression/Logistic Regression/Neural Networkの
①-③を横並びにすると↓になります。
Linear Regression/Logistic Regression/Neural Networkは①-③さえできれば
fmincgもしくはfminuncに放り込むと④最適θが計算されます。
④最適θがあれば、Xにかければ⑤予測が出てくるという流れです。
それにしてもNeural NetworkはFeedForward/Backpropagation/
Gradinent Checking/Random Initializationと①-③をやるために
追加で学ばなければならないことが多いアルゴリズムでした。
①予測式にFeedForward/Random Initialization
③GradientにBackpropagation/Gradinent Checking/Random Initialization
が必要でした。
そしてoutput Layerが複数ある際に②Cost Function③Gradientを
ループ有で行うかループ無しで行うかを考える必要がありました。
これらから①-③を作るハードルがとても高かったです。
とはいえNeural Networkの①-③が完成したので、
これから④最適θと⑤予測に取り組みます。
問題文にはfmincgを使うこと、正しく計算できていれば的中率が95.3%±1%に
なるはずとあります。
±1%の幅があるのはRandom Initializationがあるからということです。
ちなみに全く同じ課題(5000の手書き数字判別)にWeek4でも取り組んでいて、
One VS AllのLogistic Regressionで94.9%、θが渡されていたFeedForwardで97.5%でした。
何故FeedForwardの%より低いかはlambdaの設定だと思います。
課題ではlambda=1と固定されているので、
lambdaが1なら的中率は95.3%±1%になるということだと思います。
必殺技にすら見えてきましたが、costCunctionでθをpとしてパラメーター化しているような式をfmincgに放り込んでいます。
今回はθはnn_paramsと表記されています。
1直線のunrollされたθがでてくるので、reshapeしてます。
実行してみました。
まず予測結果です。
95.3%±1%の範囲に入っています。
θ=nn_paramsです。
まず計算される一直線のθは10285X1という長さで冒頭だけ
取り出すと↓です。
これがreshapeされてTheta1,Theta2になっています。
冒頭の方で確認してみて、Theta1とnn_paramsが一致していることが確認できました。
これで他のケースにもNeural Networkを応用できそうな気がします。
Week2のLinear Regression with Multi課題やWeek3の合格者の課題に
Neural Networkで取り組んでみたいと思います。
Coursera Machine Learning Week5 課題 2周目⑯ Random Initialization/debugInitilization
Random Initializationを深堀してみます。
Random Initializationはθの値の初期設定をランダムに決めることです。
Random InitializationはVideoでも紹介され問題文にもあって課題プログラムまで
ありましたが、答えが書いてあって実行して理解したという気はしていません。
なぜ深堀するかというと、
Videoの中でRandom Initializationは非常に重要だとコメントされていたことがあります。
理由はBackpropagationの時にθの初期値が0だと差分のδが全て0になって
Backpropagationがうまく作動しなくなるのが理由です。
FeedForwardは今回は初期値が与えられていましたが、
FeedForwardでもθが全て0だと何Layerを挟もうとoutput layerは全て0になると思うので
Random Initializationは応用する時に必須なのではないかと思います。
Ramdom Initilalizationは
プログラム詳細randInitalizeWeights.mで表現されています。
L_in, L_outがあれば、Wを計算するという式になっています。
L_in, L_outが何かといえば計算要素がL_inで計算結果L_outとあります。
具体的にWeek5の例で考えると
θ1のL_inはbias込みで401でL_outが25です。
θ2のL_inは26でL_outが10です。
どうやってRandom InisitalizationをするかのVideoの説明は↓でした。
これをみたときにrand(10,11)はどういうものか分からなかったので実行してみます。
10X11のランダムのベクトルを作成してくれるようです。
だとすればこれで十分だと思うのですがなぜεがついているのだろう。
あ、なるほど、あの式だと絶対値εの範囲におさまるということですね。
ふーん、
何故この式でなると断言できるんだろう??
分かりません。。。
-A ≦ A *(2rand-1) ≦A
となっているようですけど、-1≦(2rand-1)≦1でないと成立しないと思います。
どうしてこれが証明できるか分かりませんが先に進みます。
εは0.12に設定されていました。
Videoの式が具現化されています。
実行すると見事に25X401のRandom Initializationできたw=θが出てきました!
Random Initializationと似たものでdebugInitilizationWeights.mというのが
Week5の中にはあります。
こちらはGradinent Checkingの中で出てきます。
Week5の中では
Random InitializationはBackpropagationに使って、
debugInitializationWeights.mはGradinent Checkingに使っています。
目的は同じでランダムにθを作ることですが、作り方が違います。
fan_out = L_out
fan_in = L_in
です。
sinはサイン関数で-1~1の値しかとりません。
それをnumel(W)=260を1から260までを1つ1つ代入して260の値を出してます。
そしてsize(W)=10X26でreshapeして10で割っています。
おそらくランダムの計算方法をBackpropagationとGradient Checkingで変えたかったので
2つの計算方法が提示されたんだと思います。
今回はここまでです。また次回頑張ります!
Coursera Machine Learning Week5 2周目⑮ Gradinent Checking-後半-
Gradient CheckingをWeek5ではなくWeek3やWeek4の課題で使う練習をしたいと思います。
まずはWeek3の課題のwithout regularizationでやってみます。
100人の受験者のTEST1とTEST2の得点と合否がサンプルとして
与えられ、どれくらいのTEST1とTEST2だったら合格するかという
Logistic Regressionの問題でした。
thetaは3X1だったので
gradも3X1です↓
これにGradient Checkingの式を入れてみました↓
見事、左右に並びました!
左の列がGradinent Checkingで計算したgrad,
右の列がfminuncで計算したgradが並びます。
ただ、精度をはかる指標が1e-9の小ささまではいってないですね。
かなりfminuncとGradient Checkingの差は大きいという判定になりそうです。
with Regularizationで見てみます。
やはり精度をはかる指標が1e-9の小ささまではいってないですね。
かなりfminuncとGradient Checkingの差は大きいという判定になりそうです。
これはlambda=1だったので、lambda=0.1にしてみました。
あんまり傾向は変わらずですね。。。
続いてWeek4のOne VS Allでやってみます。
これは手書きの文字の判別でした。
5000のサンプルが与えれており、1サンプルは1X400の情報量でした。
thetaは401X10でした。
やり始めたところ計算が10分経っても終了しません。。。
こういうときのために評価用にSmall Neural Networkの作成が必要なんだと
実感しました。
ようやく計算終了しましたが、あれ!?です↓
Gradinent Checkingのgradは401X1となっています。
しかもerrorです。。。
そういえばgradも401X1になってますね。
そうかぁ、Week4のOne VS Allでは401X1のthetaをK=1のとき、K=2のとき、・・・・・K=10のときで合計して401X10にしていました。
今、私のたてた式だと401X1の取り出しになっていますね。
さらにyも1~10の間をとっているので、
c=1で(y == c)を入れ込んで401X1を取り出すようにします。
,
うまくいきました!
しかも基準の1e-9とほぼ同じ1.76937e-09と出ました!
c=2でもやってみます!
うまくいきました!
今後、Gradientがうまくいっているかどうか迷ったら、
使えそうです!
別の日記でこのWeek5で学習したNeural Networkを
コロナ感染者予測に応用できないかなぁとトライしてたんですが、
このNeural Networkが合っているかどうかGradinent Checking使う
楽しみができました!
今回はここまでです。また次回頑張ります!
Coursera Machine Learning Week5 2周目⑭ Gradinent Checking-中編-
Gradient Checkingを使いこなすための深掘りです。
使えるとこういう結果が出てきます。
左の列にGradinent Checkingで計算したgrad,
右の列にBackpropagationで計算したgradが並びます。
この差が01e-9以下ならBackpropagationの計算は正しいという目安で
2.1e-11なので正しいといえるということになっています。
これを計算しているcheckNNgradients.mは↓の構成になっています。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
Small Neural Networkの部分はdebugInitializeWeights.mとRandom Initializationが
似ていそうなので次回詳しいことはまとめて考えてみます。
ここではどういうSmall Neural Networkが設定されているか見ます。
input_layer_size = 3
hidden_layer_size = 5
num_labels = 3
が設定されているので絵で表すと↓ですね。
Theta1は4X5で、Theta2が6X3なので
Theta1_gradは4X5で、Theta2_gradで6X3になります。
unrollして1直線にするとgradは38個ということですね。
nn_params = [Theta1(:) ; Theta2(:)]
nn_paramsは38X1です。
次にGradient Checkingの部分はcomputeNumericalGradient.mで行われているので
見てみます。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
eはが望ましいとVIDEOで触れられていましたが
そのまま設定されていますね。
形としてはループシュミレーション取り出しで、
numgradとperturbの2つが空箱で38X1のベクトルとして用意されています。
numgradがGradient checkのそのものです。
perturbはthetaから+εと-εをするために設定されています。
grad1つ目をε分ずらして計算、grad2つ目をε分ずらして計算を繰り返すために
perturbは次元はunrollしたthetaと同じ38X1に設定されています。
そしてloopで1つ目を計算する時は1つ目だけがεで他は0、
2つ目を計算する時は2つ目だけがεで他は0になるように設定されています。
絵にするとこういうイメージです↓
loop1つ1つでperturbは全部0にリセットされています。
loss1 = costFunc(nn_params - perturb)
loss2 = costFunc(nn_params + perturb)
numgrad(p) = (loss2 - loss1) / (2*e)
で↓の絵のイメージが表現されています。
costFuncは
costFunc = @(t) nnCostFunction(t, input_layer_size, hidden_layer_size, ...
num_labels, X, y, lambda)
となっており、nnCostFucntion.mで計算されるJが設定されています。
thetaを代入するとJが計算されます。
なのでtheta + ε、theta-εを放り込むとJ(theta + ε)とJ(theta-ε)が計算される
設定になっています。
nnCostFunction.mはJとgradが計算される関数でした。
Week3/Week2ではCost Functionがこの役割を担っていました↓
Week2やWeek3に応用する時は
costFuncを修正すれば使えるのではないかと思いました。
次回応用にトライしてみます!
Coursera Machine Learning Week5 2周目⑬ Gradinent Checking-前半-
課題にはなっていないんですが、他のデータでNeuralNetworkを
使いたいと思った時にとても重要になっているGradient Checkingを
深堀してみます。
の流れで取り組みます
VIDEO
概念と計算式と具体的なコードが触れられています。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
gradは微分だからgradは↑のような形でも取り出すことができる、
そしてそれは
Backpropagationのような理論から計算したgradと
ほぼ同じになるはずだから検算として使用できる、
と説明されていました。
この↑の絵の形でのgradの具体的な計算式が
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
でεの値はくらいが望ましいと説明されています。
ちなみに片側だけ変化分をとってくるのは推奨しないと説明されていました↓
具体的なプログラミングコードが↓です。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
これで確かにが計算できそうです。
ただ、これがBackpropagationのgradのTheta1_grad/Theta2_gradと
ほぼ同じということですが、同じ次元の25X401や10X26になるんだろうか?
と思いました。
しかし、これをみてわかりました。
Theta1 25X401とTheta2 10X26ですが、unrollで一直線にして
1つずつεずらしてgradを計算するということですね。
具体的にはTheta1は25X401で10,025、Theta210X26は260の2つを足して
10,285の1直線のθを作って、
10,285の1つずつεずらしてgradを計算していくことだと思います。
そうすると10,285のgradが計算されて、それをreshapeで25X401と10X26の形にして
Theta1_gradとTheta2_gradと突き合わせするということですね。
問題文
VIDEOと同じ説明が書かれています。
具体的なの計算は
computeNumericalGraident.mでされていると書かれてあります。
また、Gradinent Checkingは先ほど書いたような
Theta1は25X401で10,025、Theta210X26は260の2つを足して10,285全部について
ではなく部分を取り出して検証すると書いてあります。
実行上のTipでも全体で行うと計算負荷が大きくなるので
部分で行うことが勧められています。
プログラム全体/詳細
階層が深くマトリョーシカっぽく感じたので絵にしました↓
ピンクのCheckNNgradientsの中で
Backpropagationのgrad
Gradinent Checkingのgrad
を突き合わせする構造になってます。
今回はここまでです。次回は実行したり試行錯誤してプログラミングをみていきます。
Coursera Machine Learning Week5 課題 2週目⑫ -苦闘記憶- Regularized Gradient
今回はRegularized Gradientに取り組みます↓
今、全体の流れのどこをやっているか分からなくなったので振り返ることにします。
前回の日記で全体の構造を下のようにまとめました。
問題文的にはに取り組んでいます。
かなり終着に近づいてきました。
問題文/VIDEOで取り扱いがあって日記で掘り下げていないのは
の2つです。
特にGradinent Checkingの理論はWeek2/3の課題でも使えるはずなので
掘り下げてやってみたいと思います。
もう1歩引いた立場で考えると、
機械学習の黄金パターンは
①予測式-->②Cost Function-->③Gradient-->④最適θ-->⑤予測でした。
Neural Networkでは
①予測式にFeedForwardを使っていて、③GradientにBackpropagationを使っている
ということがわかりました。
②Cost Functionで『J』、③Gradientで『grad』がわかれば
fmincgに放り込めば最適θが計算されます。
そして最適θがあれば予測値が出ます。
Regularized Gradientは③Gradientの最終段階ですね。
もーすぐ最適θが出て予測値が出ます。
ということで今全体のどこを取り組んでいるのが分かったのでRegularized Gradientに取り組みます。
まずVideoで振り返った内容の確認です。
Coursera Machine Learning Week5 2周目⑦ Backpropagation Video振り返り - 暇人日記
赤丸がRegularized Gradientの部分ですね。
赤丸を拡大します↓
私の苦手な場合分けです。
違いはがあるかないかです。
jが0だったら不要で、jが1以上なら必要です。
概念的にはjが0はBias unit用のθなのでRegularizedでCost FunctionJを計算する時に
入らない方がふさわしいということでした。
ところでθのl,i,jって何を意味したのか忘れたので前回の日記を振り返ります。
jは緑なのでj=0はθのレイヤー最上部にあるBias Unit用のθのこととわかりました。
最上部のθについてはλをかけなくていいいよ、ということだと理解しました。
問題文を読んでみます。
問題文にも同じことが書いています。
j=0のΔはが不要ということです。
j=0のときのΔとは何でしょうか?ということが問いになります。
Δは5000パターンの合計のgradを5000で割ったものでした。
ふっと思いつきました
Theta1は25x401でTheta1_grad=Δは25X401でした
Theta2は10X26、Theta2_grad=Δは10X26でした。
Theta2、Theta2_grad=Δで考えると、形が↓です。
この一番左の行の1X10がBias Unit用のθです。
というのは1X25でa(2)になりそうなところに
Bias Unitを足して1X26がa(2)になっているから
Theta2は26X10になっています。
その25-->26に1行増えた分に対応しているTheta2が
一番左の段だからです。
プログラミング的には
として、A=Theta2_grad . *maskBとすれば
λ X A でTheta2_gradのBias Unitの箇所にλがかからないようにできます。
プログラム全体ex4.mを読んだところ、
もし正解なら0.576051のcostが出るそうです。
やってみました
なりました!正解です!
次回はCheckGradientNNに取り組みます!
Coursera Machine Learning week5 2周目⑪Backpropagation ループ無 後半
さて、今回も前回に引き続き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に
取り組んでいきます。
また次回よろしくお願いいたします。
Coursera Machine Learning Week5 2周目⑩ Backpropagation ループ有り 前半
ヒントにはループ有で最初は解くようにとありましたが、
私にはループ有りで解く方が難しいです。
理由ははっきりしていてループするとループシュミレーション取り出しを
しなければなりませんが、目指すべき形がわからないからです。
さらにgradは苦手分野でイメージがつきません。
なのでgradでループシュミレーション取り出しは私にとって最悪の組み合わせです。
先にループ無しで解いたのはそれが理由です。
先に解いたのでTheta1_gradとTheta2_gradの数字がわかっています。
ループ有ではこの数字に合うことを目指します。
一番わかっていない概念や構造を考えてみたいと思います。
ループ無しで書いた通り、
Theta1_grad = zeros(size(Theta1))
Theta2_grad = zeros(size(Theta2))
という最大のヒントのおかげで
Theta1_grad は25X401
Theta2_grad は10X26
と分かっています。
Theta2_grad は0-9で10通りの場合分けで、
1X26を10回取り出すというループかなと思いました↓
ですがTheta1_grad は25X401なので、何をどう逆立ちしても
ループして10個の取り出しは良い形が思いつきません。
10個での取り出しは断念した方がいいと思い、問題文を読みなおしました。
『for-loop for t =1:m』を見つけてフッと思いました。
mって普通datasetの数だよなぁ、m=length(y)でWeek2から毎回登場してるなぁ、
今回はmは5000だよなぁ、、、、
まさか、ループは1~5000!?
は5000セットあります!
こう考えると問題文の辻褄は合います。
Cost Functionのループは↓のイメージでした。
CostFunctionのときは5000X1の突き合わせを10回して5000X10でしたが、
Gradidentは1X10を5000回で5000X10かもしれません。
でもまだ謎があります。
①0-9の10通りのループはどうするのか?
②Theta1_grad は25X401をどうするのか?
③『Step 5 will divide the accumulated gradients by m』
累計されたgradientsをm(=5000)で割る
が謎です。
全く根拠ありませんが②③をひっくるめて
25X401のGradientsを5000通り計算して、5000で割るだと辻褄があいます。
delta_3は1X10になるべきです。(ループ無しでは5000X10)
なので横一列だけ取り出すようにプログラムするには↓になるはずです。
delta2は???です。
ループ無しでは5000X25だったので1X25でしょうか。。。
これだとmの1-5000のループは反映されていますが、
0-9の10通りのループが反映されていない気がします。
えいやっ!で気合でプログラミング書いてみました↓
2つのループなんで0-9の10通りのループの中にmの1-5000のループを
入れる構造で書いたんですが、、、
delta_3でひっかかりました。。。
一度立ち返ることにします。
ループ無しでは↓の構造でした。
ループ有り構造で1-5000のループの1つ1つは↓になります。
a3はループの1つ1つでも1X10ということに気づきました。
こんな感じになっていて、CostFunctionの時はK=1のときの差分、K=2のときの差分、
・・・となっていたので0-9の10通りのループをしたんですが、
Backpropagationでも必要なんだろうかと思いました。
FeedForwardとBackpropagationの関係を絵にしてみました↓
a3が1X10だからδ(3)も1X10でいいなと思いました。
同じ次元でないとふさわしくないと思いますので。
ちなみに絵に数式を足したのがこちらです。
a3が1X10だからδ(3)も1X10でいいなと思ったので、
yも1X10が良いなと思いました。
そうするとこの↑の式が成立して
0-9の10通りのループは処理していることになります。
そうすると1-5000のループだけでいいのではないかと思いました。
今回はここまでです。また次回頑張ります。
Coursera Machine Learning Week5 2周目⑨ Backpropagation ループ無し
Video振り返り/問題文読み込みをしたので、
今回はBackpropagationの課題にいよいよ取り組みます。
解き方の順番は詳細にVideoにも問題文にもありました↓
この順番に解いていけばいいはずです。
今回はループ無しで解きます。
ヒントはループ有りが推奨でしたが私にはループ有りの方が難しいので、
今回はループ無しで解いて、次回ループ有りで解いてみます。
ということで順に解いていきます。
ここはCostFunctionの時に実行しているので飛ばします。
a3がoutput Layerになりますね。
問題文ではとあります。
この違いは問題文はループを推奨しているからだと思います。
δ(3)=a(3)-y(t)になりますが、
tはループに関係しているので、ループ無しで解くときは無視でいいと思います。
そうするとこれはoutput layer(=a3)と実Sampleのyとの比較です。
Coursera Machine Learning Week5 課題 2周目⑤ Costfunction ループ無し - 暇人日記
絵としては↓のイメージになります。
実Sampleは5000X1から5000X10へ増加させていて、
output Layer(=a3)も5000X10なので、そのまま引き算できます。
問題文にはとあります。
の部分を先に考えます。
θ(2)は10X26です。δ(3)は5000X10です。
なのでこの部分を次元が合うようにδ(3) X θ(2)と考えると
5000X10 X 10X26 で5000X26になります。
はの中に
z(2)を代入すればいいはずです。
z2は5000X25なので
が次元が合わなくてエラーになりました。
Videoを振り返ってδの1つ目は不要であることを思い出しました。
δの1行目を削るのには方法があると思います。
1つ目はThetaをそもそも1行目削除する。
θ2は10X26ですが、1行目削れば10X25になります↓
そうすると5000X10 X 10X25 でδ(2)は5000X25になります。
実行は↓を参考にしました!
δ(2)もできました!
ここは前回の日記に書いた通り、
**************************************************************************
**************************************************************************
右の赤枠で考えます。
そしてのはずです。
次元から考えてみます。
Theta1_grad = zeros(size(Theta1))
Theta2_grad = zeros(size(Theta2))
最大のヒントは↑だと思います。
Theta1は25X401なのでTheta1_gradも25X401です。
Theta2は10X26なのでTheta2_gradも10X26です。
δ(3)は5000X10
δ(2)は5000X25
となっています。
まずTheta1_gradを考えます、25X401が正解です。
はTheta1_grad=δ(2) X a(1)'となります。
δ(2)は5000X25
a(1)は5000X401
Theta1_gradは25X401
なので、転置すると次元が合います。
次にTheta2_gradを考えます、10X26が正解です。
Theta2_grad=δ(3) X a(2)となります
δ(3)は5000X10
a(2)は5000X26
Theta2_gradは10X26
なので、転置すると次元が合います。
これでStep5が完了です。
最後の↑のStepはm=5000で割ればいいです。
式が2つに分かれてますが、それはRegularizedに関するので
ここでは飛ばします。
これでSubmitして正解でした!
Step通りには解けましたがやはり中身が理解できていないです。
次回はループありでの解き方に挑戦して中身ももう少し理解できらたいいな
と思います!
Coursera Machine Learning Week5 2周目⑧ Backpropagation
問題に取り組んだ日記⑥を読み進めると問題は
となっていますので、この順に読み進めていきます。
課題プログラムとしてはsigmoidGradient.mとnnCostFunction.mを
解くことになります。
まず
2.1 Sigmoid Gradient
です。
これは前回のVideoの↓に
式がかいてあるので、ほぼそのままで正解になりました。
次に
2.2 Random Initialization
です。
ここはプログラミングに関しては既に与えられているので
やることはありません。
Video⑥Random Initializationでは
Linear RegressionやLogistic Regressionを解くときに
と設定していたが、今回はそう設定すると問題がある。
なぜ問題かといえば
となるからだ、と説明されています。
それではどうすればいいか、
これを使えば、
がもっとうまく解決できるかもしれません。
とはいえ、ここでは解く必要がないのでRandom Initializationは
とばします。
2.3 Backpropagation
いつもの通り、
①問題文の読み込み
②プログラム全体ex4.mの読み込み
③プログラム詳細 nnCostFunction.mの読み込み
の順に進めていきます。
①問題文の読み込み
問題文にはかなり詳細な解き方が書いてあります。
それをVideoで振り返った内容と対応表のようにしたのが↓です。
Videoといっていることはほとんど同じです。
ただ、問題文はloopで解くことを前提にしているのでyの場合分けに言及しています。
Videoでは分からなかったことに気づかせてくれたのが、↓の部分です。
前回の日記で↓と書きました。
*************************************************************
Dは大文字デルタの意味で小文字デルタΔの累積とあります。
**************************************************************
この問題文を読んだときにΔはθ1つ1つに対する微分でDはΔの合計かなと思いました。
だからmで割るのかなと。
問題文の読み込みは以上です。
②プログラム全体ex4.mの読み込み
本文です↓
驚くくらいあっさりしています笑
ここが本当にBackpropagationのパートかなと思うくらいです。
ただ、タイトルに『Part 7: Implement Backpropagation』と入っているので
ここで正解のはずです。
BackpropagationのプログラミングはnnCostFunctionに入力するはずですが、
それをこの箇所で実行しているようには見えません。
あるのはcheckNNGradientsの文字のみです。
checkNNGradientsは↓の通り、『Gradient Checking』の部分に相当するものです。
つまり、ex4.mの本文はBackpropagationで計算したものが合っているかどうか
Gradinent Checkingで確かめなさいという検算部分になっています。
実行するとこういうもの↓が表示されます。
左がnnCostFunctionからのgradで、右がCheckGradientNNからのgradだと思います。
右と左の数字が近くて、最後の『Relative Difference』が1e-9(=0.0000000001)
より小さければ 正解と書いてあると思います。
③プログラム詳細 nnCostFunction.mの読み込み
nnCostFunction.mはnn_params, input_layer_size,hidden_layer_size,num_labels,X, y,lambdaを入力するとJとgradを計算してくれる関数となっています。
JをCost Functionで計算したので今回はgradを計算するのが目的になります。
Theta1_grad = zeros(size(Theta1))
Theta2_grad = zeros(size(Theta2))
最大のヒントは↑だと思います。
Videoを振り返っても問題文を読んでもピンとこなかった
これがSizeがTheta1とTheta2と同じということが読み取れます!
そしてloopがおすすめというヒントがあります。
Cost Functionはループありとループ無しで行ったので、
今回のgradもループありとループ無しの両方のパターンにTryしてみたいと思います。
今回はここまでです。次回はBackpropagationに取り組みます!
Coursera Machine Learning Week5 2周目⑦ Backpropagation Video振り返り
今回はBackprobagationの課題に取り組む前にVideoの振り返りをします。
Video②Backpropagation Algorithm
1周目で課題は正解したものの内容を最も理解していない部分になります。
このVIDEOのReading Partから結論から書いていく方向でまとめてみます。
正直ボトムアップで書くと見失ってしまいます笑
するためには
が必要で
が答えとあります。
この式↑の右辺が↓です。
Dは大文字デルタの意味で小文字デルタΔの累積とあります。
(この意味は正直わかりません。課題をやるときに考えてみたいと思います。
ところでこういう場合分けってプログラミングの時に難しいので嫌いです笑)
Dは小文字デルタΔの集合体と考えるとΔがどうやって計算されているか
知る必要があります。
それが↓の5Stepと説明されています。
(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)
この5つのStepで小文字デルタΔが計算されるので、
Gradient=が計算されたことになりました。
それでは5つのStepを順にみていきたいと思います。
Step1とStep2はWeek4でやったものでVIDEOの名前を借りれば
Model Representationということだと思います。
Step3はOutput Layerの予測と実Sample;yの比較ですね。
これはFeedforwardで予測されているからStep3が実行できる思います。
Step4は数学的な意味は最早わかりません。
VIDEOの中でも証明はされているから気にするなというメッセージでした。
とはいえStep4にどういったことが書かれているのかは考えてみます。
課題をやるときに苦労することになりそうなので。
分からないときは詳細に計算式は書いてあるのでこのまま実行してみようと思います。
Step4は↓でした。
これに対応するVideoのスライドの箇所が赤枠です↓です。
分解してみると、
をスライドで具現化されているのは、
なので、
を代入していると思います。
ところでg(z3)って何だっけと思ったんですが、
とスライドにありました。
やっぱり難しいです。Step4はこれくらいにしておきます。
Step5は
1個1個の場合とベクトルの場合の2つが表現されていますが、
プログラミングはベクトルで行うので右の赤枠で考えてみます。
が、文系の私には?????という感じです。
しかし、この感じに見覚えがあります。
それはLogistic RegressionのGradientです。
θとΔが違いますが式の構造が似ています。
Logistic RegressionのGradientに取り組む際に↓のようなことを書いていました。
Coursera Machine Learning Week3 課題 2周目④ -苦闘記憶-Gradient - 暇人日記
このとき、どうプログラミングしたかというと
grad =
でした。
ということは
とプログラミングすればいいはずです。
Step5まで見たので、全体の流れとプログラミングするのが簡単そうかどうかを
表にしてみました↓
Step5ができれば解けそうな気がします。
これは課題の中で考えたいと思います。
その他の点ですが、Neural Networkは
どの場所を言っているかわからないくらい
アルファベットが多いので1例を図にしました↓
a(l)jはどこか気になったので図にしてみました↓
右肩がLayerで左下がそのLayerの中の何番目のUnitかでした。
もう1つFeedforward propagationとBackpropagationと
JとGradientの関係を考えてみます。
前回の日記で↓のように書いたんですが、違うということに気づきました。
backpropagationはWeek5でビデオがあるので飛ばしますが、
feedforward propagationとbackpropagationがセットの概念で
①Ove VS all
②Neural Network feedfoward propagation
③Neural Network backpropagation
の3パターンで今回の5000の0-9の手書き数字認識課題を
やるのかなと思いました。
↑ではないと気づきました。
feedfoward propagationもbackpropagationも
とを算出するのに必要な手段であって、
2つの計算方法(Linear RegressionやLogistic Regressionのような)と
同列ではないと気づきました。
Video③Backpropagation intuition
なんとなく理解できたのはモデルを左から右へFeedForwardで作って、
誤差を右から左へ逆流させて正しいかどうかみてる、ということです。
Backpropagationは難しい、分からなくても大丈夫、
というAndrew先生の言うことを信じることにします。
ただ、やってみたいなと思ったのは、
δ(1)はX1と同じだから計算する必要ないといってましたが、
δ(1)はδ(2)から計算できるので、それをX1と比較したら
どうなるんだろうと思いました。
それでは次回Backpropagationに取り組みたいと思います!
Coursera Machine Learning Week5 課題 2周目⑥ Regularized
今回はRegularized↓に取り組みます!
前回まとめた相関図ではCostFunctionのVideoだけが参考になっているはずです。
Regularizedが何かといえば↓の式です。
この式がプログラミングできれば終了です。
Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記
前回の日記を書いたときに↓が問題でイメージできれば
解けるんじゃないかと思いました。
それでは問題文を読んでみます。
重要ポイントはlambda=1だったらJが0.383770になるということです。
0.383770をターゲットにします。
もう1つは赤丸で囲った部分です。
の一般式と違います。
θが2つあるのはLayerのLを分けているからだと思います。
一般式
では一番左のΣでLayerも1つの式にしていましたが、
問題文はLayerを分けていると思います。
なのでθは2つあって、ΣでLがついているものがないと思います。
↑の方がイメージしやすいので、こちらで考えてみます。
まずTheta1とTheta2の確認です。
絵としては↓の場所にあります。
サイズはOctaveでもこの表↑のとおり、と思ったら
縦横が逆ですね。
今回削除しなくてはいけないのは
Theta1では401のうちの1つ、Theta2では26のうちの1つです。
なぜならBiasを足していて400-->401、25-->26と予測の精度を向上させるためだけに実在しない行を足しているからです。
Theta2で考えてみます。
Theta2の形を絵にすると↓になります。
そして26のうち1行目がいりません。
削ると10X25のサイズになります↓
サイズが10X25になったので、θは合計250個
もともと問題に示されていた式↓のTheta2も10X25で250個なので、
これを要素ごとに2乗すればいいことになります。
10X26から1行目を削って10X25にする方法について
小実験してみます。
(:,2:end)を利用すれば1行目だけを削除できることがわかりました。
要素ごとに2乗して↓
合計を足して↓
完成ですね。
これをTheta1とTheta2でやったらJが0.383770になりました!
今回はここまでです。次回はBackpropagationに取り組みます!
Coursera Machine Learning Week5 課題 2周目⑤ Costfunction ループ無し
CostFunctionをループ無しで解くことにトライしてみます。
これはK=1のとき、K=2のとき、・・・、K=10のときと
ループさせていたのをループさせずに解くということです。
ループありではOutput Layerが5000X10で、
ある意味わざわざK=1のときの予測を1行取り出して、
実SampleもK=1のときを変換して、5000X1と5000X1を突き合わせていました。
絵で書くと↓のようなイメージです。
Output Layerは5000X10でK=1のとき、K=2のとき・・・、K=10のときは
全てデータとして持っているので、実Sampleを5000X10で表現できれば
実Sample y かける Output Layerの式↓にもっていけます。
絵にすると↓になります。
こうすると5000X10同士の突き合わせができます。
ということは実Sampleを5000X1を5000X10に変えたいということになります。
そして、1,2,3,4,56,7,8,9,10すべてを1に変えたいということになります。
実験をしたいと思います。
今までは↓のように1こだけ変えていました。
ググってみると、↓の方法があることがわかりました。
ということで
実Sampleを5000X1を5000X10に変えれるということになります。
そして、1,2,3,4,56,7,8,9,10すべてを1に変えれるということになります。
データを保持するために
y_Vec = (1:num_labels)==y
とすれば実Sample;5000X10が手に入るので
Output Layer5000X10との突き合わせが可能です。
どう突き合わせるかというと↓のLogistic RegressionのCostFunctionを式をみると、
実Sampleの5000X10と予測=Output Layerの5000X10をかけることになります。
何故かけるかはWeek3のLogistic RegressionのCostFunctionの理由と同じです。
は0と1の間にしか数字をとらないことと、yは0か1なことを
うまく利用しています。詳しくはこちら↓をご覧ください
Coursera Machine Learning Week3 課題 2周目③ -苦闘記憶- Compute Cost for CostFunction - 暇人日記
ということで各要素ごとに突き合わせたい=かけたいので、『.』の出番です。
これで前回の日記と同じくJが0.2876になりました!
今回はここまでです。次回はRegularizedに挑みます!
Coursera Machine Learning Week5 課題 2周目④ Costfunction ループ有り
④前回に引き続き↓に取り組んでいきます。
without Regularizationなので、
これ↑を式にして、Jが0.287629になることが目標です。
まずはヒントに合った通り、loopを使う前提で解いていきたいと思います。
loopでk=1のとき、k=2のとき、k=3のとき、・・・・k=10のときとするので、
まずはk=1のときを考えてみます。
考えるのはとの2つです。
まずです。 k=1なので↓のように直したいです。
Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記
で振り返ったように、↓が役立つはずです。
実行してみました。
y ==1
1以外の部分は『0』になりました。
1つ問題に気づきました。
y自体は変更されていません。
y==1はyを上書きはしていないということに気づきました。
↓の例を作ってみました。
上段でaを1~10で設定しました。
中段でa==1で1以外の場所を0に変更しています。
下段で再度aを呼び出しました。
中段になれば上書きですし、上段になれば上書きでないということです。
上書きでないという証明になりました。
ということは『==』機能は上書きではないので、
中段でデータを保持できないことになります。
これはCost Functionの計算に差支えがあります。
yをy==1に置き換えた値とを引き算したいからです。
ネットで調べたところ、B=a==1というような数式ではありえないような
式をいれると↓
Bでデータを保持されることがわかりました。
なのでy_Vec = 1==yとして、
と必要だったものが作成されます。
次にです。これはWeek4の課題と同じです↓
Coursera Machine Learning Week4 課題 2周目⑩ -苦闘記憶- Neural Network③ - 暇人日記
この↑の構造を計算するとOutput Layerが5000X10と計算されます。
ここで1つ問題があります。
はK=1のとき、5000X1です。
なので、=Output Layerも5000X1にする必要があります。
が、今はOutput Layerは5000X10です。
5000X1にしなければならないので1行目を選択します。
↓だと思ったからです。
ただよく考えるとNeural Networkでは1行目が1の予測をしているかどうか
ってどうしてわかるんだろう、とハタと悩みました。
1行目は2の予測でも3の予測でもいいような気がします。
FeedForwardでは確証がないのですが、
Backpropagationで誤差検証するからいいのかなと思いました。
今、k=1のときのYとOutput Layerの1行目の誤差を計算しても
きっと大きいはずです。
Theta1/Theta2は与えられたもので最適でないはずだからです。
そして現実の問題もThetaの最適値が最初から分かっていることはないはずです。
いわばFeedForwardは当て馬だなと思いました。
その当て馬のFeedForwardで計算しても、それが最適かどうかわかるはずがないので、
Backpropagationがあるのかなと思いました。
Output Layerから1行目を取り出すのは
Output Layer(:,1)とすると↓のように取り出せるはずです。
これでk=1のときのの5000X1ができました。
ということは↓の計算ができるはずです。
この計算はlogisitic RegressionのCostFunctionそのままでWeek3の課題でした↓
Week3の課題のLogistic RegressionのCost Functionをコピペしました!
今度はこの単品のLogistic Regression(上の段)を複数のLogistic Regression(下の段)
にすればいいことになります。
これはKは1から10までなので
for i=1:k
end
で真ん中に単品のLogistic Regressionを挟めばいいはずです。
そうするとJはK=1のとき、K=2のとき、K=3のとき、・・・K=10のときと
10個のJが出るはずです。
この10個のJの取り出し方は↓の日記にまとめたのが役に立ちます。
Jは10個なので、
パターン①取り出すものが「値」です。(一覧がNX1になる)
が役に立ちます。
Jhistory=zeros(K,1)
と10X1の空ベクトルを用意すれば取り出せるはずです!
実行してみました!
取り出せました!
合計が目的通り0.28763になりました!
ただ、submitで合格すると正答するためには
sum(Jhisotry)が0.28763でなく、Jが0.28763になる必要があります。
色々な方法があると思いますが私は
単品Logistic RegressionをJpart、
ループシュミレーション取り出しの10X1をJhistory、
J=sum(Jhisotry)
としてみました。
(すみません、これで正解になるかどうかはわかりません。
一度修了しているせいか提出できず採点してもらえませんでした。
1回目はループ無しで解いたので、これでプログラミング的に正解かどうかが
わかりません)
今回はここまでです。次回はループを使わない方法にTryしてみます。
Neural Networkでコロナ感染者数を予測してみたときの躓きのまとめ
懲りずに線形回帰取り組んだ東京都コロナ感染者予測をNeural Networkでも
やってみようとトライしてみました。
が、結果は散々です泣
Week5の課題はLogistic RegressionのNeural Networkだったので、
これを頑張ってLinear RegressionのNeural Networkに変えようとしたのですが、
プログラミングが不正確なせいか全然精度が出ませんでした↓
Linear Regressionの方がはるかにましです。
コーセラ機械学習で学んだ線形回帰でコロナ感染者数を予測してみる(4/18時点)※4/24UPDATE有 - 暇人日記II
構造は↓のようにしました。
全部でLayerは3つ、Hidden LayerのUnitは3にしました。
躓いたところのまとめです。
X = [ones(m, 1) X]にするタイミング
nnCostFunction内でX = [ones(m, 1) X]をするので、本文中に足してはいけないが
Theta1のためには必要なので一度足して削除する。
**************************************************************************
X = [ones(m, 1) X]
Week5課題の完コピ↓
--------------------------------------------------------------------------------------
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params*1;
--------------------------------------------------------------------------------------
X=X(:,2:end);
**************************************************************************
nn_paramsの初期値の設定
Week5の課題ではTheta1/Theta2のサイズについてや与えられていましたが、
今回は考えなければなりません。
Reshapeで合致させながら、一般化しようと思って作ったのが↓の式です。
nn_params=randperm(size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels)
Logistic RegressionからLinear Regressionへの変更
①Model Representationではsigmoidはいらないので削除しました。
②Jの計算式をLogistic RegressionからLinear Regressionへ変更する必要があります。
Week5の課題のJはLogistic RegressionのJと同じでした↓
↓が比較したものです。
Logistic RegressionのJ部分をLinear RegressionのJの式へ変更する必要
したらいいのでは、と思ったので変更しました。
③sigmoidGradientもLinear RegressionのGradientに削除する必要があります。
Week2の課題で↓のLinear RegressionのGradientのプログラミングを完コピしましたが
うまくいきませんでした。
なので、こっちの↓の赤枠で囲んだ式を再現したらサイズは合って
エラーなくプログラミング自体は走りました。
(ここが間違っているのかもしれませんが。。。)
CheckNNGradientsでサイズが合わないエラー
なんでエラーが出ると思ったら,CheckNNGradients.mで
初期設定されている↓の値のせいだとわかりました。
input_layer_size = 3
hidden_layer_size = 5
num_labels = 3
となっています。
Week5の課題は5000X400->25X10みたいな大きいサイズなので、
部分を取り出すという形で機能していますが、
私の今回は約20-30X1-->約20-30X3-->約20-30x1という小規模なので
元のサイズより大きいサイズを取り出そうとしているエラーです。
↓に直したらプログラミング自体はエラーなく走りました。
input_layer_size = 1
hidden_layer_size = 3
num_labels = 1
最終的に予測値はどう計算する?
Week5の課題では与えられていた部分が予測を出すのを担っていました↓
options = optimset('MaxIter', 50)
costFunction = @(p) nnCostFunction(p, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, X, y, lambda)
[nn_params, cost] = fmincg(costFunction, initial_nn_params, options)
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))
Theta2 = reshape(nn_params*2
これらがこれから考えるWeek5の課題の中で解けたらいいなぁと思っています。
行きがかりで理解したことはマトリョーシカのように
ex4.mはCheckNNGradientを含み
CheckNNGradientはcomputeNumericalGradientとdebugInitializeWeightsを含んでいることです。
しっかりとWeek5の課題を理解できるよう頑張ってみます!