暇人日記

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

Coursera Machine Learning Week5 課題 2周目⑰ 予測

もう随分とWeek5のNeural Networkに取り組んでますが振り返りたいと思います。

 

Week2-4で学んだ黄金の流れ

①予測式-->②Cost Function-->③Gradient-->④最適θ-->⑤予測

でいくと①-③がこれまでの日記で完了しています。

 

Linear Regression/Logistic Regression/Neural Networkの

①-③を横並びにすると↓になります。

f:id:omoshiroamericanews:20200613234727p:plain


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に放り込んでいます。

f:id:omoshiroamericanews:20200614000208p:plain

今回はθはnn_paramsと表記されています。

 

1直線のunrollされたθがでてくるので、reshapeしてます。

f:id:omoshiroamericanews:20200614000443p:plain

 

実行してみました。

まず予測結果です。

f:id:omoshiroamericanews:20200614121056p:plain

95.3%±1%の範囲に入っています。

 

θ=nn_paramsです。

f:id:omoshiroamericanews:20200614121304p:plain

まず計算される一直線のθは10285X1という長さで冒頭だけ

取り出すと↓です。

f:id:omoshiroamericanews:20200614121331p:plain

 

これがreshapeされてTheta1,Theta2になっています。

f:id:omoshiroamericanews:20200614121524p:plain

f:id:omoshiroamericanews:20200614121604p:plain

冒頭の方で確認してみて、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でも紹介され問題文にもあって課題プログラムまで

ありましたが、答えが書いてあって実行して理解したという気はしていません。

f:id:omoshiroamericanews:20200613224237p:plain

なぜ深堀するかというと、

Videoの中でRandom Initializationは非常に重要だとコメントされていたことがあります。

理由はBackpropagationの時にθの初期値が0だと差分のδが全て0になって

Backpropagationがうまく作動しなくなるのが理由です。

 

FeedForwardは今回は初期値が与えられていましたが、

FeedForwardでもθが全て0だと何Layerを挟もうとoutput layerは全て0になると思うので

Random Initializationは応用する時に必須なのではないかと思います。

 

Ramdom Initilalizationは

プログラム詳細randInitalizeWeights.mで表現されています。

f:id:omoshiroamericanews:20200613225630p:plain

L_in, L_outがあれば、Wを計算するという式になっています。

L_in, L_outが何かといえば計算要素がL_inで計算結果L_outとあります。

f:id:omoshiroamericanews:20200613230402p:plain

 

具体的にWeek5の例で考えると

f:id:omoshiroamericanews:20200613230700p:plain

θ1のL_inはbias込みで401でL_outが25です。

θ2のL_inは26でL_outが10です。

 

どうやってRandom InisitalizationをするかのVideoの説明は↓でした。

 

f:id:omoshiroamericanews:20200427175806p:plain

 

これをみたときにrand(10,11)はどういうものか分からなかったので実行してみます。

 

 

f:id:omoshiroamericanews:20200613231030p:plain

10X11のランダムのベクトルを作成してくれるようです。

だとすればこれで十分だと思うのですがなぜεがついているのだろう。

 

f:id:omoshiroamericanews:20200613231306p:plain

あ、なるほど、あの式だと絶対値εの範囲におさまるということですね。

ふーん、

f:id:omoshiroamericanews:20200613231516p:plain

何故この式でf:id:omoshiroamericanews:20200613231306p:plainなると断言できるんだろう??

 

分かりません。。。

-A ≦ A *(2rand-1) ≦A

となっているようですけど、-1≦(2rand-1)≦1でないと成立しないと思います。

 

どうしてこれが証明できるか分かりませんが先に進みます。

εは0.12に設定されていました。

f:id:omoshiroamericanews:20200613232120p:plain

Videoの式が具現化されています。

 

実行すると見事に25X401のRandom Initializationできたw=θが出てきました!

f:id:omoshiroamericanews:20200613232313p:plain

f:id:omoshiroamericanews:20200613232248p:plain

 

 

Random Initializationと似たものでdebugInitilizationWeights.mというのが

Week5の中にはあります。

 

こちらはGradinent Checkingの中で出てきます。

Week5の中では

Random InitializationはBackpropagationに使って、

debugInitializationWeights.mはGradinent Checkingに使っています。

 

目的は同じでランダムにθを作ることですが、作り方が違います。

f:id:omoshiroamericanews:20200613233404p:plain

 f:id:omoshiroamericanews:20200613233422p:plain

fan_out = L_out

fan_in = L_in

です。

 

sinはサイン関数で-1~1の値しかとりません。

それをnumel(W)=260を1から260までを1つ1つ代入して260の値を出してます。

そしてsize(W)=10X26でreshapeして10で割っています。

 

f:id:omoshiroamericanews:20200613233754p:plain

 

おそらくランダムの計算方法を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だったので

f:id:omoshiroamericanews:20200607214026p:plain

 

gradも3X1です↓

f:id:omoshiroamericanews:20200607214948p:plain

 

これにGradient Checkingの式を入れてみました↓

f:id:omoshiroamericanews:20200607214853p:plain

見事、左右に並びました!

左の列がGradinent Checkingで計算したgrad,

右の列がfminuncで計算したgradが並びます。

ただ、精度をはかる指標が1e-9の小ささまではいってないですね。

かなりfminuncとGradient Checkingの差は大きいという判定になりそうです。

 

 

 

with Regularizationで見てみます。

f:id:omoshiroamericanews:20200607215913p:plain

やはり精度をはかる指標が1e-9の小ささまではいってないですね。

かなりfminuncとGradient Checkingの差は大きいという判定になりそうです。

 

