Theano で MLP & CNN (2)
Theano で Multi Layer Perceptron & Convolutional Neural Net - まんぼう日記 のつづき.重みの正則化(regularization, weight decayとも)の項を入れました.ついでに細々と条件を見直して,MNISTの識別実験を再び.
これまでの経緯や関連記事は上記リンク先へどうぞ.
前回からの変更点
nnet0211.py MLPのプログラム.Layer クラスと MLP クラスを定義.重み W の更新則に正則化項を追加(バイアス b には正則化なし)した.また,Wをゼロ平均の正規分布からとった乱数で初期化するようにした.b は 0 で.重みの更新則はこんなん:
\[ \Delta W \leftarrow -\eta \left( \frac{\partial E}{\partial W} + \lambda W \right) + \mu \Delta W \]
mnist_mlp0211.py nnet0211を使ってMNISTの識別実験をするプログラム.データの平均を引いて \( \mathbf{0} \) にしたもので学習・テストするようにした.それから,学習関係のパラメータをちょっと修正.詳細は↓で.
convnet0211.py CNNのプログラム.ConvLayer, PoolLayer, FullLayer の各クラスおよび CNN クラスを定義.nnet0211 を使うように修正.
convnet0211.py convnet0211 を使ってMNISTの識別実験をするプログラム.mnist_mlp と同様に修正.
MLPでの実験
以前の実験( Theano で Multi Layer Perceptron - まんぼう日記 )との違いは次の通り:
- データの平均を \( \mathbf{0} \) にしたものを用いる
- 重みの初期化の仕方が違う
- SGDのバッチあたりデータ数(batchsize)を 1000 から 100に
- 学習定数(eta)を 0.5 から 0.1 に,慣性係数(mu)を 0.8 から 0.9 に
- 正則化項(係数lam)を入れた
まずは正則化なし(lam = 0)で.以前のテスト誤識別率 1.63% に対してこちらは 1.41%.
### 3-layer MLP: D = 784 H1 = 1000 H2 = 500 K = 10 ### training: NL = 50000 NV = 10000 D = 784 K = 10 batchsize = 100 0 2.3028 92.28 2.3028 92.61 10 0.0055 0.18 0.0971 1.85 20 0.0000 0.00 0.0932 1.58 30 0.0000 0.00 0.0971 1.59 40 0.0000 0.00 0.0995 1.58 50 0.0000 0.00 0.1012 1.59 # NT = 10000 50 0.0000 0.00 0.1012 1.59 0.0904 1.41
以下,lam の値のみ変えた結果.
lam = 0.00001 50 | 0.0001 0.00 | 0.0717 1.48 | 0.0672 1.41 lam = 0.0001 50 | 0.0017 0.00 | 0.0508 1.46 | 0.0477 1.43 lam = 0.001 50 | 0.0393 0.92 | 0.0724 2.31 | 0.0738 2.42
CNNでの実験
以前の実験( Theano で Multi Layer Perceptron & Convolutional Neural Net - まんぼう日記 )の一番最後の,Conv-Pool-ReLu-Softmax と同じ構造のCNNを用います.条件の違いは上記のMLPでの実験と同じ,ただし,学習定数 eta は 0.1 じゃなくて 0.05 で.
### Conv-Pool-ReLu-Softmax Xdim: (1, 28, 28) # W1dim: (16, 5, 5) ds1: (4, 4) H1: 576 # H2: 400 lam = 0.0 50 0.0001 0.00 0.0561 0.93 0.0437 0.85 lam = 0.00001 50 0.0001 0.00 0.0477 0.93 0.0362 0.85 lam = 0.0001 50 0.0012 0.00 0.0343 0.87 0.0268 0.88 lam = 0.001 50 0.0244 0.54 0.0413 1.09 0.0346 1.16
これらの実験では正則化の効果は見えませんでしたが,もっと冗長な(変数の数が多い)MLP/CNNを使えばきっと効果を発揮するでしょう.