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と組み合わせたものも多いのでこちらの正確な比較は大変。 学習も難しいし。
公開されている実装としては、確認しやすいものとしては以下の実装がある。
- Ladder Network: github.com/rinuboney/ladder
- VAT: qiita.com/mokemokechicken/items/69228b4c7884025e1ffe
- Deep Boltzmann Machines: github.com/monsta-hd/boltzmann-machines
手法はシンプルで、(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 件のコメント:
コメントを投稿