学習率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のスケジューラ設計を活用してみてください。

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です