3081 文字
15 分
MoEモデルは普通のモデルと同じように学習できる? Denseとの違いを基礎から整理
この記事について

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 / Gatehidden stateから各Expertへのスコアを計算し、Top-K個を選択する小さなネットワーク
Top-K選択スコア上位K個のExpertのみを活性化。K=1(Switch Transformer)やK=2(Mixtral)が代表的

代表的なMoEモデルのスペック#

モデル総パラメータアクティブパラメータExpert数Top-K
Mixtral-8x7B約46.7B約12.9B82
DeepSeek-V3671B37B256(+1 shared)8
Qwen3-235B-A22B235B22B1288
Qwen3.6-35B-A3B35B3B

なぜ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を完全に排除する。

  1. 各Expertに動的バイアスを付与しRoutingスコアに加算
  2. 各学習ステップ後、Expertの負荷を観測
  3. 高負荷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 BalancingFine-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の学習を一言で表す表現だと思う。


参考文献#

  1. Mixture of Experts Explained (HuggingFace) https://huggingface.co/blog/moe
  2. MoEs in Transformers (HuggingFace) https://huggingface.co/blog/moe-transformers
  3. Auxiliary-Loss-Free Load Balancing Strategy for Mixture of Experts https://arxiv.org/abs/2408.15664
  4. Expert-Router Coupling Loss https://arxiv.org/abs/2512.23447
  5. Scalable Training of MoE with Megatron Core https://arxiv.org/abs/2603.07685
  6. Training MoE Models (EngineersOfAI) https://engineersofai.com/docs/llms/mixture-of-experts/Training-MoE-Models
  7. DR-LoRA: Dynamic Rank LoRA for MoE https://arxiv.org/html/2601.04823v4
  8. MoE-Sieve: Routing-Guided LoRA https://arxiv.org/html/2603.24044v1
  9. MIXLORA: Enhancing Large Language Models Fine-Tuning with LoRA-based Mixture of Experts https://arxiv.org/pdf/2404.15159
  10. HILO: Hierarchical Low-Rank Adaptation https://arxiv.org/pdf/2502.03884
MoEモデルは普通のモデルと同じように学習できる? Denseとの違いを基礎から整理
https://yurudeep.com/posts/deeplearning/2026/20260427/
作者
ひらノルム
公開日
2026-04-27
ライセンス
CC BY-NC-SA 4.0