オプティマイザと訓練テクニック 入門
勾配降下 primer は一行で締めた:w ← w − η · ∇L。だが現実の LLM 訓練は その一行を実用的な機構の 4 層で包む —— どの層も「モデルが本当に収束する」ために 必要な要素だ。短い 4 トピック:SGD → Adam → AdamW(誰もが使う オプティマイザ);学習率スケジュール(ウォームアップ + コサイン 減衰);混合精度訓練(fp16 / bf16);そして分散訓練(data / tensor / pipeline parallel)。この primer を読めば、 訓練スクリプト冒頭の設定群が意味を持って見えるようになる。
SGD → Adam → AdamW
パラメータごとの適応的ステップサイズと、LLM 訓練を成立させた重み減衰の修正。
勾配降下 primer §1 で素の SGD —— w ← w − η · ∇L —— を扱った。 単純な問題ではうまくいく。だが現代の深層ネットでは多くを取りこぼす: グローバル 1 つの学習率は最も急な方向に合わせる必要があり、緩い方向には小さすぎる、 結果として進みが遅い。深層学習における最適化の歴史は、その制約を回避する長い物語だ。
第 1 の修正:モーメンタム。過去の勾配の移動平均を持ち、その方向に進む。 ノイズが均され、一貫した方向で加速する。グローバル学習率は 1 つのままだが、 オプティマイザがそれをより有効に使う。
第 2 の修正:Adam(Kingma & Ba、2014)—— 適応的モーメント推定。 2 つの移動平均を持つ:勾配の m_t(1 次モーメント)、勾配 2 乗の v_t(2 次モーメント)。前者はモーメンタム。後者は各パラメータの勾配が どれだけばらつくかを示す。ステップを √v_t で割れば、各パラメータが 自分の有効学習率を持つ。
Adam、第 t ステップ更新:
m_t = β₁ · m_{t-1} + (1 − β₁) · g_t ← 1 次モーメント
v_t = β₂ · v_{t-1} + (1 − β₂) · g_t² ← 2 次モーメント
m̂_t = m_t / (1 − β₁ᵗ) ← バイアス補正
v̂_t = v_t / (1 − β₂ᵗ)
w ← w − η · m̂_t / (√v̂_t + ε)
典型値:β₁ = 0.9、β₂ = 0.95–0.999、ε = 1e-8核心 —— 最近の勾配が大きいパラメータは有効ステップが縮められ、小さい場合は 伸ばされる。細長い損失面では、急な軸が縮み、緩い軸が伸びる —— ジグザグせずに最小値へ直行する。
第 3 の修正:AdamW(Loshchilov & Hutter、2017)。Adam に 正しい重み減衰を組み合わせる。元の Adam は L2 正則化を勾配自体に混ぜようとしたが、 L2 が √v_t でスケールされるため、実際の減衰量がパラメータの勾配分散に 依存してしまう —— 混乱の元。AdamW は両者を分離する:まず Adam 更新を行い、その後別途 η · λ · w 分だけ重みを縮める:
AdamW、第 t ステップ更新:
w ← w − η · m̂_t / (√v̂_t + ε) − η · λ · w
─────────
重み減衰
適応スケーリングから分離変更は繊細だが、結果は大きい。AdamW は大規模でより良く汎化し、現代の LLM 訓練は どれもこれを使う。PyTorch、JAX、HuggingFace はトランスフォーマー訓練の既定 オプティマイザを AdamW にしている。
2026 年に実際に使われているもの:
- AdamW はほぼ何にでも。LLM の事前訓練、ファインチューニング、 多くの深層学習タスクの既定。
- モーメンタム付き SGD は特定の画像分類(ResNet、設定によっては ViT) で依然強い —— 損失地形が穏やかで、適応的手法が役立たないどころか汎化を損なう場合。
- Lion、Sophia、Adafactor、Shampoo、Muon —— メモリや収束で AdamW を 打ち負かすと主張する新しいオプティマイザ群。2026 年時点で本番では AdamW を 完全に置き換えたものはまだないが、分野は実験を続けている。
Adam のメモリコストについて一言:パラメータごとに fp32 テンソルを 2 つ追加で持つ (m と v)。7B モデルなら、これだけで 56 GB、加えて 28 GB の fp32 重み —— オプティマイザ側だけで約 84 GB。なぜこれが固い制約に なるかはハードウェア primer §2 で見た通り。Adafactor や 8-bit AdamW のような 省メモリオプティマイザはまさにここを解くために存在する。
Transformer では:各ブロックの各パラメータに適用されるのはβ₁ = 0.9、β₂ = 0.95、ε = 1e-8、 重み減衰 λ ≈ 0.1 の AdamW と学習率スケジュール(§2)。 この一文が GPT-3、LLaMA、PaLM、Claude、Gemini —— 2020 から 2026 年に訓練された ほぼすべての旗艦 LLM のオプティマイザを表す。レシピが圧倒的で、 「AdamW」は「現代 LLM 訓練」と事実上同義語だ。
学習率スケジュール
最初は warmup、終盤は decay。LLM を定数 η で訓練する人はいない。
AdamW はパラメータごとのステップを与えてくれる。残る問いは:グローバルなステップ サイズ η は訓練全体でどう変えるか? 定数 η は悪い。すべての現代 LLM は 2 段階 スケジュールを使う —— 最初にwarmup、その後にdecay。
Warmup。η = 0 から始め、最初の約 0.1–2% で線形にピークへ上げる。 なぜか? Adam の 2 次モーメント v_t は勾配の大きさの統計を蓄積する 時間が必要 —— 最初のステップで満タンの η を打つと、v_t は当てに ならず、更新が巨大になる。warmup によりオプティマイザの状態を安定させてから 全速ステップを当てる。warmup を飛ばすのは古典的な「ステップ 5 で損失 NaN」ミス。
Decay。warmup の後、η を残りの訓練で下げ、最終的に非常に小さい値 (ピークの 10%、時に 0)にする。直感:訓練初期は大きなステップで正しい近傍を探し、 後期は最小値近傍を磨くため小さなステップにしたい。よく使われる形状:
- コサイン減衰 ——
η_t = η_peak · 0.5 · (1 + cos(π · t/T))。 滑らかで段差なし。LLM の既定。 - 線形減衰 —— η_peak から η_end まで直線。ファインチューニングで一般的。
- 逆平方根 ——
η_t = η_peak / √t。元の Transformer 論文が 使用;今は少ない。 - WSD(Warmup-Stable-Decay) —— 訓練の大半を η_peak で維持し、 終盤に急減衰。最終訓練 budget が事前に分からないときに有用(後で再開して 後から減衰可能)。
Transformer 事前訓練でよく見る値:
ピーク LR: 3e-4 から 1e-3 (モデルが大きいほど小さい) warmup ステップ: 500 – 2000 (全体の 0.1–2%) 総ステップ: 10k – 数百万 (データ量依存) 減衰形状: ピークの 10% までコサイン 最低 LR: 3e-5 から 1e-4
スケールに関する実用的事実:モデルが大きくなるほど最適ピーク LR は小さくなる。 7B モデルは η ≈ 3e-4 付近、70B モデルは η ≈ 5e-5 寄り。 「Maximal Update Parameterization」(μP)というスケーリング規則の研究系統が、 小規模でハイパーパラメータを調整して大規模で正しい LR を予測する方法を与える。
Transformer では:訓練スクリプトのスケジュールは通常、毎ステップ 呼ばれる get_lr() に組み込まれる。最も重要なハイパーパラメータは ピーク LR、次が warmup の長さ、3 番目が減衰の形。主要 LLM ラボの model card や 技術レポートはこの 3 つの数字を必ず示す。訓練が発散したら、まず疑うのは LR スケジュールだ。
混合精度訓練
活性を 2 バイト浮動小数で保つ。数学は壊れず、モデルは訓練でき、GPU は約 2 倍速い。
ハードウェア primer §2 で VRAM の重要性を見た。混合精度訓練は実務で最も効く単一最適化: ネットワークの大部分を 4 バイトの fp32 ではなく 2 バイト浮動小数(fp16 か bf16)で 保持する。結果:VRAM 半減、現代の Tensor Core GPU でスループット約 2 倍。
登場人物:
- fp32 —— 32 ビット IEEE 754。1 符号 + 8 指数 + 23 仮数。 範囲 ~10⁻³⁸ から 10³⁸、約 7 桁の精度。数値計算の安全な既定だが、コストが高い —— 1 個 4 バイト。
- fp16 —— 16 ビット半精度。1 + 5 + 10。範囲 ~6×10⁻⁵ から ~6.5×10⁴、 約 3 桁の精度。メモリ半減、Tensor Core 上でスループット 2 倍。だが: 狭い範囲のため勾配がアンダーフローして 0 になり、活性がオーバーフローして inf になる。
- bf16(brain float)—— 同じく 16 ビット、1 + 8 + 7。fp32 と同じ指数 範囲(オーバーフロー / アンダーフローの心配なし)、ただし仮数は 7 ビットのみ (約 2 桁の精度)。Google が ML 用に作成、現在は A100、H100、TPU、MI300X など すべての主要ハードウェアで大規模モデル訓練の既定。
- fp8 —— 8 ビット浮動小数。2 変種(E4M3 と E5M2)。H100 以上では fp8 で行列積を回せ、さらに高速化できる;推論で広く、訓練でも増加中。OCP MX 規格で 標準化済み。
「混合」の字が重要だ。すべてを fp16/bf16 に入れるのではない —— 一部の演算には高精度が必要。標準レシピ:
- 重み、活性、勾配 —— fp16 か bf16。順伝播も逆伝播も低精度。 加速はここから。
- 重みのマスタコピー —— fp32。オプティマイザ状態と権威の重み値を フル精度で保持。更新時は fp16/bf16 で更新量を計算し、fp32 マスタに当てる。
- リダクション(和・平均、特に多数の値にわたるもの)—— fp32。 多くの低精度数の累積は精度を急速に失う;入力が bf16 でもリダクションは通常 fp32 で。
- Loss scaling —— fp16 のみ。逆伝播前に損失を大きな定数 (例:1024)で掛け、勾配の大きさを fp16 のアンダーフロー領域から押し上げ、 逆伝播後に同じ定数で割って戻す。bf16 は不要(指数範囲が fp32 と同じ)、 これが bf16 が勝った最大の理由。
コードでこれを手書きすることはまずない。PyTorch の autocast と AMP がキャストを自動処理:
# PyTorch — bf16 で autocast
with torch.autocast(device_type="cuda", dtype=torch.bfloat16):
out = model(x)
loss = criterion(out, y)
loss.backward() # 勾配は自動的に bf16
optimizer.step() # fp32 マスタコピーを更新H100 で 7B Transformer を訓練する具体的な数字:
- VRAM が約 50% 減。活性とオプティマイザの 2 次テンソルが減る。 バッチサイズや文脈長を倍にできる。
- TFLOPS が約 2 倍。H100 は dense 行列積で fp16/bf16 が 989 TFLOPS、 fp32 が 67 TFLOPS と表記 —— 実差は 10× で、これが 2026 年に「fp32 訓練」が ほぼ絶滅した理由。
- 最終損失は同等(ノイズ範囲内)。モデルは機能的に fp32 訓練と 同等、ただ訓練が速いだけ。
Transformer では:現代 LLM の参考実装は既定で bf16 訓練。推論は さらに先へ —— fp8、int8、4-bit 量子化まで。次に読む Transformer の事前訓練 (および 2026 年にファインチューニングする任意の LLM)はほぼ確実に 「bf16 + fp32 マスタコピー」—— この組み合わせは今や退屈な既定だ。
分散訓練
DP × TP × PP —— モデルを数百 GPU に分割する 3 つの独立軸。
bf16 の 70B モデルは重みだけで 140 GB —— 単 H100 の 80 GB を超える。訓練には さらに勾配、オプティマイザ状態、活性が乗る。ハードウェア primer §2 で見たように 7B でも単 H100 を超え、70B 以上はマルチ GPU 確定。では「モデルを複数 GPU に分割」は どう実装するのか? 3 つの直交する技法、通常は組み合わせて使う。
1. データ並列(DP)。各 GPU が完全なモデルコピーを持つ。バッチを GPU 間で分割。各 GPU が自分のバッチ分で順伝播 + 逆伝播し、ローカル勾配を作る。 その後 all-reduce で勾配を平均し、すべての GPU が同じ重み更新を行う。 単純で多 GPU に拡張しやすい —— ただしモデルが各 GPU に収まる必要がある。
DP の変種はデータだけでなく訓練状態の一部もシャードする。ZeRO(Microsoft)と FSDP(PyTorch)は、DP グループでオプティマイザ 状態、勾配、重みをシャードし、必要に応じて gather / scatter する。1 GPU あたりの メモリを大幅に減らしつつ「1 GPU に 1 コピー」の心象モデルを保つ。現代の訓練スクリプトは 既定で FSDP を使うことが多い。
2. テンソル並列(TP)。モデル自体が 1 GPU に収まらない場合、 各層の重み行列を GPU 間で分割。4096 × 4096 の行列を 4 GPU に分けると、4 つの 4096 × 1024 スラブになる。順伝播・逆伝播ともに各層で all-to-all 通信 (各 GPU が部分行列積を計算し集約)が必要。通信コストが大きいので、TP は通常 1 ノード内に留め、NVLink(≥ 600 GB/s 単方向)で接続する;ノード間 InfiniBand では遅すぎる。
3. パイプライン並列(PP)。モデルを縦に分割 —— GPU 0 が 層 1–8、GPU 1 が層 9–16、以下同様。GPU 0 の活性が GPU 1 に流れ、続いて GPU 2 に 流れる。素朴にやると、前段が終わるまで GPU が遊ぶ —— 「パイプライン気泡」だ。 実装ではマイクロバッチでバッチをさらに小さなチャンクに切り、パイプラインで 流して全段を稼働させる。TP でも足りないとき(モデルが大きすぎて単層も 1 ノードに 収まらないとき)に PP を使う。
実際の LLM 訓練ではこれらを組み合わせる:
- 2D(DP + TP)。10B 規模まで一般的。マルチノードで DP、ノード内で TP。 各ノードが(シャード後の)完全モデルコピーを持ち、ノード間は all-reduce で協調。
- 3D(DP + TP + PP)。70B+ モデルの標準。1024 GPU の訓練を想像: 32-way DP × 8-way TP × 4-way PP。各軸が異なる次元で作業を分割;合計 32 · 8 · 4 = 1024。
- 系列並列(Sequence parallel)。比較的新しい追加:他に加えて 系列次元を GPU 間で分割。超長文脈窓では系列軸の活性がメモリを支配するため重要。
- 専門家混合(MoE)。別種の「並列」 —— 異なるトークンを異なる 専門家サブネットにルーティング。各専門家が 1 GPU に住むので、モデルは巨大に できる一方、順伝播では数個の専門家しか活性化しない。1T パラメータ規模のモデルを 80B 相当のトークン単位コストで運用できる。
これを動かすハードウェア:
- ノード内:8 GPU を NVLink/NVSwitch で接続、~600+ GB/s 単方向。 TP の通信コストが実用に収まる。
- ノード間:InfiniBand や RoCE、~200–400 GB/s。DP の all-reduce には 十分、細粒度の TP には遅すぎる。
- ソフトウェア:PyTorch FSDP、NVIDIA Megatron-LM、DeepSpeed、 JAX + Mesh + GSPMD、Maxtext。スタックは違っても、根底にあるのは同じ 3 軸。
Transformer では:次に読む同じアーキテクチャが、1 GPU (1B モデルが収まる)から 16 GPU(70B モデルを TP + PP)、そして数千 (3D 並列 + MoE による最先端 LLM)までスケールする。「1 GPU で動く」から 「25k H100 で 6 か月訓練」までの道のりは、本節の内容そのもの。旗艦モデル発表の 背後にあるエンジニアリング努力の多くは、アーキテクチャではなくここにある。
前提知識スタックは出揃った。次の primer:Transformer 本体 —— ついに。