AdaGrad / RMSProp あだぐらど / あーるえむえすぷろっぷ
AdaGradRMSProp適応的学習率最適化勾配降下法深層学習
AdaGrad / RMSPropについて教えて
簡単に言うとこんな感じ!
AdaGradは「よく更新されるパラメータは学習率を小さく、あまり更新されないパラメータは学習率を大きく」と自動調整する賢い最適化手法だよ。RMSPropはAdaGradの「学習率が下がりすぎて止まってしまう」欠点を直した改良版なんだ!
AdaGrad / RMSPropとは
AdaGrad(Adaptive Gradient Algorithm) は2011年にDuchiらが提案した最適化手法です。各パラメータに個別の学習率を設定し、これまでの勾配の累積に応じて自動調整します。テキスト処理のようなスパース(まばら)なデータで特に有効で、頻出単語(よく更新)は小さく、希少単語(めったに更新されない)は大きく学習率を設定できます。
ただしAdaGradは学習を重ねるほど学習率が単調に小さくなるため、長い学習では更新が止まってしまうという欠点があります。
RMSProp(Root Mean Square Propagation) は2012年にGeoff Hintonが提案した改良版です。過去の勾配を指数移動平均で忘れながら管理することで、学習率の急激な低下を防ぎます。LSTMなどのRNN系の学習に特に効果的で、後にAdamの基礎部品にもなりました。
各手法の比較
| 項目 | SGD | AdaGrad | RMSProp | Adam |
|---|---|---|---|---|
| 学習率の調整 | 一律 | パラメータ別(累積) | パラメータ別(指数平均) | パラメータ別(指数平均)+モメンタム |
| スパースデータへの強さ | 弱い | 強い | 強い | 強い |
| 長期学習 | 問題なし | 学習率が0に近づく | 問題なし | 問題なし |
| 実装の複雑さ | 簡単 | やや簡単 | 中程度 | やや複雑 |
import torch.optim as optim
# AdaGrad
optimizer_adagrad = optim.Adagrad(model.parameters(), lr=0.01)
# RMSProp
optimizer_rmsprop = optim.RMSprop(
model.parameters(),
lr=0.01,
alpha=0.99, # 指数移動平均の減衰率
eps=1e-8
)
歴史と背景
- 2011年:DuchiらがスタンフォードでAdaGradを発表。自然言語処理の分野で大きな注目を集める
- 2012年:Hintonが機械学習講義の資料でRMSPropを紹介(論文化されていない珍しい経緯)
- 2014年:AdamにRMSPropのアイデアが取り込まれ、AdaGrad・RMSPropの後継として普及
- 現在:単体ではなくAdamの理解を深めるための「祖先」として教育的に重要な位置付け
どの手法を使えばいいか
| 状況 | 推奨手法 |
|---|---|
| とりあえず始めたい | Adam |
| スパースな特徴量(テキストなど) | AdaGrad または Adam |
| RNN・LSTMの学習 | RMSProp または Adam |
| 大規模言語モデル | AdamW |
| 小規模・シンプルなモデル | SGD + モメンタム |
関連用語
- SGD(確率的勾配降下法) — すべての最適化手法の出発点
- Adam — AdaGradとRMSPropを組み合わせて発展させた手法
- 学習率スケジューリング — 最適化手法と組み合わせる学習率制御
- LSTM — RMSPropが特に効果を発揮するモデル