暇人日記

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

Neural Networkを3階層から4階層にする

Week5の課題はNeural Networkが3階層の設定ですが、

4階層に変更することに挑戦しました。

 

 

絵にするとこういう感じです↓

f:id:omoshiroamericanews:20200904222238p:plain

 

何故3階層から4階層に変更したいかというと

初心者コンテストに挑戦したのですが、予測精度が低く合格点がとれませんでした。

3階層から4階層にしたら精度が上がるかなと思って挑戦してみようと思いました。

courseradaisuki.hateblo.jp

 

 

変更点①Layer 

f:id:omoshiroamericanews:20200904223053p:plain

f:id:omoshiroamericanews:20200904223243p:plain

 

②nn_paramsとTheta1とTheta2とTheta3が①のlayerに連動するようにする

f:id:omoshiroamericanews:20200904223413p:plain

f:id:omoshiroamericanews:20200904223813p:plain

 

③nnCostFunction.mにhidden_layer_size1とhidden_layer_size2を加える

f:id:omoshiroamericanews:20200904224030p:plain


FeedForwardでa4まで積み上げる。

Jの計算にTheta3を追加する

deltaを1つ増やす。

Theta1_grad /Theta2_gradにTheta3_gradを加える。

 

④initial_thetaを3つ設定できるようにする

f:id:omoshiroamericanews:20200904224951p:plain

 ⑤costFunctionにhidden_layer_size1とhidden_layer_size2を加える

f:id:omoshiroamericanews:20200904225159p:plain

⑥fmincgで計算されたnn_paramsをTheta1/Thata2/Thata3へreshape調整

f:id:omoshiroamericanews:20200904225303p:plain

⑦Gradinent Checking機能を修正する

f:id:omoshiroamericanews:20200904225528p:plain

 

hidden_layer_size1とhidden_layer_size2を加えて

Thata1/Theta2/Theta3の調整を行いました。

 

f:id:omoshiroamericanews:20200904225627p:plain

 

 

ここまでの変更を加えて4階層でのNeural Networkで

Gradinent Checkingしました。

 

f:id:omoshiroamericanews:20200904225740p:plain

 

差異がe-11なので極小といえます。

うまくいきました!

 

3階層と4階層ではどちらの予測精度が高くなるのか

初心者コンテストのデータで実験してみます!

 

実験結果は暇人日記IIの方に書くことにします。

 

また次回頑張ります!

Week5までのまとめとLinear Regressionの精度の考え方

Week5までのまとめをしたいと思います。

 

機械学習の予測の考え方は大きく↓でした。

 

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

 

①予測式をたてて②Cost Functionで差分の合計をJで表現します。

Jが小さくなれば小さくなるほど、精度が良いということになります。

 

②のCost Functionを最小にする値は何かを計算するのに必要なのが、

③Gradientでした。Gradientはいわば微分みたいなものだと思いました。

(厳密には勾配のようですが、文系の私には同じに見えます)

 

②Cost Functionと③Gradientを基にfmincgもしくはfminuncといった関数を使って

④最適θを計算します。

 

④最適θを計算したら⑤予測するという流れでした。

 

①予測式=Model Representation/②Gost Function/③GradientDecentを

まとめたのが↓でした。

f:id:omoshiroamericanews:20200810222536p:plain



Week2ではLinear Regression

Week3ではLogistic Regressionの

Week4ではOne VS AllのLogistic Regression

Week5ではNeural NetworkのLogistic Regression

を行いました。

 

そしてNeural NetworkのLinear Regressionを課題外でしたがやりました。

 

違う見方をすると

Linear Regressionの予測方法でできるようになったことは

①シンプルな直線での予測

②α毎にJを縦軸にIterationを横軸にとってJが小さくなっていくか確認

③Normal Equationでの一発最適θの発見

④Polynomial=多項式化による曲線での予測

⑤λを調整してoverfit/underfitの加減を調整しての予測

⑥Neural Networkでの予測

 

Logistic Regressionの予測方法でできるようになったことは

①シンプルな直線での予測

②Polynomial=多項式化による曲線での予測

③λを調整してoverfit/underfitの加減を調整しての予測

④One VS Allでの予測

⑤Neural Networkでの予測

 

 

Week2の課題はLinear Regression

Week3の課題はLogistic Regression

Week4とWeek5の課題は共通でLogistic Regressionでした(手書き文字判別)。

 

Week2の課題には通常のLinear RegressionもNeural NetworkでのLinear Regressionも

取り組みましたが、Jは20憶前後でした。

Linear Regressionは誤差をどう評価するという点が課題として残っています。

※Logistic Regressionは85%とかででるのでわかりやすいのですが。。。

 

なので、Week2の課題を基にJがいくらだったら精度何%だといえるかを考えたい

と思います。

 

Week2の課題はサンプル数が47でした↓

 

f:id:omoshiroamericanews:20200811145415p:plain

 

合計は↓の15,999,395です。

f:id:omoshiroamericanews:20200811145452p:plain


この15,999,395の+1%は16,159,389で-1%は15,839,401です。

予測値の合計が15,839,401~16,159,389だとJがどうなるの考えてみます。

 

パターン①

1%分の159,994が47のサンプルで均等にずれた場合、

1つあたりの誤差は159,994÷47で3,404になります。

3404の2乗は11,587,216で47個分かけると544,599,152となります。

5.4億です。

 

パターン②

1%分の159,994が1つのサンプルのみで起きる場合(=46のサンプルは100%の精度)、

159,994の2乗なので、25,598,080,036になります。

 

パターン①とパターン②で54億と250億で桁が1つ違います。。。

 

が、予測とサンプルは見比べてパターン①とパターン②のどちらかは

分かるのでパターン①で誤差1%の際の予測のJは544,619と考えていいと思います。

 

Week2の課題をNeural Networkで解いたときに

Jが41憶と28憶という値が出てきました↓

 

www.courseradaisuki.com

 

パターン①で考えると

41億の誤差を47のサンプル数で割って87,234,042を平方根して9,339なので

1つあたりの誤差は9,339です。

1%の誤差の場合は1つあたりは3,404でした。

1つあたりの誤差は3倍なので誤差は3%と考えていいのでしょうか。

 

パターン①の1%/2%/3%の場合を作ってみました↓

 

f:id:omoshiroamericanews:20200811160035p:plain

 

9,339は2%と3%の間にいます。

f:id:omoshiroamericanews:20200811160450p:plain

Jと1つあたりの誤差がわかっているので逆算してみました。

パターン①の考えで正しければ精度は2.7%になります。

 

 

28億の誤差を47のサンプル数で割って59,574,468を平方根して7,718なので、

1つあたりの誤差は7,718です。

f:id:omoshiroamericanews:20200811160643p:plain

同じようにパターン①で考えると精度は2.3%です。

 

Week2の課題をRegularizedのLinear Regressionで解こうとしたこともありました。

 

www.courseradaisuki.com

 

Jは20.3憶でした。

20.3億の誤差を47のサンプル数で割って43,191,489を平方根して6,572なので

1つあたりの誤差は6,572です。

 

同じようにパターン①で考えると精度1.9%だったんだと納得しました。

f:id:omoshiroamericanews:20200811160810p:plain

 

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

 

Week2の課題(家の値段)をNeural Networkで解いてみる-後編⑦-Pythonとの予測の比較

Neural Networkでの予測の精度はLinear Regressionの精度を上回ることができました。

 

