概要(モデルの精度 vs 学習の収束性)
Optimizerって沢山あって、結局どれが良いの?ってなる。論文でよく使われているやつを使えば良いのだが、様々な条件(モデルの大きさ、タスクの難易度、データの複雑性、lossの関数、etc...)によってBestなOptimizerは変わってくる。
Optimizerを選ぶときの単純な法則を知っていると、迷わずに済むと思う。
今回はモデルの精度と学習の収束性の2点が大きくある。
- modelの性能を上げたい場合は、local minimaに収束しないようにしないといけない。local minimaから脱出するために、gradientを大きく更新させる必要がある。しかし学習が安定しにくい。
- 学習を早く滑らかに収束させたい場合は、learning rateの調整やgradientのmoving average(移動平均)を取ったりする事で、パラメーターの突発的更新を抑制出来る。しかしlocal minimaに陥いる可能性が高く、精度が出にくい。
幾つかの有名なOptimizerを例に見ていく
SGD
SGDはシンプルにGradient方向へ重みをupdateする。故にlocal minimaから脱出しやすく精度が高くなる。余談ですが、PytorchのSGDのimplementationはrandomにサンプルするという確率的機能は無いらしい。じゃあSGDじゃなくて、GD(Gradient Descent)じゃんという会話があり、その通りだと思った。
SGD with momentum
SGDにgradientのmomentumを付ける事で学習をsmoothにする。故にSGDより精度が落ちるが学習の収束性が増す。
Adam
AdamはSGD with momentumにRMSPropという学習率を調整する機能が付いている。故にSGD with momentumより精度が落ちるが学習の収束性が増す。
結論
より多くのSmoothingの機能を付けることで学習速度が早く安定するが、一方で精度が落ちてくる(local minimaに陥りやすい)。まずはAdamで学習してみて収束するかを確認して、精度を上げたいのであればSGD with momentumまたはSGDを使ってみるのが良いと思う。