まんぼう日記

takataka's diary

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を使えばきっと効果を発揮するでしょう.