PythonにもLinear Regressionの予測を行う機能があります。

こちらと比較したいと思います。

 

色々読みこみまして↓(私のうけたオンラインレッスンではおまじないと呼んでいました)

f:id:omoshiroamericanews:20200728214925p:plain

dataをtrainとして読み込みます↓

f:id:omoshiroamericanews:20200728215040p:plain

head関数で中身を確認します↓

f:id:omoshiroamericanews:20200728215149p:plain

 

describe関数でデータの情報を再度確認します。

f:id:omoshiroamericanews:20200728215219p:plain

info関数でデータの型を確認します↓

f:id:omoshiroamericanews:20200728215254p:plain

 

1行目と2行目を予測要素と設定します↓

f:id:omoshiroamericanews:20200728215403p:plain

 

ちゃんと1行目と2行目が取り出されているか確認します↓

f:id:omoshiroamericanews:20200728215635p:plain

 

予測結果をyと設定します↓

f:id:omoshiroamericanews:20200728215750p:plain

 

Linear Regressionの予測をするための設定をします↓

f:id:omoshiroamericanews:20200728215902p:plain

 

単回帰で傾きを取り出せます↓

f:id:omoshiroamericanews:20200728215932p:plain

 

切片を取り出します↓

 

f:id:omoshiroamericanews:20200728220205p:plain

 

予測します↓

f:id:omoshiroamericanews:20200728220233p:plain

 

予測結果です↓

f:id:omoshiroamericanews:20200728220308p:plain

 

Octaveで比較したいのでnumpy.ndarray型になっているのをcsvにするために

処理します↓

f:id:omoshiroamericanews:20200728220408p:plain

 

csvファイルにします↓

f:id:omoshiroamericanews:20200728220541p:plain

 

Octavaに取り込みます↓

f:id:omoshiroamericanews:20200728220639p:plain

 

↓に基づいて誤差を計算します。

f:id:omoshiroamericanews:20200728220703p:plain

f:id:omoshiroamericanews:20200728220746p:plain

 

Neural Networkの誤差です。

f:id:omoshiroamericanews:20200728221147p:plain

 

Overfitの可能性はありますが、Neural Networkの方が精度が出ています。

 

ちなみにWeek2のLinear Regressionでの誤差は

f:id:omoshiroamericanews:20200728221257p:plain

だったのでPythonと同じ結果でした。

 

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

Week2の課題(家の値段)をNeural Networkで解いてみる-後編⑥-

前回の取り組みで見つけた

>①fmincgが最適θを計算していない

を再度考えてみます。

 

もう一度、初期パラメーターと計算後の最適θを並べて

観察してみることにしました。

 

一見何も計算されないように見えましたが

微妙に計算されていることがわかりました。

 

f:id:omoshiroamericanews:20200724211033p:plain


ところで、これは誤差655憶の場合です。

誤差28憶の場合は計算されているのではないかと思いました。

 

28億のパターンです↓

f:id:omoshiroamericanews:20200724212129p:plain

28億のパターンだとちゃんと計算されていることがわかりました。

 

ということはfmincgで計算されていることが確認できました。

なぜ655憶のパターンと28憶のパターンがでてくるのかは

『local optima』かなと思い始めました。

 

local optimaはWeek2のLinear Regressionの時に説明がありました。

 

local optimaは↓の図みたいにJを最小化させるθがあるのに

そこにたどり着けず別の凹みに囚われてしまうというような説明でした。

 

f:id:omoshiroamericanews:20200724212932p:plain

fmincgを使えば、何でもかんでもちゃんと最小のJを見つけてくれると

思っていたのですが、そうではない挙動に見えます。

local optimaにはまるのはhidden layerで-1から1で、

output layerで6桁になるのが難点です。

 

output layerを6桁なのを1桁にして予測してみようと思いました。

単純にyを10万で割って予測してみます。

 

1回目です。

f:id:omoshiroamericanews:20200724214945p:plain

f:id:omoshiroamericanews:20200724215010p:plain

それっぽくなりました。

ただ、毎回こういう予測になるのかが不安なので

合計5回やってみます。

 

2回目です。

f:id:omoshiroamericanews:20200724215533p:plain

f:id:omoshiroamericanews:20200724215555p:plain

今回もそれっぽいです。

 

3回目です。

f:id:omoshiroamericanews:20200724215920p:plain

f:id:omoshiroamericanews:20200724215939p:plain

今回もそれっぽいです。確率が上がってきた気がします。

 

4回目です。

f:id:omoshiroamericanews:20200724220418p:plain

f:id:omoshiroamericanews:20200724220451p:plain

お、行けました!それっぽい感じです。

 

 

5回目です。

f:id:omoshiroamericanews:20200724222226p:plain

f:id:omoshiroamericanews:20200724222243p:plain

確率100%でできるようになりました!

 

予測値の精度をWeek2と比較したいと思います。

Week2のLinear RegressionではNormal Equationという絶対解を

出す方法がありました。

 

そのNormal Equationで出した答えが↓です。

f:id:omoshiroamericanews:20200724223605p:plain

f:id:omoshiroamericanews:20200724223628p:plain

誤差が0.20なので、Neural Networkで出した計算の方が

精度が高いということになります!

 

λ=0.1のときの誤差をみてみます。

f:id:omoshiroamericanews:20200724224105p:plain

 

λ=0.01のときです。

f:id:omoshiroamericanews:20200724224329p:plain

 

λ=0.001のときです。

f:id:omoshiroamericanews:20200724224625p:plain

 

λ=1のときです。

f:id:omoshiroamericanews:20200724224829p:plain

 

λ=10のときです。

f:id:omoshiroamericanews:20200724225035p:plain

 

どうも、面白いことに誤差はλ=0.01で最小になりそうな雰囲気があります。

λ=0のときが最小だと思ってましたが、次回考えてみます。

 

とにもかくにもNeural NetworkでLinear Regressionの予測が

できるようになった気がします。

 

ポイントはhidden layerで-1から1の間になるので、

予測値も意図的に1桁に落としていくことかと思いました。

また他のケースで実験してみたいと思います。

Week2の課題(家の値段)をNeural Networkで解いてみる-後半⑤-

前回までの試行と課題を振り返ります。

 

構造を↓のように設定してしました。

f:id:omoshiroamericanews:20200723211259p:plain

Linear Regression用にGradinent Checkingを整備しました。

Gradinent Checkingは正解でしたがfmincgで予測を行ったら

予測が合いませんでした。

 

大きな分岐点が2つありました。

1つ目はFeatureNormalizeでした。

f:id:omoshiroamericanews:20200723212225p:plain

この分岐ではFeatureNormalizeしない版ではtanh関数を使用している

Hidden Layerのa2が-1か1になってしまう問題が大きく見えたので、

FeatureNormalizeする方法を選びました。

 

2つ目はλです。

λを1の-12乗や0に調整して予測値の向上を図りました。

 

f:id:omoshiroamericanews:20200723212741p:plain

 

時々、予測が6桁になりますが安定しないという最大の問題に当たりました。

λ=0にすると、予測値とyの引き算の値が最小化する計算がされます。

が、これが誤差655憶と誤差28億との間をさまよいます。

 

誤差28憶の時は予測は6桁となり、予測値っぽいですが、

誤差655憶の時の予測はかけ離れた値になって精度が低すぎになります。

 

