Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

初等線形代数・統計でMNISTの94.8%の画像を正しく分離

昨日の記事で、初等的な線形代数と統計のみで、MNISTの94.0%の画像を正しく分離できたことを書きましたが、手法を少しだけ見なおすことで、精度が94.8%になりました。

0: ok=4853(98.0%), ng=97(2.0%)
1: ok=5191(92.3%), ng=432(7.7%)
2: ok=4827(97.2%), ng=139(2.8%)
3: ok=4779(93.6%), ng=328(6.4%)
4: ok=4699(97.0%), ng=146(3.0%)
5: ok=4243(93.7%), ng=286(6.3%)
6: ok=4683(95.5%), ng=222(4.5%)
7: ok=4872(94.1%), ng=304(5.9%)
8: ok=4642(94.4%), ng=275(5.6%)
9: ok=4631(93.0%), ng=351(7.0%)
OK=47420/50000(94.8%), NG=2580/50000(5.2%)

この値は、VAEの中間層データで分類した場合(94.2%)よりも良い良い結果です。VAEでは、高次元空間上でのデータの自然な分離状況を少し取りこぼしているようです。

94.0%から94.8%への精度向上は、僅か0.8%ではありますが、残りは6.0%から5.2%に減ったので、上手く分類できないデータは13%程度ほど減ったことになります。テストデータの分類は、91.6%から91.7%に精度が向上しましたが、これは僅かな値です。

ちなみに、Web上で古典的な機械学習の記事を少し見ていたら、MNISTの分類精度に関する情報が下記に載っていることが分かりました。残りの誤差の比率は、20年ぐらい前(1998年頃)に、5.0%を切ったようです。手法としては、「K-nearest-neighbors, Euclidean (L2)」との事なので、古典的な手法なのでしょうね。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

20年前となりますと、コンピューターパワーがかなり低く、行列関連の色々なライブラリも簡単に使えなかったので、大変だったのでしょうね。なお、上記サイトを見ると、画像内の数字の位置を少しずらすな2どの前処理(PREPROCESSING)をすると精度が向上するようです。前処理としては、例えば、文字の重心を画像の中心にするのではなく、文字を囲む四角形を画像の中心に揃えるなど。

ちなみに、tensorflowの例題として付いてくる「convolution.py」で分類したところ、10秒もしないうちに誤差が5%以下になり、数分で処理が完了したときはTest errorが0.8%になりました。やはり、CNNは強力ですね。なお、上記サイトに書かれた最良の値は0.23% (2012年)でした。

補足

本件の計算手法及び詳細は下記githubのファイル「mnist-cov-fine.html (html版)」か「mnist-cov-fine.ipynb(jupyter notebook版)」を参照願います。
github.com