LLM(大規模言語モデル)の訓練において、学習率を訓練ステップに応じて動的に変化させる戦略の総称。固定学習率では収束が不安定になりがちな数十億パラメータ規模のモデルに対し、ウォームアップ・コサインアニーリング・ワンサイクルなど多彩なスケジューラが開発され、訓練効率と最終精度を大幅に改善する。
LLM学習率スケジューリング(Learning Rate Scheduling)は、大規模言語モデルの訓練中に学習率 η を時間経過(ステップ数やエポック数)に応じて動的に制御する手法群である。学習率はオプティマイザの更新幅を決定する最重要ハイパーパラメータであり、高すぎると損失が発散し、低すぎると収束に膨大な計算資源を浪費する。2026 年現在、Llama 3・GPT-4・Gemini といった主要 LLM はいずれもコサインアニーリング + ウォームアップの組み合わせを基本採用しており、学習率スケジューリングは LLM 訓練パイプラインの標準コンポーネントとなった。
学習率スケジューリングの基本的な考え方は、訓練フェーズごとに最適な学習率が異なるという経験的知見に基づく。訓練初期にはパラメータがランダム初期化状態にあり大きな勾配が発生しやすいため、低い学習率で安定化させる(ウォームアップ)。訓練中盤では十分な学習率でパラメータ空間を効率的に探索し、終盤では小さな学習率で微調整して損失の谷に収束させる。
| スケジューラ | 数式概要 | 典型パラメータ | 主な採用モデル | 収束特性 |
|---|---|---|---|---|
| Step Decay | η = η₀ × γ^(step/milestone) | γ=0.1, milestone=30ep | ResNet, VGG(CV系) | 段階的、LLMには不向き |
| Exponential Decay | η = η₀ × e^(-λt) | λ=0.01 | 旧世代RNN/LSTM | 単調減衰、調整困難 |
| Cosine Annealing | η = η_min + 0.5(η_max-η_min)(1+cos(πt/T)) | T=total_steps | Llama 3, GPT-4, Mistral | 滑らか、LLM標準 |
| Linear Warmup + Cosine | warmup→cosine decay | warmup=2000steps | Llama 3 (2K warmup) | 現行LLM最多採用 |
| One Cycle | warmup→max→anneal | div_factor=25 | FastAI系, BERT FT | 超収束、短時間訓練 |
| Polynomial Decay | η = (η₀ - η_end)(1-t/T)^p + η_end | p=1.0-2.0 | BERT, T5, mT5 | 線形〜二次減衰 |
| Warmup-Stable-Decay (WSD) | warmup→定率→急減衰 | stable=80% | MiniCPM, 一部中国系LLM | 安定期長め |
| Inverse Square Root | η = η₀ / √t | — | 初期Transformer | Attention Is All You Need |
学習率スケジューリングが LLM に不可欠な理由は、パラメータ数が数十億〜数兆に達するモデルのロスランドスケープ(損失地形)が極めて複雑であることに起因する。
DeepMind の Chinchilla 論文(2022)が示したスケーリング則は、最適なトークン数 D とパラメータ数 N の関係を D ≈ 20N と定式化した。この法則に従って訓練トークン数を増やす場合、学習率スケジューラの総ステップ数 T を正しく設定することが不可欠である。T を過小に見積もると後半で学習率が 0 に近づきすぎ、過大に見積もると減衰が不十分になる。
PyTorch 2.x の torch.optim.lr_scheduler モジュールは主要スケジューラを網羅している:
import torch
from torch.optim import AdamW
from torch.optim.lr_scheduler import CosineAnnealingLR, LinearLR, SequentialLR
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
optimizer = AdamW(model.parameters(), lr=3e-4, weight_decay=0.1)
# Linear Warmup (2000 steps) + Cosine Annealing
warmup = LinearLR(optimizer, start_factor=1e-6/3e-4, total_iters=2000)
cosine = CosineAnnealingLR(optimizer, T_max=98000, eta_min=3e-5)
scheduler = SequentialLR(optimizer, [warmup, cosine], milestones=[2000])
for step, batch in enumerate(dataloader):
loss = model(**batch).loss
loss.backward()
optimizer.step()
scheduler.step()
optimizer.zero_grad()
Transformers ライブラリでは get_scheduler ヘルパーで主要スケジューラにアクセスできる:
from transformers import get_scheduler
scheduler = get_scheduler(
name="cosine",
optimizer=optimizer,
num_warmup_steps=2000,
num_training_steps=100000,
)
対応スケジューラ名: linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup, inverse_sqrt
固定学習率でも訓練は可能だが、LLM スケールでは以下の問題が生じる。訓練初期に勾配爆発で NaN が発生するリスクが高まる(ウォームアップ不在)。訓練後半に学習率が高すぎて損失の谷を飛び越えてしまい、最終精度が 1〜3% 低下する。Google の Adafactor 論文(2018)では、スケジューラ不使用で BLEU スコアが 2.1 ポイント低下した事例が報告されている。
事前学習ではコサインアニーリングが優勢。Meta の Llama 3 論文では、コサイン vs 線形で最終 perplexity に 0.3〜0.5 の差が出たと報告されている。コサインは訓練中盤で学習率を比較的高く維持するため、パラメータ空間の探索が十分に行われる。ファインチューニングでは差が小さく、線形減衰で十分なケースが多い。
経験的なガイドラインは全体ステップ数の 0.1〜2%。Llama 3 は 2,000 steps(全 15T トークン ÷ バッチ 4M = 約 375 万 steps の 0.05%)。Mistral は 1,000 steps。BERT は全体の 1% がオリジナル設定。ウォームアップが短すぎると初期の勾配爆発リスクがあり、長すぎると有効な訓練時間が減る。
継続事前学習(Continual Pre-training)で使われるテクニック。事前学習済みモデルに追加データで訓練を続ける際、学習率を一度上げ直してから再度減衰させる。Llama 3.1 や CodeLlama で採用されており、新しいドメイン知識の獲得効率が向上する。