Chainer:AutoEncoderのOptimizerを変えてみた


2017年 03月 30日

28×28のオートエンコーダだが、ちゃんとエンコードできるまでには100万エポック程度教えこまないといけない。
つまり、とても学習がのろく、馬鹿である。
もうちょっと賢く、さっさと学習できるようにしたいものである。
# Initialize model
model = MyAE()
optimizer = optimizers.SGD()
optimizer.setup(model)
ここで、Chainerのマニュアルの該当部分を読もう。
Docs ≫ chainer Reference Manual ≫ Optimizers

どうやら何種類も用意されているようで、何を選ぶべきか困る。 いままでは、optimiers.SGD()により、SGD(Vanilla Stochastic Gradient Descent)というタイプのOptimizerを生成していたようだ。 でも、これは頭が悪そうなので、別のにしよう。 Deep Learningの本で時々出てくるAdamというのがあるので、とりあえずこれを使ってみよう。
変更は、以下の1行のみである。

optimizer = optimizers.Adam()

Adamの説明が、”Adam optimization algorithm.” となっているが、これではどんな最適化が行われるのかさっぱり分からない。 Adamの説明についてもネット上に情報があるので、ここでは説明を省略し、さっそく実行してみよう。

とりあえず、前回と同じ10000エポック時の出力を示す。
mnistae10000Adam.png
SGDでは10000エポックでは何も分からない状態だったが、今回のAdamでは、もう十分な再現性があり、数字が判別できる。SGDの100万エポックに近い状態である。 ならば、1000エポックでどこまで判別できるか調べてみた。
mnistae1000Adam.pngたった1000エポックでも、そんなに悪くない。 ということで、Optimizerの選択は非常に重要なようだ。

Optimizerは、AutoEncoderだけでなく、もっと他の場合でも有効であるに違いない。
とうことで、普通のDeep Learning の学習に戻ろう。