様々なoptimizerたち

適当に調べた。

Adam

arxiv.org

おなじみのやつ。

欠点

  1. 最初だけ学習率を小さくする"warmup"をしないと発散することがある。
  2. 最終的に収束したときの精度がSGDよりなぜか悪い。
  3. ハイパーパラメータの設定によって精度が良かったり悪かったりする。

そもそも玄人はAdamなんて使わずにSGD+Nesterovとかで学習率を手動で調整している説もあるが、それはそれとしてoptimizerに投げるだけにしたい層も居て、そんな人たちにより良いoptimizerを提案したいみたいな。

AdaBound

arxiv.org
qiita.com

epoch数を増やすごとに学習率が一定値に近づくようにクリッピングして欠点2と3をカバーした。

LookAhead

arxiv.org
cyberagent.ai

"fast weights"と"slow weights"に分ける考え方を導入していた。まず"fast weights"を何らかの更新法(e.g. SGD, Adam)でミニバッチk個ぶん学習してから、その値をもとに"slow weights"を更新した。"slow weights"がいい感じに収束するので、Adam単体と比べて欠点2がカバーされたと言える。またハイパーパラメータの違いに対してロバストらしい。(欠点3)

RAdam

arxiv.org
nykergoto.hatenablog.jp

Adamの補正項の分散について理論的に解析して、warmupすべきepoch数はAdamのハイパラの\beta_2の値から定まると結論づけた。それを踏まえ、warmupを自動的に切り替えるようなアルゴリズムを提案することで欠点1をカバーした。またその提案アルゴリズムでは、warmup後の更新式も彼らの理論解析の結果に基づき少し変えてあった。これによってかどうかはよくわからないが、ハイパーパラメータの違いに対してロバストになったらしい。

AdaMod

arxiv.org
medium.com

RAdamと同じく、Adamを変形して明示的なwarmupを不要にする系のやつ。

Ranger

medium.com

普通に考えてLookAhead+RAdamが攻守最強な気がするが、実際試した人がいてRangerという名前が付いていた。

LARS

arxiv.org

LARSはLayer-wise Adaptive Rate Scalingの略。昔々あるところにImageNet学習タイムアタック勢が(ry

diffGrad

arxiv.org

(゚Д゚)

NovoGrad

arxiv.org

(゚Д゚)

github.com

LookAhead+RAdam+LARSなど様々なトッピングパターンが考えられるが、実際色々試している人がいる。