学習率スケジューリング がくしゅうりつすけじゅーりんぐ
学習率スケジューリング最適化コサインアニーリングウォームアップ深層学習
学習率スケジューリングについて教えて
学習率スケジューリングとは
学習率スケジューリング(Learning Rate Scheduling) とは、学習の進行に合わせて学習率を動的に変化させる技術です。固定の学習率だと「序盤は収束が遅い」「終盤は最適解を飛び越える」という問題が起きやすいため、段階的に調整することで学習効率と精度を改善します。
学習率が大きすぎると損失関数の谷底を行き来して収束しません。小さすぎると収束が遅く、局所最適解に陥りやすくなります。スケジューリングは「序盤は大きく探索、終盤は小さく精密に」という理想的な学習を実現します。
現代の深層学習ではウォームアップとコサインアニーリングを組み合わせたスケジュールが特に人気で、GPT・BERTなどの大規模言語モデルでも標準的に採用されています。
主なスケジューリング手法
| 手法 | 特徴 | イメージ |
|---|---|---|
| ステップ減衰 | 一定エポックごとに学習率を半減 | 階段状に下がる |
| 指数減衰 | エポックごとに指数関数的に減衰 | なめらかに下がる |
| コサインアニーリング | コサイン曲線に沿って変化 | なめらかな波型で下がる |
| ウォームアップ | 最初は小さく徐々に大きくする | 序盤だけ上昇 |
| サイクリック | 学習率を周期的に上下させる | 波型 |
| ReduceLROnPlateau | 損失が改善しなくなったら自動で下げる | 停滞検知型 |
import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR, StepLR
optimizer = optim.Adam(model.parameters(), lr=0.001)
# コサインアニーリングスケジューラ
scheduler = CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6)
for epoch in range(100):
train(model, optimizer)
scheduler.step() # エポックごとに学習率を更新
print(f"Epoch {epoch}, LR: {scheduler.get_last_lr()}")
歴史と背景
- 1980〜90年代:ステップ減衰が研究されるがあまり体系化されていなかった
- 2016年:Loshchilovらがコサインアニーリングを提案し精度向上が確認される
- 2017年:Transformerの登場でウォームアップ+線形減衰スケジュールが標準化
- 2019年以降:ウォームアップ+コサインアニーリングの組み合わせがLLM学習の事実上の標準に
スケジュールの選び方
| モデル・タスク | 推奨スケジュール |
|---|---|
| 小〜中規模の画像分類 | ステップ減衰またはReduceLROnPlateau |
| Transformer全般 | ウォームアップ + コサインアニーリング |
| 大規模言語モデル | ウォームアップ + 線形減衰 または コサインアニーリング |
| 試行錯誤段階 | ReduceLROnPlateau(自動調整なので楽) |
関連用語
- ウォームアップ(学習率) — スケジューリングの序盤フェーズ
- コサインアニーリング — 最もよく使われるスケジューリング手法
- Adam — スケジューリングと組み合わせて使う最適化手法
- ハイパーパラメータ — 学習率はハイパーパラメータの代表例