Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

実務で使えるニューラルネットワークの最適化手法

メリークリスマス。
@tereka114です。

本記事はDeep Learning論文紹介 Advent Calendar 2019の25日です。
qiita.com

私はKaggleの画像コンペに頻繁に参加しています。
そのときに、毎度選定にこまるのがニューラルネットワークの最適化手法(Optimizer)です。
学習率やWeight Decayなどハイパーパラメータが多く、選択パタンが無数にあると感じています。

そのため、Kaggleでよく利用される(されうる)最適化手法を振り返ります。
もちろん、実務でも十分使えるので、皆さんの学習に活かしてくれると幸いです。

最適化手法

今回紹介するのは次の最適化手法です。
Kaggle、もしくは、実務でもこの5種類を抑えておけば、問題ないと思っています。むしろ、十分すぎるぐらい。
調査(個人的主観含む)でつけた事前の軸とその評価を記載します。

最適化手法 精度 収束速度 安定性
SGD ×
Adam × ×
AdamW ×
Adabound
RAdam

精度:収束したときに高いAccuracyを出せるか、など
収束速度:学習の収束まで早くいけるか
安定性:勾配が爆発することなく、最適解を学習できるか

SGD(Momentun)

最も標準的な最適化手法です。
得られたパラメータの勾配を学習率で掛け算し、減少させます。また、Momentunを設定することで、収束が高速化します。

SGDは学習率の設定が難しく、収束するか否かはこの設定が適切か否かに関わっているといっても過言ではないでしょう。
多くのライブラリでは学習率0.01, Momentunは0.9に設定されています。

学習済モデルを学習する場合ではなければ、この設定を利用すれば大丈夫です。
学習済モデルの場合では0.001を利用することをお勧めします。
学習率が高い場合、学習済モデルのパラメータが壊れてしまい、ImageNetの事前学習で獲得された汎用的な特徴抽出機が壊れます。

Adam

Adamの良い点は、SGDよりも収束が早い点です。
領域分割(Semantic Segmentation)では、SGDだと収束が非常に遅く、かつ、局所最適解にたどり着くことが多いです。
ただ、物体検出のFasterRCNNや領域分割モデルのUNetやFPNなどパラメータも多く、タスクが難しい場合にSGDよりよい解にたどり着くこともそれなりにあります。

しかし、このモデルですが、収束が安定しないことが多いです。
学習率(Alpha,lr)の設定を誤るだけで、勾配が爆発し、その結果、パラメータの更新幅が大きくなり、オーバーフローを起こすことも多々ありました。
学習済モデルを利用する場合は0.0001を利用すると安定することが多いです。

AdamW

[1711.05101] Decoupled Weight Decay Regularization

Adamの基本のアルゴリズムからWeight Decayに関する式を変更しました。
自動調整された学習率の場合は、もともと期待していたWeight Decayの結果が得られず、精度が下がる事象が得られるようです。
その事象を回避するために式を変更しています。

具体的な数式は論文を参照ください。
また、PyTorchであれば、既存で実装されています。

pytorch.org

AdaBound

[1902.09843] Adaptive Gradient Methods with Dynamic Bound of Learning Rate

Adamは時々、極端に大きな学習率になることから、SGDと比較して収束が安定しないことが知られています。
そのため、Adamに対して動的に学習率をクリップすることにより、収束を安定させています。
これにより、収束を安定させつつ、精度を同等にしています。
ハイパーパラメータについても、final_lrと呼ばれるクリップで利用するパラメータを適切に設定することで学習可能になります。

PyTorchの実装はこちら
github.com

RAdam

[1908.03265] On the Variance of the Adaptive Learning Rate and Beyond

Warmupと呼ばれる最初に小さい学習率で学習し、通常の学習率で学習させていく手法は収束の高速化、及び、安定性に貢献しています。
また、このWarmupを人手で行うのではなく、分散を考慮した学習率を推定しています。
その仕組みをAdamに組み込んだのがRAdam(Rectified Adaptive Learning Rate)です。

何度かこの手法を活用して学習しましたが、Adamと比較してハイパーパラメータに対して過敏ではないため、扱いやすいです。
PyTorchの実装はこちら

github.com

実験

CIFAR10を使って各Optimizerを用いて実験を試みました。
実験の条件は次の通りです。

項目
誤差 交差エントロピー誤差
データ拡張(Data Augmentation) なし(本実験ではそこまで影響しないため)
アーキテクチャ ResNet50
Batch size 32
Epoch 50

蛇足ではありますが、精度が論文などの実験と比較して低めに出ているのはおそらく、Augmentationを実施していないからです。

Optimizer間の比較

SGDは0.01, その他は0.001の学習率で比較しました。
実験結果は次の通りです。AdamWのWeight Decayは0.00001です。

計算したグラフは次の通りです。

f:id:acro-engineer:20191225080743p:plain
OptimizerのAccuracy比較

少々わかりずらいので順列を示すと次の通りです。

RAdam > AdamW > Adam > Adabound = SGD

Weight Decayを除いて、デフォルトパラメータで学習を行ったので、最適なパラメータは他にあるかもしれません。
ただ、RAdam、AdamWのようなAdamの後継を使うと他と比べて、精度が高い学習を進められそうです。

RAdamとAdamの学習率

Adamはlrが大きいと勾配が発散し、局所最適解に落ちたり、収束しなくなることが(私の)経験的に得られています。
例えば、Segmentationの場合は学習率が0.001だと高すぎて収束せず、誤差の値がnanになります。
しかし、RAdamは最初に自動的にWarmupされているので収束が安定しそうです。

今回は学習率に関する安定性の実験を行おうと思います。
Adamの場合

f:id:acro-engineer:20191225080838p:plain
Adamの学習率比較のグラフ

RAdamの場合

f:id:acro-engineer:20191225080851p:plain
RAdamの学習率比較のグラフ

AdamとRAdamで大きく差分は開かず、学習率の影響を受けている印象です。
ただ、分類ではなく、もう少し難しいタスクなってくると大きく収束に影響するかもしれません。

AdamWのWeight Decayの値

Weight Decayの値を利用した場合のAdamとAdamWの比較です。
AdamWの方が精度が高く出ているので、AdamWの方が使っていくのには良いのではと考えています。

f:id:acro-engineer:20191225080905p:plain
AdamとAdamWの比較

最後に

Optimizer一つとっても適切にチューニングしなければうまくいかないのでまだまだニューラルネットワークは難しいと感じるところです。
期待とは少し異なった部分もあるのでデータセットに応じて、一つひとつ実験を重ねていく必要があると思っています。
おそらく、データセットによっても結果が変わるので気が向けばしっかりと実験してみたいと思います(また新しいのでそうですし、、)。

では!また、新年もよろしくおねがいします。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com