この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- MoEモデルの学習ループの骨格はDenseと同じ(Forward→Loss→Backward→Optimizer)。フレームワークが対応していればコードの見た目はほぼ変わらない。
- ただし内部では「選ばれなかったExpertに勾配がゼロ」「RouterのTop-K選択が非微分」「Load Balancing用の追加Loss」など、Dense にはない機構が動いている。
- メモリは推論時はアクティブパラメータ分で済むが、学習時は総パラメータ分必要で、Optimizer Stateを合わせると実質その3倍近い領域が必要になる。
- LoRAはMoEにもそのまま使えるが、上位25%のExpertだけに絞って適用するMoE-Sieveのような特化手法を使うとより効率的。
はじめに
以前書いたQwen3.6の記事で「Sparse MoE で総パラメータ 35B・アクティブ 3B」という設計を扱った。推論時は3B相当のFLOPsで動くMoE(Mixture of Experts)モデルだ。
ここで素朴な疑問が湧いた。
- 35Bのパラメータを持つとして、学習はどうやるんだろう?
- Dense(普通の)モデルと同じ学習ループが使えるのか?
- メモリだけ気をつければOK?
この記事ではその疑問を起点に、MoEモデルの学習を基礎から整理する。先に結論だけ言うと:
学習ループの骨格はDenseと同じだが、内部では複数のMoE固有の機構が動いている。
メモリだけでなく、勾配の流れ方・Load Balancing・分散学習の通信パターンなど、Denseとは異なる設計上の工夫が必要になる。
MoEの基本構造
TransformerのFFNをExpertに分割する
MoEの核心は、TransformerのFFN(Feed-Forward Network)層を複数のExpertに分割することにある^1。
入力トークン x │ ▼┌──────────┐│ Router │ ← 各ExpertへのスコアをCompute。Top-K を選択│ (Gate) │└──────────┘ │ Top-K 選択 ▼┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐│ E_1 │ │ E_2 │ │ E_3 │ ... │ E_N │ ← N個のExpert(FFN)└──────┘ └──────┘ └──────┘ └──────┘ 活性化 活性化 非活性化 │ │ ▼ ▼ 重み付き合算 → 出力| コンポーネント | 役割 |
|---|---|
| Expert | 個々のFFNサブネットワーク。独立したパラメータを持つ |
| Router / Gate | hidden stateから各Expertへのスコアを計算し、Top-K個を選択する小さなネットワーク |
| Top-K選択 | スコア上位K個のExpertのみを活性化。K=1(Switch Transformer)やK=2(Mixtral)が代表的 |
代表的なMoEモデルのスペック
| モデル | 総パラメータ | アクティブパラメータ | Expert数 | Top-K |
|---|---|---|---|---|
| Mixtral-8x7B | 約46.7B | 約12.9B | 8 | 2 |
| DeepSeek-V3 | 671B | 37B | 256(+1 shared) | 8 |
| Qwen3-235B-A22B | 235B | 22B | 128 | 8 |
| Qwen3.6-35B-A3B | 35B | 3B | — | — |
なぜMoEが使われるのか
- 推論コスト効率: 各トークンで活性化するのはアクティブパラメータ分だけなので、推論FLOPsはアクティブパラメータ数に比例する
- 学習効率: 同じ学習FLOPsならDenseより高い精度を達成できる(最大3.4ポイントの改善が報告されている^2)
- スケーラビリティ: Expert数を増やすことで、推論コストをほぼ増やさずにモデル容量を拡大できる
学習ループの骨格はDenseと同じ
MoEモデルの学習ループ自体は、Denseと骨格は同じだ。
[データローダ] → [Forward] → [Loss計算] → [Backward] → [Optimizer更新]PyTorch + HuggingFace等のフレームワークがRouter + Expertの計算グラフを構築してくれるため、ユーザーから見た学習コードは大きくは変わらない。
この意味では「普通のTransformerと同じように学習できるか?」という最初の疑問への答えは「おおむねYes、コードの見た目は変わらない」だ。
でも内部はかなり違う
骨格は同じでも、中身はDenseとは別物だ。6つの観点で整理する。
| 観点 | Denseモデル | MoEモデル |
|---|---|---|
| Forward | 全パラメータが毎トークンで活性化 | RouterがTop-K Expertを選択し、選ばれた分だけ計算 |
| Backward(勾配) | 全パラメータに勾配が流れる | 選ばれたExpertにのみ勾配が流れる(スパース勾配) |
| Routerの勾配 | 該当なし | Top-K選択が非微分 → 勾配近似が必要 |
| 追加Loss | なし | Load Balancingのための Auxiliary Loss(または後述のloss-free手法)が必要 |
| メモリ | パラメータ数に比例 | 総パラメータ数ベース(全Expert + Optimizer State を保持) |
| 通信(分散) | All-Reduce中心 | Expert ParallelismによるAll-to-All通信が発生 |
勾配の流れが本質的に違う
MoEとDenseの最大の違いはここだ。
Expertへの勾配はスパース
Denseでは、各トークンに対して全パラメータに勾配が流れる。MoEでは:
- あるトークンで選択されなかったExpertの重みには勾配ゼロ
- つまり各Expertは、自分に割り当てられたトークンからのみ学習する
- Attention層・Embedding等の共有パラメータはDenseと同様に全トークンで更新される
RouterのTop-K選択は非微分
RouterのTop-K選択(argmax的な操作)は数学的に微分できない。このため、Router自体の更新には何らかの近似が必要になる。
主要なアプローチが3つある:
| 手法 | 概要 |
|---|---|
| Straight-Through Estimator(STE) | Top-K操作の勾配をそのまま通す近似。最もシンプルだが精度が低い |
| SparseMixer | 数値ODE法を使ってRouting項の勾配を近似 |
| DenseMixer | 学習時に非活性Expertも追加Forwardで計算し、より正確なRouter勾配を得る(学習コストは増加、推論時はスパースのまま) |
実装上はSTEが最もよく使われる。
メモリは推論と学習で大きく違う
「35B-A3Bなら学習時も3B相当のメモリでOK?」という疑問にはNo が答えだ。
| 項目 | 推論時 | 学習時 |
|---|---|---|
| モデル重み | 全Expertをメモリに保持(35B分) | 同左 |
| Optimizer State(AdamW) | 不要 | 全Expert分(35B × 2 state = 70B分の fp32) |
| 勾配 | 不要 | スパースだが全Expert分の領域を確保 |
| Activation | アクティブExpert分(3B相当) | Gradient Checkpointingを考慮しても全Expert分が必要な場合あり |
推論時は3B相当のFLOPsで済むが、学習時のメモリは35B分のDenseとほぼ同等になる。AdamWのOptimizer Stateまで含めると、FP32で35B×3倍近い領域が必要になる計算だ。
「メモリだけ注意すればOK?」という問いには、「メモリが最大の注意点であることは正しい。ただしそれだけではない」が正確な答えになる。
MoE最大の課題:Load Balancing
MoE固有の課題として、Routing Collapse がある。RouterがあるExpertばかりを選び続けると:
- 一部のExpertだけが学習され、残りが死ぬ
- 分散学習時に特定ノードがボトルネックになる
- Expert間で似たような知識を持つようになり、MoEの利点が消える
この問題を解決するためのアプローチが複数ある。
従来:Auxiliary Lossによるバランシング
言語モデリングのLossに、均等割り当てを促すLossを足す。
Total Loss = LM Loss + α × (Importance Loss + Load Loss)- Importance Loss: Routerが各Expertに割り当てるスコアの合計を均等化
- Load Loss: 実際に各Expertに割り当てられるトークン数を均等化
- 問題点: αのチューニングが難しく、大きすぎるとLM性能が劣化し、小さすぎるとバランスが取れない
DeepSeek-V3:Auxiliary-Loss-Free^3
DeepSeek-V3で採用された手法で、Auxiliary Lossを完全に排除する。
- 各Expertに動的バイアスを付与しRoutingスコアに加算
- 各学習ステップ後、Expertの負荷を観測
- 高負荷Expertのバイアスを下げ、低負荷Expertのバイアスを上げる
勾配に干渉しないため、LM性能を損なわずにバランスを達成できる。
より新しい手法
- Expert-Router Coupling Loss^4: ExpertのRouter embeddingをプロキシトークンとして扱い、ExpertとRouterの整合性を促す。計算量がトークン数に依存しない効率的な設計
- Orthogonality Loss + Variance Loss: Expertが異なるタイプのトークンを処理するよう促し、Routerの判断をより明確にする。従来のLoad Balancing Lossのみと比べ、最大23.79%の改善が報告されている
学習の不安定性と分散学習
安定化のための3つのテクニック
スパースな勾配は学習を不安定にしやすい。定番の対策がある。
- Router z-loss: RouterのLogitが大きくなりすぎるのを防ぐ正則化(Switch Transformerで導入)
- Expert Dropout: 学習時にランダムにExpertをドロップして汎化性能を向上
- Jitter Noise: Routerの入力に小さなノイズを加えて、特定Expertへの偏りを防ぐ
分散学習:All-to-All通信の登場
DenseモデルはData Parallel / Tensor Parallelを組み合わせれば事足りる場合が多いが、MoEではExpert Parallelism が必要になる。
- 各GPUが異なるExpertを担当
- RouterがどのGPUにトークンを送るかを決め、All-to-All通信 が発生
- メモリ管理・通信・計算の最適化をシステムスタック全体で共同設計する必要がある(Megatron-Core等^5)
All-to-Allは実装コストが高く、大規模MoEのトレーニングインフラ設計の難所のひとつだ。
LoRAはMoEにそのまま使える?
答えは「使える。ただし全Expert一律適用は非効率」だ^6。
各ExpertのFFN層にLoRAアダプタを挿入する形で使え、HuggingFaceのPEFTライブラリもMoEモデルへのLoRA適用をサポートしている。
MoE特化のLoRA手法
2025〜2026年にかけて、MoEの構造を活かした効率化手法が複数登場している。
DR-LoRA(Dynamic Rank LoRA)^7
各Expertに異なるランクのLoRAを割り当てる手法。Expert Saliency Score(Routing頻度 × 勾配ベースの重要度)で各Expertのタスクへの貢献度を評価し、重要なExpertには高ランク、使われていないExpertには低ランク(またはLoRAなし)を動的に割り当てる。
MoE-Sieve(Routing-Guided LoRA)^8
上位25%の高頻度ExpertにのみLoRAを適用する手法。少量のキャリブレーションデータで活性化パターンをプロファイリングし、使われるExpertを特定する。
全ExpertLoRAと同等の性能を維持しながら:
- 学習可能パラメータ: 70〜73%削減
- チェックポイントサイズ: 71〜73%削減
- 学習時間: 最大50%削減
MIXLORA^9
既存のDenseモデルにLoRAをExpertとして挿入し、後からMoE構造を構築する手法。マルチタスクで最大9%の精度改善、GPUメモリ消費40%削減を報告している。
HILO^10
層ごとにアダプタの数とランクを調整するアプローチ。表現の複雑さが層によって異なることを考慮し、各層に最適な構成を決定する。
適用時の実用的な注意点
| 観点 | 注意点 |
|---|---|
| どこに入れるか | Expert(FFN)だけでなく、Attention層・Routerにも入れるか選択が必要 |
| Routerを学習するか | 一般には凍結が安全。ドメインが大きく異なる場合は微調整が有効なことも |
| Load Balancing | Fine-tuning時にもバランスが崩れる可能性がある。Auxiliary Lossを維持するか検討 |
| メモリ | 全ExpertにLoRAを入れるとLoRA重み数がExpert数倍になる。MoE-Sieve的に絞ると効率が大幅改善 |
| マージ | LoRAのマージはExpertごとに独立して行える |
まとめ
「MoEモデルは普通に学習できるのか?」という最初の疑問への答えをまとめる。
Q. 学習ループはDenseと同じ? 骨格は同じ。コードの見た目はほぼ変わらない。ただし内部ではRouterの勾配近似・Load Balancing・Expert Parallelismなど、Dense にはない機構が動作している。
Q. メモリだけ注意すればOK? メモリが最大の注意点であることは正しい。推論時はアクティブパラメータ分で済んでも、学習時は総パラメータ分のDenseモデルと同等の扱いが必要だ。加えてLoad Balancing設定・Expert Parallelism設計・学習安定化のハイパーパラメータ調整も必要になる。
Q. LoRAはそのまま使える? 使える。ただし全Expert一律適用は非効率で、MoE-Sieve(上位25%のみ)やDR-LoRA(Expertごとにランクを変える)のような特化手法を使うと、大幅にコストを下げながら同等の性能を出せる。
「骨格は同じ・中身は別物」がMoEの学習を一言で表す表現だと思う。
参考文献
- Mixture of Experts Explained (HuggingFace) https://huggingface.co/blog/moe
- MoEs in Transformers (HuggingFace) https://huggingface.co/blog/moe-transformers
- Auxiliary-Loss-Free Load Balancing Strategy for Mixture of Experts https://arxiv.org/abs/2408.15664
- Expert-Router Coupling Loss https://arxiv.org/abs/2512.23447
- Scalable Training of MoE with Megatron Core https://arxiv.org/abs/2603.07685
- Training MoE Models (EngineersOfAI) https://engineersofai.com/docs/llms/mixture-of-experts/Training-MoE-Models
- DR-LoRA: Dynamic Rank LoRA for MoE https://arxiv.org/html/2601.04823v4
- MoE-Sieve: Routing-Guided LoRA https://arxiv.org/html/2603.24044v1
- MIXLORA: Enhancing Large Language Models Fine-Tuning with LoRA-based Mixture of Experts https://arxiv.org/pdf/2404.15159
- HILO: Hierarchical Low-Rank Adaptation https://arxiv.org/pdf/2502.03884