AI・機械学習
上級

AdamW(アダムダブリュー)

Adam オプティマイザに正しい重み減衰(decoupled weight decay)を導入した改良版。Loshchilov & Hutter が 2017 年に提案し、LLM 訓練のデファクトスタンダードとなっている。L2 正則化と重み減衰を分離することで、適応学習率との干渉を排除し汎化性能を向上させた。

0 回閲覧
0 いいね

AdamWとは

AdamW は、2017 年に Ilya Loshchilov と Frank Hutter が論文「Decoupled Weight Decay Regularization」で提案した最適化アルゴリズムである。オリジナルの Adam(Adaptive Moment Estimation)が抱えていた重み減衰の実装上の問題を修正し、正則化の効果を正しく発揮できるようにした。

Adam では重み減衰を L2 正則化として損失関数に加算する形で実装されていた。しかし、Adam の適応学習率メカニズムにより、L2 正則化項の勾配もスケーリングされてしまい、意図した正則化効果が得られないという問題があった。AdamW はこの問題を解決するため、重み減衰をオプティマイザの更新ステップに直接組み込む「分離型重み減衰(decoupled weight decay)」を採用した。

2026 年現在、GPT-4、Gemini、Llama 3、Claude、Qwen 3 など主要な LLM のほぼ全てが AdamW を採用しており、深層学習における最も重要なオプティマイザの一つとなっている。

AdamWのアルゴリズム

AdamW の更新則は以下の通りである:

  1. 勾配 g_t = ∇L(θ_t) を計算
  2. 1 次モーメント更新: m_t = β1 · m_{t-1} + (1 − β1) · g_t
  3. 2 次モーメント更新: v_t = β2 · v_{t-1} + (1 − β2) · g_t²
  4. バイアス補正: m̂_t = m_t / (1 − β1^t), v̂_t = v_t / (1 − β2^t)
  5. パラメータ更新: θ_{t+1} = θ_t − η · (m̂_t / (√v̂_t + ε) + λ · θ_t)

ここで λ が分離された重み減衰係数である。オリジナル Adam との決定的な違いは、ステップ 5 で重み減衰項 λ · θ_t が適応学習率 m̂_t / (√v̂_t + ε) の外側に加算される点にある。

Adam vs AdamW の違い

項目Adam(L2正則化)AdamW(分離型重み減衰)
正則化の実装損失関数に λ‖θ‖² を加算更新式に λθ を直接加算
適応学習率との相互作用L2 項の勾配もスケーリングされる重み減衰は適応学習率の影響を受けない
正則化効果パラメータごとに不均一全パラメータに均一に作用
汎化性能SGD + Momentum に劣る場合ありSGD + Momentum と同等以上
LLM での採用ほぼ使われないデファクトスタンダード

LLM訓練でのAdamWの設定

主要 LLM で公開されている AdamW のハイパーパラメータ設定を比較する:

モデル学習率β1β2weight_decaygradient_clipwarmup
GPT-3 175B0.6e-40.90.950.11.0375 steps
Llama 2 70B1.5e-40.90.950.11.02000 steps
Llama 3 70B1.5e-40.90.950.11.08000 steps
Qwen 2 72B3e-50.90.950.11.0—
Mistral 7B3e-40.90.950.11.01000 steps

注目すべき共通点として、β2 = 0.95 が LLM 訓練で事実上の標準値となっている。これはオリジナル Adam 論文で推奨された β2 = 0.999 とは大きく異なる。LLM の訓練では勾配の分散が大きく変動するため、β2 を小さくして 2 次モーメントの追従性を高める必要がある。

メモリ効率と分散学習

AdamW はパラメータごとに m(1 次モーメント)と v(2 次モーメント)の 2 つの状態を保持するため、パラメータ本体と合わせて 3 倍のメモリを消費する。分散学習環境では以下の手法でメモリを削減する:

手法メモリ削減概要
ZeRO Stage 1オプティマイザ状態をシャードGPU 間で m, v を分割保持
ZeRO Stage 2+ 勾配もシャード通信量は増加
ZeRO Stage 3+ パラメータもシャード最大削減だが通信コスト大
8-bit Adam状態を INT8 量子化bitsandbytes で実装
Adafactorモーメントを行列分解メモリ大幅削減だが精度低下リスク

実装例

PyTorch での AdamW 使用は非常にシンプルである:

optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=3e-4,
    betas=(0.9, 0.95),
    weight_decay=0.1,
    eps=1e-8
)

Hugging Face Transformers の Trainer でも AdamW がデフォルトオプティマイザとして組み込まれており、特別な設定なしに利用できる。

FAQ

Q1. AdamとAdamWはどちらを使うべき?

2026 年現在、ほぼ全てのケースで AdamW を使うべきである。PyTorch の torch.optim.Adam にも weight_decay パラメータがあるが、これは L2 正則化であり AdamW の分離型重み減衰とは異なる。torch.optim.AdamW を明示的に指定することを推奨する。

Q2. AdamWのweight_decayはどの値が適切?

LLM の事前学習では 0.1 が最も一般的な値である。ファインチューニングでは 0.01〜0.1 の範囲で設定する。weight_decay を 0 にすると正則化効果がなくなり過学習のリスクが高まる。一方、0.3 以上に設定すると学習が不安定になる傾向がある。

Q3. AdamWの代替として有力なオプティマイザは?

Lion(Google, 2023)は符号ベースの更新によりメモリ効率が高く、一部のタスクで AdamW を上回る結果が報告されている。Sophia(Stanford, 2023)は二次情報を効率的に活用し収束を高速化する。Schedule-Free AdamW(Meta, 2024)は学習率スケジュールを不要にする。ただし、いずれも AdamW ほどの大規模な検証実績はなく、プロダクション環境では AdamW が最も安全な選択肢である。