前回SGDとバッチサイズの関係を調べて、大きな収穫がありました。
そこで今度は最適化メソッドを入れ替えた場合の傾向について調査してみます。
比較用に採用したメソッドは以下の通り
下にいくほど、世代が新しくなると思ってよいです。(ザックリですが)
各メソッドを紹介するのが目的ではないので、詳細には触れないことにします。
※mxnetには、他にも最適化メソッドが存在します。
条件はすべて同じにして、最適化関数だけを入れ替えます。
使用したネットワークはLSTM1層です。
収束まで時間がかかるケースを想定して、今回は10,000エポック回してみました。
結果はこのようになりました。
この14caseを実行するのに、41時間以上かかってしまいましたw
こういう時にはやはりハイスペックな実行環境が欲しくなりますね。
SGD
- 学習率による収束の差が大きい(学習率選びの比重が高い)
- どの学習率も収束し難さが見て取れる
adagrad
- 学習率のパラメータが存在しないので、悩みが少なくて済む!
- 内部学習率が漸減するので、(一般には)早期収束するケース以外には向かない
- 今回のケースでは、よい感じで収束している
rmsprop
- 学習率=1e-2だけ、収束できていない(推移がヘンw)
- それ以外は学習率による差がほとんどなく、よい感じで収束している
adadelta
- adagradと同じく学習率が無いので、悩みフリー!
- よい感じで収束している
adam
- 学習率の大きい方2ケースが、収束していない(推移がヘン)
- 残り2ケースは、ほぼ同じ様子でよい感じで収束している
※良い感じに収束とは、損失関数の結果が 1e-2 近辺に落ち着くことを指しています。
使用データがUSD/JPYなので、結果が1e-2→0.01円→1pipとなり、予想誤差が1pipだと十分ではないか!が根拠です。
結論
学習を進める上で、毎回複数最適化メソッドを採用する意味はほとんどありません。
従って、今後の学習で採用する最適化関数は
- 新しめの方が良さそう(と思われる)
- adadeltaとadamでは得られる結果がほぼ同じように見える(学習率を間違えない限り)
- モデル、データを色々と変更して学習していく過程において、学習率を考慮しなくてよいことは非常に大きなメリットである
以上のことから、adadeltaを採用こととする!
と考えていたら、小さな落とし穴がありました・・・
41時間は長かったので、どこに時間がかかっているのか出力情報を増やして調べてみました。
今回は2000エポックですが、傾向は同じだと思います。
判明した問題点
adadelta、学習率パラメータが不要なのは良いが、すごく遅い!
なんとadamの2.5倍の時間がかかっています。
adadeltaで1回学習するよりも、学習率x2パターンのadamの方が早く終わるのです!!
ということで結論としては
- 今後の最適化メソッドとして、adamを採用する
- 収束しない場合には、adadeltaも試してみる
ことにしました。
さて、図をよく見るとわかるのですが、損失関数が時々1e-2を下回っています。
上でも述べましたが
平均誤差が1pip以下って結構いい感じなんじゃない?
と思ってしまいます。
前回ディープラーニングに取り組んだ際には、収束すら困難でした ( ノД`)シクシク…
今回は色々と本気で取り組んで、進捗が出たことは非常に嬉しい限りです。
Symbolicによる高速化等まだまだ試してみたいこともありますが、そろそろ次ステップに進む頃合いでしょうか。