λ=0の場合は、右のRegularizedの項がなくなり

予測値-yを最小化する方向へいくはずなのになぜそうならないのか、

がわからずに困っている状況です。

 

λ=0の時に確率100%で予測値が6桁/誤差が28憶前後にできるように

トライ&エラーしたいと思います。

 

まず、ランダムで設定された初期パラメーターが同じだったら

fmincgは同じ結果を出してくれるかを検証してみようと思います。

 

ということで初期パラメーターと計算後の最適θを1計算結果することに

保存することにします。

 

そうすると、衝撃の事実が発覚しました!

 

f:id:omoshiroamericanews:20200723223111p:plain

なんと、1計算ごとの初期パラメーターと計算後の最適θを比較すると

同じだということが判明しました!

 

プログラミングの予測パート、つまりfmincg部分は

Week5やWeek5をWeek3で予測値を出した分と同じものからnum_labelsを

削除しただけのもの使っていたつもりだったので、

まさかこれがうまく作動していないとは思いませんでした。

 

f:id:omoshiroamericanews:20200723223955p:plain

 

↑の部分でnuml_labelsを削除していたのですが、ダメだったということになります。

 

念のため、

fmincg(costFunction, initial_nn_params, options)

だけ取り出して再計算させましたが動きませんでした。。。

 

fmincgをfminuncに変えてみようと思います。

 

 

問題文を読み進めます。

f:id:omoshiroamericanews:20200226214027p:plain

Week3の課題ではfminuncを使用しましたが、fmincgを使いなさいという指示が

出ました。 fmincgの方が多くのパラメーターを使う際にはfminuncより効率的だと

説明されています。

 

 

Coursera Machine Learning Week4 課題 2周目③ -苦闘記憶- One vsALL① - 暇人日記

 

昔、fmincgはfminuncより優れているということがCourseraの教材に

書かれていました。

 

が、Week2のLinear Regressionの課題をfmincgで解こうとしたときに

プログラミングがうまくいかないという課題に当たっています。

 

↓の実験の日記の時はfminuncを使っています。

www.courseradaisuki.com

 

↑の日記の主旨ぶれるので日記には書かなかったんですが、

fmincgを使うと動きませんでした。

漠とこのときにfmincgはLogistic Regression向きで

fminuncはLinear Regression向きなのかと思っていました。

 

なので、fmincgをfminuncに置き換えてみようと思いました。

 

f:id:omoshiroamericanews:20200723231904p:plain

 

初期パラメータ=initial_nn_paramsと計算後の最適θ=nn_paramsが

異なるので計算されることがわかります!

どうやらfmincgではなくfminuncの方が良いようです。

 

予測結果です。

1回目です。

f:id:omoshiroamericanews:20200723231710p:plain

f:id:omoshiroamericanews:20200723231739p:plain

fmincgがfminuncより優秀というのは正しいらしく

λ=0、MaxIter=40で1計算30分ほどかかります。

λ=0だとθがいかような値をとってもRegularizedCostの計算に関与しないので

overfit気味の線をかけるのではないかと思います。

 

MaxIterを調整したくなりますが、まずは5回計算して安定して

予測が6桁になるかどうか見てみます。

 

2回目です。

 

f:id:omoshiroamericanews:20200723233225p:plain

最適θは計算されていることが確認できました。

予測です。↓

f:id:omoshiroamericanews:20200723233243p:plain

f:id:omoshiroamericanews:20200723233258p:plain

うわ、でた。このパターンか、という感じです。。。

なぜこうなってしまうのだろう。。。

 

3回目です。

f:id:omoshiroamericanews:20200723234110p:plain

最適θは計算されています。

 

f:id:omoshiroamericanews:20200723234155p:plain

f:id:omoshiroamericanews:20200723234222p:plain

誤差が655憶です。

 

5回やる前ですが、課題は同じになりそうです。

つまり安定して予測が6桁にならない。

 

とはいえ、進展がありました。

①fmincgが最適θを計算していない

②fminuncは最適θを計算している、ただなぜか誤差655憶が最適と

 計算してくることがある。

 

①のなぞ解きをするか、②のfminuncのMaxIterとλを調整するか、

を追加検討したいと思います。

 

また次回頑張ります。

Week2の課題(家の値段)をNeural Networkで解いてみる-後編④-

前回の続きです。

 

λを1の-15乗にしたら安定するかどうか実験してみます。

 

1回目です。

f:id:omoshiroamericanews:20200712221904p:plain

2回目です。

f:id:omoshiroamericanews:20200713212541p:plain

3回目です。

f:id:omoshiroamericanews:20200713212937p:plain

4回目です。

f:id:omoshiroamericanews:20200713214259p:plain

 

5回目です。

f:id:omoshiroamericanews:20200713214803p:plain

 

確率は20%ですね。

 

 

そういえばλ=0で5回トライしてみます。

そもそもλ=0でθの2乗部分はないことにしているので、

λ=0で予測が6桁にならないのは謎です。

 

 

1回目です。

 

f:id:omoshiroamericanews:20200715210608p:plain

Jも同時にとっていくことにします。

f:id:omoshiroamericanews:20200715210638p:plain

655億の誤差です。


 

 

2回目です。

f:id:omoshiroamericanews:20200715211106p:plain

f:id:omoshiroamericanews:20200715211127p:plain

やはり655憶の誤差です。


 

3回目です。

f:id:omoshiroamericanews:20200715211429p:plain

f:id:omoshiroamericanews:20200715211459p:plain

誤差が41憶になりました!
この方が1桁誤差が少ないのになぜ1回目と2回目はこちらを選べないのだろう。

 

 

 

4回目です。

f:id:omoshiroamericanews:20200715211821p:plain

f:id:omoshiroamericanews:20200715211843p:plain

誤差が655憶パターンです。


 

5回目です。

f:id:omoshiroamericanews:20200715212258p:plain

誤差が655億です。

f:id:omoshiroamericanews:20200715212235p:plain

 

確率20%です。

 

 

やはり謎が解けないです。

なぜ、λ=0でθの2乗を無効化しているのに百発百中で6桁の予測にならないのか。

 

『MaxIter』を増やしてみます。

これが多い方が結果は安定するはずです。

これでだめなら、fmincgを今回使っていますが、fmincgはLogistic Regression用で

fminuncの方が良いかもしれませんのでそちらでトライしてみます。

 

『MaxIter』を150にした1回目です。

f:id:omoshiroamericanews:20200715213314p:plain

f:id:omoshiroamericanews:20200715213355p:plain

誤差は655憶です。

 

2回目です。

f:id:omoshiroamericanews:20200715214538p:plain

f:id:omoshiroamericanews:20200715214611p:plain

誤差が655億パターンです。

 

3回目です。

f:id:omoshiroamericanews:20200715215503p:plain

f:id:omoshiroamericanews:20200715215527p:plain

予測が6桁で、誤差が28憶です。

なぜ全部の予測がこの近辺にならないのでしょうか。。。。

 

4回目です。

 

f:id:omoshiroamericanews:20200719222325p:plain

f:id:omoshiroamericanews:20200719222401p:plain

InitiaThetaの差で差が出ているのかもしれません。

なので、ログをとることにします。

f:id:omoshiroamericanews:20200719222455p:plain

 

 

5回目です。

 

f:id:omoshiroamericanews:20200719222759p:plain

 

f:id:omoshiroamericanews:20200719222839p:plain

