まんぼう日記

takataka's diary

Pylearn2 の tutorial でお勉強

土曜やけど大学へ.で,仕事もせずに上田上あたりをてくてく.

f:id:takatakamanbou:20140824183208j:plain「美穀之郷」って彫ってある

13.05km, 02:08:53, 6.08km/h

 

その後おもむろに Theano + Pylearn2 - まんぼう日記 のつづき.Pylearn2 の tutorial IPython Notebook Tutorials — Pylearn2 dev documentation でお勉強.

 pylearn2/scripts/tutorials/ の下の hoge.ipynb というファイルが IPython の Notebook とやらで,

$ ipython hoge.ipynb

としたらインタラクティブなチュートリアルが動くはずらしいのですが,たかたかの環境ではエラーが出て(NameError: name 'false' is not defined)だめみたい(MacPortsでのpy27-ipythonのインストール時に notebook という variant を + しても).仕方ないので上記のリンク先のウェブページを見ながら.

 

Softmax Regression

http://nbviewer.ipython.org/github/lisa-lab/pylearn2/blob/master/pylearn2/scripts/tutorials/softmax_regression/softmax_regression.ipynb

 

手書き数字のデータ MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges を softmax regression (ロジスティック回帰の多クラス版,multinomial logit model とも)で0から9の10クラスに識別.

データのダウンロード

pylearn2/scripts/datasets/download_mnist.py を実行すれば上記の MNIST のサイトからデータをダウンロード&展開してしかるべき場所に置いてくれるみたい.たかたかは手動でやっちゃったけど.28x28画素の手書き数字の画像.元々は二値画像だったけど anti-aliasing の関係でグレイスケールになっている.学習用(train-*)のデータ数は6万.テスト用(t10k-*)のデータ数は名前やファイルサイズからしてたぶん1万.

YAMLファイルの記述を理解する

チュートリアルの説明に従って,pylearn2/scripts/tutorials/softmax_regression/sr_*.yaml に書いてあることをざっと理解する.

  • ネットワークの入力は 28x28 = 784 次元,出力は 10 クラス,softmax regression だから隠れ層なし

  • train の最初の5万個を学習データとし,残り1万個をvalidation(汎化性能の評価)用とする
  • 最小化するコスト関数は negative log-likelihood,BGD(Batch Gradient Descent)で.バッチサイズは1万個.

学習させてみる

学習は 14 epochs (1 epoch は全学習データを一通り学習する過程 = 今の例では5バッチ分の最急降下ステップ(のはず))で停止.9 epochs 時の validation データでの誤識別率が最小だったらしい. そのときのテストデータでの誤識別率は test_y_misclass: 0.0755 すなわち 7.55%. 得られた重みを可視化したものがこちら.

f:id:takatakamanbou:20140823174655p:plain

 

Multilayer Perceptron

http://nbviewer.ipython.org/github/lisa-lab/pylearn2/blob/master/pylearn2/scripts/tutorials/multilayer_perceptron/multilayer_perceptron.ipynb

 

上記チュートリアルのPart1は Multi-Layer Perceptron (MLP) の説明なのでスキップ.

Part2

Softmax Regression の例に sigmoid ニューロンから成る隠れ層を追加した2層のMLPの実験.たかたかは入力層(Pylearn2で言うvisible unit)も含めて層の数を数える慣習に染まってるので3層と呼びたくなりますが. 隠れ層ニューロン数は500.学習時間は Softmax Regression の場合よりずっと長く,Intel Core i7 3.4GHz(クアッドコア),メモリ32GBの iMac で

real     81m50.428s
user     212m15.508s
sys     4m17.201s

でした.37 epochs.CPUでの計算です.GPU使ったらどれ位速いのかはまたいずれ.学習データ(train),検査データ(valid),テストデータ(test)の誤識別率は

train_y_misclass : 0.00146
valid_y_misclass : 0.0205
test_y_misclass : 0.0187

学習時間はかかるけれど,隠れ層での非線形変換のおかげで誤識別率は Softmax Regression の 7.55% から 1.87% に低下.

ちょっと寄り道

より deep な(隠れ層を増やした)MLP を扱う Part3 に行く前に,ちょっと寄り道.上記のMLPのsigmoidニューロンをrectified linearなもの(和が負なら0を出力し,正ならそのままの値を出力する)に置き換えたらどう変わるか実験してみる.他の条件は全く同じ. 学習は 23 epochs で停止,計算時間は

real     44m6.872s
user     127m1.015s
sys     2m4.353s

誤識別率は

train_y_misclass : 0.0
valid_y_misclass : 0.0202
test_y_misclass : 0.0201

学習繰り返し数と計算時間が減少するのは予想通り,テスト誤識別率がちょっとあがってるのはまあこんなもんか.で,意外なのは学習データの誤識別率.まあちゃんと調べてないからこれで何かが言えるわけではないですが.

 

つづく  Pylearn2 の tutorial でお勉強 - 2時間目 - まんぼう日記