最適化アルゴリズム

学習率スケジューリング がくしゅうりつすけじゅーりんぐ

学習率スケジューリング最適化コサインアニーリングウォームアップ深層学習
学習率スケジューリングについて教えて

簡単に言うとこんな感じ!

料理で火加減を変えるのと同じ!最初は強火で早く加熱して、仕上げに弱火でじっくり——学習率スケジューリングも「学習の序盤は大きく、終盤は小さく」と自動で調整することで、より良いモデルを作れるんだよ!


学習率スケジューリングとは

学習率スケジューリング(Learning Rate Scheduling) とは、学習の進行に合わせて学習率を動的に変化させる技術です。固定の学習率だと「序盤は収束が遅い」「終盤は最適解を飛び越える」という問題が起きやすいため、段階的に調整することで学習効率と精度を改善します。

学習率が大きすぎる損失関数の谷底を行き来して収束しません。小さすぎると収束が遅く、局所最適解に陥りやすくなります。スケジューリングは「序盤は大きく探索、終盤は小さく精密に」という理想的な学習を実現します。

現代の深層学習ではウォームアップとコサインアニーリングを組み合わせたスケジュールが特に人気で、GPTBERTなどの大規模言語モデルでも標準的に採用されています。


主なスケジューリング手法

手法特徴イメージ
ステップ減衰一定エポックごとに学習率を半減階段状に下がる
指数減衰エポックごとに指数関数的に減衰なめらかに下がる
コサインアニーリングコサイン曲線に沿って変化なめらかな波型で下がる
ウォームアップ最初は小さく徐々に大きくする序盤だけ上昇
サイクリック学習率を周期的に上下させる波型
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(自動調整なので楽)

関連用語