機械学習Courseraの機械学習コースでニューラルネットワークを学んだので、習作としてC#で実装してみた。多層パーセプトロン対応。Classification専用(シグモイド関数をベタ書きしてるので)。ソースコードはここにおいてある。実装の概略ネットワーク各層の関数を、行列型の配列Thetas[]で保持している。}これに、(RandomizeThetas()で初期化したあと)関数Learn()に学習用データとパラメタを渡せば最急降下法で学習を開始する。}}上記のGetGrad()が、各ノードの偏微分を返す関数で、それを使ってUpdateThetas()内でThetas[]を更新する。GetGrad()の実装も教科書通り。grad;}ForwardProp()は名前の通りフォワードプロパゲーションを、BackProp()はバックプロパゲーションをする関数。ForwardProp()は各層の中間値を返すので、それを使ってBackProp()で後ろの層から変化量もとめ、L_deltasを更新している。全入力のループが終わったら、GetGrad()がL_deltasを使って偏微分を求める。偏微分を求める実装がややこしいのだが、コースで推奨されているとおりに、近似値を求めて比較する方法でデバッグした。+e(eは小さい数)のそれぞれでコストを求め、その傾きを使うというもの。lambda);2通りの結果がほぼ同じなので、実装が合っていることを確認できる。使ってみるこちらのサイトにある手書き数字の学習と認識に挑戦してみる。}トレーニング用とテスト用のデータがすでに用意されていたので、そのまま利用した。好ましいパラメタを選ぶために、本来ならクロスバリデーション用として別のデータを用意すべきだが、今回はテスト用を流用した。3層ネットワークで、イテレーションは適当に300回。合計5回の学習で1時間以上かかってしまった。認識率は約90%だった。何も工夫しないとこんなものだろうか。イテレーション回数が少なくて収束しきっていないのかもしれない。このあたりは、別にちゃんとしたライブラリを使っていろいろ試してみようと思う。一から自分で組んでみてかなり勉強になったが、本格的に実装するならライブラリを使わないと難しいと改めて実感。数学関連の問題がでるコンテストらしい。参加日記392位/9177人。全完で暫定85位/3075人。2016の参加日記3完1部分点で暫定192位/3601人。数学が分からなくて苦しんだ。...2016-07-31天下一プログラマーコンテスト2016予選Aの参加日記2完の141位/446人。一問解けるようになりたい。月別アーカイブはてなブログをはじめよう!yambe2002さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。