Neural Networkを3階層から4階層にする
Week5の課題はNeural Networkが3階層の設定ですが、
4階層に変更することに挑戦しました。
絵にするとこういう感じです↓
何故3階層から4階層に変更したいかというと
初心者コンテストに挑戦したのですが、予測精度が低く合格点がとれませんでした。
3階層から4階層にしたら精度が上がるかなと思って挑戦してみようと思いました。
- 変更点①Layer
- ②nn_paramsとTheta1とTheta2とTheta3が①のlayerに連動するようにする
- ③nnCostFunction.mにhidden_layer_size1とhidden_layer_size2を加える
- ④initial_thetaを3つ設定できるようにする
- ⑤costFunctionにhidden_layer_size1とhidden_layer_size2を加える
- ⑥fmincgで計算されたnn_paramsをTheta1/Thata2/Thata3へreshape調整
- ⑦Gradinent Checking機能を修正する
変更点①Layer
②nn_paramsとTheta1とTheta2とTheta3が①のlayerに連動するようにする
③nnCostFunction.mにhidden_layer_size1とhidden_layer_size2を加える
FeedForwardでa4まで積み上げる。
Jの計算にTheta3を追加する
deltaを1つ増やす。
Theta1_grad /Theta2_gradにTheta3_gradを加える。
④initial_thetaを3つ設定できるようにする
⑤costFunctionにhidden_layer_size1とhidden_layer_size2を加える
⑥fmincgで計算されたnn_paramsをTheta1/Thata2/Thata3へreshape調整
⑦Gradinent Checking機能を修正する
hidden_layer_size1とhidden_layer_size2を加えて
Thata1/Theta2/Theta3の調整を行いました。
ここまでの変更を加えて4階層でのNeural Networkで
Gradinent Checkingしました。
差異が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を
まとめたのが↓でした。
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でした↓
合計は↓の15,999,395です。
この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憶という値が出てきました↓
パターン①で考えると
41億の誤差を47のサンプル数で割って87,234,042を平方根して9,339なので
1つあたりの誤差は9,339です。
1%の誤差の場合は1つあたりは3,404でした。
1つあたりの誤差は3倍なので誤差は3%と考えていいのでしょうか。
パターン①の1%/2%/3%の場合を作ってみました↓
9,339は2%と3%の間にいます。
Jと1つあたりの誤差がわかっているので逆算してみました。
パターン①の考えで正しければ精度は2.7%になります。
28億の誤差を47のサンプル数で割って59,574,468を平方根して7,718なので、
1つあたりの誤差は7,718です。
同じようにパターン①で考えると精度は2.3%です。
Week2の課題をRegularizedのLinear Regressionで解こうとしたこともありました。
Jは20.3憶でした。
20.3億の誤差を47のサンプル数で割って43,191,489を平方根して6,572なので
1つあたりの誤差は6,572です。
同じようにパターン①で考えると精度1.9%だったんだと納得しました。
今回はここまでです。また次回頑張ります。
Week2の課題(家の値段)をNeural Networkで解いてみる-後編⑦-Pythonとの予測の比較
Neural Networkでの予測の精度はLinear Regressionの精度を上回ることができました。
PythonにもLinear Regressionの予測を行う機能があります。
こちらと比較したいと思います。
色々読みこみまして↓(私のうけたオンラインレッスンではおまじないと呼んでいました)
dataをtrainとして読み込みます↓
head関数で中身を確認します↓
describe関数でデータの情報を再度確認します。
info関数でデータの型を確認します↓
1行目と2行目を予測要素と設定します↓
ちゃんと1行目と2行目が取り出されているか確認します↓
予測結果をyと設定します↓
Linear Regressionの予測をするための設定をします↓
単回帰で傾きを取り出せます↓
切片を取り出します↓
予測します↓
予測結果です↓
Octaveで比較したいのでnumpy.ndarray型になっているのをcsvにするために
処理します↓
csvファイルにします↓
Octavaに取り込みます↓
↓に基づいて誤差を計算します。
Neural Networkの誤差です。
Overfitの可能性はありますが、Neural Networkの方が精度が出ています。
ちなみにWeek2のLinear Regressionでの誤差は
だったのでPythonと同じ結果でした。
今回はここまでです。また次回頑張ります。
Week2の課題(家の値段)をNeural Networkで解いてみる-後編⑥-
前回の取り組みで見つけた
>①fmincgが最適θを計算していない
を再度考えてみます。
もう一度、初期パラメーターと計算後の最適θを並べて
観察してみることにしました。
一見何も計算されないように見えましたが
微妙に計算されていることがわかりました。
ところで、これは誤差655憶の場合です。
誤差28憶の場合は計算されているのではないかと思いました。
28億のパターンです↓
28億のパターンだとちゃんと計算されていることがわかりました。
ということはfmincgで計算されていることが確認できました。
なぜ655憶のパターンと28憶のパターンがでてくるのかは
『local optima』かなと思い始めました。
local optimaはWeek2のLinear Regressionの時に説明がありました。
local optimaは↓の図みたいにJを最小化させるθがあるのに
そこにたどり着けず別の凹みに囚われてしまうというような説明でした。
fmincgを使えば、何でもかんでもちゃんと最小のJを見つけてくれると
思っていたのですが、そうではない挙動に見えます。
local optimaにはまるのはhidden layerで-1から1で、
output layerで6桁になるのが難点です。
output layerを6桁なのを1桁にして予測してみようと思いました。
単純にyを10万で割って予測してみます。
1回目です。
それっぽくなりました。
ただ、毎回こういう予測になるのかが不安なので
合計5回やってみます。
2回目です。
今回もそれっぽいです。
3回目です。
今回もそれっぽいです。確率が上がってきた気がします。
4回目です。
お、行けました!それっぽい感じです。
5回目です。
確率100%でできるようになりました!
予測値の精度をWeek2と比較したいと思います。
Week2のLinear RegressionではNormal Equationという絶対解を
出す方法がありました。
そのNormal Equationで出した答えが↓です。
誤差が0.20なので、Neural Networkで出した計算の方が
精度が高いということになります!
λ=0.1のときの誤差をみてみます。
λ=0.01のときです。
λ=0.001のときです。
λ=1のときです。
λ=10のときです。
どうも、面白いことに誤差はλ=0.01で最小になりそうな雰囲気があります。
λ=0のときが最小だと思ってましたが、次回考えてみます。
とにもかくにもNeural NetworkでLinear Regressionの予測が
できるようになった気がします。
ポイントはhidden layerで-1から1の間になるので、
予測値も意図的に1桁に落としていくことかと思いました。
また他のケースで実験してみたいと思います。
Week2の課題(家の値段)をNeural Networkで解いてみる-後半⑤-
前回までの試行と課題を振り返ります。
構造を↓のように設定してしました。
Linear Regression用にGradinent Checkingを整備しました。
Gradinent Checkingは正解でしたがfmincgで予測を行ったら
予測が合いませんでした。
大きな分岐点が2つありました。
1つ目はFeatureNormalizeでした。
この分岐ではFeatureNormalizeしない版ではtanh関数を使用している
Hidden Layerのa2が-1か1になってしまう問題が大きく見えたので、
FeatureNormalizeする方法を選びました。
2つ目はλです。
λを1の-12乗や0に調整して予測値の向上を図りました。
時々、予測が6桁になりますが安定しないという最大の問題に当たりました。
λ=0にすると、予測値とyの引き算の値が最小化する計算がされます。
が、これが誤差655憶と誤差28億との間をさまよいます。
誤差28憶の時は予測は6桁となり、予測値っぽいですが、
誤差655憶の時の予測はかけ離れた値になって精度が低すぎになります。
λ=0の場合は、右のRegularizedの項がなくなり
予測値-yを最小化する方向へいくはずなのになぜそうならないのか、
がわからずに困っている状況です。
λ=0の時に確率100%で予測値が6桁/誤差が28憶前後にできるように
トライ&エラーしたいと思います。
まず、ランダムで設定された初期パラメーターが同じだったら
fmincgは同じ結果を出してくれるかを検証してみようと思います。
ということで初期パラメーターと計算後の最適θを1計算結果することに
保存することにします。
そうすると、衝撃の事実が発覚しました!
なんと、1計算ごとの初期パラメーターと計算後の最適θを比較すると
同じだということが判明しました!
プログラミングの予測パート、つまりfmincg部分は
Week5やWeek5をWeek3で予測値を出した分と同じものからnum_labelsを
削除しただけのもの使っていたつもりだったので、
まさかこれがうまく作動していないとは思いませんでした。
↑の部分でnuml_labelsを削除していたのですが、ダメだったということになります。
念のため、
fmincg(costFunction, initial_nn_params, options)
だけ取り出して再計算させましたが動きませんでした。。。
fmincgをfminuncに変えてみようと思います。
問題文を読み進めます。
Week3の課題ではfminuncを使用しましたが、fmincgを使いなさいという指示が
出ました。 fmincgの方が多くのパラメーターを使う際にはfminuncより効率的だと
説明されています。
Coursera Machine Learning Week4 課題 2周目③ -苦闘記憶- One vsALL① - 暇人日記
昔、fmincgはfminuncより優れているということがCourseraの教材に
書かれていました。
が、Week2のLinear Regressionの課題をfmincgで解こうとしたときに
プログラミングがうまくいかないという課題に当たっています。
↓の実験の日記の時はfminuncを使っています。
↑の日記の主旨ぶれるので日記には書かなかったんですが、
fmincgを使うと動きませんでした。
漠とこのときにfmincgはLogistic Regression向きで
fminuncはLinear Regression向きなのかと思っていました。
なので、fmincgをfminuncに置き換えてみようと思いました。
初期パラメータ=initial_nn_paramsと計算後の最適θ=nn_paramsが
異なるので計算されることがわかります!
どうやらfmincgではなくfminuncの方が良いようです。
予測結果です。
1回目です。
fmincgがfminuncより優秀というのは正しいらしく
λ=0、MaxIter=40で1計算30分ほどかかります。
λ=0だとθがいかような値をとってもRegularizedCostの計算に関与しないので
overfit気味の線をかけるのではないかと思います。
MaxIterを調整したくなりますが、まずは5回計算して安定して
予測が6桁になるかどうか見てみます。
2回目です。
最適θは計算されていることが確認できました。
予測です。↓
うわ、でた。このパターンか、という感じです。。。
なぜこうなってしまうのだろう。。。
3回目です。
最適θは計算されています。
誤差が655憶です。
5回やる前ですが、課題は同じになりそうです。
つまり安定して予測が6桁にならない。
とはいえ、進展がありました。
①fmincgが最適θを計算していない
②fminuncは最適θを計算している、ただなぜか誤差655憶が最適と
計算してくることがある。
①のなぞ解きをするか、②のfminuncのMaxIterとλを調整するか、
を追加検討したいと思います。
また次回頑張ります。
Week2の課題(家の値段)をNeural Networkで解いてみる-後編④-
前回の続きです。
λを1の-15乗にしたら安定するかどうか実験してみます。
1回目です。
2回目です。
3回目です。
4回目です。
5回目です。
確率は20%ですね。
そういえばλ=0で5回トライしてみます。
そもそもλ=0でθの2乗部分はないことにしているので、
λ=0で予測が6桁にならないのは謎です。
1回目です。
Jも同時にとっていくことにします。
655億の誤差です。
2回目です。
やはり655憶の誤差です。
3回目です。
誤差が41憶になりました!
この方が1桁誤差が少ないのになぜ1回目と2回目はこちらを選べないのだろう。
4回目です。
誤差が655憶パターンです。
5回目です。
誤差が655億です。
確率20%です。
やはり謎が解けないです。
なぜ、λ=0でθの2乗を無効化しているのに百発百中で6桁の予測にならないのか。
『MaxIter』を増やしてみます。
これが多い方が結果は安定するはずです。
これでだめなら、fmincgを今回使っていますが、fmincgはLogistic Regression用で
fminuncの方が良いかもしれませんのでそちらでトライしてみます。
『MaxIter』を150にした1回目です。
誤差は655憶です。
2回目です。
誤差が655億パターンです。
3回目です。
予測が6桁で、誤差が28憶です。
なぜ全部の予測がこの近辺にならないのでしょうか。。。。
4回目です。
InitiaThetaの差で差が出ているのかもしれません。
なので、ログをとることにします。
5回目です。
確率40%になりました。
それでもやはり40%です。。。。
やはりfmincgでもなぜ答えがバラバラになるか疑問です。
InitialThetaが原因なのでしょうか。
しかしInitialThetaがバラバラだと答えがバラバラになるのでは困ります。
うーん、どう考えればいいんだろう。
また考えてみます。
Week2の課題(家の値段)をNeural Networkで解いてみる-後半③-
FeedForwardではtanh関数を使っていましたが、
予測値ではtanh関数を使わないというという荒業で計算してみました。
根拠はないです笑
やってみてわかったことはそんなに答えは変わらないということでした。
何故だろうと思いましたが、
X *theta1がすでに絶対値で1近辺の数字になっています。
tanh関数を使うと-1から1の間に値が収束するので、
それよりは幅に広がりがあるとはいえ、近辺になっているのは変わらずです。
うーん、FeatureNormallizeがダメなのかもしれないと思いました。
FeatureNormalizeしないでトライしてみます。
こうなりました↓
桁は近づきましたが、予測が全て同じ値なのが気になります。
これはλ=0だったので、λを小さくしていきます。
λ=0.1にしました。
同じです。
心配になったのでプロセスを見てみます。
まずXに要素全て1の行を加えます。
それにTheta1をかけます。
それにtanh関数をあてます。
値が1か-1かという極端なことになっています。
Theta2もよくみると13093か-13093かという極端なことになっています。
なので1か-1に13093か-13093をかけているので、
predの値が全て同じなんだと思いました。
一回、λを0.00001にしてみます。
全く同じ結果でした。。。
Theta2も同じです。
λ=10にしてみました。
やはり同じです。
hidden layerが-1と1の種類というのも同じです。
FeatureNormalizeしてもしなくても予測が合いません。
今までの試行を振り返って表にしました↓
FeatureNormalizeしてもしなくてもそれぞれの壁にぶち当たっています。
Jが間違えているのかという気がしてきました。
いや、でもあっているはずです。
a3つまりoutput Layerをyの予測の47の差分を2乗する部分と
Theta1/2のBias部分の1行をとって2乗することで考えは合っているはずです。
ではfmincgでしょうか?
と思ってみたらそもそもfminuncとなっていることに気づきましたorz
λ=0で実行しなおしてみます!
さらにかけ離れた値が返ってきました泣
X*Thata1の値が↓でした。
これにtanh関数を充てると↓のようにばらつきはあるのですが、
Theta2の値が6桁ではないので、小さい値の予測になってしまったように
思います。
λ=0でやって効果がないと思いますが、ダメもとで
Jのθの2乗のパートは12桁になるので、
lambda = 0.0000000000001(1の-13乗)で
13桁くらいは解消されるλで計算してみます。
あ、近くなりました!
X*Theta1が↓のような値になりました。
tanh関数をあてるとこうなります↓
Theta2が念願の5桁近辺になっています!
なので、予測値の桁があがって精度が上がったんだと思います。
『MaxIter』が40だったんですが、150に上げてみます。
なんと、精度が良くなるのかと思いきや、悪くなりました。
これは謎です。『MaxIter』はやればやるほど精度が高くなるものだと
思っていたのですが。
『MaxIter』を50にして計算してみます↓
あれ、FeatureNormalizeする前のような感じになってしまいました。
元の40にして再現できてるかどうかみてみます。
できていません。。。
何か変えてしまっています。。。
λの数が怪しいので直していきます。
lambda = 0.00000000000001(1の-14乗)でした。
lambda = 0.0000000000001(1の-13乗)で
と書いていましたがこれが間違いで、1の-14乗で計算すると
↓になりました。
前回の結果と完全に一致しないのはRandom Initializationが理由だと思います。
それでは『MaxIter』を150にしてみます。
結果です↓
精度が下がってしまいました。
『MaxIter』を50にしてみます。
ダメでした。
Random Initialization次第で安定しないのでしょうか。
『MaxIter』を40にしてみます。
あれ、なぜダメなんだろうと思いましたが、
Random Initializationでフレるのかと思いまいしたので、
全く同じ条件でもう3回やってみます。
1回目です。6桁予測がでてきました。
2回目です。
3回目です。
4回目です。
5回目です。
どうやらRandom Initializationに左右されるようです。
左右されない予測値が欲しいです。
次回はまたトライします。
λを1の-15乗にしてトライしてみようと思います。
この気まぐれさが何とかなってほしいです。
Week2の課題(家の値段)をNeural Networkで解いてみる-後編②-
前回はGradinent Checkingがクリアできたので、fmincgで最適θを出して
予測値を出しましたがダメというところでした。
最適θを出してから予測値までを振り返ってみます。
構造は↓になっています。
そして計算ロジックはHidden Layerではsigmoid関数の代わりにtanh関数を
使てoutput layerでは掛け算のままとなっています。
なのでFeartureNormalizeした
Xに(本当は47個あるが3までを表示)、要素が1の行を加えて、Theta1とかけます。
47X25になっています。
これにtanh関数をします。
全て-1と1の間になっています。
要素が1の行を加えて47X26にします。
これをTheta2をかけます。
そのままの結果でいいはずなのでsigmoidもtanhも使っていません
ただ、yとは桁数がかけ離れています。。。
Hidden Layerでは-1と1の間にあるのに
output Layerでは10万くらいの結果にならなければ
ならないのでTheta2は大きな数字が入らないと駄目だと思いますが、
そうはなっていないので、桁数が違うのかなと思いました。
あ!!わかった気がします。
Jは予測値-yの2乗とθの式の積み上げでした。
このJの誤差が小さければ小さいほど良い予測となります。
今回はHidden Layerからoutput Layerで大きなθが必要ですが、
大きすぎるとJが大きくなるのでfmingが適度な大きさのθにとどめたと考えます。
θが大きくなってもいいように、設定されているのがλでした。
λを1で計算していたのですが、小さくしていってみます。
そうするとθは大きな値をとれるので、予測値が6桁に近づいてくると思います。
さっきはλ=1だったので0.1にしてみます。
あれ、イマイチでした。
λ=0.01にしてみます。
まだ、桁数がだめです。
λ=0.001にしてみます。
仮説が間違えているのでしょうか。。。
不安になってきました。
λ=0.0001にしてみました。
まだなのか、仮説の間違いなのか。。
λ=0.00001にしてみました。
ダメです、もう1回考えてみます。
Jの概念が↓でした。
右の部分のθの2乗部分が大きいため、大きいθは最適とはみなされないと考えました。
今回は左の部分は47個の2乗です。(予測値ーyは47個なので)
しかし右のθの部分は101個の2乗の合計になります。
(Theta1とThata2の合計が101個なので)
Theta2はhidden layerの-1から1の値を6桁に引き上げるため、
6桁が要求されます。それを2乗すると12桁になり、圧倒的な大きさとなるため、
左の部分のコントロールより右のθの部分のコントロールを優先した結果、
現在見えている予測値とyの差になっていると考えました。
λ=0としてみます。
こうすると右のθの部分はゼロになるので、左の部分の
予測値-yに特化した数字ができるはずです。
ダメです。
Jが原因だと思ったのですが、そうではないことがわかりました。
λ=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を使うこと
⑥Feedforwardのoutput layerであるa(3)にはsigmoidもtanhも使わないこと。
⑦JはRegularizationでない部分はLinear RegressionのCostFunctionを使い、
Regularizationの部分はWeek5と同じにすること
とありました。
Errorが出て修正してErrorが出て修正してを繰り返して
プログラムが実行されました↓
やった!できました!
さっそく予測しようと思いましたが、予測する前にX側のデータを
FeatureNormalizeしておこうと思いました。
これは今回のX側のデータのように↑、データの桁数がばらついていると
計算時間が長くなるので、Xのデータを行ごとに平均値を出して、
データ個々-平均値を計算して、標準偏差で割るというものでした。
Week2の課題でアドバイスされていたのでそれにのっとります。
具体的には行ごとの平均値です↓
データ個々-平均値です↓
行ごとの標準偏差です↓
行ごとに割ったものです↓
FeatureNormalizeしてもGradinent Checkingが大丈夫かどうか
念のため確認してみました↓
大丈夫でした!
CostFucntion/Gradientがそろったので最適θをfmincgで計算して予測してみます!
左が予測値で、右が答えだったので大幅なずれです泣
『ついにLinear RegressionでもNeuralNetworkを使えるようになりました!
感動です泣
次回はちょっと前にやっていたコロナ感染者予測にあてはめることを
別の日記でやってみたいと思います。』
というフィナーレを思っていたのですが、延期です。。。
なぜgradient ChekingはOKなのに予測がダメダメなんだろう。
また次回取り組みます。
Week2の課題(家の値段)をNeural Networkで解いてみる-中編-
前回の予測がなぜ間違えているかわかりました。
nnCostFunction.mを修正し忘れていました。
Week5の課題のプログラムは↓のような構造をしていました。
Gradinent CheckingをしてるCheckNNgradients.mは
nnCostFunction.mを参照しているのですが、
前回の日記で書いていたWeek2の課題用のプログラミングを
nnCostFunction.mに反映させていませんでした。
ということは前回の日記でうまくいっていたようにみえた
Gradinent CheckingはWeek5の正答例そのものなので合っていて
当然ということになります。
ということでnnCostFunction.mを修正してGradinent Checkingをしてみます。
というわけでnncostFunction.mに前回の日記の私の仮説を反映して
Gradinent Checkingを行ってみました。
やはりダメでしたorz
誤差が1e-9以下となってほしいところ、もっと大きい数字になっています。
ただ、ふっと↑で見えている範囲は右の行と左の行が一致しています。
全部を見てみることにしました↓
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)'となります。
θが間違ってるんでダメそうですが、予測までやってみました↓
やはりだめです。
このGradinent Checkingがうまくできないと駄目な気がします。
ということで改めてδ(2)をまた考えることにします。
①次元から考える (文系的発想)
②理論から考えてみる (ダメそう)
③Videoを見返してみる
まず①次元から考えてみます。
δ(2)は↑の式で表されていました。
δ(3)はa(3)-yなので47X1です。
Theta2は26X1です。
の部分は47X26 or 26X47になります。
が、Week5ではここはθのBias用の1行を取り除く必要があったので、
47X25 or 25X47になるはずです。
はSigmoidこそなくなりましたが、47X25になる必要があります。
z2=X *Theta1は47X3 X 3 X25なので47X25になります。
本当はなのでだめそうですが、Directにz2を放り込んで
Gradinent Checkingしてみました↓
やはりだめです。
ただ次元的にはの47X25として考えていきます。
の前段のはz2をSigmoid関数に放り込むことでした。
はの微分という解説だったと思います。
sigmoidGradientという関数がWeek5では使われていたのですが、
SigmoidFunctionのGradientと書かれていました↓
SigmoidはLogistic Regressionのために導入している関数で
Linear Regressionの今回は使用しない前提で進めています。
使用すると答えが0から1の間になってしまい、
家の値段の予測にはならないと思ったからです。
ここまでは合っていると思います。
そうなるとz2を微分しなければならないと思うのですが、
それがわからないです。
z2はX * Theta1なので、これをXについて微分するとTheta1になると思います。
Theta1は3X25なので、次元が合いません。
ただ次元的にはの47X25として考えていきます。
無理やり実行しましたがやはりErrorでした。
全然検討つかないので見えるものは全部試していきます。
Videoのスライドに↓がありました。
Sigmoid用だと思いますが、当てはめる方向で考えます
a(2) . X (1-a(2))とあります。a(2)とz(2)の差はWeek5ではBiasの1を足していることと
Sigmoidでした。
a(2)は47X26で次元が合わないため、z2 . X (1-z2)にしてみました。
全く同じ結果に見えます。
少なくとも前回代入のz2とz2 . X (1-z2)の値は違うので
違う値になってもいいのではと思いました。
何か違うところも間違えていそうです。
また次回取り組みます!
Week2の課題(家の値段)をNeural Networkで解いてみる-前半-
Neural NetworkでWeek2の家の値段の課題を解くことにトライしてみます。
課題は家の面積と部屋数から値段を予測することでした↓
Week5のNeural NetworkのプログラミングはLogistic Regressionで
0,1の分類解決用でしたが、今回の家の値段の課題はLinear Regressionのため、
プログラミングの式を変えなければならないはずです。
そしてLayerも考える必要があります。
Week5では手書きの数字の候補1つ1つに400の基データがあったので、
↓のような構造でした。
①今回は家の値段にはサイズと部屋数の2つです。
↑の図で「400」が「2」になります。
②5000のデータ数でしたが、Week2の課題は47でした。
↑の図で「5000」が「47」になります。
③outputが10でした。これは0-9の数字の10パターンの数字だったので、
10にしていました。今回は値段なんで1にしてみます。
合っているかどうかは精度で確認する考えで進めます。
構造としては一度こういう形で考えてみます↓
プログラミング上はこうですね↓
Week2のデータをDLして↓
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)
としました。
狙い通りになっています。
これを25X3と26X1のTheta1とTheta2にreshapeします。
見事にできました!↓
これでFeedForwardができます。
Week5ではLogistic RegressionだったのでSigmoid関数を使っていました↓
今回はLinear RegressionなのでSigmoidを外します。
次にBackpropagationです。
鍵の1つがこの部分です↓
これはSigmoid関数の微分だったと思います。
今回はFeedForwardでもSigmoidを外しましたので、
この部分が変わるはずです。
あんまりよくわからなくて試行錯誤した結果、
この微分だと思って、↓のようにしてみましたらうまくいきました .
とりあえずErrorなくgradは計算されて
この値が合っているかどうかGradinent Checkingの結果が↓です。
見事に合ってました!
ただ、なんで
=
と考えたらうまくいったかは不明です。。。
何はともあれ黄金パターンの
①予測式-->②Cost Function-->③Gradient-->④最適θ-->⑤予測
のうち①-③が完了したことになります。
なので④⑤に取り組みます。
Week5の式をパクッてfmincgで最適θを出して
X * thetaで予測値を出して,yと並べました↓
ボロボロです笑
何か間違いがあります。
また次回頑張ります!
Coursera Machine Learning Week5 課題 2周目⑱ 予測精度向上
Week5の課題ではλ=1、MaxIter=50で的中率95.2%でした。
同じ課題をWeek4では与えられたθでの的中率は97.5でした。
オプションではNeural Networkは複雑な予測線を描ける強力なツールなので、
λを小さくしてある程度regularizedの力を弱めて精度100%に近づけなさいというのが
課題です。
意図的にoverfitさせてくださいとかいてあります。
的中率100%見てみたいです!
なんでやってみます。
ということでλ=0.1、MaxIter=200にしてみました。
しかし圧倒的な計算コストです30分経ってもおわりません。
前回の日記でやったようにまずは一番良いλを探すことにします。
λ=0.1、MaxIter=50にしてみます。
96.78%です!
たっぷり45分くらいかかりました。
λ=0.01で96.9%です。
λ=0.001で96.62%です。
λ=0.05でトライしてみます。
96.56%でした。
λ=0.005でトライしてみます。
95.80%
λ=0.015でトライしてみます。
ここまでのをサマリーしてみます。
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%です!
本当に100%って出るんだってNeural Networkのすごさを実感できました。
この課題は5000セットに対しての予測なので、5000/5000ですね。
Week3の課題は100%いかなかったのはlayerを変えたら100%になるのかなぁと
思いました。
次はWeekのLinear Regressionの課題をNeural Networkで解いてみたいと思います!
Week3の課題をNeural Networkで解いてみる 後半
前回はNeural Networkの精度の低さにびっくりしたところで終わりました。
まずはlambdaを調整してみたいと思います。
overfitやunderfitの時のガイドラインがCourseraでは紹介されていました↓
今回は当たらなさすぎの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へ変更します。
λを0.1、MaxIterを1000でやってみます。
的中率98%になりました!
この精度もくるとさすがNeural Network!と思えます。
10000にしてみました。
確かに時間かかります。30分は待ちました。
的中率は同じく98%でした。
しかも試行回数に正比例して的中率が上がるわけではなく、
ある程度のところで的中率も高止まりするというコーセラの解説でした。
λやMaxIterを調整するのはこれくらいが限界のように感じます。
UdemyのPythonによる予測コースを受けたときにグリッドサーチという手法が
紹介されていました。
それと同じことをループシュミレーション取り出しでやれば
できるかもしれませんが、今回は98%なので置いておきます。
ところでλ=1、MaxIter=100のとき的中率は67%でした
MaxIterを1000にしたら的中率がどれくらい上がるか見てみます。
93%になりました!
試行回数は500は設定した方が良いんだなと思いました。
最後にGradinent Checkingをしました↓
式は課題から完コピなので大丈夫だろうと思ってましたが
やはり大丈夫でした!
次回はWeek4の課題のOptionか、Week2の課題をNeural Networkで
解くことに取り組みたいと思います!
Week3の課題をNeural Networkで解いてみる 前半
Week3の課題はTEST1とTEST2の点数と合否がデータセットで100個与えられていて、
合否の予測線を作りなさいというものでした。
まずNeural Networkで解くので構造を考えてみます。
Input layerはTest1とTest2のなので「2」ですね。
Output Layerは合格か不合格なので「2」としようと思いましたが、
「1」にします。
合格でなければ不合格なので「1」についての的中率の裏返しが
不合格の的中率と考えました。
Hidden layerは1つとして5個の要素がある設定にします。
絵にするとこうです↓
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を作ります↓
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と予測結果を並べました!
パット見、約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が悪いか、
何か原因がある気がします。
次回検証してみます!
fmincg,fminuncを使うときに出てくる@t,@pは何か?
Week5までに出てきた@t、@pを列挙してみます。
Week5のex4.mの中です。
@(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の中です。
同じく@(p)がnncostFunctionに絡んでいるケースです。
直後に来る式は2つのケースでは違います。
ex4.mではfmincgですが、Gradinent CheckingではcostFuncつまりnnCostFunctionに
nn_paramsを放り込んでいます。
このnn_paramsはfmincgとか入ってないので最適化されてなさそう、と思ったので
前後関係を見てみることにしました。
なるほど。
debugInitializationで計算されたθ=nn_paramsがそのまま放り込まれていますね。
なので最適化されたθでGradinent Checkingしてるというわけではないですね。
nn_paramsがわかっているなら↑の@(p)の式なしにそのまま放り込めばいいのでは、
と思いましたが、構成上この方がいいことに気づきました。
θ+ε、θ-εでθを変化させてJ,gradを計算させたいから@(p)の式が
挟んであると理解しました。
仮説いまのところ当たってそうです。
Week4のoneVSAll.mのヒントにあったものです。
ここでは@(t)がlrCostFunctionに絡んでいます。
lrCostFunctionlmをみてみます↓
lrCostFunctionはtheta,X,y,lambdaを代入するとJ,gradが計算される関数です。
pとtで文字が変わりましたが仮説は同じだと思います。
なんとなくですが、nn_paramsがpと↑の式では表記されて
@(p)でnnCostFunctionでp=nn_paramsはまだ決まっていない状態かなと思いました。
Week2 logistic Regressionのex2_reg.mの中です。
Cost FunctionRegの中身を確認してみます↓
costFunctionRegはtheta,X,y,lambdaを代入すればJとgradを計算してくれる関数です。
t=thetaで@(t)が前に来て、t=thetaがまだ決まっていない状態かなと思いました。
つまり、あとはt=theta次第、ということを表しているのかなと思いました。
なんとなくですが、nn_paramsがpと↑の式では表記されて
@(p)でnnCostFunctionでp=nn_paramsはまだ決まっていない状態かなと思いました。
fminunc/fmincgがどういう機能のものだったかを書いた日記が
あったことを思い出しました。
その中に
@t(costFunction(t,X,y))のtはcostFunction.mを呼ぶ機能で
fminuncを使うためにcostFunction.mをラップくるむことができると書いていますね。
tはthetaのtではないようです。
という文がありました。
まぁ、仮説とも近い気もします。
また気づきがあったら考えてみたいと思います!