Random Initializationを深堀してみます。
Random Initializationはθの値の初期設定をランダムに決めることです。
Random InitializationはVideoでも紹介され問題文にもあって課題プログラムまで
ありましたが、答えが書いてあって実行して理解したという気はしていません。
なぜ深堀するかというと、
Videoの中でRandom Initializationは非常に重要だとコメントされていたことがあります。
理由はBackpropagationの時にθの初期値が0だと差分のδが全て0になって
Backpropagationがうまく作動しなくなるのが理由です。
FeedForwardは今回は初期値が与えられていましたが、
FeedForwardでもθが全て0だと何Layerを挟もうとoutput layerは全て0になると思うので
Random Initializationは応用する時に必須なのではないかと思います。
Ramdom Initilalizationは
プログラム詳細randInitalizeWeights.mで表現されています。
L_in, L_outがあれば、Wを計算するという式になっています。
L_in, L_outが何かといえば計算要素がL_inで計算結果L_outとあります。
具体的にWeek5の例で考えると
θ1のL_inはbias込みで401でL_outが25です。
θ2のL_inは26でL_outが10です。
どうやってRandom InisitalizationをするかのVideoの説明は↓でした。
これをみたときにrand(10,11)はどういうものか分からなかったので実行してみます。
10X11のランダムのベクトルを作成してくれるようです。
だとすればこれで十分だと思うのですがなぜεがついているのだろう。
あ、なるほど、あの式だと絶対値εの範囲におさまるということですね。
ふーん、
何故この式でなると断言できるんだろう??
分かりません。。。
-A ≦ A *(2rand-1) ≦A
となっているようですけど、-1≦(2rand-1)≦1でないと成立しないと思います。
どうしてこれが証明できるか分かりませんが先に進みます。
εは0.12に設定されていました。
Videoの式が具現化されています。
実行すると見事に25X401のRandom Initializationできたw=θが出てきました!
Random Initializationと似たものでdebugInitilizationWeights.mというのが
Week5の中にはあります。
こちらはGradinent Checkingの中で出てきます。
Week5の中では
Random InitializationはBackpropagationに使って、
debugInitializationWeights.mはGradinent Checkingに使っています。
目的は同じでランダムにθを作ることですが、作り方が違います。
fan_out = L_out
fan_in = L_in
です。
sinはサイン関数で-1~1の値しかとりません。
それをnumel(W)=260を1から260までを1つ1つ代入して260の値を出してます。
そしてsize(W)=10X26でreshapeして10で割っています。
おそらくランダムの計算方法をBackpropagationとGradient Checkingで変えたかったので
2つの計算方法が提示されたんだと思います。
今回はここまでです。また次回頑張ります!