土曜やけど大学へ.で,仕事もせずに上田上あたりをてくてく.
「美穀之郷」って彫ってある
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
手書き数字のデータ 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%. 得られた重みを可視化したものがこちら.
Multilayer Perceptron
上記チュートリアルの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
学習繰り返し数と計算時間が減少するのは予想通り,テスト誤識別率がちょっとあがってるのはまあこんなもんか.で,意外なのは学習データの誤識別率.まあちゃんと調べてないからこれで何かが言えるわけではないですが.