これはlambda=1だったので、lambda=0.1にしてみました。

 

f:id:omoshiroamericanews:20200607220103p:plain

あんまり傾向は変わらずですね。。。

 

 

続いてWeek4のOne VS Allでやってみます。

これは手書きの文字の判別でした。

5000のサンプルが与えれており、1サンプルは1X400の情報量でした。

 

thetaは401X10でした。

 

やり始めたところ計算が10分経っても終了しません。。。

 

こういうときのために評価用にSmall Neural Networkの作成が必要なんだと

実感しました。

 

ようやく計算終了しましたが、あれ!?です↓

f:id:omoshiroamericanews:20200607222757p:plain

 

Gradinent Checkingのgradは401X1となっています。

しかもerrorです。。。

f:id:omoshiroamericanews:20200607222933p:plain

 

そういえばgradも401X1になってますね。

 

f:id:omoshiroamericanews:20200607223049p:plain

 

そうかぁ、Week4のOne VS Allでは401X1のthetaをK=1のとき、K=2のとき、・・・・・K=10のときで合計して401X10にしていました。

 

今、私のたてた式だと401X1の取り出しになっていますね。

 

さらにyも1~10の間をとっているので、

 c=1で(y == c)を入れ込んで401X1を取り出すようにします。

,

f:id:omoshiroamericanews:20200608212750p:plain

うまくいきました!

しかも基準の1e-9とほぼ同じ1.76937e-09と出ました!

 

c=2でもやってみます!

f:id:omoshiroamericanews:20200608213525p:plain

うまくいきました!

 

今後、Gradientがうまくいっているかどうか迷ったら、

使えそうです!

 

別の日記でこのWeek5で学習したNeural Networkを

コロナ感染者予測に応用できないかなぁとトライしてたんですが、

このNeural Networkが合っているかどうかGradinent Checking使う

楽しみができました!

 

courseradaisuki.hateblo.jp

 

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

Coursera Machine Learning Week5 2周目⑭ Gradinent Checking-中編-

Gradient Checkingを使いこなすための深掘りです。

 

使えるとこういう結果が出てきます。

 

f:id:omoshiroamericanews:20200606234512p:plain

 

左の列にGradinent Checkingで計算したgrad,

右の列にBackpropagationで計算したgradが並びます。

 

この差が01e-9以下ならBackpropagationの計算は正しいという目安で

2.1e-11なので正しいといえるということになっています。

 

これを計算しているcheckNNgradients.mは↓の構成になっています。

 

f:id:omoshiroamericanews:20200606211836p:plain

