暇人日記

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

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つの計算方法が提示されたんだと思います。

 

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