※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

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 の学習に戻ろう。