(出典;『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

 

が設定されているので絵で表すと↓ですね。

 

f:id:omoshiroamericanews:20200606213422p:plain

 

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で行われているので

見てみます。

 

f:id:omoshiroamericanews:20200606212121p:plain

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

 

eはf:id:omoshiroamericanews:20200524114404p:plainが望ましいとVIDEOで触れられていましたが

そのまま設定されていますね。

 

 

形としてはループシュミレーション取り出しで、

 numgradとperturbの2つが空箱で38X1のベクトルとして用意されています。

 

numgradがGradient checkのf:id:omoshiroamericanews:20200524114306p:plainそのものです。

perturbはthetaから+εと-εをするために設定されています。

 

grad1つ目をε分ずらして計算、grad2つ目をε分ずらして計算を繰り返すために

perturbは次元はunrollしたthetaと同じ38X1に設定されています。

そしてloopで1つ目を計算する時は1つ目だけがεで他は0、

2つ目を計算する時は2つ目だけがεで他は0になるように設定されています。

絵にするとこういうイメージです↓

loop1つ1つでperturbは全部0にリセットされています。

 

f:id:omoshiroamericanews:20200606232340p:plain

 

loss1 = costFunc(nn_params - perturb)
loss2 = costFunc(nn_params + perturb)

numgrad(p) = (loss2 - loss1) / (2*e)

で↓の絵のイメージが表現されています。

f:id:omoshiroamericanews:20200524113931p:plain

 

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が計算される関数でした。

f:id:omoshiroamericanews:20200606234124p:plain

 

Week3/Week2ではCost Functionがこの役割を担っていました↓

 

f:id:omoshiroamericanews:20200606234226p:plain

f:id:omoshiroamericanews:20200606234254p:plain

Week2やWeek3に応用する時は

costFuncを修正すれば使えるのではないかと思いました。

 

次回応用にトライしてみます!

Coursera Machine Learning Week5 2周目⑬ Gradinent Checking-前半-

課題にはなっていないんですが、他のデータでNeuralNetworkを

使いたいと思った時にとても重要になっているGradient Checkingを

深堀してみます。

 

 

 

の流れで取り組みます

 

VIDEO

概念と計算式と具体的なコードが触れられています。

 

f:id:omoshiroamericanews:20200524113931p:plain

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

 

gradは微分だからgradは↑のような形でも取り出すことができる、

そしてそれは

Backpropagationのような理論から計算したgradと

ほぼ同じになるはずだから検算として使用できる、

と説明されていました。

 

この↑の絵の形でのgradの具体的な計算式が

f:id:omoshiroamericanews:20200524114306p:plain

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

 

でεの値はf:id:omoshiroamericanews:20200524114404p:plainくらいが望ましいと説明されています。

 

ちなみに片側だけ変化分をとってくるのは推奨しないと説明されていました↓f:id:omoshiroamericanews:20200524114502p:plain

 

具体的なプログラミングコードが↓です。

f:id:omoshiroamericanews:20200524114652p:plain

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

 

これで確かにf:id:omoshiroamericanews:20200524114306p:plainが計算できそうです。

 

ただ、これがBackpropagationのgradのTheta1_grad/Theta2_gradと

ほぼ同じということですが、同じ次元の25X401や10X26になるんだろうか?

と思いました。

 

しかし、これをみてわかりました。

f:id:omoshiroamericanews:20200524115217p:plain

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と同じ説明が書かれています。

 

f:id:omoshiroamericanews:20200524120130p:plain

 

具体的なf:id:omoshiroamericanews:20200524114306p:plainの計算は

computeNumericalGraident.mでされていると書かれてあります。

 

f:id:omoshiroamericanews:20200524120524p:plain

また、Gradinent Checkingは先ほど書いたような

Theta1は25X401で10,025、Theta210X26は260の2つを足して10,285全部について

ではなく部分を取り出して検証すると書いてあります。

 

f:id:omoshiroamericanews:20200524120731p:plain

実行上のTipでも全体で行うと計算負荷が大きくなるので

部分で行うことが勧められています。

 

プログラム全体/詳細

 

階層が深くマトリョーシカっぽく感じたので絵にしました↓

f:id:omoshiroamericanews:20200606210809p:plain



 

ピンクのCheckNNgradientsの中で

Backpropagationのgrad

Gradinent Checkingのgrad
を突き合わせする構造になってます。

 

今回はここまでです。次回は実行したり試行錯誤してプログラミングをみていきます。

Coursera Machine Learning Week5 課題 2週目⑫ -苦闘記憶- Regularized Gradient

今回はRegularized Gradientに取り組みます↓

 

f:id:omoshiroamericanews:20200523215747p:plain

 

今、全体の流れのどこをやっているか分からなくなったので振り返ることにします。

 

前回の日記で全体の構造を下のようにまとめました。

 

 

f:id:omoshiroamericanews:20200523220302p:plain

 

問題文的にはf:id:omoshiroamericanews:20200523220326p:plainに取り組んでいます。

かなり終着に近づいてきました。

 

問題文/VIDEOで取り扱いがあって日記で掘り下げていないのは

f:id:omoshiroamericanews:20200523220633p:plain

f:id:omoshiroamericanews:20200523220655p:plain

の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振り返り - 暇人日記

f:id:omoshiroamericanews:20200523223137p:plain

赤丸がRegularized Gradientの部分ですね。

赤丸を拡大します↓

f:id:omoshiroamericanews:20200523223207p:plain

 私の苦手な場合分けです。

 

違いはf:id:omoshiroamericanews:20200523223625p:plainがあるかないかです。

jが0だったら不要で、jが1以上なら必要です。

概念的にはjが0はBias unit用のθなのでRegularizedでCost FunctionJを計算する時に

入らない方がふさわしいということでした。

 

ところでθのl,i,jって何を意味したのか忘れたので前回の日記を振り返ります。

 

f:id:omoshiroamericanews:20200523223904p:plain

f:id:omoshiroamericanews:20200523224130p:plain


 

 jは緑なのでj=0はθのレイヤー最上部にあるBias Unit用のθのこととわかりました。

 

最上部のθについてはλをかけなくていいいよ、ということだと理解しました。

 

 

問題文を読んでみます。

 

f:id:omoshiroamericanews:20200523222916p:plain

 

問題文にも同じことが書いています。

j=0のΔはf:id:omoshiroamericanews:20200523224657p:plainが不要ということです。

 

j=0のときのΔとは何でしょうか?ということが問いになります。

Δは5000パターンの合計のgradを5000で割ったものでした。

 

 

ふっと思いつきました

Theta1は25x401でTheta1_grad=Δは25X401でした

Theta2は10X26、Theta2_grad=Δは10X26でした。

 

Theta2、Theta2_grad=Δで考えると、形が↓です。

 

f:id:omoshiroamericanews:20200523225607p:plain

この一番左の行の1X10がBias Unit用のθです。

というのは1X25でa(2)になりそうなところに

Bias Unitを足して1X26がa(2)になっているから

Theta2は26X10になっています。

その25-->26に1行増えた分に対応しているTheta2が

一番左の段だからです。

 

f:id:omoshiroamericanews:20200523111245p:plain

 

 

プログラミング的には

 

f:id:omoshiroamericanews:20200523225814p:plain

f:id:omoshiroamericanews:20200523225909p:plain

として、A=Theta2_grad . *maskBとすれば

λ X A でTheta2_gradのBias Unitの箇所にλがかからないようにできます。

 

プログラム全体ex4.mを読んだところ、

f:id:omoshiroamericanews:20200523231404p:plain

もし正解なら0.576051のcostが出るそうです。

 

やってみました

 

f:id:omoshiroamericanews:20200523231632p:plain

なりました!正解です!

 

次回はCheckGradientNNに取り組みます!

 

 

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に

取り組んでいきます。

 

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

 

 

Coursera Machine Learning Week5 2周目⑩ Backpropagation ループ有り 前半

ヒントにはループ有で最初は解くようにとありましたが、

私にはループ有りで解く方が難しいです。

 

理由ははっきりしていてループするとループシュミレーション取り出しを

しなければなりませんが、目指すべき形がわからないからです。

さらにgradは苦手分野でイメージがつきません。

 

なのでgradでループシュミレーション取り出しは私にとって最悪の組み合わせです。

 

先にループ無しで解いたのはそれが理由です。

 

先に解いたのでTheta1_gradとTheta2_gradの数字がわかっています。

ループ有ではこの数字に合うことを目指します。

f:id:omoshiroamericanews:20200522114528p:plain



 一番わかっていない概念や構造を考えてみたいと思います。

 

ループ無しで書いた通り、

Theta1_grad = zeros(size(Theta1))
Theta2_grad = zeros(size(Theta2))

という最大のヒントのおかげで

Theta1_grad は25X401
Theta2_grad は10X26

と分かっています。

 

Theta2_grad は0-9で10通りの場合分けで、

1X26を10回取り出すというループかなと思いました↓

f:id:omoshiroamericanews:20200502232926p:plain

 

ですがTheta1_grad は25X401なので、何をどう逆立ちしても

ループして10個の取り出しは良い形が思いつきません。

 

10個での取り出しは断念した方がいいと思い、問題文を読みなおしました。

 

f:id:omoshiroamericanews:20200502233739p:plain

『for-loop for t =1:m』を見つけてフッと思いました。

mって普通datasetの数だよなぁ、m=length(y)でWeek2から毎回登場してるなぁ、

今回はmは5000だよなぁ、、、、

 

まさか、ループは1~5000!?

 

f:id:omoshiroamericanews:20200502234503p:plainは5000セットあります!

こう考えると問題文の辻褄は合います。



 

Cost Functionのループは↓のイメージでした。

f:id:omoshiroamericanews:20200502234121p:plain

 

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)

 

