MNISTのデータを使ったテストではまともに動いているように思えなかったのでめちゃくちゃ単純な2層ネットワークを作ってテストした。入力が[1,0]の場合は正解が[1,0]、入力として[0,1]の場合は正解が[0,1]で試した。今回はバッチ実行等はしておらず、2つのパターンを交互に入れて、1回ずつ数値微分で降下させてウエイトを修正させた。
ネットワークの定義とWeight,Biasは以下の通り(同じ条件でデバッグするため、乱数ではなく意図的に設定)
layer:[02] arch:[(2, 2, 2)] === Weight:0 === [[ 0.01 0.03] [ 0.02 0.04]] === Bias:0 === [0 0] === Weight:1 === [[ 0.01 0.02] [ 0.03 0.04]] === Bias:1 === [0 0]
総学習回数は5000回で、正解を出し始めたのは3953回目であった。学習回数は、どのような降下法を使っているか、ウエイトの初期値の乱数の適切さ、学習パラメータ等で決まるらしいので、3953回が一概にだめな学習とは言えないが(単純な構成にしては回数かかりすぎな気はしますけど)、少なくとも数千回というオーダーで学習させることで、正解を出すようにウエイトが最適化さえることが確認できた。バッチ実行させていないせいなのかどうかわからないけど、パターン1の誤差が一旦上昇して、後に下降しているのが見られる。こんな学習が可能とは。。。(なお、パターン1、パターン2で学習1セットとしているので、投入したパターンの回数(降下法が動いた回数)は2倍になります)。
テストデータを一回ずつ入れて降下させる方法だと学習できているようなので、今後はバッチ実行で正しく平均値?に基づき学習できるかを確認して、次第に複雑なネットワークで試す予定。
■追記
[:W300:left]前回学習させたのは5000回であった。グラフとしては誤差0に向かっていたが、さらに学習させるとどうなるのか?が気になったので、10万回学習させてみた。この結果が左のグラフ。実際の学習は10万回やらせたけどグラフ化した場合、16000以上はもうほぼ0で変化が分からないので、16000までの範囲でグラフ化はした。パターン1の誤差は一旦上昇して下降するのが不思議だったけど、パターン1とパターン2の平均を取ると(グラフ中黄色の線)、単純に下降している。パターン2の下降の勾配がきつくて、それに引っ張られてパターン1の誤差は一旦上昇したということだろうか。。うーん。
ちなみに10万回学習させると、誤差は0.0005まで下がっている。
99600,0,1,0.000576,0.000541 99800,0,1,0.000575,0.000540 100000,0,1,0.000574,0.000539
この時の重みはどうか??というと、以下のようにクロスしているけど入力→中間→出力が直結したネットワークを学習により獲得している。普通人間が考えてもこうなるしかないけど、それが自動でできるというわけです(か。。)
=== W0 === [[-3.16793492 2.92998695] [ 2.99018305 -2.74483237]] === B0 === [0 0] === W1 === [[-4.19742834 4.22742834] [ 4.14475157 -4.07475157]] === B1 === [0 0]