手書き数字の文字認識。バックプロパゲーションの出力が0ばかりになってしまった。

 世の中のAIブームの影響を受けて、何年かぶりにニューラルネットワークNNをやってみたのですが・・・
 思いの外うまくいかない。


【手書き数字の文字認識】
 digits(8*8),MNIST(28*28)の手書き数字の文字認識をやってみたのですが、バックプロパゲーションの出力が0ばかりになってしまった。


【対処法】
 正解の時は、バックプロパゲーションをしない。
 間違えた時だけ、バックプロパゲーションを行う。


 ネットに書いてありました・・・(T . T)


【なぜこんなことになったのか】
 手書き数字の文字認識は、入力に対して、1〜10の10種類の出力を出すわけですが・・・


 出力の設計は、
 0ならば[1 0 0 0 0 0 0 0 0 0 ] 1ならば[0 1 0 0 0 0 0 0 0 0 ]


みたいになるわけです。 


 一つだけ1で、残りの9が0となるわけです。

 このようなのをwinner-take-allというらしいのですが・・・

 ニューロの立場で考えた場合、1になる確率は10%で0になる確率は90%です。
0を出力していれば、9割近く正解するわけです。


 バックプロバゲーションを常に有効にした場合、
 なまじ出力をしても、9割の確率で出力を0にしろと言われるわけです。
 1にしろと言われるのは1割だけ、そのため、ニューロは0出力になってしまったわけです。