f:id:omoshiroamericanews:20200719222911p:plain

 

確率40%になりました。

 

それでもやはり40%です。。。。

 

やはりfmincgでもなぜ答えがバラバラになるか疑問です。

InitialThetaが原因なのでしょうか。

しかしInitialThetaがバラバラだと答えがバラバラになるのでは困ります。

 

うーん、どう考えればいいんだろう。

 

また考えてみます。

Week2の課題(家の値段)をNeural Networkで解いてみる-後半③-

FeedForwardではtanh関数を使っていましたが、

予測値ではtanh関数を使わないというという荒業で計算してみました。

 

根拠はないです笑

 

f:id:omoshiroamericanews:20200711162243p:plain

やってみてわかったことはそんなに答えは変わらないということでした。

 

何故だろうと思いましたが、

X *theta1がすでに絶対値で1近辺の数字になっています。

tanh関数を使うと-1から1の間に値が収束するので、

それよりは幅に広がりがあるとはいえ、近辺になっているのは変わらずです。

 

f:id:omoshiroamericanews:20200711162507p:plain

 

うーん、FeatureNormallizeがダメなのかもしれないと思いました。

 

FeatureNormalizeしないでトライしてみます。

こうなりました↓

f:id:omoshiroamericanews:20200711220450p:plain

桁は近づきましたが、予測が全て同じ値なのが気になります。

 

これはλ=0だったので、λを小さくしていきます。

 

λ=0.1にしました。

 

f:id:omoshiroamericanews:20200711222756p:plain

同じです。

 

心配になったのでプロセスを見てみます。

 

まずXに要素全て1の行を加えます。

 

f:id:omoshiroamericanews:20200711222958p:plain

それにTheta1をかけます。


f:id:omoshiroamericanews:20200711223233p:plain

 

それにtanh関数をあてます。

f:id:omoshiroamericanews:20200711223317p:plain

値が1か-1かという極端なことになっています。

 

Theta2もよくみると13093か-13093かという極端なことになっています。

f:id:omoshiroamericanews:20200711223440p:plain

 

なので1か-1に13093か-13093をかけているので、

predの値が全て同じなんだと思いました。

 

一回、λを0.00001にしてみます。

 

f:id:omoshiroamericanews:20200711225929p:plain

全く同じ結果でした。。。

 

f:id:omoshiroamericanews:20200711230121p:plain

Theta2も同じです。

 

λ=10にしてみました。

 

f:id:omoshiroamericanews:20200712151442p:plain

やはり同じです。

 

hidden layerが-1と1の種類というのも同じです。

 

f:id:omoshiroamericanews:20200712151631p:plain

 

FeatureNormalizeしてもしなくても予測が合いません。

 

今までの試行を振り返って表にしました↓

f:id:omoshiroamericanews:20200712151736p:plain

FeatureNormalizeしてもしなくてもそれぞれの壁にぶち当たっています。

 

Jが間違えているのかという気がしてきました。

 

いや、でもあっているはずです。

a3つまりoutput Layerをyの予測の47の差分を2乗する部分と

Theta1/2のBias部分の1行をとって2乗することで考えは合っているはずです。

 

ではfmincgでしょうか?

と思ってみたらそもそもfminuncとなっていることに気づきましたorz

 

 

λ=0で実行しなおしてみます!

 

f:id:omoshiroamericanews:20200712153718p:plain

さらにかけ離れた値が返ってきました泣

 

X*Thata1の値が↓でした。

f:id:omoshiroamericanews:20200712153841p:plain

これにtanh関数を充てると↓のようにばらつきはあるのですが、

f:id:omoshiroamericanews:20200712153958p:plain

 

Theta2の値が6桁ではないので、小さい値の予測になってしまったように

思います。

f:id:omoshiroamericanews:20200712154021p:plain

 

λ=0でやって効果がないと思いますが、ダメもとで

Jのθの2乗のパートは12桁になるので、

lambda = 0.0000000000001(1の-13乗)で

13桁くらいは解消されるλで計算してみます。

 

f:id:omoshiroamericanews:20200712154836p:plain

 

あ、近くなりました!

 

X*Theta1が↓のような値になりました。

f:id:omoshiroamericanews:20200712155000p:plain

tanh関数をあてるとこうなります↓

f:id:omoshiroamericanews:20200712155133p:plain

 

Theta2が念願の5桁近辺になっています!

 

f:id:omoshiroamericanews:20200712155059p:plain

 

なので、予測値の桁があがって精度が上がったんだと思います。

 

『MaxIter』が40だったんですが、150に上げてみます。

 

 

f:id:omoshiroamericanews:20200712160409p:plain

なんと、精度が良くなるのかと思いきや、悪くなりました。

これは謎です。『MaxIter』はやればやるほど精度が高くなるものだと

思っていたのですが。

 

『MaxIter』を50にして計算してみます↓

f:id:omoshiroamericanews:20200712160609p:plain

あれ、FeatureNormalizeする前のような感じになってしまいました。

 

元の40にして再現できてるかどうかみてみます。

f:id:omoshiroamericanews:20200712160920p:plain

できていません。。。

何か変えてしまっています。。。

 

λの数が怪しいので直していきます。

 

lambda = 0.00000000000001(1の-14乗)でした。

lambda = 0.0000000000001(1の-13乗)で

と書いていましたがこれが間違いで、1の-14乗で計算すると

↓になりました。

 

f:id:omoshiroamericanews:20200712161512p:plain

 

前回の結果と完全に一致しないのはRandom Initializationが理由だと思います。

それでは『MaxIter』を150にしてみます。

結果です↓

f:id:omoshiroamericanews:20200712162521p:plain

精度が下がってしまいました。

 

『MaxIter』を50にしてみます。

f:id:omoshiroamericanews:20200712163755p:plain

ダメでした。

Random Initialization次第で安定しないのでしょうか。

 

 『MaxIter』を40にしてみます。

f:id:omoshiroamericanews:20200712164133p:plain

あれ、なぜダメなんだろうと思いましたが、

Random Initializationでフレるのかと思いまいしたので、 

全く同じ条件でもう3回やってみます。

 

1回目です。6桁予測がでてきました。

f:id:omoshiroamericanews:20200712164350p:plain

 

2回目です。

f:id:omoshiroamericanews:20200712164704p:plain

 

3回目です。

 

f:id:omoshiroamericanews:20200712165130p:plain

 

4回目です。

 

f:id:omoshiroamericanews:20200712165600p:plain



 5回目です。

f:id:omoshiroamericanews:20200712170206p:plain

 

どうやらRandom Initializationに左右されるようです。

左右されない予測値が欲しいです。

 

次回はまたトライします。

 

λを1の-15乗にしてトライしてみようと思います。

この気まぐれさが何とかなってほしいです。 

 

Week2の課題(家の値段)をNeural Networkで解いてみる-後編②-

前回はGradinent Checkingがクリアできたので、fmincgで最適θを出して

予測値を出しましたがダメというところでした。

 

最適θを出してから予測値までを振り返ってみます。

構造は↓になっています。

 

f:id:omoshiroamericanews:20200711145414p:plain

 

そして計算ロジックはHidden Layerではsigmoid関数の代わりにtanh関数を

使てoutput layerでは掛け算のままとなっています。

 

f:id:omoshiroamericanews:20200711145510p:plain

 

なのでFeartureNormalizeした

