Vectorizationを見ていきます。Checkingモーメンタム法を順に実装していきます。今回扱うニューラルネットワーク今回は、下図のような入力層、1層の隠れ層、出力層がつながったモデルを扱います。2次元の入力を受け取り、3次元の隠れ層、2次元の出力層へとつながっていきます。前回までと異なり、今回はバイアスも定義されています。https://peterroelants.github.io/posts/neural_network_implementation_part04/#Vectorization出力層の活性化関数にsoftmax関数を使うと、このモデルは2クラス分類問題に使用することができます。使用するデータセットの用意いつも通り使用するデータセットを生成します。今回は、下図のような、青クラスの外側を赤クラスが取り囲んだようなデータセットを使用します。2)scikit-learnのmake_circlesという関数を使うと、今回使いたいデータを簡単に用意することができます。x_redとx_blueをプロットすると先ほど示した図が得られます。使うと次のように表すことができます。この数式をコードに落とすとこのようになります。使用して次のように記述できます。bo)以上をもとに、ニューラルネットワーク全体の関数と、入力からクラスを予測する関数を定義することができます。使用した時に、バックプロパゲーションで使用するコスト関数の微分の値は次のようになります。出力層(ソフトマックス層)への入力です。(Python内ではerror_output関数)は次のように定義できます。Tさらに、コスト関数の重みでの微分は、(こちらも計算過程は一切省略してしまいますが。)次のように書けます。同様にバイアスに関してもヤコビアンが次のように記述できます。この二つのヤコビアンを計算する関数は、次のように実装できます。計算式はノートに譲るとして、計算結果だけを紹介すると、ヤコビアンは次のように記述できます。要素ごとの積を表しています。途中の計算こそややこしいのですが、計算結果はシンプルで、簡単なコードに落とすことができます。Checkingバックプロパゲーションの実装はバグを埋め込みやすく、実装が正しいかをチェックすることは非常に大事だそうです。バックプロパゲーションで計算した微分の値と、数値微分の値が大きく異なっていないかを調べることで、実装の正しさをチェックできます。数値微分とは、次の式で微分の値を近似することをいいます。十分に小さな値でなければいけません。実際にバックプロパゲーションで計算した微分と、数値微分の値が近いものかを調べてみます。バックプロパゲーションで微分を計算します。順方向に出力を計算した後、微分を値を逆方向に計算しています。gradient_bias_hidden(Eh)次に各パラメータに対して数値微分を計算して、バックプロパゲーションでの微分の値と近い値かをnumpyのisclose関数を使用して調べます。foundと表示され、全てのパラメータについて微分の値が近いことが確認できました。以前は最急降下法を使用してコスト関数の最適化を行っていましたが、今回はモーメンタム法を使用します。後に見るように、最急降下法だと局所最適解にたどり着いてしまうことが多く、良い結果が得られないからです。モーメンタム法では、次の式でパラメータを更新します。Vs)]いよいよバックプロパゲーションを使ってネットワークの最適化を行っていきます。update_params関数を使ったパラメータの更新を、300イテレーション回します。T))ls_costsに保存したイテレーションごとのコスト関数の値を可視化すると次のようになります。最初は70程度だった値が、200回を超えたあたりから0に近い小さな値に収束していく様子が確認できます。学習したパラメータを使って、決定境界を可視化すると次のようになります。うまく入力を分類できている様子が確認できます。隠れ層は3次元でしたので、隠れ層の値も3次元空間上にプロットすることができます。隠れ層の時点で3次元空間上では青クラスと赤クラスがうまく分類できているようです。パラメータの更新をするので、コードは次のようになるかと思います。T))再び最適化の過程を可視化すると次のようになります。振動しながらも徐々にコスト関数は小さくなっていきますが、最終的に70-80程度までしかコストを小さくできていません。Notebookで何回か上記コードを実行して試してみましたが、何度やっても同様にある程度の値までコストが小さくなったらそれ以上は小さくなりませんでした。局所最適解につかまってしまっているのだと思います。念のため、決定境界も可視化してみましたが、やはり全然うまく分類できていない様子が確認できます。Notebookは下記においてあります。前回の記事の続きです。アーカイブおすすめの本はてなブログをはじめよう!kanohkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。