隠れ層のある場合のニューラルネットにおける逆誤差伝搬法の数式が間違っていたのを修正しました。
また、 の微分評価式が間違っていたのを修正しました。
正しくは となります。
以上訂正した記事をアップロードしました。
気ままな技術者生活から人生について考える
隠れ層のある場合のニューラルネットにおける逆誤差伝搬法の数式が間違っていたのを修正しました。
また、 の微分評価式が間違っていたのを修正しました。
正しくは となります。
以上訂正した記事をアップロードしました。
NeuralNet.java でバグが見つかり、本来
for (int y = 0; y < ysize; ++y) { d += w[x][y] * bderivative[y] }
と書くべきところを x に関して和を取っていました。修正し、GitHub を更新しました。
修正の結果、収束がさらに速くなった気がします。また、ループを繰り返すと過学習してしまう傾向がみられます。
以前、Java で作成する AI みたいな本を買ってきてプログラムを打ち込んでいたが、MNIST の手書き認識精度が 10% 台とほとんど認識できない状態になっていた。
今回、改めて Java で組んでみてその理由が判明。
σ'(z) とのアダマール積を取るべきところを加算しておりました。
そりゃ、収束せんわなあ。
プログラムを組み直したら劇的に収束が改善され、10回ループくらいで90%の認識率を持つようになりました。(さすが最急降下法!!)
これ以上の認識精度は難しいようです。
まだコメントが一切ないコードなので、コメントを付けて GitHub に上げようと思います。
また、コードを JCuda 版に改造して劇的な性能改善を図る予定です。
(CPU による Java8 の parallelStream は Core i7 6900K では期待した性能が出ないようです。並列化のオーバーヘッドが大きい?)
今は AutoEncoder による Deep Learning を試みていますが、これがまたうまく行かない。