AI・機械学習
上級

多項式減衰スケジューラ(タコウシキゲンスイスケジューラ)

学習率を多項式関数 η(t) = (η₀ - η_end) × (1 - t/T)^p + η_end に基づいて減衰させるスケジューリング手法。冪指数 p を調整することで線形(p=1)から二次(p=2)、さらに急峻な減衰まで柔軟に制御できる。BERT・T5・mT5 など Google 系モデルの訓練で広く採用されてきた。

0 回閲覧
0 いいね

多項式減衰スケジューラとは

多項式減衰(Polynomial Decay)スケジューラは、学習率を多項式関数に基づいて減衰させる手法である。基本数式は:

η(t) = (η₀ - η_end) × (1 - t/T)^p + η_end

ここで η₀ は初期学習率、η_end は最終学習率、T は総ステップ数、p は冪指数(power)である。p=1 で線形減衰、p=2 で二次減衰となり、p が大きいほど初期の減衰が緩やかで後半に急速に減衰する。

Google の BERT(2018)および T5(2019)の訓練で標準採用され、TensorFlow エコシステムでは tf.keras.optimizers.schedules.PolynomialDecay として実装されている。PyTorch でも Hugging Face Transformers 経由で広く利用される。

冪指数による減衰カーブの違い

冪指数 p減衰パターン中間点(t=T/2)の学習率特徴主な用途
0.5平方根減衰η₀ の 71%初期に急減衰、後半緩やかあまり使用されない
1.0線形減衰η₀ の 50%均一な減衰BERT, ファインチューニング
2.0二次減衰η₀ の 75%初期緩やか、後半急T5, mT5
3.0三次減衰η₀ の 88%初期は殆ど減衰しない長時間訓練

※ η_end = 0 の場合の理論値

コサインアニーリングとの比較

多項式減衰とコサインアニーリングは LLM 訓練における 2 大スケジューラであり、それぞれの特性を理解することが重要:

項目多項式減衰 (p=1)多項式減衰 (p=2)コサインアニーリング
中間点学習率η₀ の 50%η₀ の 75%η₀ の 50%(η_min=0 時)
減衰カーブ直線上に凸S 字(上に凸→下に凸)
後半の収束均一に低下急速に低下急速に低下
数式の単純さ◎◎○
Google 系モデルBERTT5Gemma 2
Meta 系モデル——Llama 3
精度差(GPT-2 実験)基準+0.1 ppl+0.3 ppl

GPT-2 124M での実験ではコサインアニーリングがわずかに優位だが、差は小さい。BERT のオリジナル実装が線形減衰(p=1)を採用したため、BERT 系モデルのファインチューニングでは今でも線形減衰が広く使われている。

実モデルでの採用例

モデル冪指数 p初期学習率最終学習率ウォームアップ
BERT Base1.0(線形)1×10⁻⁴010,000 steps
BERT Large1.0(線形)1×10⁻⁴010,000 steps
T5 Base1.0(線形)※1×10⁻²0—
mT51.01×10⁻²—inverse sqrt warmup
ALBERT1.0(線形)1.76×10⁻³012,500 steps
DeBERTa1.0(線形)2×10⁻⁵0ステップの 6%

※ T5 は Inverse Square Root スケジューラを公式採用だが、ファインチューニングでは線形減衰が推奨

PyTorch での実装

from torch.optim.lr_scheduler import PolynomialLR

# PyTorch 2.x 標準
scheduler = PolynomialLR(
    optimizer,
    total_iters=100000,  # 総ステップ数
    power=2.0            # 冪指数(二次減衰)
)

# Hugging Face Transformers 経由
from transformers import get_scheduler

scheduler = get_scheduler(
    "polynomial",
    optimizer=optimizer,
    num_warmup_steps=2000,
    num_training_steps=100000,
    # Transformers のデフォルトは power=1.0(線形)
)

ウォームアップとの組み合わせ

from torch.optim.lr_scheduler import LinearLR, PolynomialLR, SequentialLR

warmup = LinearLR(
    optimizer,
    start_factor=1e-7 / 1e-4,
    total_iters=10000
)
poly_decay = PolynomialLR(
    optimizer,
    total_iters=990000,  # 総ステップ - ウォームアップ
    power=1.0
)
scheduler = SequentialLR(
    optimizer,
    [warmup, poly_decay],
    milestones=[10000]
)

TensorFlow での実装

BERT オリジナル実装は TensorFlow ベースであり、多くのファインチューニングコードが TF の PolynomialDecay を使用:

import tensorflow as tf

scheduler = tf.keras.optimizers.schedules.PolynomialDecay(
    initial_learning_rate=1e-4,
    decay_steps=100000,
    end_learning_rate=0.0,
    power=1.0  # 線形減衰
)
optimizer = tf.keras.optimizers.Adam(learning_rate=scheduler)

多項式減衰の選択指針

p=1(線形減衰)を選ぶ場面

  • BERT 系モデルのファインチューニング
  • 訓練が比較的短い場合(数万ステップ以下)
  • シンプルさを優先する場合

p=2(二次減衰)を選ぶ場面

  • 長時間の事前学習で中盤の学習率を高く維持したい場合
  • T5 / mT5 系モデルの訓練
  • コサインアニーリングに近い減衰カーブを多項式で実現したい場合

コサインアニーリングを選ぶ場面

  • LLM 事前学習(Llama 3 / GPT-4 クラス)
  • 最高精度を目指す場合
  • 業界標準に合わせたい場合

FAQ

Q1: 多項式減衰とコサインアニーリングの精度差はどの程度?

GPT-2 124M パラメータモデルでの実験では、コサインアニーリングが線形減衰(p=1)に対して Perplexity で 0.3〜0.5 ポイント優位、二次減衰(p=2)に対して 0.1〜0.2 ポイント優位という報告がある。ただし、モデルサイズやデータセットによって差は変動し、統計的に有意でないケースも多い。

Q2: BERT のファインチューニングではなぜ線形減衰が標準なのか?

BERT のオリジナル実装(Google 公開コード)が線形減衰 + ウォームアップを採用しており、以降のファインチューニング研究がこの設定を踏襲したため。ファインチューニングは訓練ステップ数が少ない(数千〜数万)ため、スケジューラ間の差が事前学習ほど顕著にならない。コサインに変更しても精度は殆ど変わらない。

Q3: power パラメータはどうやってチューニングする?

実務上は p=1(線形)か p=2(二次)のどちらかを選ぶのが一般的。ハイパーパラメータサーチを行う場合は p ∈ {0.5, 1.0, 1.5, 2.0, 3.0} から選択する。経験則として、訓練が長いほど p を大きくすると中盤の学習率が高く維持されて有利。