なので横一列だけ取り出すようにプログラムするには↓になるはずです。

f:id:omoshiroamericanews:20200502155525p:plain

 

delta2は???です。

ループ無しでは5000X25だったので1X25でしょうか。。。

これだとmの1-5000のループは反映されていますが、

0-9の10通りのループが反映されていない気がします。

 

えいやっ!で気合でプログラミング書いてみました↓

2つのループなんで0-9の10通りのループの中にmの1-5000のループを

入れる構造で書いたんですが、、、

f:id:omoshiroamericanews:20200522121206p:plain

delta_3でひっかかりました。。。

 

 

一度立ち返ることにします。

 

ループ無しでは↓の構造でした。

f:id:omoshiroamericanews:20200522121434p:plain

 

ループ有り構造で1-5000のループの1つ1つは↓になります。

 

f:id:omoshiroamericanews:20200522121539p:plain

 

a3はループの1つ1つでも1X10ということに気づきました。

 

f:id:omoshiroamericanews:20200522121914p:plain

こんな感じになっていて、CostFunctionの時はK=1のときの差分、K=2のときの差分、

・・・となっていたので0-9の10通りのループをしたんですが、

Backpropagationでも必要なんだろうかと思いました。

 

FeedForwardとBackpropagationの関係を絵にしてみました↓

f:id:omoshiroamericanews:20200522122332p:plain

a3が1X10だからδ(3)も1X10でいいなと思いました。

同じ次元でないとふさわしくないと思いますので。

 

ちなみに絵に数式を足したのがこちらです。

f:id:omoshiroamericanews:20200522122558p:plain

a3が1X10だからδ(3)も1X10でいいなと思ったので、

yも1X10が良いなと思いました。

 

f:id:omoshiroamericanews:20200522122753p:plain

そうするとこの↑の式が成立して

0-9の10通りのループは処理していることになります。

 

そうすると1-5000のループだけでいいのではないかと思いました。

 

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

Coursera Machine Learning Week5 2周目⑨ Backpropagation ループ無し

Video振り返り/問題文読み込みをしたので、

今回はBackpropagationの課題にいよいよ取り組みます。

 

解き方の順番は詳細にVideoにも問題文にもありました↓

 

f:id:omoshiroamericanews:20200503122906p:plain


この順番に解いていけばいいはずです。

 

今回はループ無しで解きます。

ヒントはループ有りが推奨でしたが私にはループ有りの方が難しいので、

今回はループ無しで解いて、次回ループ有りで解いてみます。

 

 

ということで順に解いていきます。

 

f:id:omoshiroamericanews:20200503123153p:plain

ここはCostFunctionの時に実行しているので飛ばします。

a3がoutput Layerになりますね。

 

f:id:omoshiroamericanews:20200503123258p:plain

問題文ではf:id:omoshiroamericanews:20200503152209p:plainとあります。

この違いは問題文はループを推奨しているからだと思います。

 

 

δ(3)=a(3)-y(t)になりますが、

tはループに関係しているので、ループ無しで解くときは無視でいいと思います。

 

そうするとこれはoutput layer(=a3)と実Sampleのyとの比較です。

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

絵としては↓のイメージになります。

 

f:id:omoshiroamericanews:20200503151517p:plain

 

実Sampleは5000X1から5000X10へ増加させていて、

output Layer(=a3)も5000X10なので、そのまま引き算できます。

 

f:id:omoshiroamericanews:20200503123319p:plain

問題文にはf:id:omoshiroamericanews:20200503152452p:plainとあります。

f:id:omoshiroamericanews:20200504143026p:plainの部分を先に考えます。

θ(2)は10X26です。δ(3)は5000X10です。

なのでこの部分を次元が合うようにδ(3) X θ(2)と考えると

5000X10 X 10X26 で5000X26になります。

 

f:id:omoshiroamericanews:20200503153421p:plainf:id:omoshiroamericanews:20200503153700p:plainの中に

z(2)を代入すればいいはずです。

z2は5000X25なので

f:id:omoshiroamericanews:20200503152452p:plain

が次元が合わなくてエラーになりました。

 

f:id:omoshiroamericanews:20200504143355p:plain

Videoを振り返ってδの1つ目は不要であることを思い出しました。

δの1行目を削るのには方法があると思います。

 

1つ目はThetaをそもそも1行目削除する。

