以前、Java で作成する AI みたいな本を買ってきてプログラムを打ち込んでいたが、MNIST の手書き認識精度が 10% 台とほとんど認識できない状態になっていた。
今回、改めて Java で組んでみてその理由が判明。
σ'(z) とのアダマール積を取るべきところを加算しておりました。
そりゃ、収束せんわなあ。
プログラムを組み直したら劇的に収束が改善され、10回ループくらいで90%の認識率を持つようになりました。(さすが最急降下法!!)
これ以上の認識精度は難しいようです。
まだコメントが一切ないコードなので、コメントを付けて GitHub に上げようと思います。
また、コードを JCuda 版に改造して劇的な性能改善を図る予定です。
(CPU による Java8 の parallelStream は Core i7 6900K では期待した性能が出ないようです。並列化のオーバーヘッドが大きい?)
今は AutoEncoder による Deep Learning を試みていますが、これがまたうまく行かない。