学習率Warmupとは、学習開始直後の学習率を低く抑えてから、徐々に通常の学習率まで引き上げる手法です。 特にTransformerやBERTなどのモデルでよく用いられ、学習の安定性を高める目的で導入されます。
なぜWarmupが必要なのか?
学習初期では、モデルのパラメータがランダムに近いため、 大きな学習率で学習を始めてしまうとパラメータが暴れてしまい、 うまく収束しないことがあります。
Warmupは、これを防ぐために「まずは小さく学び、だんだん加速する」という考え方です。
具体的なスケジュール例
以下のようなスケジュールで学習率が変化します:
# PyTorchでのWarmupスケジューラ例
from torch.optim.lr_scheduler import LambdaLR
def get_warmup_scheduler(optimizer, warmup_steps):
def lr_lambda(current_step):
return min((current_step + 1) / warmup_steps, 1.0)
return LambdaLR(optimizer, lr_lambda)
この例では、warmup_steps
ステップの間は線形に学習率が増加し、以降は一定になります。
実際にどんなときに使う?
- BERTやTransformerモデルの学習(HuggingFaceなど)
- 大規模データセットでの初期学習安定化
- 新規モデルでの学習試行
補足:Warmupの後に学習率を下げる方法もある
Warmupで学習率を徐々に上げた後、一定のステップを超えたら徐々に下げていくことで、より高い精度を得る手法もあります。代表的なのが:
- Cosine Annealing(余弦関数に沿って下げる)
- Step Decay(一定ステップごとに学習率を減衰)
- Exponential Decay(学習率を指数的に下げていく)
たとえば、以下のようなスケジューラを使ってWarmupとDecayを組み合わせられます:
from transformers import get_cosine_schedule_with_warmup
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=500,
num_training_steps=10000
)
これにより、「学習初期は丁寧に、小慣れたら本気で学び、終盤は落ち着いて調整」といった、まるで人間の学びのような流れを再現できます。
まとめ
Warmupは単なる「ゆっくりスタート」ではなく、モデルの不安定さを回避し、よりよい結果に導くテクニックです。 特にTransformer系のモデルを使うなら、ぜひWarmup+Decayのスケジューラ設計を活用してみてください。