θ2は10X26ですが、1行目削れば10X25になります↓

f:id:omoshiroamericanews:20200503154247p:plain

 

そうすると5000X10 X 10X25 でδ(2)は5000X25になります。

 

実行は↓を参考にしました!

f:id:omoshiroamericanews:20200503154937p:plain

 

 

 

δ(2)もできました!

 

f:id:omoshiroamericanews:20200503123329p:plain

ここは前回の日記に書いた通り、

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

f:id:omoshiroamericanews:20200503155713p:plain

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

右の赤枠で考えます。

 

そしてf:id:omoshiroamericanews:20200503160143p:plainのはずです。

 

次元から考えてみます。

 

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が正解です。

f:id:omoshiroamericanews:20200503160131p:plain


は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が完了です。

 

f:id:omoshiroamericanews:20200516103448p:plain

 

最後の↑のStepはm=5000で割ればいいです。

式が2つに分かれてますが、それはRegularizedに関するので

ここでは飛ばします。

 

これでSubmitして正解でした!

 

Step通りには解けましたがやはり中身が理解できていないです。

 

次回はループありでの解き方に挑戦して中身ももう少し理解できらたいいな

と思います!

 

Coursera Machine Learning Week5 2周目⑧ Backpropagation

問題に取り組んだ日記⑥を読み進めると問題は

 

となっていますので、この順に読み進めていきます。

 

課題プログラムとしてはsigmoidGradient.mとnnCostFunction.mを

解くことになります。

f:id:omoshiroamericanews:20200427174624p:plain

まず

2.1 Sigmoid Gradient

です。

 

これは前回のVideoの↓に

f:id:omoshiroamericanews:20200427174217p:plain

式がかいてあるので、ほぼそのままで正解になりました。

 

次に

2.2 Random Initialization

です。

 

ここはプログラミングに関しては既に与えられているので

やることはありません。

 

Video⑥Random Initializationでは

Linear RegressionやLogistic Regressionを解くときに

f:id:omoshiroamericanews:20200427175220p:plain

と設定していたが、今回はそう設定すると問題がある。

なぜ問題かといえば

f:id:omoshiroamericanews:20200427175405p:plain

となるからだ、と説明されています。

 

それではどうすればいいか、

f:id:omoshiroamericanews:20200427175652p:plain

これを使えば、

 

www.courseradaisuki.com

がもっとうまく解決できるかもしれません。

 

とはいえ、ここでは解く必要がないのでRandom Initializationは

とばします。

 

2.3 Backpropagation

いつもの通り、

①問題文の読み込み

②プログラム全体ex4.mの読み込み

③プログラム詳細 nnCostFunction.mの読み込み

の順に進めていきます。

 

 

①問題文の読み込み

問題文にはかなり詳細な解き方が書いてあります。

それをVideoで振り返った内容と対応表のようにしたのが↓です。

f:id:omoshiroamericanews:20200427233848p:plain

Videoといっていることはほとんど同じです。

ただ、問題文はloopで解くことを前提にしているのでyの場合分けに言及しています。

 

Videoでは分からなかったことに気づかせてくれたのが、↓の部分です。

f:id:omoshiroamericanews:20200427234144p:plain

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

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

Dは大文字デルタの意味で小文字デルタΔの累積とあります。

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

この問題文を読んだときにΔはθ1つ1つに対する微分でDはΔの合計かなと思いました。

だからmで割るのかなと。

問題文の読み込みは以上です。

 ②プログラム全体ex4.mの読み込み

本文です↓

f:id:omoshiroamericanews:20200427230011p:plain

驚くくらいあっさりしています笑

ここが本当にBackpropagationのパートかなと思うくらいです。

ただ、タイトルに『Part 7: Implement Backpropagation』と入っているので

ここで正解のはずです。

BackpropagationのプログラミングはnnCostFunctionに入力するはずですが、

それをこの箇所で実行しているようには見えません。

あるのはcheckNNGradientsの文字のみです。

 

checkNNGradientsは↓の通り、『Gradient Checking』の部分に相当するものです。

 

f:id:omoshiroamericanews:20200427230618p:plain

つまり、ex4.mの本文はBackpropagationで計算したものが合っているかどうか

Gradinent Checkingで確かめなさいという検算部分になっています。

 

実行するとこういうもの↓が表示されます。

f:id:omoshiroamericanews:20200428231646p:plain

左が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を振り返っても問題文を読んでもピンとこなかった

f:id:omoshiroamericanews:20200427232616p:plain

これが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から結論から書いていく方向でまとめてみます。

正直ボトムアップで書くと見失ってしまいます笑

 

f:id:omoshiroamericanews:20200412111704p:plain

するためには

f:id:omoshiroamericanews:20200412111720p:plain

が必要で

f:id:omoshiroamericanews:20200412111752p:plain

が答えとあります。

 

この式↑の右辺が↓です。

f:id:omoshiroamericanews:20200412112003p:plain

Dは大文字デルタの意味で小文字デルタΔの累積とあります。

(この意味は正直わかりません。課題をやるときに考えてみたいと思います。

 ところでこういう場合分けってプログラミングの時に難しいので嫌いです笑)

 

Dは小文字デルタΔの集合体と考えるとΔがどうやって計算されているか

知る必要があります。

 

それが↓の5Stepと説明されています。

 

f:id:omoshiroamericanews:20200412113058p:plain

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

 

この5つのStepで小文字デルタΔが計算されるので、

Gradient=f:id:omoshiroamericanews:20200412111720p:plainが計算されたことになりました。

 

 

 

 それでは5つのStepを順にみていきたいと思います。

 

