nykergoto’s blog

機械学習とpythonをメインに

Adabound の final_lr と収束性について

みなさん optimizer は何を使っていますか? (僕は SGD + Momentum + Nesterov が好きです)

adagrad/adadelta/adam などなど NN で用いられる optimizer は数多くありますが, 最近提案された optimizer に adabound というものがあります。 adabound はざっくりいうと SGD と adam のいいとこ取りを狙った手法で、論文では序盤では adam の早い収束性を, 終盤では SGD の高い汎化性を再現しています。

f:id:dette:20190530200839p:plain
序盤終盤すきのない adabound 先生

自分のスライドで恐縮ですが Adabound やそのたの Optimizer について解説したものがあるのでもしよければ参考にしてください。

final_lr ?

つよつよな Adabound ですが新しく final_lr というパラメータが追加されています。 これは学習終盤での lr の上界と下界を決定するパラメータです。適当に手元のタスクで数回実験をしてみたところ lr + final_lr が結果に大きく影響しているように感じられました。

そこで今回は超解像度化モデル ESPCN の学習を使って lr と final lr がどのような関係になっているのかを実験してみました。

実験条件

実験は前回の画像の超解像度化モデル ESPCN(画像の超解像度化: ESPCN の pytorch 実装 / 学習 - nykergoto’s blog) を使います。前回は adam で学習をしていましたが、それを adabound で置き換えます。

lr の探索範囲

上記の実験では Adam の最適な学習率は 0.001 でした。よってその周辺が良いでしょうという仮定をおいて LR の探索は $10^{-2.5} \sim 10^{-4}$ まで底を10に取ったログスケール上で 0.5 刻みで動かします。

final_lr の探索範囲

final_lr に関しては、元の論文でも言われているように adabound は最後の段階で SGD に近い動きをすることが狙いでした。SGD の最適な学習率はおおよそ 0.01 程度の値でしたので、それを考えるとだいたい 0.1 ~ 0.001 ぐらいで動かせば良さそうに思えます。

しかし adabound で用いている勾配は SGD のそれではなく Adam のものと同じです。Adam では過去の勾配を指数加重平均を取ったものを更新につかいます。
この勾配は過去情報を使って平均化していますから、 SGD で用いている「単なるステップ $t$ で得られた勾配 $g_t$」に比べて分散の少ない勾配、言い方を変えると FG*1 をより上手く近似できている「良い」勾配となると期待できます。

特に final lr が active になるような学習の終盤ではよりその傾向が顕著になるはずですので final lr もそれに合わせて大きめにとっておくのが良いのではないか? とも思えます。

この仮説をもとにして final lr の探索範囲は SGD の最適 lr に比べて大きめな範囲も含めるように 10 ** 0.5 ~ -2 まで 0.5 刻みで学習をさせました。

その他の条件

通常のNNの学習同様 lr を一定 step ごと(今回は 15epochごと) に 0.1 倍する schedule で学習します。 training データと validation データは別のデータセットを使いこれらは先の記事と同様の物を使います。 評価指標は目的関数にも用いている mse で評価しました。

結果

各条件ごとでの training mse の最小値を lr を縦軸に, final_lr を横軸にとってヒートマップとして表したのが以下の図です。

f:id:dette:20190530192517p:plain

各セルが横軸の LR と縦軸の final_lr の時の rmse の値を表しています。色が明るいほど小さい、すなわち mse の小さい良い解です。 (縦軸横軸ともにログスケールになっていることに注意して下さい)

これを見ると final_lr の影響のほうが支配的であり final_lr が大きい値のほうが mse の値を最小化できていることが確認できます。

adabound の pytorch 実装 https://github.com/Luolc/AdaBound の初期値では final_lr=0.1 になっています ので、それよりも大きい値を設定してあげる必要がありそうです。

同様のことを validation データについてプロットしたのが以下の図です。こちらも training mse 同様の傾向があることがわかります。

f:id:dette:20190530192514p:plain

まとめと感想

ESPCN モデルを使った実験を行ったところ final_lr の値が loss の最小値を決めており lr は余り影響していないことがわかりました。 adabound の論文では「 lrに左右されずに収束が早まる」という意味の主張がされていましたのでそれが裏付けられた形になりました。

一方で final_lr を SGD の最適値よりもかなり大きい値に設定していないと, 良い解に収束しない様子が確認されました。 このことから adabound を使う際には SGD よりも大きめの final_lr, 具体的には 0.1 やもうちょっと大きい値 (今回でいうと 1.0 ぐらいのほうが性能は良かった) を使って置く必要がありそうです。

[Future Work] 🤔

上記色々書きました、がこれは単に ESPCN モデルを mse で最適化した時にそうなった、ということに過ぎません。 超解像度化のモデルは、体感でも相当収束が早い簡単なモデルです。そのため指数平均を取った勾配の Variance が相当抑えられ大きな LR を取って更新する必要があった可能性も否めません。 要するにこの結果が一般に言えるかどうかは微妙なところなので、もうちょっと調べてみたいところです。😌

今後やりたいこと

  • 物体認識とかで adabound を使って同じような傾向があるかどうかを調べる

参考文献

*1:目的関数全体の勾配 Full Gradient のことです。データすべての勾配の平均、といってもOKです。