下丸子のコネクショニスト

機械学習、人工知能などの話題について触れます。

CaffeでAutoEncoderを学習してみた

最近,Deep Auto Encoder界が盛り上がりを見せている.

このままでは流行に置いて行かれてしまうので,手始めにCaffeでAutoEncoderを学習してみた.

例によって下記で導入した環境を用いて実験を行う.

iamrobotandproud.hatenablog.com

 

なお,ここでいうAutoEncoderとは,入力を自己(auto)近似するニューラルネットワークのことを示している.

AutoEncoderは,「ある入力データを少数の基底で圧縮(エンコード)して,

それを解凍(デコード)したときに,

もとの入力データをどれだけ表現しているか?」

ということを指標として学習を行うという特徴がある.

 

実験には,標準で用意されているCaffeのプログラムとMNISTのデータセットをありがたく使うことにする.

MNISTに関しては,以下を参照していただきたい.

iamrobotandproud.hatenablog.com

 

なお,本記事で示すディレクトリ構成は,とくに記述が無ければCaffeのインストール先(CAFFE_ROOT)を基準にしているものとする.

 

今回の実験には,

/caffe/examples/mnist/train_mnist_autoencoder.sh

をというプログラムを用いる.

 

train_mnist_autoencoder.shは,

/caffe/examples/mnist/mnist_autoencoder_solver.prototxt

というAutoEncoderのネットワーク構造を記述したprototxtを読み込み,MNISTの学習データを教師なし学習するプログラムとなっている.

 

/caffe/examples/mnist/mnist_autoencoder_solver.prototxt

を読むと分かるが,今回用いるネットワーク構造は

Input Data -> encode1~4 layer -> decode1~4 layer -> Output Data

という砂時計型の構造になっていて,各encode・decode layerの後にはシグモイド関数が活性化関数としてついている.

4層目のencode layerは30個のニューロンしかなく,0~9の数字が書かれた画像データを,30個のニューロンのパタンで表現するようになっている.

なお,今回用いるdecoderは,encoderのパラメータとは独立になっているようだ.よく使われる方法であれば,encoderのパラメータを転置して,対応するdecoderのパラメータに用いるのだが,そうはなっていない.

また通常であれば,学習時,最初にLayerごとにpre-trainingして,最後に全体をfine-tuningするような手順を踏むと精度が上がるはずなのだが,今回はそのようになっていないらしい.

しかもこのAutoEncoder,入力をDenoisingしていないようだ...がっくし.

 

なお,すべてのINNER_PRODUCT layerのオプションに

weight_filler {
      type: "gaussian"
      std: 1
      sparse: 15
}

という記述があり,sparseなんてオプションを筆者は初めて見ました.

Layerカタログには載っていないので調べてみると,

caffe/src/caffe/proto/caffe.proto

に,

// The expected number of non-zero input weights for a given output in
// Gaussian filler -- the default -1 means don't perform sparsification.
optional int32 sparse = 7 [default = -1];

と書いてあった.なんのことだかさっぱりだが,ソースを深く辿っていくと,ほんとうにただの初期化処理を行っているらしい.

べつに,Sparsityを考慮して最適化を行っているわけではないようだ…

 

気を取り直して実験を続ける.

sh examples/mnist/train_mnist_autoencoder.sh

と実行するだけで,(Stacked) Auto Encoderの学習が始まる.

デフォルトでは,examples/mnist/に学習した重み等が保存され,学習処理は60000Iterationで終了する.

 

長くなってしまったので,学習結果に関しては次回報告する.