Step1とStep2はWeek4でやったものでVIDEOの名前を借りれば

Model Representationということだと思います。

 

Step3はOutput Layerの予測と実Sample;yの比較ですね。

これはFeedforwardで予測されているからStep3が実行できる思います。

 

Step4は数学的な意味は最早わかりません。

VIDEOの中でも証明はされているから気にするなというメッセージでした。

とはいえStep4にどういったことが書かれているのかは考えてみます。

 課題をやるときに苦労することになりそうなので。

分からないときは詳細に計算式は書いてあるのでこのまま実行してみようと思います。

 

 

Step4は↓でした。

 f:id:omoshiroamericanews:20200427113238p:plain

 

 これに対応するVideoのスライドの箇所が赤枠です↓です。

f:id:omoshiroamericanews:20200427113521p:plain

分解してみると、

f:id:omoshiroamericanews:20200427114030p:plain

をスライドで具現化されているのは、

f:id:omoshiroamericanews:20200427114043p:plain

なので、

f:id:omoshiroamericanews:20200427114125p:plain

 を代入していると思います。

 

ところでg(z3)って何だっけと思ったんですが、

f:id:omoshiroamericanews:20200427114229p:plain

とスライドにありました。

 

やっぱり難しいです。Step4はこれくらいにしておきます。

 

Step5は

f:id:omoshiroamericanews:20200427114347p:plain

1個1個の場合とベクトルの場合の2つが表現されていますが、

プログラミングはベクトルで行うので右の赤枠で考えてみます。

が、文系の私には?????という感じです。

しかし、この感じに見覚えがあります。

それはLogistic RegressionのGradientです。

 

f:id:omoshiroamericanews:20200427160111p:plain

θとΔが違いますが式の構造が似ています。

 

Logistic RegressionのGradientに取り組む際に↓のようなことを書いていました。

Coursera Machine Learning Week3 課題 2周目④ -苦闘記憶-Gradient - 暇人日記

 

 

f:id:omoshiroamericanews:20200427160526p:plain

このとき、どうプログラミングしたかというと

grad =f:id:omoshiroamericanews:20200427160736p:plain

でした。

 

ということは

f:id:omoshiroamericanews:20200503160150p:plain

とプログラミングすればいいはずです。

 

Step5まで見たので、全体の流れとプログラミングするのが簡単そうかどうかを

表にしてみました↓

 

f:id:omoshiroamericanews:20200427161627p:plain


Step5ができれば解けそうな気がします。

これは課題の中で考えたいと思います。

 

 

その他の点ですが、Neural Networkは

どの場所を言っているかわからないくらい

アルファベットが多いので1例を図にしました↓

 

f:id:omoshiroamericanews:20200412105942p:plain

 

a(l)jはどこか気になったので図にしてみました↓

 

f:id:omoshiroamericanews:20200412110034p:plain

 右肩が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も

f:id:omoshiroamericanews:20200412111704p:plainf:id:omoshiroamericanews:20200412111720p:plainを算出するのに必要な手段であって、

2つの計算方法(Linear RegressionやLogistic Regressionのような)と

同列ではないと気づきました。

 

 

Video③Backpropagation intuition

なんとなく理解できたのはモデルを左から右へFeedForwardで作って、

誤差を右から左へ逆流させて正しいかどうかみてる、ということです。

 

Backpropagationは難しい、分からなくても大丈夫、

というAndrew先生の言うことを信じることにします。

 

f:id:omoshiroamericanews:20200427173035p:plain

ただ、やってみたいなと思ったのは、

δ(1)はX1と同じだから計算する必要ないといってましたが、

δ(1)はδ(2)から計算できるので、それをX1と比較したら

どうなるんだろうと思いました。 

 

それでは次回Backpropagationに取り組みたいと思います!

Coursera Machine Learning Week5 課題 2周目⑥ Regularized

 

今回はRegularized↓に取り組みます!

 

f:id:omoshiroamericanews:20200424213036p:plain

 

前回まとめた相関図ではCostFunctionのVideoだけが参考になっているはずです。

 

f:id:omoshiroamericanews:20200424213349p:plain

 

Regularizedが何かといえば↓の式です。

f:id:omoshiroamericanews:20200424213721p:plain

この式がプログラミングできれば終了です。

 

Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記

前回の日記を書いたときに↓が問題でイメージできれば

解けるんじゃないかと思いました。

 

f:id:omoshiroamericanews:20200424214107p:plain

 

それでは問題文を読んでみます。

f:id:omoshiroamericanews:20200424214250p:plain

重要ポイントはlambda=1だったらJが0.383770になるということです。

0.383770をターゲットにします。

 

もう1つは赤丸で囲った部分です。

f:id:omoshiroamericanews:20200424213721p:plain

の一般式と違います。

θが2つあるのはLayerのLを分けているからだと思います。

一般式

f:id:omoshiroamericanews:20200424213721p:plain

では一番左のΣでLayerも1つの式にしていましたが、

f:id:omoshiroamericanews:20200424214702p:plain

 

問題文はLayerを分けていると思います。

なのでθは2つあって、ΣでLがついているものがないと思います。

 

f:id:omoshiroamericanews:20200424214702p:plain

↑の方がイメージしやすいので、こちらで考えてみます。

 

まずTheta1とTheta2の確認です。

絵としては↓の場所にあります。

f:id:omoshiroamericanews:20200418231010p:plain

サイズはOctaveでもこの表↑のとおり、と思ったら

縦横が逆ですね。

 

f:id:omoshiroamericanews:20200424222630p:plain

f:id:omoshiroamericanews:20200424222648p:plain

 

