
第2部 モデルとは何か第26章 NEW
MoE(Mixture of Experts)
「671Bなのに37B並みの速さ」はなぜ成り立つのか。ルーターがトークンごとに少数の専門家だけを呼び出す仕組みと、その代わりに払うメモリの代償を見ていきます。
このページの内容(9項目)
「総パラメータ1.6兆、ただし1トークンあたり490億だけ使用」——どういう意味?
最近のモデルカードには、パラメータ数が2つ並んでいることがよくあります。DeepSeek-V4-Proなら「1.6T(49B activated)」、gpt-oss-120bなら「117B(5.1B active)」。大きいほうがモデル全体の重みの量、小さいほうが1トークンを計算するときに実際に使う重みの量です。この2つの数字の差を生んでいるのが、この章の主役 MoE(Mixture of Experts、混合エキスパート) です。
MoEとは:全員ではなく「呼ばれた人だけ」が働く
ひとことで言うと
MoEは、Transformerの中の計算ブロック(主にFFN)を何十〜何百個もの「エキスパート」に分け、トークンごとにルーターが選んだ数個だけを計算させる設計です。知識をしまう場所は大きく、1回の計算は小さく保てます。
普通のモデル(密なモデル、dense model)は、どのトークンを処理するときも全部の重みを使います。8Bモデルなら、1トークンごとに80億個の重みすべてと掛け算をします。
MoEモデルでは、層の中にエキスパートと呼ばれる小さなFFNがたくさん並んでいて、その前にルーター(router、ゲートとも呼ぶ)が立っています。ルーターは入ってきたトークンを見て「このトークンは3番と17番に任せよう」と決め、選ばれたエキスパートだけが計算します。ほかのエキスパートはそのトークンについては休んでいます。
MoEは「受付のある総合病院」に似ています。受付(ルーター)が患者(トークン)を見て、内科と眼科へ回す。病院には何十人もの医師(エキスパート)が在籍していますが、1人の患者を診るのは数人だけです。病院の規模(総パラメータ)は大きくても、1人あたりの診察の手間(計算量)は小さく済みます。
ただし、このたとえには落とし穴があります。本物の病院のように「数学の専門家」「法律の専門家」がきれいに分かれているわけではありません。これは後の「よくある誤解」で扱います。
ルーターとtop-k:誰を呼ぶかの決め方
ルーターの中身は意外と単純で、トークンのベクトルに小さな行列を掛けて「各エキスパートへの点数」を出すだけです。点数の高い上位k個のエキスパートを選ぶので、これを top-kルーティング と呼びます。
flowchart TD T["トークンのベクトル"] --> R["ルーター
各エキスパートに点数"] R -->|"上位k個を選ぶ"| E1["エキスパート3"] R -->|"上位k個を選ぶ"| E2["エキスパート17"] R -.->|"選ばれない"| E3["ほかの多数の
エキスパート"] E1 --> M["点数で重み付けして合算"] E2 --> M M --> N["次の層へ"]
選び直しはトークンごと、層ごとに行われます。同じ文の中でも単語ごとに違うエキスパートが呼ばれ、同じ単語でも1層目と20層目では別のエキスパートが担当します。「質問1つにつき1人の専門家」ではない点に注意してください。
kの値はモデルによって違います。初期の大規模MoE研究(2017年のShazeerらの論文)で現在の形が広まり、Switch Transformer(2021年)はk=1まで減らしても学習できることを示しました。最近のモデルでは、多数の細かいエキスパートから4〜10個程度を選ぶ構成がよく見られます。
総パラメータと有効パラメータ
MoEを理解するいちばんの鍵は、2種類のパラメータ数を区別することです。
| 呼び名 | 意味 | 効いてくるもの |
|---|---|---|
| 総パラメータ(total) | 全エキスパートを含むモデル全体の重み | 必要なメモリ・ディスク容量 |
| 有効パラメータ(active / activated) | 1トークンの計算で実際に使う重み | 1トークンあたりの計算量・速度の目安 |
モデル名にこの2つが書き込まれていることもあります。Qwen3-30B-A3Bは「総30.5B、有効3.3B」、Qwen3-235B-A22Bは「総235B、有効22B」です。名前の後半の「A3B」「A22B」が有効パラメータを表しています。
注意したいのは、パラメータ数だけで賢さは決まらないことです。MoEの売りは「使う計算量のわりに多くの知識をしまっておける」点ですが、同じ有効パラメータの密なモデルより賢いか、同じ総パラメータの密なモデルにどこまで迫るかは、モデルごとに評価してみないとわかりません(評価の考え方は第30章)。
なぜメモリは全員分必要なのか
ひとことで言うと
計算は少数のエキスパートで済みますが、次のトークンでどのエキスパートが呼ばれるかは事前にわかりません。だから全エキスパートをすぐ使える場所に置いておく必要があります。
病院のたとえでいえば、患者が来るまでどの科が必要かわからないので、全医師に出勤してもらっておく必要がある、ということです。Metaも Llama 4 の発表で、すべてのパラメータはメモリに保持されるが、推論時に活性化されるのはその一部だけ、と説明しています。
具体的な数字で見てみましょう。DeepSeek-V3は総671B・有効37Bです。計算量は37Bの密なモデルに近いのに、重みは671B分あります。4bitに量子化しても単純計算で約335GB(6710億 × 4bit ÷ 8)になり、家庭用GPU1枚には到底載りません。
下のウィジェットで、総パラメータと有効パラメータのそれぞれを入れてみてください。メモリ量を決めるのは総パラメータのほうです。
一方で、速度の面ではMoEに大きな利点があります。トークン生成(デコード)は「重みをメモリから読み出す速さ」が律速になりやすく、MoEでは1トークンごとに読む重みが有効パラメータ分だけで済みます。そのため、メモリにさえ載れば、同じ総サイズの密なモデルよりずっと速く文字が出てきます。
実例で見るMoE
主なMoEモデルの公開値を並べます。数字はいずれもモデルカードや公式発表で確認したものです 2026年10月時点。
| モデル | 総 / 有効 | エキスパート構成 |
|---|---|---|
| Mixtral 8x7B(2023年) | 46.7B / 12.9B | 各層8個から2個を選ぶ |
| DeepSeek-V3 / R1 | 671B / 37B | ルーティング対象256個から8個+共有1個 |
| Qwen3-235B-A22B | 235B / 22B | 128個から8個 |
| Qwen3-30B-A3B | 30.5B / 3.3B | 128個から8個 |
| gpt-oss-120b | 117B / 5.1B | 128個から4個 |
| gpt-oss-20b | 21B / 3.6B | 32個から4個 |
| Llama 4 Scout | 109B / 17B | 16エキスパート |
| Llama 4 Maverick | 400B / 17B | 128個のうち1個+共有1個 |
| Qwen3.5-397B-A17B | 397B / 17B | 512個から10個+共有1個 |
| DeepSeek-V4-Pro(プレビュー) | 1.6T / 49B | 384個から6個+共有1個 |
「Mixtral 8x7B」という名前から「7B×8=56B」と考えがちですが、実際は46.7Bです。エキスパートになるのはFFN部分だけで、アテンションや埋め込みは全員で共有しているからです。名前の掛け算をそのまま信じないようにしましょう。
傾向としては、エキスパートを「少数・大きめ」から「多数・小さめ」にし、そこから数個を選ぶ方向へ進んでいます。細かく分けたほうが組み合わせの自由度が増え、役割分担が進みやすい、というのがDeepSeekMoE論文などの主張です。
負荷分散と共有エキスパート
MoEを学習させると、ルーターが一部の人気エキスパートばかりを選ぶ「えこひいき」が起きがちです。呼ばれないエキスパートは学習が進まず、ますます呼ばれなくなります。GPUを並べて分担している場合は、人気エキスパートを担当するGPUだけが渋滞します。
そこで 負荷分散(load balancing) の工夫が必要になります。代表的なのは次の2つです。
- 補助損失(auxiliary loss): 「各エキスパートへの割り当てが均等なほど良い」という罰則項を学習の目的に足す方法。Switch Transformerなどで使われました。均等さを強く求めすぎると本来の性能が落ちるのが悩みどころです。
- 補助損失なしのバランス調整: DeepSeek-V3は、エキスパートごとのバイアス値をルーターの点数に足し、混みすぎたエキスパートは選ばれにくく、空いているエキスパートは選ばれやすくなるよう調整する方式を採用しました。
もうひとつの工夫が 共有エキスパート(shared expert) です。ルーターに関係なく、すべてのトークンが必ず通るエキスパートを1つ置きます。文法のような「誰にでも必要な共通知識」は共有エキスパートに任せ、ルーティング対象のエキスパートは個別の役割に集中しやすくする狙いです。病院でいえば「全員がまず通る総合診療科」です。DeepSeek-V3、Llama 4 Maverick、Qwen3.5などが採用しています。
ローカルで動かすときの勘所
MoEは、ローカル実行の世界でも存在感が大きくなっています。理由は「メモリは大量に必要、でも1トークンの計算は軽い」という性質が、GPUのVRAMは少ないがメインメモリはそこそこある、というパソコンの事情と相性がよいからです。
代表的なテクニックが、エキスパートだけをCPU側のメモリに置く 方法です。アテンションや共有部分のように毎トークン必ず使う重みはGPUに置き、トークンごとに一部しか使わないエキスパートの重みはメインメモリに置いてCPUで計算させます。llama.cpp(第7章)には、このためのオプションがあります。
| オプション | 働き |
|---|---|
--cpu-moe(-cmoe) | すべてのMoEエキスパートの重みをCPU側に置く |
--n-cpu-moe N(-ncmoe) | 最初のN層分のエキスパートをCPU側に置く |
--override-tensor(-ot) | テンソル名のパターンごとに置き場所を細かく指定する |
# まず全部GPUに載せる指定をし、エキスパートだけをCPUへ逃がす例
llama-server -m model.gguf -ngl 99 --cpu-moe
# VRAMに余裕があれば、CPUへ逃がす層を減らしていく
llama-server -m model.gguf -ngl 99 --n-cpu-moe 20
オプション名は llama.cpp の server README で確認したものです 2026年10月時点。変わることがあるので、手元のバージョンで --help を確認してください。
量子化(第10章)との関係も重要です。MoEでは重みの大半がエキスパートなので、エキスパート部分をどれだけ小さくできるかが総メモリをほぼ決めます。gpt-oss はMoEの重みをMXFP4という4bit系の形式で後学習しており、その結果 gpt-oss-120b は80GBのGPU1枚、gpt-oss-20b は16GBのメモリに収まると公式に説明されています。
注意
CPUオフロードは「載らないものを動かせる」技術であって、速度はメインメモリの帯域で頭打ちになります。また、プロンプトを読み込む段階(プリフィル)は多くのトークンを一度に処理するので、トークンごとにばらばらのエキスパートが呼ばれ、結局多くのエキスパートを読むことになります。長いプロンプトでは待ち時間が増えることを覚えておきましょう。
よくある誤解
MoEのエキスパートは「数学担当」「プログラミング担当」のように分野ごとの専門家だ
Mixtralの論文は、話題(分野)に基づく明確な割り当てパターンは見られず、むしろ構文的な傾向に沿っていたと報告している。「エキスパート」は学習で自然に決まる分担の名前にすぎない
有効パラメータが37Bなら、37Bの密なモデルと同じメモリで動く
メモリに必要なのは総パラメータ分。37Bに近いのは1トークンあたりの計算量のほう
「8x7B」なら総パラメータは56B
アテンションなどは共有なので、Mixtral 8x7Bの総パラメータは46.7B
確認クイズ
Q2. ルーターはどの単位でエキスパートを選び直す?
トークンごと、かつ層ごとです。1つの質問や1つの文につき1人の専門家が決まるわけではありません。
Q3. 共有エキスパートは何のためにある?
すべてのトークンが必ず通るエキスパートを置き、共通して必要な知識をそこに集めるためです。ルーティング対象のエキスパートが個別の役割に集中しやすくなります。
Q4. llama.cppでVRAMが足りないMoEモデルを動かすとき、まず試すとよいオプションは?
--cpu-moe や --n-cpu-moe N です。毎トークン使う共通部分はGPUに置き、エキスパートの重みをCPU側のメモリに逃がします。
この章のまとめ
- MoEは、層の中のFFNを多数のエキスパートに分け、ルーターがトークンごと・層ごとに上位k個だけを選んで計算させる設計。
- 総パラメータはメモリ量を、有効パラメータは1トークンあたりの計算量を決める。2つを混同しない。
- 学習では負荷の偏りを防ぐ工夫(補助損失、バイアス調整)や、全トークンが通る共有エキスパートが使われる。
- エキスパートは分野別の専門家ではなく、学習で自然に決まる分担。
- ローカル実行では、エキスパートをCPU側に置くオフロードと、エキスパート部分の量子化が効く。
さらに深く学ぶ
この章の内容をもう一歩掘り下げるための原典です。
- Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layerゲートで一部の専門家だけを動かす「疎なMoE層」を大規模に実現した論文。いまのMoE LLMの直接の祖先です。
- Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity各トークンを1つの専門家だけに送る単純な設計で、学習を安定させつつ兆パラメータ級に拡大した論文。
- Mixtral of Experts8個の専門家から2個を選ぶオープンウェイトのMoEモデルの報告。専門家が話題ごとに分かれるわけではない、という分析も興味深い点です。
- DeepSeek-V3 Technical Report総パラメータ671B・アクティブ37BのMoEモデルの報告。補助損失を使わない負荷分散やMTPなど、最新の工夫がまとまっています。
出典・参考
- Shazeer et al., Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer(arXiv:1701.06538)
- Fedus et al., Switch Transformers(arXiv:2101.03961) — top-1ルーティングと負荷分散の補助損失
- Jiang et al., Mixtral of Experts(arXiv:2401.04088) — 8エキスパート中2個、ルーティング分析
- Mistral AI: Mixtral of experts — 総46.7B・有効12.9B
- Dai et al., DeepSeekMoE(arXiv:2401.06066) — 細かいエキスパート分割と共有エキスパート
- DeepSeek-V3 Technical Report(arXiv:2412.19437) — 補助損失なしの負荷分散
- deepseek-ai/DeepSeek-V3(Hugging Face) — 総671B・有効37B、config.json(2026年10月確認)
- deepseek-ai/DeepSeek-V4-Pro(Hugging Face) — プレビュー版、総1.6T・有効49B、config.json(2026年10月確認)
- Qwen/Qwen3-235B-A22B、Qwen/Qwen3-30B-A3B、Qwen/Qwen3.5-397B-A17B(Hugging Face、2026年10月確認)
- openai/gpt-oss-120b(Hugging Face) — 総117B・有効5.1B、gpt-oss-20bの値、MXFP4(2026年10月確認)
- Meta AI: The Llama 4 herd — Scout 109B/17B、Maverick 400B/17B、共有エキスパート
- llama.cpp server README(GitHub) —
--cpu-moe、--n-cpu-moe、--override-tensor(2026年10月確認)