最適化アルゴリズム

ウォームアップ(学習率) うぉーむあっぷ(がくしゅうりつ)

ウォームアップ学習率Transformer大規模言語モデル最適化学習安定化
ウォームアップ(学習率)について教えて

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

スポーツ選手が試合前に準備運動するのと同じ!学習の最初は学習率を小さくしてゆっくりスタートし、徐々に本来の値まで上げていくんだ。いきなり全力で走ると怪我(学習の発散)するから、最初は慎重に準備するよ!


ウォームアップ(学習率)とは

ウォームアップ(Warmup) は、学習の開始直後に学習率を小さな値から目標値まで段階的に増加させる技術です。初期化されたばかりのモデルは重みがランダムで不安定なため、いきなり大きな学習率で更新すると損失が発散したり局所最適解に陥ったりするリスクがあります。

2017年に発表されたTransformerの論文(“Attention Is All You Need”)でウォームアップが標準的な技術として広まりました。特に大規模なTransformerモデルの学習には不可欠で、BERTGPT・T5などすべての主要モデルで採用されています。

ウォームアップが終わったあとは、通常の学習率スケジューリングコサインアニーリングや線形減衰など)へ移行します。ウォームアップのステップ数はモデルの規模や全学習ステップ数に応じて設定し、一般に全学習ステップの1〜10%程度が目安とされています。


ウォームアップの種類

種類概要特徴
線形ウォームアップ学習率を直線的に増加最もシンプルで使いやすい
指数ウォームアップ指数関数的に増加初期はより慎重
Transformerスケジュールウォームアップ後に反比例で減衰元論文で提案された方式
import torch.optim as optim
from transformers import get_linear_schedule_with_warmup

optimizer = optim.AdamW(model.parameters(), lr=5e-5)

# HuggingFaceのウォームアップスケジューラ
scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=1000,      # ウォームアップステップ数
    num_training_steps=10000    # 総学習ステップ数
)
# 手動でウォームアップを実装する例
def warmup_lr(step, warmup_steps, base_lr):
    if step < warmup_steps:
        return base_lr * (step / warmup_steps)  # 線形増加
    return base_lr

歴史と背景

  • 2017年:Vaswaniら「Attention Is All You Need」でTransformerと共にウォームアップが提案
  • 2018年:BERTの事前学習でウォームアップ+線形減衰が採用され、NLPの標準技術に
  • 2020年以降:GPT-3など超大規模モデルでウォームアップの重要性がさらに高まる
  • 現在:ほぼすべての大規模モデルの学習でウォームアップが採用されている

ウォームアップが重要な理由

問題ウォームアップなしウォームアップあり
学習初期の不安定性損失が発散・振動しやすい安定したスタートが切れる
Batchnorm/LayerNorm初期統計量が不正確で誤更新徐々に正確な統計を収集
Adamのバイアスモーメント推定が不正確な序盤に大更新モーメントが安定してから大きく動く

関連用語