AutoEncoder の記事を記述しました

AutoEncoder による DNN 初期化方法に関する記述を
ホームページ記事に追加しました。

今回の検証は python で行ったため、レポジトリを分けました。

Java による実装はそのうち手が空いた時に行おうと思います。

ML_python レポジトリを追加

ようやく AutoEncoder を使った DNN が動いたので、GItHub に公開しました。

とりあえず、途中まで教科書「ゼロから作る Deep Learning」を参考にしつつ、
AutoEncoder クラスや MultiLayerNet クラスを追加しています。

4000回の学習でテストデータに対し、最小 88%、最大 96%程度の認識率を
持たせることができました。

DNN は途中のデバッグが非常に困難に感じます。既存の DNN ライブラリは
どうやってデバッグを解決しているのでしょうか。

記事の方はそのうち更新したいと思います。

JCuda 版ニューラルネット記事追加

JCuda 版ニューラルネットのコードに関する説明記事をアップしました。CPU 版と比較して、以下の変更があります、

  • CPU版では batchsize 方向の並列化はしなかったが、JCuda 版では batchsize 方向も並列計算する。
  • CPU 版ではホストメモリの管理のみだったが、JCuda 版ではホストメモリおよびデバイスメモリの両方を管理する。
  • JCuda 版では計算はデバイスメモリで閉じるようにする。
  • メソッドはほぼ共通して使えるように、デバイスメモリ管理をオブジェクト定義に追加して隠蔽する。

 

SimpleNet.java バグ修正しました

SimpleNet.java の forward() 計算で、bias を使用しないというバグがあったため、JCudaNNKernel.cu とともに修正しました。ただ、bias があってもなくても正答率に目立った変化はないようです。

JCuda 版ニューラルネットのソースコード解説は、現在作成中です。完成にはあと2〜3日かかると思いますので、好ご期待。

AutoEncoder 系のライブラリも作成中ですが、まだ動きません。

NeuralNet.java のバグを修正しました

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 を試みていますが、これがまたうまく行かない。