f:id:omoshiroamericanews:20200711145803p:plain

Xに(本当は47個あるが3までを表示)、要素が1の行を加えて、Theta1とかけます。

 

f:id:omoshiroamericanews:20200711150004p:plain

47X25になっています。

 

これにtanh関数をします。

f:id:omoshiroamericanews:20200711150117p:plain

全て-1と1の間になっています。

 

要素が1の行を加えて47X26にします。

f:id:omoshiroamericanews:20200711150215p:plain

 

これをTheta2をかけます。

f:id:omoshiroamericanews:20200711150323p:plain

そのままの結果でいいはずなのでsigmoidもtanhも使っていません

 

ただ、yとは桁数がかけ離れています。。。

f:id:omoshiroamericanews:20200711150447p:plain

 

Hidden Layerでは-1と1の間にあるのに

output Layerでは10万くらいの結果にならなければ

ならないのでTheta2は大きな数字が入らないと駄目だと思いますが、

そうはなっていないので、桁数が違うのかなと思いました。

 

あ!!わかった気がします。

 

Jは予測値-yの2乗とθの式の積み上げでした。

 

このJの誤差が小さければ小さいほど良い予測となります。

今回はHidden Layerからoutput Layerで大きなθが必要ですが、

大きすぎるとJが大きくなるのでfmingが適度な大きさのθにとどめたと考えます。

 

θが大きくなってもいいように、設定されているのがλでした。

λを1で計算していたのですが、小さくしていってみます。

そうするとθは大きな値をとれるので、予測値が6桁に近づいてくると思います。

 

さっきはλ=1だったので0.1にしてみます。

 

f:id:omoshiroamericanews:20200711152226p:plain

あれ、イマイチでした。

 

λ=0.01にしてみます。

f:id:omoshiroamericanews:20200711153946p:plain

まだ、桁数がだめです。

 

λ=0.001にしてみます。

f:id:omoshiroamericanews:20200711154743p:plain

仮説が間違えているのでしょうか。。。

不安になってきました。

 

λ=0.0001にしてみました。

 

f:id:omoshiroamericanews:20200711155924p:plain

まだなのか、仮説の間違いなのか。。

 

 

λ=0.00001にしてみました。

f:id:omoshiroamericanews:20200711160630p:plain

 

ダメです、もう1回考えてみます。

 

Jの概念が↓でした。

 

f:id:omoshiroamericanews:20200711160103p:plain

右の部分のθの2乗部分が大きいため、大きいθは最適とはみなされないと考えました。

今回は左の部分は47個の2乗です。(予測値ーyは47個なので)

しかし右のθの部分は101個の2乗の合計になります。

(Theta1とThata2の合計が101個なので)

 

Theta2はhidden layerの-1から1の値を6桁に引き上げるため、

6桁が要求されます。それを2乗すると12桁になり、圧倒的な大きさとなるため、

左の部分のコントロールより右のθの部分のコントロールを優先した結果、

現在見えている予測値とyの差になっていると考えました。

 

λ=0としてみます。

こうすると右のθの部分はゼロになるので、左の部分の

予測値-yに特化した数字ができるはずです。

 

f:id:omoshiroamericanews:20200711161517p:plain

 

ダメです。

Jが原因だと思ったのですが、そうではないことがわかりました。

 

f:id:omoshiroamericanews:20200711161813p:plain

λ=0でJは実に655憶。最適化されているとは思えない値ですね。。。

 

違うことが原因で予測がずれていると判断します。

 

また次回頑張ります。

 

Week2の課題(家の値段)をNeural Networkで解いてみる-後編①-

CourseraにはDiscussion Forumなるものがありまして、

そこにNeural NetworkでLinear Regressionを解こうとした問い合わせがないか

検索してみました。

 

その中の1つにVideoのレクチャーノートのボーナスにそれについて

触れてあるものがあるとありました。

 

読んだところ、具体的な変更方法が記載されていて

 

①num_labels(=output layer)は削除。

 ただしThetaやnn_paramsで使われている箇所は1へ変更

②yは47X1を無理やり47X10にすることなく、47X1で

 y-a3をすること

③hiden layerでは依然としてnon linearにしておくこと

 Sigmoidを使うということかなと思っていたら、

④Sigmoidの代わりにtanh関数を使うこと

 tanh関数は導入すると-1から1の間に収まる関数ということです。

 (Sigmoidは0-1の間に収まる関数でした)

⑤Backpropagationの中のSigmoid関数のGradientの代わりに↓のtanh関数の

 Gradientを使うこと

f:id:omoshiroamericanews:20200708225440p:plain

⑥Feedforwardのoutput layerであるa(3)にはsigmoidもtanhも使わないこと。

⑦JはRegularizationでない部分はLinear RegressionのCostFunctionを使い、

 Regularizationの部分はWeek5と同じにすること

 

とありました。

 

Errorが出て修正してErrorが出て修正してを繰り返して

プログラムが実行されました↓

 

f:id:omoshiroamericanews:20200708224550p:plain

 

やった!できました!

 

さっそく予測しようと思いましたが、予測する前にX側のデータを

FeatureNormalizeしておこうと思いました。

f:id:omoshiroamericanews:20200704151135p:plain

これは今回のX側のデータのように↑、データの桁数がばらついていると

計算時間が長くなるので、Xのデータを行ごとに平均値を出して、

データ個々-平均値を計算して、標準偏差で割るというものでした。

Week2の課題でアドバイスされていたのでそれにのっとります。

 

具体的には行ごとの平均値です↓

f:id:omoshiroamericanews:20200711143925p:plain

 

データ個々-平均値です↓

f:id:omoshiroamericanews:20200711144019p:plain

 

行ごとの標準偏差です↓

f:id:omoshiroamericanews:20200711144100p:plain

 

行ごとに割ったものです↓

f:id:omoshiroamericanews:20200711144135p:plain

 

FeatureNormalizeしてもGradinent Checkingが大丈夫かどうか

念のため確認してみました↓

f:id:omoshiroamericanews:20200711144258p:plain

大丈夫でした!

 

CostFucntion/Gradientがそろったので最適θをfmincgで計算して予測してみます!

f:id:omoshiroamericanews:20200711144739p:plain

左が予測値で、右が答えだったので大幅なずれです泣

 『ついにLinear RegressionでもNeuralNetworkを使えるようになりました!

 感動です泣

 

 次回はちょっと前にやっていたコロナ感染者予測にあてはめることを

 別の日記でやってみたいと思います。』

 

というフィナーレを思っていたのですが、延期です。。。

 

なぜgradient ChekingはOKなのに予測がダメダメなんだろう。

 

また次回取り組みます。

Week2の課題(家の値段)をNeural Networkで解いてみる-中編-

前回の予測がなぜ間違えているかわかりました。

 

nnCostFunction.mを修正し忘れていました。

 

Week5の課題のプログラムは↓のような構造をしていました。

 

f:id:omoshiroamericanews:20200705212401p:plain

 

Gradinent CheckingをしてるCheckNNgradients.mは

nnCostFunction.mを参照しているのですが、

前回の日記で書いていたWeek2の課題用のプログラミングを

nnCostFunction.mに反映させていませんでした。

 

ということは前回の日記でうまくいっていたようにみえた

Gradinent CheckingはWeek5の正答例そのものなので合っていて

当然ということになります。

 

