chainerでStacked denoising Autoencoder

イマドキのナウいようじょなのでもっぱらNeural networkで遊んでます.

Autoencoder(自己符号化器)の話をします.
Autoencoder、というよりNeural Net一般の問題でありますが、ネットワークの構造を深くしてゆくと逆伝搬の途中でその勾配が弱まっていってしまって, NNの前段と後段で逆伝搬される勾配が異なってくる勾配消失(Gradient vanishing)という現象が大きな問題となってきます. このへんは青い本に書いてあった気がするのですが高くて買ってないですし、あんまり詳しくないので詳しくは述べません.

 そのため深いAutoencoderを構成する際には段ごとにその前段からの入力を元に戻すように学習させ、そうして一層ずつ学習させたネットワークを積み上げる(stack)という技法が用いられ、そうして構成されたAutoencoderをStacked Autoencoderといいます.イメージとしては(面倒なので図は用意しません)
1. 入力 x -> [AE 1層目] -> [AE 1層目をひっくり返したもの] -> x となるように学習
2. 入力 x -> [AE 1層目(固定)] -> [AE 2層目] -> [AE 2層目.T] -> x
3. 入力 x -> [AE 1層目(固定)] -> [AE 2層目(固定)] -> [AE 3層目] -> [AE 3層目.T] -> x
4~n. 以下同様 といった感じです.

そんな感じの学習を行うプログラムを書いてみました.もちろんchainerで.

Stacked denoising(deep) Autoencoder 安直に小さいネットワーク作ってやってますが、もっと賢い書き方あるかもしれませんね.
まあきちんと書いてないのもありますが、わかりにくいですし長いです.もっと楽にかけたらいいんですけどね……

f:id:tochikuji:20150916210438p:plain

ん…?

f:id:tochikuji:20150916210916p:plain

あっ!!

ということでStacked Autoencoderを拙作libDNNに実装しました. (過去記事参照) 

tochikuji.hatenablog.jp

以下MNISTを3層のAutoencoderで学習させるサンプルです.

Stacked denoising(deep) Autoencoder (with libDNN)

通常のAutoEncoderと同様に大きなモデルも一気に定義してしまって,その積み上げ順と多少のお作法に則ったencoding, decodingの伝搬規則を書けば後はtrain一発で通るようにしてあります. めっちゃ便利ですね.
手がまわなくて未だドキュメントとExampleのコメントを書いてないので身体で感じてください.(あるいは誰か書いてください)
ドキュメントきちんと書きました。pushしてなかっただけです。