ウォームアップ(学習率) うぉーむあっぷ(がくしゅうりつ)
ウォームアップ学習率Transformer大規模言語モデル最適化学習安定化
ウォームアップ(学習率)について教えて
簡単に言うとこんな感じ!
スポーツ選手が試合前に準備運動するのと同じ!学習の最初は学習率を小さくしてゆっくりスタートし、徐々に本来の値まで上げていくんだ。いきなり全力で走ると怪我(学習の発散)するから、最初は慎重に準備するよ!
ウォームアップ(学習率)とは
ウォームアップ(Warmup) は、学習の開始直後に学習率を小さな値から目標値まで段階的に増加させる技術です。初期化されたばかりのモデルは重みがランダムで不安定なため、いきなり大きな学習率で更新すると損失が発散したり局所最適解に陥ったりするリスクがあります。
2017年に発表されたTransformerの論文(“Attention Is All You Need”)でウォームアップが標準的な技術として広まりました。特に大規模なTransformerモデルの学習には不可欠で、BERT・GPT・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のバイアス | モーメント推定が不正確な序盤に大更新 | モーメントが安定してから大きく動く |
関連用語
- 学習率スケジューリング — ウォームアップを含む学習率制御全般
- コサインアニーリング — ウォームアップの後に続くスケジュール
- Adam — ウォームアップと組み合わせるのが定番の最適化手法
- 層正規化(Layer Normalization) — ウォームアップと組み合わせて学習安定化