暇人日記

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

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に取り組みます!