ということでnnCostFunction.mを修正してGradinent Checkingをしてみます。

 

 

 

というわけでnncostFunction.mに前回の日記の私の仮説を反映して

Gradinent Checkingを行ってみました。

 

f:id:omoshiroamericanews:20200704231747p:plain

 

やはりダメでしたorz

誤差が1e-9以下となってほしいところ、もっと大きい数字になっています。

 

ただ、ふっと↑で見えている範囲は右の行と左の行が一致しています。

 

全部を見てみることにしました↓

f:id:omoshiroamericanews:20200704231826p:plain

f:id:omoshiroamericanews:20200704231854p:plain

f:id:omoshiroamericanews:20200704232336p:plain

gradは1X101なので全部で101行あるのですが、

赤線より下はドンピシャで合って、赤線より上はボロボロです。

 

数えると赤線が下から26行目なのでTheta2_gradの1X26は合っていて、

Theta1_gradがボロボロという絵姿になっていると判断しました。

 

Theta2_gradは↓の計算式でδ(3)とa(2)だったんで合っていたんだなぁと思いました。

Theta1_gradは悩んだδ(2)が絡んでいるので間違えているということだと思います。

Theta2_grad=δ(3) X  a(2)となります

Theta1_grad=δ(2) X  a(1)'となります。

 

 θが間違ってるんでダメそうですが、予測までやってみました↓

 

f:id:omoshiroamericanews:20200704232657p:plain

やはりだめです。

 

このGradinent Checkingがうまくできないと駄目な気がします。

 

ということで改めてδ(2)をまた考えることにします。

①次元から考える (文系的発想)

②理論から考えてみる (ダメそう)

③Videoを見返してみる

 

まず①次元から考えてみます。

f:id:omoshiroamericanews:20200705214047p:plain

δ(2)は↑の式で表されていました。

δ(3)はa(3)-yなので47X1です。

Theta2は26X1です。

 

f:id:omoshiroamericanews:20200705214430p:plainの部分は47X26 or 26X47になります。

が、Week5ではここはθのBias用の1行を取り除く必要があったので、

47X25 or 25X47になるはずです。

 

f:id:omoshiroamericanews:20200705214543p:plainはSigmoidこそなくなりましたが、47X25になる必要があります。

 

z2=X *Theta1は47X3  X 3 X25なので47X25になります。

本当はf:id:omoshiroamericanews:20200705214543p:plainなのでだめそうですが、Directにz2を放り込んで

Gradinent Checkingしてみました↓

 

f:id:omoshiroamericanews:20200705220201p:plain



やはりだめです。

ただ次元的にはf:id:omoshiroamericanews:20200705214543p:plainの47X25として考えていきます。

 

f:id:omoshiroamericanews:20200705214543p:plainの前段のf:id:omoshiroamericanews:20200705220434p:plainはz2をSigmoid関数に放り込むことでした。

f:id:omoshiroamericanews:20200705214543p:plainf:id:omoshiroamericanews:20200705220434p:plainの微分という解説だったと思います。

 

sigmoidGradientという関数がWeek5では使われていたのですが、

SigmoidFunctionのGradientと書かれていました↓

 

f:id:omoshiroamericanews:20200705220620p:plain



SigmoidはLogistic Regressionのために導入している関数で

Linear Regressionの今回は使用しない前提で進めています。

使用すると答えが0から1の間になってしまい、

家の値段の予測にはならないと思ったからです。

 

ここまでは合っていると思います。

 

そうなるとz2を微分しなければならないと思うのですが、

それがわからないです。

 

z2はX * Theta1なので、これをXについて微分するとTheta1になると思います。

Theta1は3X25なので、次元が合いません。

 

 

ただ次元的にはf:id:omoshiroamericanews:20200705214543p:plainの47X25として考えていきます。

 

無理やり実行しましたがやはりErrorでした。

f:id:omoshiroamericanews:20200705221219p:plain

 

全然検討つかないので見えるものは全部試していきます。

Videoのスライドに↓がありました。

Sigmoid用だと思いますが、当てはめる方向で考えます

f:id:omoshiroamericanews:20200705221444p:plain

a(2) . X (1-a(2))とあります。a(2)とz(2)の差はWeek5ではBiasの1を足していることと

Sigmoidでした。

a(2)は47X26で次元が合わないため、z2 . X (1-z2)にしてみました。

 

f:id:omoshiroamericanews:20200705222221p:plain

全く同じ結果に見えます。

 

少なくとも前回代入のz2とz2 . X (1-z2)の値は違うので

違う値になってもいいのではと思いました。

 

何か違うところも間違えていそうです。

 

また次回取り組みます!

 

 

Week2の課題(家の値段)をNeural Networkで解いてみる-前半-

Neural NetworkでWeek2の家の値段の課題を解くことにトライしてみます。

 

課題は家の面積と部屋数から値段を予測することでした↓

f:id:omoshiroamericanews:20200704151135p:plain

 

Week5のNeural NetworkのプログラミングはLogistic Regressionで

0,1の分類解決用でしたが、今回の家の値段の課題はLinear Regressionのため、

プログラミングの式を変えなければならないはずです。

 

そしてLayerも考える必要があります。

Week5では手書きの数字の候補1つ1つに400の基データがあったので、

↓のような構造でした。

f:id:omoshiroamericanews:20200704152529p:plain

 

①今回は家の値段にはサイズと部屋数の2つです。

↑の図で「400」が「2」になります。

 

②5000のデータ数でしたが、Week2の課題は47でした。

↑の図で「5000」が「47」になります。

 

③outputが10でした。これは0-9の数字の10パターンの数字だったので、

 10にしていました。今回は値段なんで1にしてみます。

 合っているかどうかは精度で確認する考えで進めます。

 

 

構造としては一度こういう形で考えてみます↓

f:id:omoshiroamericanews:20200704153559p:plain

 

プログラミング上はこうですね↓

f:id:omoshiroamericanews:20200704220514p:plain

 

Week2のデータをDLして↓ 

f:id:omoshiroamericanews:20200704214946p:plain

 

Theta1とTheta2の形を設定しに行きます。

Theta1が3X25=5でTheta2が26X1なので75+26=101ですね。

nn_paramsが1X101になる必要があります。

 

size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels

で3X25+26X1=101を表現しました。

 

ランダムの数字を入れるために、

nn_params=rand(1,size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels)

としました。

 

f:id:omoshiroamericanews:20200704220132p:plain

f:id:omoshiroamericanews:20200704220106p:plain

狙い通りになっています。

 

 

これを25X3と26X1のTheta1とTheta2にreshapeします。

 

f:id:omoshiroamericanews:20200704220841p:plain

 

見事にできました!↓

f:id:omoshiroamericanews:20200704220905p:plain

f:id:omoshiroamericanews:20200704220920p:plain

 

これでFeedForwardができます。

 

Week5ではLogistic RegressionだったのでSigmoid関数を使っていました↓

 

f:id:omoshiroamericanews:20200704222619p:plain

 

今回はLinear RegressionなのでSigmoidを外します。

 

次にBackpropagationです。

鍵の1つがこの部分です↓

f:id:omoshiroamericanews:20200704223251p:plain

これはSigmoid関数の微分だったと思います。

 

今回はFeedForwardでもSigmoidを外しましたので、

この部分が変わるはずです。

 

あんまりよくわからなくて試行錯誤した結果、

f:id:omoshiroamericanews:20200704224641p:plain

