Mixture of Experts(MoE)とルーティングの内部
パラメータを増やしても計算量を増やさない――その魔法の正体が MoE。疎な活性化とルーティングの原理を押さえれば、巨大モデルが安く速い理由と落とし穴が一気に腑に落ちます。
- 1.MoE は FFN を多数のエキスパートに分け、トークンごとに Top-k 個だけ起動する疎な構造。総パラメータ(容量)を増やしても、1トークンあたりの計算量はk個分しか増えないのが核心。
- 2.ルーターが各トークンのエキスパート割り当てを学習するが、放置すると人気エキスパートに偏る。負荷分散損失で利用を均し、容量係数で1エキスパートの受け入れ上限を決めてあふれを drop する。
- 3.総パラメータが多いぶん推論時のメモリと帯域は食うが、活性パラメータは小さい。容量と推論コストを別々に動かせるのが MoE 最大の利点であり、設計上のトレードオフの軸になる。
なぜ「Mixture of Experts」なのか
スケーリング則 が示すとおり、モデルの性能は概ねパラメータ数とデータ量に従って伸びます。しかし密(dense)なモデルでパラメータを増やすと、1トークンを処理する計算量も比例して増え、学習も推論も重くなります。容量と計算コストが密結合しているのが密モデルの宿命です。
Mixture of Experts(MoE) は、この結びつきをほどく仕組みです。発想は単純で、巨大な順伝播層(FFN)を 多数の小さな「エキスパート」に分割し、各トークンに対しては そのうち少数だけを起動します。総パラメータは膨大でも、1トークンが実際に通る経路は一部だけ――この**疎な活性化(sparse activation)**が MoE の心臓です。
Transformer のブロックは大きくアテンション層と FFN 層に分かれます。MoE 化されるのは通常 FFN 層です。アテンションは全トークンの関係を見る都合で共有したまま、FFN を複数のエキスパートに置き換える構成が主流です。Multi-Head Attention の内部 で見たアテンションはそのまま残る、と捉えてください。
疎な活性化:容量と計算量を切り離す
密な FFN では、全トークンが同じ巨大な重み行列を通ります。MoE では FFN を E 個のエキスパート(それぞれが独立した小さな FFN)に分け、各トークンは ルーター(gating network) が選んだ k 個だけを通ります。典型的には k は 1 か 2 です。
密な FFN: x ──▶ [巨大な FFN] ──▶ y (全パラメータが毎回働く)
MoE FFN: x ──▶ [ルーター] ──▶ Top-k 個のエキスパートだけ起動
├─▶ Expert_3 ─┐
└─▶ Expert_7 ─┴─▶ 加重和 ──▶ y
ここで「総パラメータ」と「活性パラメータ」を区別するのが決定的です。
- 総パラメータ: 全エキスパートを足し合わせた量。モデルの**容量(記憶・表現力)**を決める。
- 活性パラメータ: 1トークンが実際に通る量。**計算コスト(FLOPs)**を決める。
エキスパートを E=64 個用意し k=2 だけ起動するなら、総パラメータは密モデルの数十倍でも、1トークンの計算量はおよそ2エキスパート分に留まります。これが「パラメータを増やしても計算量を増やさない」と言われる正体です。
| 観点 | 密(Dense)モデル | MoE モデル |
|---|---|---|
| 総パラメータ | = 活性パラメータ | 活性パラメータより遥かに大きい |
| 1トークンの計算量 | 全パラメータに比例 | Top-k 個のエキスパート分だけ |
| 容量と計算量 | 密結合(同時に増える) | 分離(別々に設計できる) |
| 主なコスト | 計算(FLOPs) | メモリ・帯域(全エキスパート常駐) |
Top-k ゲーティング:ルーターはどう選ぶか
ルーターの実体は小さな線形層1枚です。入力トークンのベクトル x を受け取り、各エキスパートへのスコア(ロジット)を出します。
logits = x · W_router # W_router は [隠れ次元 × エキスパート数 E]
gate = softmax(logits) # E 個のエキスパートへの重み(合計1)
このうちスコア上位 k 個だけを選び、その重みで各エキスパートの出力を加重和します。k 個に絞るのが Top-k ゲーティングです。
ステップ:
1. logits = x · W_router # E 個のスコア
2. top_idx = argtopk(logits, k) # 上位 k 個のエキスパート番号
3. w = softmax(logits[top_idx]) # 選ばれた k 個だけで正規化
4. y = Σ_{i in top_idx} w_i · Expert_i(x) # 加重和
ここで本質的な難しさがあります。「上位 k 個を選ぶ」という argtopk は微分不可能な離散操作です。ではなぜルーターが学習できるのか。答えは、選ばれたエキスパートに掛かる重み w を経由して勾配が流れるからです。あるエキスパートの出力が損失を下げる方向に効けば、その w を大きくするよう(=そのトークンに対するロジットを上げるよう)W_router が更新されます。選択そのものは離散だが、選択後の連続的な重み付けが学習信号になる――この設計が MoE を訓練可能にしています。
k=1(Switch Transformer 型)は計算量が最小で実装も単純ですが、各トークンが1エキスパートしか見ないため学習が不安定になりやすい。k=2 は2つのエキスパートの比較から勾配が得られ、安定とのバランスが良いとされます。k を増やすほど品質は上がりやすい一方、活性パラメータと計算量も比例して増えるため、k は品質と計算コストの直接的なつまみです。
負荷分散:放置すると一部のエキスパートに偏る
MoE には固有の病があります。学習初期にたまたま良く選ばれたエキスパートはさらに更新が進んで賢くなり、ますます選ばれる――という自己強化のループで、ルーターが一部のエキスパートばかり使うようになるのです。これを ルーティングの崩壊(routing collapse) と呼びます。
崩壊すると、多くのエキスパートが事実上未使用になり容量を無駄にします。さらに、人気エキスパートにトークンが殺到すると後述の容量を超えてあふれ、計算の偏りで分散学習の効率も落ちます。
これを防ぐのが 負荷分散損失(load balancing loss / auxiliary loss) です。本来の言語モデル損失(交差エントロピー)に、エキスパート利用の偏りを罰する補助項を足します。直感的には次の量を小さくします。
aux_loss = E × Σ_i ( f_i × P_i )
f_i : エキスパート i に実際に振り分けられたトークンの割合
P_i : エキスパート i へのルーター確率(gate)の平均
E : エキスパート総数(スケール合わせの係数)
f_i × P_i の総和は、全エキスパートに均等(各 1/E)のとき最小になります。特定のエキスパートに f と P が集中するほどこの積の和が大きくなり、損失が増えます。つまりこの補助項は「みんなを均等に使え」という圧力をルーターに掛けます。本損失との重み付けは小さめの係数で調整し、強すぎると品質を損ない、弱すぎると崩壊を許す、という綱引きになります。
f(実際の割り当て)だけを均そうとしても、それは離散的で勾配が流れません。微分可能な P(ルーター確率)を掛けることで、偏りを是正する勾配が W_router まで届くようにしているのが巧妙な点です。f が偏っているエキスパートほど、その P を下げる向きに学習が進みます。
容量係数とトークンの drop
負荷分散損失は「平均的に」均すものの、個々のバッチでは依然として割り当てに偏りが出ます。分散学習では各エキスパートを別デバイスに置くため、1エキスパートが処理できるトークン数に固定の上限を設けて実装します。この上限を決めるのが 容量係数(capacity factor) です。
エキスパート容量 = capacity_factor × (バッチのトークン数 / エキスパート数 E)
capacity_factor が 1.0 なら「均等配分ぴったり」で余裕ゼロ、1.25 なら各エキスパートに25%の余裕を持たせる、という意味です。問題は容量を超えたトークンの扱いです。
- drop(あふれ落とし): 容量を超えたトークンはそのエキスパートでは処理されず、FFN をスキップして残差接続だけで次へ流れる。計算は守れるが、そのトークンはエキスパート処理を受け損ねる。
- 容量係数を上げる: drop を減らせるが、確保メモリと計算が増え、未使用の容量も生まれる。
| 容量係数 | drop の発生 | 計算・メモリ | 向き不向き |
|---|---|---|---|
| 小さい(〜1.0) | 多い(品質を損ねうる) | 最小・効率的 | 推論で負荷分散が効いている場合 |
| 中庸(1.25 前後) | 適度に抑制 | バランス | 学習時の標準的な選択 |
| 大きい(2.0+) | ほぼゼロ | 重い・無駄が出る | drop を絶対に避けたい場面 |
drop は品質低下に直結しうるため、負荷分散損失でそもそも偏らせないのが本筋で、容量係数は安全弁という位置づけです。推論時はバッチ構成が学習時と変わるため drop の挙動も変わり、ここがサービング設計の注意点になります。
推論コストとモデル容量のトレードオフ
MoE の利点と弱点は表裏一体です。容量(総パラメータ)と計算量(活性パラメータ)を分離できるのが利点ですが、その分離が新しいコストを生みます。
最大の現実問題は メモリです。1トークンが通るのは k 個でも、どのエキスパートが選ばれるか事前に分からないため、推論時は全エキスパートをメモリに常駐させておく必要があります。つまり、
- 計算(FLOPs)は活性パラメータ基準で軽い。
- メモリ占有は総パラメータ基準で重い。
という非対称が生じます。KV キャッシュと推論最適化 で見た Decode がメモリ帯域律速だったのと同じ問題圏で、MoE はさらにエキスパート重みの読み出しと、トークンを正しいデバイスへ運ぶ通信が乗ります。
- MoE は FFN を
E個のエキスパートに分け、ルーターが選ぶ Top-k 個だけ起動する 疎活性化。総パラメータ(容量)と活性パラメータ(計算量)を分離する。 - ルーターは線形層+softmax。argtopk は微分不可だが、選ばれた重み経由で勾配が流れるため学習できる。
- 放置すると一部エキスパートに偏る(崩壊)。負荷分散損失(
f_i × P_iの和)で均し、容量係数で上限を決め、あふれは drop。 - 利点=同じ計算で大容量。代償=全エキスパート常駐のメモリとルーティング通信。容量と推論コストを別々に設計できるのが本質。
まとめ:MoE は「容量」と「計算」を分けて設計する道具
MoE を一言でいえば、容量と計算量を独立に動かせるようにする構造です。密モデルでは一蓮托生だった2つを切り離し、「計算は据え置きで容量だけ伸ばす」設計を可能にします。
| 論点 | 実態 | そこから言えること |
|---|---|---|
| なぜ速くて大きいか | Top-k だけ起動する疎活性化 | 総パラメータを増やしても計算量はk個分のみ |
| なぜ偏るか | 良いエキスパートが選ばれ続ける自己強化 | 負荷分散損失と容量係数で均す必要がある |
| 何を drop するか | 容量超過トークンはFFNをスキップ | drop は品質劣化、容量係数は安全弁 |
| 代償は何か | 全エキスパート常駐のメモリと通信 | 計算は軽いがメモリ・帯域・通信が重い |
この見立てがあると、「総パラメータは巨大なのに推論が速い」「でも GPU メモリは大量に要る」「学習でエキスパートが遊んでいる」といった MoE 特有の現象が、疎活性化・負荷分散・容量の言葉で説明できます。LLM と Transformer の FFN を「分割して一部だけ使う」と置き換えるだけで、最新の巨大モデルがなぜ安く動くのかが線でつながります。
AI/機械学習 Article
Mixture of Experts(MoE)とルーティングの内部を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
MoE
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
ルーターが各トークンのエキスパート割り当てを学習するが、放置すると人気エキスパートに偏る。負荷分散損失で利用を均し、容量係数で1エキスパートの受け入れ上限を決めてあふれを drop する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「MoE / LLM」に近いか確認する。
- 強みである「MoE は FFN を多数のエキスパートに分け、トークンごとに Top-k 個だけ起動する疎な構造。総パラメータ(容量)を増やしても、1トークンあたりの計算量はk個分しか増えないのが核心。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。