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エポック時の出力を示す。
SGDでは10000エポックでは何も分からない状態だったが、今回のAdamでは、もう十分な再現性があり、数字が判別できる。SGDの100万エポックに近い状態である。
ならば、1000エポックでどこまで判別できるか調べてみた。
たった1000エポックでも、そんなに悪くない。
ということで、Optimizerの選択は非常に重要なようだ。
Optimizerは、AutoEncoderだけでなく、もっと他の場合でも有効であるに違いない。
とうことで、普通のDeep Learning の学習に戻ろう。