chakokuのブログ(rev4)

日々のごった煮ブログです

【DLfS】自分の好みでNNを実装、しかし学習がおかしい

DLfSの「4.5章 学習アルゴリズム」のアルゴリズムを踏襲しつつ、自分の好き勝手な実装方法で学習機能(数値微分による勾配降下法)を持つNNを作成した。エラーなしに走るには走るけど、相変わらずいろんな入力に対して同じ答えしか返さない。。しかも、誤差平均が上がったりするし。。

--- ans ---   // 正解データ
[5, 0, 4, 1, 9]    // training
[7, 2, 1, 0, 4, 1,*略*,4, 1, 7, 6, 9]  //test

----------- // NNによる回答 (降下法1回目)
[2, 2, 2, 2, 2] 
[2, 2, 2, 2, 2, 2,*略*, 2, 2, 2, 2]
Accuracy: 0.0%  // trainingに対する正解率
Accuracy: 8.0%  // testingに対する正解率
loss:6.908(ts)  //誤差平均

            // NNによる回答 (降下法2回目)
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, *略*,1, 1, 1, 1]
Accuracy: 20.0% // trainingに対する正解率
Accuracy: 14.0%  // testingに対する正解率
loss:6.905(ts)  //誤差平均

最初は誤差が下がって一見、学習しているかのフリをしつつ、途中から誤差が上昇したりしてかなり挙動がおかしい。原因は勾配計算にあると推測している。ミニバッチに対応させているけど、そのあたりがおかしいのだろう。
使ってるデータはMNISTなので配列がでかすぎてまともにデバッグができない。3x2ぐらいの小さな入力データを使って、全ての勾配を手で計算して隅々までデバッグするつもり。
テスト例:

input:6 hidden:10 output:3

入力ー>正解
□■ ー>[1,0,0]
■□
□■

□□ ー>[0,1,0]
□■
■■

□■ ー>[0,0,1]
□■
□□