この微分だと思って、↓のようにしてみましたらうまくいきました .

 

f:id:omoshiroamericanews:20200704224803p:plain

 

とりあえずErrorなくgradは計算されて

 

f:id:omoshiroamericanews:20200704224846p:plain

f:id:omoshiroamericanews:20200704224927p:plain

 

この値が合っているかどうかGradinent Checkingの結果が↓です。

 

f:id:omoshiroamericanews:20200704225249p:plain

 

見事に合ってました!

 

ただ、なんで

f:id:omoshiroamericanews:20200704230109p:plain =f:id:omoshiroamericanews:20200704224641p:plain

と考えたらうまくいったかは不明です。。。

 

何はともあれ黄金パターンの

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

のうち①-③が完了したことになります。

 

なので④⑤に取り組みます。

 

Week5の式をパクッてfmincgで最適θを出して

f:id:omoshiroamericanews:20200704230821p:plain

X * thetaで予測値を出して,yと並べました↓

 

f:id:omoshiroamericanews:20200704230722p:plain

ボロボロです笑

 

何か間違いがあります。

 

また次回頑張ります!

Coursera Machine Learning Week5 課題 2周目⑱ 予測精度向上

Week5の課題ではλ=1、MaxIter=50で的中率95.2%でした。

同じ課題をWeek4では与えられたθでの的中率は97.5でした。

 

オプションではNeural Networkは複雑な予測線を描ける強力なツールなので、

λを小さくしてある程度regularizedの力を弱めて精度100%に近づけなさいというのが

課題です。

意図的にoverfitさせてくださいとかいてあります。

 

f:id:omoshiroamericanews:20200620160108p:plain

 

的中率100%見てみたいです!

なんでやってみます。

 

ということでλ=0.1、MaxIter=200にしてみました。

しかし圧倒的な計算コストです30分経ってもおわりません。

 

前回の日記でやったようにまずは一番良いλを探すことにします。

λ=0.1、MaxIter=50にしてみます。

 

96.78%です!

 

たっぷり45分くらいかかりました。

 

λ=0.01で96.9%です。

f:id:omoshiroamericanews:20200624202319p:plain

 

λ=0.001で96.62%です。

f:id:omoshiroamericanews:20200624213947p:plain

 

λ=0.05でトライしてみます。

96.56%でした。

f:id:omoshiroamericanews:20200624224836p:plain

 

λ=0.005でトライしてみます。

95.80%

f:id:omoshiroamericanews:20200626090451p:plain

 

 

λ=0.015でトライしてみます。

f:id:omoshiroamericanews:20200627140606p:plain

 

ここまでのをサマリーしてみます。

 

1.000 95.20%
0.100 96.78%
0.050 96.56%
0.015 95.54%
0.010 96.90%
0.005 95.80%
0.001 96.62%

 

一番良いのは0.010ですが、あんまり規則的になってないですね。。。

 

今まで一番結果の良かったλ=0.01でMaxIterを増やしてみます。

λ==0.01でIterationを150にしてみます。

 

出ました!

100%です!

f:id:omoshiroamericanews:20200627222943p:plain

 

本当に100%って出るんだってNeural Networkのすごさを実感できました。

 

この課題は5000セットに対しての予測なので、5000/5000ですね。

 

Week3の課題は100%いかなかったのはlayerを変えたら100%になるのかなぁと

思いました。

 

次はWeekのLinear Regressionの課題をNeural Networkで解いてみたいと思います!

Week3の課題をNeural Networkで解いてみる 後半

前回はNeural Networkの精度の低さにびっくりしたところで終わりました。

 

まずはlambdaを調整してみたいと思います。

 

overfitやunderfitの時のガイドラインがCourseraでは紹介されていました↓

f:id:omoshiroamericanews:20200619223717p:plain

 

今回は当たらなさすぎのunderfitの状態なので、

Decreasing λに沿ってlambdaを小さくしていきます。

 

 


前回はlambda=1 で67%でしたので小さくしていこうと思います!

lambda= 0.1 にしてみました。

90%になりました!

かなりよくなりました!

 

90%以上を目指してまだまだ小さくしていきます!

lambda=0.01しました!

73%でした。。。

小さくしすぎでしょうか。。。

 

もう少しだけ小さくしてみます。

lambda=0.001にしました。

69%です。

 

どうやら1-0.01の間に最適点がありそうです。

 

lambda = 0.3で68%

 

0.1-0.01の間にありそうです。

 

lambda= 0.05にしてみました。

69%です。

 

今のところ0.1が一番いい値です。

0.09にしてみました。68%です。

0.11にしてみました。68%です。

 

0.1がスイートスポットのようです。

0.101にしてみました。72%です。

0.999にしてみました。69%です。

 

0.1001にしてみました。75%です。

 

表にしてみます。

λ 的中率
1.0000 67%
0.3000 68%
0.1100 68%
0.1010 72%
0.1001 75%
0.1000 90%
0.9990 69%
0.9900 68%
0.0500 69%
0.0100 73%
0.0010 69%

 

0.1000のところが圧倒的なスイートスポットに見えます。

と同時にλによる調整はこれが限界かなとも思いました。

 

的中率を上げる方法はもう1つあることを思い出しました。

 

それはfmincgの『MaxIter』を増やす方法です。

これは試行回数みたいなもので大きければ大きいほど

的中率が高くなるが計算時間も長くなるという代物でした。

しかも試行回数に正比例して的中率が上がるわけではなく、

ある程度のところで的中率も高止まりするというコーセラの解説でした。

 

現在は100に設定されているのですが、1000へ変更します。

f:id:omoshiroamericanews:20200620145309p:plain

λを0.1、MaxIterを1000でやってみます。

 

f:id:omoshiroamericanews:20200620145632p:plain

 

的中率98%になりました!

 

この精度もくるとさすがNeural Network!と思えます。

 

10000にしてみました。

確かに時間かかります。30分は待ちました。

的中率は同じく98%でした。

 

しかも試行回数に正比例して的中率が上がるわけではなく、

ある程度のところで的中率も高止まりするというコーセラの解説でした。

 

 

λやMaxIterを調整するのはこれくらいが限界のように感じます。

UdemyのPythonによる予測コースを受けたときにグリッドサーチという手法が

紹介されていました。

 

それと同じことをループシュミレーション取り出しでやれば

できるかもしれませんが、今回は98%なので置いておきます。

 

ところでλ=1、MaxIter=100のとき的中率は67%でした

MaxIterを1000にしたら的中率がどれくらい上がるか見てみます。

 

93%になりました!

 

試行回数は500は設定した方が良いんだなと思いました。

 

最後にGradinent Checkingをしました↓

f:id:omoshiroamericanews:20200620154028p:plain

 

式は課題から完コピなので大丈夫だろうと思ってましたが

やはり大丈夫でした!

 

次回はWeek4の課題のOptionか、Week2の課題をNeural Networkで

解くことに取り組みたいと思います!

 

 

 

Week3の課題をNeural Networkで解いてみる 前半

Week3の課題はTEST1とTEST2の点数と合否がデータセットで100個与えられていて、

合否の予測線を作りなさいというものでした。

 

f:id:omoshiroamericanews:20200615205330p:plain

まずNeural Networkで解くので構造を考えてみます。

 

Input layerはTest1とTest2のなので「2」ですね。

 

Output Layerは合格か不合格なので「2」としようと思いましたが、

