【Coursera機械学習】week4の課題のまとめと勉強したことのメモ

スポンサーリンク
coursera
スポンサーリンク

第4週目の講義はニューラルネットワークに関するものでした。行列の掛け算の順番が分からなくなった場合は、それぞれの行列が何行何列か確認することで、解決できました。

スポンサーリンク

課題1:lrCostFunction

課題1ではニューラルネットワークのコスト関数を実装します。

ロジスティック回帰におけるコスト関数は以下の数式で表します。詳しくは、ex3のPDFに書いてあります。hはシグモイド関数です。

\( J(\theta) = \frac{1}{m}\sum_{i=1}^m[-y^{(i)}log(h_\theta(x^{(i)})) – (1-y^{(i)})log(1-h_\theta(x^{(i)}))] \)

ここで、week3の講義で説明があったように、過学習を防ぐために正則化項を追加します。正則化項を追加したコスト関数は以下のようになります。

\( J(\theta) = \frac{1}{m}\sum_{i=1}^m[-y^{(i)}log(h_\theta(x^{(i)})) – (1-y^{(i)})log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\sum_{j=1}^n\theta^2_j \)

また、PDFで「Note that you should not be regularizing θ₀ which is used for the bias term.」とあるように、θの0番目を正則化に含めないようにすることに注意してください。

今回のコードでは、

とすることで、θの0番目を0に変換しています。

また、最急降下法(grad)にも正則化項を追加することを忘れないようにしましょう。

\(\frac{\partial J(\theta)}{\partial \theta_0} = \frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j + \frac{\lambda}{m}\theta_j\)

課題2:OneVsAll

課題2では課題1で実装したコスト関数が最小になるようなθの値を求めます。

この課題ではfmincgを使うことが推奨されています。fmincgは指定した関数を最小にするような変数を求めるときに使うようです。

例えば、

と記述した場合、funを最小にするようなx0を計算してくれます。詳しくは下のサイトが参考になると思うので見てみてください。

制約なし多変数関数の最小値を求める – MATLAB fminunc – MathWorks

今回のニューラルネットワークを図にすると下のようになっています。そのため、それぞれのクラスに対して、重みθは401あるので、all_thetaは10×401になっています。

クラスラベルの数だけfor文を回して、それぞれで、コスト関数が最小となるθを求めます。

課題3:predictOneVsAll

課題3では、課題2で求めた最適化された重みθを使って実際に予測を行います。予測結果は、入力値Xと重みθを掛け算したものを活性化関数(ここではsigmoid)で変換すれば得られます。

予測結果hは5000×10の行列です。

それぞれの行で、最大値のインデックスを取得することでどのクラスに分類されたか知ることができます。

最大値の取得にはmaxを使います。maxの詳しい使い方は下のサイトを参考にして下さい。

配列の最大要素 – MATLAB max – MathWorks

これらを組み合わせて、行ごとの最大要素を求めています。

octaveの基本的な演算はこちらにまとめています。

課題4:predict

課題4では、隠れ層が1層追加され、3層構造のニューラルネットワークを考えます。

課題2と3を組み合わせたものを2回書くことで実装できます。input layerとhidden layerのノードにバイアス項として1を追加します。

タイトルとURLをコピーしました