今回削除しなくてはいけないのは

Theta1では401のうちの1つ、Theta2では26のうちの1つです。

なぜならBiasを足していて400-->401、25-->26と予測の精度を向上させるためだけに実在しない行を足しているからです。

 

Theta2で考えてみます。

Theta2の形を絵にすると↓になります。

f:id:omoshiroamericanews:20200424223637p:plain

 

そして26のうち1行目がいりません。

削ると10X25のサイズになります↓

 

f:id:omoshiroamericanews:20200424224041p:plain

 

サイズが10X25になったので、θは合計250個

もともと問題に示されていた式↓のTheta2も10X25で250個なので、

f:id:omoshiroamericanews:20200424224126p:plain

これを要素ごとに2乗すればいいことになります。

 

10X26から1行目を削って10X25にする方法について

小実験してみます。

 

f:id:omoshiroamericanews:20200424224417p:plain

f:id:omoshiroamericanews:20200424224435p:plain


(:,2:end)を利用すれば1行目だけを削除できることがわかりました。

 

要素ごとに2乗して↓

f:id:omoshiroamericanews:20200424224647p:plain

合計を足して↓

f:id:omoshiroamericanews:20200424224727p:plain

完成ですね。

 

これをTheta1とTheta2でやったらJが0.383770になりました!

 

今回はここまでです。次回はBackpropagationに取り組みます!

Coursera Machine Learning Week5 課題 2周目⑤ Costfunction ループ無し

CostFunctionをループ無しで解くことにトライしてみます。

f:id:omoshiroamericanews:20200503151426p:plain

 

 

これはK=1のとき、K=2のとき、・・・、K=10のときと

ループさせていたのをループさせずに解くということです。

 

ループありではOutput Layerが5000X10で、

ある意味わざわざK=1のときの予測を1行取り出して

実SampleもK=1のときを変換して、5000X1と5000X1を突き合わせていました。

 

絵で書くと↓のようなイメージです。

 

f:id:omoshiroamericanews:20200424204854p:plain

Output Layerは5000X10でK=1のとき、K=2のとき・・・、K=10のときは

全てデータとして持っているので、実Sampleを5000X10で表現できれば

実Sample y かける Output Layerの式↓にもっていけます。

 

f:id:omoshiroamericanews:20200424210743p:plain

 

絵にすると↓になります。

f:id:omoshiroamericanews:20200424211436p:plain

こうすると5000X10同士の突き合わせができます。

 

ということは実Sampleを5000X1を5000X10に変えたいということになります。

 そして、1,2,3,4,56,7,8,9,10すべてを1に変えたいということになります。

 

実験をしたいと思います。

今までは↓のように1こだけ変えていました。

 

f:id:omoshiroamericanews:20200424113254p:plain

 

ググってみると、↓の方法があることがわかりました。

 

f:id:omoshiroamericanews:20200424212035p:plain

 

 

 

ということで

実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を式をみると、

f:id:omoshiroamericanews:20200424210743p:plain

実Sampleの5000X10と予測=Output Layerの5000X10をかけることになります。

 

 

何故かけるかはWeek3のLogistic RegressionのCostFunctionの理由と同じです。

 

f:id:omoshiroamericanews:20200430114303p:plain

 

f:id:omoshiroamericanews:20200430114457p:plain


は0と1の間にしか数字をとらないことと、yは0か1なことを

うまく利用しています。詳しくはこちら↓をご覧ください

 

Coursera Machine Learning Week3 課題 2周目③ -苦闘記憶- Compute Cost for CostFunction - 暇人日記

 

 

ということで各要素ごとに突き合わせたい=かけたいので、『.』の出番です。

 

 

 

f:id:omoshiroamericanews:20200424212702p:plain

f:id:omoshiroamericanews:20200424212718p:plain


これで前回の日記と同じくJが0.2876になりました!

 

今回はここまでです。次回はRegularizedに挑みます! 

Coursera Machine Learning Week5 課題 2周目④ Costfunction ループ有り

④前回に引き続き↓に取り組んでいきます。

f:id:omoshiroamericanews:20200416142351p:plain

without Regularizationなので、

f:id:omoshiroamericanews:20200416142640p:plain

 これ↑を式にして、Jが0.287629になることが目標です。

 

まずはヒントに合った通り、loopを使う前提で解いていきたいと思います。

 

f:id:omoshiroamericanews:20200418191039p:plain

 

loopでk=1のとき、k=2のとき、k=3のとき、・・・・k=10のときとするので、

まずはk=1のときを考えてみます。

 

考えるのはf:id:omoshiroamericanews:20200410113304p:plainf:id:omoshiroamericanews:20200410113338p:plainの2つです。

 

まずf:id:omoshiroamericanews:20200410113304p:plainです。 k=1なので↓のように直したいです。

 

f:id:omoshiroamericanews:20200418225645p:plain

Coursera Machine Learning Week5 課題 2周目① Cost Function VIDEO振返り - 暇人日記

で振り返ったように、↓が役立つはずです。

 

f:id:omoshiroamericanews:20200418225826p:plain

実行してみました。

y ==1

 

1以外の部分は『0』になりました。

f:id:omoshiroamericanews:20200423115228p:plain

1つ問題に気づきました。

y自体は変更されていません。

 

f:id:omoshiroamericanews:20200423115314p:plain

 

y==1はyを上書きはしていないということに気づきました。

↓の例を作ってみました。

 

f:id:omoshiroamericanews:20200423115520p:plain

上段でaを1~10で設定しました。

中段でa==1で1以外の場所を0に変更しています。