「1」にします。

合格でなければ不合格なので「1」についての的中率の裏返しが

不合格の的中率と考えました。

 

Hidden layerは1つとして5個の要素がある設定にします。

 

絵にするとこうです↓

 

f:id:omoshiroamericanews:20200617215131p:plain

 

Theta1は3X5です。

Theta2は6X1です。

 

Yは100x1のベクトルで、output layerを「1」にしているので

このままでいいです。  

 

これとfeed forwardで計算した100x1の予測を突き合わせてNeural Networkしてみたいと思います。

 

まず、Week3のデータをロードします。

data = load('ex2data1.txt')
X = data(:,[1 2])
y = data(:,3)

m = size(X, 1)

 

FeedforwardのTheta1とTheta2を作ります。

Theta1とTheta2を1直線にしたnn_paramsは5X3=15と6X1=6の

合計の21になるようします。


X= [ones(m, 1) X]

nn_params=rand(1,size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels)

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))
Theta2 = reshape(nn_params*1

 

Theta1とTheta2があるのでFeedForwardでoutput layerを作ります↓

f:id:omoshiroamericanews:20200617215708p:plain

 

output layerは100X1,yも100X1です。

課題の順番でいえばここでCost Functionですが、

ここで挟まなくても大丈夫でした。

課題ではnnCostFunction.mを作っていたので、ここにCost Functionの式が

必要だったんだと思います。

今回はnnCostFunction,mを流用しようと思うのでここで挟まなくても大丈夫でした。

 

続いてBackpropagationの式を組みます。

こちらも課題の式を流用します。

 

grad = [Theta1_grad(:) ; Theta2_grad(:)]

 

でgradまで表記しました。

 

本当はGradinent Checkingですが課題の式を流用してるので

あってるとして前に進んでみます。

 

nnCostFucntion.mを流用するのでfmincgの式を組みに行きます。

 

@pとnnCostFunction.mを使ってfimncgの中のcostFunctionを作りに行きます。

 

costFunction = @(p) nnCostFunction(p, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, X, y, lambda)

 

 

optionとlambdaを設定します。

options = optimset('MaxIter', 100)

lambda = 1

 

 

fmincgに必要なinitialのThetaとnnparamsを作りに行きます。

 

initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size)
initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels)


initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)]

 

満を持してfmincgの登場です。

[nn_params, cost] = fmincg(costFunction, initial_nn_params, options)

 

これで最適化されたθがnn_paramsという形で表現されています。

 

このままではoutput layerの予測値を計算できないので

最適化されたnn_paramsをreshapeして最適化されたTheta1とTheta2を作ります。

 

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))

 

Theta2 = reshape(nn_params*2

 

X かける Theta1 -->sigmoid -->かけるTheta2 -->sigmoidで予測値を出します。

 

B = [ones(m, 1) X]*Theta1'
predB = sigmoid(B)
C = [ones(m, 1) predB]*Theta2'
predC=sigmoid(C)

 

D = [y predC]

でyと予測結果を並べました!

 

f:id:omoshiroamericanews:20200617221422p:plain

パット見、約20個で3つも間違えているような。。。

 

error=mean(double(predC==y))

でみたところ、0.69

 

正答率69%!?

 

低い。。。

Neural Networkだからもっと高くなると思ったのに。。。

Week3 の時の解き方fminuncでは正答率89%だったのでかなり低く感じます。

 

 

何かの間違いかと思って違う式で検証してみましたが、

E = (predC-y).^2、

sum(E)

31

差分が31あるということなのでやはり正答率は69%です。

 

layerの構成が悪いか、lambdaが悪いか、Gradinent Checkingが悪いか、

何か原因がある気がします。

 

次回検証してみます!

*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

fmincg,fminuncを使うときに出てくる@t,@pは何か?

Week5までに出てきた@t、@pを列挙してみます。

 

Week5のex4.mの中です。

 

f:id:omoshiroamericanews:20200614000208p:plain

@(p)が絡んでいる nnCostFunction.mはnn_params, input_layer_size,hidden_layer_size,num_labels,X, y,lambdaを入力すると

Jとgradを計算してくれる関数となっていました。

nn_paramsはWeek2/3/4でいうθです。

 

なんとなくですが、nn_paramsがpと↑の式では表記されて

@(p)でnnCostFunctionでp=nn_paramsはまだ決まっていない状態かなと思いました。

 

 

この仮説で他のケースも見ていってみます。

 

Week5のGradinent Checkingの中です。

f:id:omoshiroamericanews:20200614113713p:plain

 

同じく@(p)がnncostFunctionに絡んでいるケースです。

直後に来る式は2つのケースでは違います。

ex4.mではfmincgですが、Gradinent CheckingではcostFuncつまりnnCostFunctionに

nn_paramsを放り込んでいます。

 

このnn_paramsはfmincgとか入ってないので最適化されてなさそう、と思ったので

前後関係を見てみることにしました。

f:id:omoshiroamericanews:20200614113156p:plain

なるほど。

debugInitializationで計算されたθ=nn_paramsがそのまま放り込まれていますね。

 

なので最適化されたθでGradinent Checkingしてるというわけではないですね。

 

nn_paramsがわかっているなら↑の@(p)の式なしにそのまま放り込めばいいのでは、

と思いましたが、構成上この方がいいことに気づきました。

f:id:omoshiroamericanews:20200614113713p:plain

 

θ+ε、θ-εでθを変化させてJ,gradを計算させたいから@(p)の式が

挟んであると理解しました。

 

f:id:omoshiroamericanews:20200614115303p:plain

仮説いまのところ当たってそうです。

 

Week4のoneVSAll.mのヒントにあったものです。

 

f:id:omoshiroamericanews:20200614213840p:plain

ここでは@(t)がlrCostFunctionに絡んでいます。

 

lrCostFunctionlmをみてみます↓

f:id:omoshiroamericanews:20200614214126p:plain

lrCostFunctionはtheta,X,y,lambdaを代入するとJ,gradが計算される関数です。

 

pとtで文字が変わりましたが仮説は同じだと思います。

なんとなくですが、nn_paramsがpと↑の式では表記されて

@(p)でnnCostFunctionでp=nn_paramsはまだ決まっていない状態かなと思いました。

 


Week2  logistic Regressionのex2_reg.mの中です。

f:id:omoshiroamericanews:20200614115654p:plain

 

Cost FunctionRegの中身を確認してみます↓


f:id:omoshiroamericanews:20200614115927p:plain

costFunctionRegはtheta,X,y,lambdaを代入すればJとgradを計算してくれる関数です。

 

t=thetaで@(t)が前に来て、t=thetaがまだ決まっていない状態かなと思いました。

つまり、あとはt=theta次第、ということを表しているのかなと思いました。

なんとなくですが、nn_paramsがpと↑の式では表記されて

@(p)でnnCostFunctionでp=nn_paramsはまだ決まっていない状態かなと思いました。

 

fminunc/fmincgがどういう機能のものだったかを書いた日記が

あったことを思い出しました。

www.courseradaisuki.com

 

その中に

@t(costFunction(t,X,y))のtはcostFunction.mを呼ぶ機能で

fminuncを使うためにcostFunction.mをラップくるむことができると書いていますね。

tはthetaのtではないようです。

 という文がありました。

 

まぁ、仮説とも近い気もします。

また気づきがあったら考えてみたいと思います!