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] □■ □□