下段で再度aを呼び出しました。

中段になれば上書きですし、上段になれば上書きでないということです。

上書きでないという証明になりました。

ということは『==』機能は上書きではないので、

中段でデータを保持できないことになります。

 

これはCost Functionの計算に差支えがあります。

yをy==1に置き換えた値とf:id:omoshiroamericanews:20200410113338p:plainを引き算したいからです。

 

ネットで調べたところ、B=a==1というような数式ではありえないような

式をいれると↓

f:id:omoshiroamericanews:20200423120255p:plain

Bでデータを保持されることがわかりました。

 

なのでy_Vec = 1==yとして、

 

f:id:omoshiroamericanews:20200418230325p:plain

f:id:omoshiroamericanews:20200418230427p:plain


と必要だったものが作成されます。

 

次にf:id:omoshiroamericanews:20200410113338p:plainです。これはWeek4の課題と同じです↓

Coursera Machine Learning Week4 課題 2周目⑩ -苦闘記憶- Neural Network③ - 暇人日記

 

f:id:omoshiroamericanews:20200418231010p:plain

この↑の構造を計算するとOutput Layerが5000X10と計算されます。

 

ここで1つ問題があります。

f:id:omoshiroamericanews:20200410113304p:plainはK=1のとき、5000X1です。

なので、f:id:omoshiroamericanews:20200410113338p:plain=Output Layerも5000X1にする必要があります。

 

が、今はOutput Layerは5000X10です。

 

5000X1にしなければならないので1行目を選択します。

↓だと思ったからです。

f:id:omoshiroamericanews:20200418234847p:plain

ただよく考えるとNeural Networkでは1行目が1の予測をしているかどうか

ってどうしてわかるんだろう、とハタと悩みました。

 

f:id:omoshiroamericanews:20200411101314p:plain

1行目は2の予測でも3の予測でもいいような気がします。
FeedForwardでは確証がないのですが、

Backpropagationで誤差検証するからいいのかなと思いました。

今、k=1のときのYとOutput Layerの1行目の誤差を計算しても

きっと大きいはずです。

Theta1/Theta2は与えられたもので最適でないはずだからです。

そして現実の問題もThetaの最適値が最初から分かっていることはないはずです。

 

いわばFeedForwardは当て馬だなと思いました。

その当て馬のFeedForwardで計算しても、それが最適かどうかわかるはずがないので、

Backpropagationがあるのかなと思いました。

 

Output Layerから1行目を取り出すのは

Output Layer(:,1)とすると↓のように取り出せるはずです。

 

f:id:omoshiroamericanews:20200418235826p:plain

f:id:omoshiroamericanews:20200418235841p:plain

これでk=1のときのf:id:omoshiroamericanews:20200410113338p:plainの5000X1ができました。

ということは↓の計算ができるはずです。

f:id:omoshiroamericanews:20200419000620p:plain

 

この計算はlogisitic RegressionのCostFunctionそのままでWeek3の課題でした↓

 

Week3の課題のLogistic RegressionのCost Functionをコピペしました!

 

今度はこの単品のLogistic Regression(上の段)を複数のLogistic Regression(下の段)

にすればいいことになります。

f:id:omoshiroamericanews:20200419001103p:plain

 

これはKは1から10までなので

for i=1:k

end

で真ん中に単品のLogistic Regressionを挟めばいいはずです。

 

そうするとJはK=1のとき、K=2のとき、K=3のとき、・・・K=10のときと

10個のJが出るはずです。

 

この10個のJの取り出し方は↓の日記にまとめたのが役に立ちます。

www.courseradaisuki.com

 

Jは10個なので、

パターン①取り出すものが「値」です。(一覧がNX1になる)

が役に立ちます。

 

Jhistory=zeros(K,1)

と10X1の空ベクトルを用意すれば取り出せるはずです!

実行してみました!

f:id:omoshiroamericanews:20200419001740p:plain

取り出せました!

f:id:omoshiroamericanews:20200419001808p:plain

合計が目的通り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に変えようとしたのですが、

プログラミングが不正確なせいか全然精度が出ませんでした↓

 

f:id:omoshiroamericanews:20200426234211p:plain

 

Linear Regressionの方がはるかにましです。

コーセラ機械学習で学んだ線形回帰でコロナ感染者数を予測してみる(4/18時点)※4/24UPDATE有 - 暇人日記II

 

構造は↓のようにしました。

全部でLayerは3つ、Hidden LayerのUnitは3にしました。

f:id:omoshiroamericanews:20200426120026p:plain

躓いたところのまとめです。

 

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と同じでした↓

↓が比較したものです。

f:id:omoshiroamericanews:20200426235133p:plain

 

Logistic RegressionのJ部分をLinear RegressionのJの式へ変更する必要

したらいいのでは、と思ったので変更しました。

f:id:omoshiroamericanews:20200426235151p:plain

 

③sigmoidGradientもLinear RegressionのGradientに削除する必要があります。

 

Week2の課題で↓のLinear RegressionのGradientのプログラミングを完コピしましたが

うまくいきませんでした。

f:id:omoshiroamericanews:20200426235443p:plain

 

なので、こっちの↓の赤枠で囲んだ式を再現したらサイズは合って

エラーなくプログラミング自体は走りました。

(ここが間違っているのかもしれませんが。。。)

 

f:id:omoshiroamericanews:20200426235607p:plain

CheckNNGradientsでサイズが合わないエラー

 

f:id:omoshiroamericanews:20200501112032p:plain

なんでエラーが出ると思ったら,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の課題を理解できるよう頑張ってみます!

*1:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1

*2:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1