2018年6月18日月曜日

non-CNNでMNIST

論文を読んでいたのですが、MNISTのランキングに載っていないnon-CNNの構造ってたくさんあるんですね。 2016年のRedditの内容としてLadder NetworkがCNNもData Augumentationも使わない構造としては99.43%でSoTAという話を見つけました。 色々な論文を読んでみたのですが、non-CNNで数値が載っているものとしてはだいたいこれが最良の結果になっているように思う。

Maxout Networksの論文にはランキングにないものがいくつか載っていて、 non-CNNでより良い精度を出すためには結構参考になるかも知れない。 RBFカーネルと組み合わせたりして良い性能が出る (計算量は…) ものもあります。 あとPermutation-invariant MNISTなどで検索すると微妙に意味合いは違うと思うのですが、よく似た研究が見つかります。 他にもGenerative ModelとかAdversarial Trainingを使ったものが結構あります。non-CNNの精度としてわかっているものはAAEで99.15%Adversarial trainingで99.29%VATで99.36%など。他にも99%くらいの結果はたくさんある。 ただCNNと組み合わせたものも多いのでこちらの正確な比較は大変。 学習も難しいし。


公開されている実装としては、確認しやすいものとしては以下の実装がある。 これらを利用して軽く確認してみたのですが、パラメータチューニングが難しかったり、学習が遅かったり簡単ではない感じ。 コツを掴まないとそう簡単には良い感じには取り扱えないような気がしている。 何となくですが、以下の論文がほどほどの精度で一番楽なんじゃないか。
手法はシンプルで、(1)入力層0.2、中間層0.5のDropoutと、(2)fine-tuningで精度が出るという話。 様々な構造が途中で出てきますが、一番良い結果の99.21%が出たのは以下の構造みたい。

項目利用手法
活性化関数ReLU
最適化関数SGD + Momentum
モデル1784-500-1000-10

普通は784なのに1784というよくわからない数値になっているのは、第2隠れ層へのmean-fieldの1000ユニットを特徴として追加しているからとか。 ここで全結合ではなくDeep Boltzmann Machines (簡単説明) を導入している。 チューニング前の論文では99.05%の精度が出ると主張しているので、0.21%の更新になるという事ですね。 ただDeep Boltzmann Machinesを使わない全結合でも99.08%まで出るらしい。 これがシンプルな割には良い結果だなと。

SGD + Momentumは遅いのでおもむろにAMSGrad + Early Stopping (patience=0) を使って確認してみました。 汎化性能はSGD + Momentumのほうが上という報告もあるし参考値です。 最初はlearning rate=1e-3で学習し、fine-tuningで学習率を上表のように下げればまあまあの精度が出ます。 追試するならSGD + Momentumを使うべきなのですが、Dropoutの調整とfine-tuningの効果はこれでも実感できるし、まあ良いかなと。

構造テスト性能
784-2000-2000-10 AMSGrad (lr=1e-4)98.79%
784-2000-2000-10 AMSGrad (lr=1e-5)98.73%
784-500-500-10 AMSGrad (lr=1e-4)98.52%
784-500-500-10 AMSGrad (lr=1e-5)98.45%
784-500-1000-10 AMSGrad (lr=1e-4)98.65%
784-500-1000-10 AMSGrad (lr=1e-5)98.57%

全結合の標準性能である98.40%は簡単に超えました。 99.08%には到達していませんが、思っていたよりは簡単に多少の精度改善ができました。

ついでなのでMaxoutもやってみる。Maxoutは from keras.legacy.layers import MaxoutDense すれば使えます。 最適な構造もわからないけど、軽くやってみた限り平凡ですね。

構造テスト性能
784-2000-2000-10 AMSGrad (lr=1e-4)98.47%
784-500-500-10 AMSGrad (lr=1e-4)98.53%

non-CNNで手軽にもっと性能が出ないものか。

0 件のコメント: