MNISTを多層パーセプトロンで


去年の12月頃にもしていたけれど、Imager::AnimeFaceを作っていたときにさまざまな拡張を取り込んでいるのでそれで試した。

特徴量は、AnimeFaceと同じ(nv_face_haarlike)にした。名前はhaarlikeだけど中身は四方向面特徴を拡張したものになってる。1152次元のベクトルになる。この関数は32x32以下の画像には使用できないので、28x28の元画像に上下左右2pxずつのパディングを加えた画像に対して適用した。

環境

Windows XP, Intel Core 2 Quad Q9550

結果

中間層素子 256


98.52%

中間層素子 800


98.6%

中間層素子 2048


98.66%

感想

ほとんどの変更は高速化のためなので、速くはなっていた。中間層素子256で6万件全部使っても1エポック30秒程度だった。テストも256なら1万件に対して700msで終わっているので、1件あたり70μs程度。このおかげで2048ユニットとか無理だろって内容もごく普通に試すことができた。
中間層素子は試した限りでは増やすほどよい結果になっている。ただ識別の速度は遅くなるので、実用上は微妙な精度の差を気にするよりは速度を気にしたほうがいいと思ってる。

12月時点から変わっているところ

  • 誤差関数を交差エントロピー誤差に
  • 中間層にノイズを加える (+-0.7までの一様乱数)
  • 学習の終わりのほうで学習係数が減っていくようにする
  • 十分学習できているパターンは逆伝播を行わない(データセットから消すわけではなく、順伝播時の結果を毎回調べる)
  • 1層目と2層目で学習係数を変える (0.01, 0.0001)
  • 内積の計算をOpenMPで並列化
  • 内積の計算をSSEで並列化