一、前言

伴隨著大型語言模型以及深度學習領域的發展,MoE(混合專家模型)憑藉它所具備的條件計算特性以及高度的擴展性,逐漸成為了一個研究方面的熱點。這篇文章主要是對MoE模型的一些基本原理、整體的架構設計以及關鍵的核心技術去做一個梳理工作,並且還會結合一些開源的實例,來簡要地描述一下典型的MoE模型在實現方面的主要思路以及它們的應用場景。

二、什麼是MoE?

在對MoE進行深入了解之前,先來回顧一下經典的這個Transformer架構。在標準的Transformer當中,它的每一個Encoder/Decoder層都會包含一個多頭注意力(Multi-Head Attention)以及一個全連接前饋網絡(Feed-Forward Network,通常可以簡稱為FNN)。這個FNN會針對所有的輸入token去執行相同的線性變換以及非線性映射的處理,這樣就會產生稠密的計算並且帶來高昂的資源消耗。

而混合專家模型(Mixture of Experts,簡稱MoE) 這個技術,則是在FNN的這個位置引入了一種“專家”機制:它會把一個大規模的前饋網絡拆分成多個子網絡(也就是專家),並且藉助門控網絡(Router) 來對token進行動態的路由分配。具體來講的話,門控網絡會依據token所具有的特徵(比如說詞嵌入或者是注意力上下文),來計算出針對每一個專家的打分(score),並且只會去激活那些得分最高的K個專家來參與計算,其餘的專家則會保持閒置狀態。通過這樣的方式,整個模型的總參數量就可以達到數千億的規模,但是在每一次實際運算當中實際被激活的參數(Activated Parameters) 僅僅是其中的一小部分,典型的比例大約在5%到15%之間,這就極大程度上降低了計算開銷以及顯存方面的佔用。

  • Transformer與MoE兩者本質上的差異
    • 稠密計算:標準的Transformer架構,它的FNN會對所有的參數一視同仁地進行處理;
    • 條件計算:MoE模型則僅僅會針對部分專家去執行計算任務,從而實現了稀疏激活的效果。
  • 為什麼要進行這樣的設計呢? 其主要的原因囊括以下幾點:
    • 可擴展性方面:在預算允許的情況之下,可以去增加專家的數量,用以來提升模型的整體容量;
    • 效率方面:因為激活的參數比較少,所以能夠馬上降低FLOPs以及顯存的運用;
    • 專業化方面:不同的專家可以“專攻”不同類型的特徵或者是任務,以此來提高整體的性能表現。
試想一下,一座圖書館(就好比是Transformer),它裡邊存放著成千上萬本書籍(這些書籍就好比是參數),要是想要查閱某項信息,你就必須去翻閱所有的書頁;而MoE這個模型呢,它就像是一位圖書管理員(門控網絡),會根據你提出的問題,只去取出那些最為相關的幾本書(專家)來進行閱讀,這樣做既能夠節省時間,又非常高效。

三、MoE的核心組成

MoE的運行主要是依賴於兩大模塊:

  1. 專家(Experts)
    • 每一個專家它本身都是一個獨立的前饋網絡子層(通常情況下是兩層帶有激活函數的線性變換),這就好比是針對模型參數空間當中的一個子集來開展專門的訓練工作(相關內容可以參見《Outrageously Large Neural Networks: The Sparsely‑Gated Mixture‑of‑Experts Layer》)。
    • 專家與專家之間可以去運用不同的切分策略,比如參數聚類(Balanced K‑Means)、共激活圖分割(Co‑activation Graph)或者是梯度感知分割這樣的方法,目的就是為了保證每一個專家都能夠在它所專長的領域之內擁有最優的參數配置方案。
  2. 門控網絡(Router)
    • 輸入x會經過一個線性映射得到專家打分結果H(x)=xW\_g,然後還會加入可學習的噪聲來實現平滑化的處理:H'(x)=H(x)+SoftPlus(xW\_n)⊙𝒩(0,1)(這個過程被稱為Noisy Gating)。
    • 它會選用Top‑K選擇策略:保留K個得分最高的專家,在進行歸一化之後輸出G(x)=Softmax(KeepTopK(H'(x),K))這個結果,並且會把輸入分配給這K個被選中的專家。
    • 同時還會輔以一個輔助負載損失L\_aux=λ·CV(n\_1,…,n\_E),用以確保Token分配到各個專家那裡的樣本量的方差能夠達到最小化,從而避免出現“熱門專家”過載的這種情況。

四、MoE為什麼會如此高效?

1. 憑藉條件計算來降低FLOPs

標準的Transformer模型裡邊的FNN,它需要對全部N個專家子層以及所有的輸入Token都去執行同樣的計算工作,其複雜度是O(N·d^2)這個級別;然而MoE模型只是去激活K個專家,使得複雜度得以降低到O(K·d^2)。在K遠小於N的這種情況之下,計算量方面就能夠實現接近N/K倍的線性下降。

2. 參數的過度配置以及表示能力

超大規模的模型往往需要運用大量的參數才能夠擬合複雜的模式,而稠密化的增長方式則會導致運算方面的瓶頸。MoE模型憑藉稀疏路由的機制,在訓練過程當中允許存在數倍於激活參數的全局參數量(E·d^2),從而提升了模型對於多樣化模式的捕捉能力。

3. 專家化分工以及分佈式並行處理

每一個專家僅僅需要去學習子空間當中的特徵,以此來實現功能上的分工;而專家並行(Expert Parallelism)這種方式會把不同的專家部署在不同的設備上面,從而減少了主幹網絡進行同步時所產生的開銷。基於Pipeline並行或者是Tensor並行的方式,可以獲得更高的吞吐率以及更低的延遲表現(相關內容可以參見《GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding》)。

4. 實踐驗證

  • GLaM這個模型在擁有1.2萬億參數規模的情況下,僅僅激活了8%的參數,並且在29項NLP任務上面超越了擁有175B參數的GPT‑3,這充分展示了條件計算所具有的優勢。
  • Switch Transformer所採用的Top‑1路由策略,使得吞吐率得到了接近2倍的提升,同時還保持了任務性能方面的表現沒有降低。

五、關於MoE的技術細節

傳統意義上的那些大型神經網絡(比如說最常見的Transformer模型),它們就好像是一個“全能型選手”一樣,每一次在去處理數據的時候,都必須要調用到全部的參數來參與計算,這樣的方式它的成本是比較高的。

然而MoE模型它所運用的則是一種“按需調用”(也就是條件計算)的方法,僅僅讓一部分專家去參與到計算過程當中,從而避免了那些無謂的資源浪費情況的發生。

1. 稀疏激活與激活參數

Transformer架構中的FFN層,在理論上需要對所有的token都執行完整的計算,但是在實際測試當中發現,僅僅只有部分的神經元會被觸發——這就呈現出了一種天然的稀疏性(參見《MoEfication: Transformer Feed-forward Layers are Mixtures of Experts》)。MoE正是基於這一點,把一個大規模的FNN切分成為E個所謂的“專家”,並且讓門控網絡針對每一個token只去選擇K個專家來參與後續的計算:

指標說明
總參數量可以高達數十億甚至上千億的級別
激活參數量約等於總參數量乘以 (K/E) 這個比例,通常所佔比重在 5% 到 15% 之間
帶來的優勢FLOPs 以及顯存方面的開銷會成比例下降,顯著提高訓練和推理過程的效率

2. 門控網絡以及路由策略的運作

專家的挑選工作是由門控網絡(Router) 來完成的,常見的實現方式如下所示:

  1. 進行線性映射:H(x)=xW\_g
  2. 進行噪聲注入:H'(x)=H(x)+g·StandardNormal()⊙SoftPlus(H(x))(這個過程也稱作Noisy Gating)
  3. 取Top-K結果:G(x)=Softmax(KeepTopK(H'(x),K))
  • Top-2 vs. Top-1:GShard模型選用了Top-2的策略並且會對輸出進行混合,以此來提升整體的魯棒性;而Switch Transformer模型則選用了Top-1的策略,目的是為了簡化通信方面的複雜度(參見《GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding》以及《Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity》)。
  • 分層稀疏:Qwen3這類模型會在不同的網絡深度動態地去調整K值的大小,以此來實現更為細緻顆粒度的條件計算。

3. 負載均衡和輔助損失

部分專家可能會因為打分偏高而持續被激活,從而造成了過載的現象。為了防止出現資源分配不均的情況,MoE引入了一種輔助負載損失(Auxiliary Load Loss) 的機制,它通常被定義為專家所接收到的token數量的變異係數:

L\_aux = λ · CV(n₁, n₂, …, n\_E) 在這個公式當中,nᵢ代表的是第i個專家在當前這個批次中所處理的token數量,而λ則是一個平衡權重。

該損失項在預訓練的過程當中會與主損失一同進行優化,目的是為了確保各個專家的利用率能夠大致保持均勻(可以參考GShard模型以及transformers庫當中關於aux\_loss的具體實現)。

六、一些經典的MoE模型實例

下面按照時間順序來介紹若干具有代表性的開源MoE模型:

1. Sparsely-Gated Mixture-of-Experts Layer(2017)

由Shazeer等人(來自Google Brain團隊)提出(參考論文《Outrageously Large Neural Networks: The Sparsely‑Gated Mixture‑of‑Experts Layer》),首次把門控路由機制引入到了前饋層當中,運用了可學習的噪聲Top‑K門控(Noisy Top‑K Gating)技術,並且提出了一種輔助負載損失(Auxiliary Load Loss)的方法,用以平衡各個專家之間的負載情況。奠定了條件計算(Conditional Computation)的基石,實現了大規模參數下的稀疏激活與高效訓練。

2. GShard(2020)

由Lepikhin等人(來自Google Research團隊)提出,相關論文為《GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding》。在Transformer的每一個FNN層當中都部署了Top‑2門控的MoE結構,引入了專家容量(capacity)這個概念,並且能夠自動地把專家劃分到多台機器的多個顯卡上;同時還選用了隨機路由以及負載平衡方面的策略。實現了跨機專家並行(Expert Parallelism)以及自動化的參數分片,支持6000億級參數模型的訓練與推理,顯著提升了模型的可擴展性。

3. Switch Transformer(2021)

由Fedus等人(來自Google Research團隊)提出,相關論文為《Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity》。提出了一種Top‑1門控的策略,它使得每一個token都只會去訪問單個的專家,從而簡化了通信的複雜度;同時引入了容量因子(Capacity Factor)這個概念,用以優化專家的負載的情況;還支持運用bfloat16格式來進行訓練。在溝通開銷以及吞吐率這兩個方面之間取得了一個較好的平衡,提出了一種更為輕量級的MoE實現方案,把模型的規模擴展到了1萬億參數的級別,同時還保持了較高的效率。

4. GLaM(2021)

由Du等人(來自Google Research團隊)提出,相關論文為《GLaM: Efficient Scaling of Language Models with Mixture-of-Experts》。模型擁有64個專家,並且在每一層會激活其中的2個;選用了Mixture-of-Modality的路由策略,會把不同模態(比如文本、編碼等)的任務定向到不同的專家那裡去處理;激活的參數僅僅佔到了總參數量的8%。證明了稀疏激活這種方式不僅能夠保持原有的性能,還能夠進一步優化多模態學習以及多任務學習的效果,從而極大的推動了MoE在大型預訓練模型當中的應用。

5. DeepSeek-MoE(2024)

由DeepSeek AI團隊提出,相關論文為《DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models》。採用了細粒度專家切分(也就是Fine-Grained Expert Segmentation)的技術,把FFN分成了多個較小的專家;同時引入了共享專家(Shared Experts)的機制來處理那些公共知識;每一個token會激活6個專家。在提高專家專業化程度以及減少冗餘信息這兩個方面提供了一些新的思路,展示了多專家融合以及共享機制所具有的潛力。

6. LLaMA-MoE(2024)

由Sys4NLP團隊基於Meta LLaMA2進行開發,可參考《LLaMA-MoE: Building Mixture-of-Experts from LLaMA with Continual Pre-training》。它支持包括隨機、聚類、共激活圖等在內的多種專家切分方法;同時還提供了Top‑K噪聲門控以及Switch單專家門控這兩種不同的策略;專家參數的設計也趨向於輕量化。展示了MoE在輕量級模型上面的一條應用路徑,為那些中等規模以及小規模參數的模型提供了一種可行的擴展策略。

7. Qwen3-235B-A22B(2025)

由阿里巴巴通義千問團隊發布,可參考官方文檔以及模型的開源倉庫相關信息。總參數量達到了2350億,擁有128個專家;運用了分層稀疏調度的機制來動態調整激活的專家數量,單個token會激活8個專家;原生就支持32K的上下文長度,並且可以藉助YaRN技術擴展到128K;還運用了GQA注意力機制以及異步卸載等技術來優化並行計算的效率。融合了分層調度以及動態激活這兩種技術,為處理超長文本以及應對高吞吐場景提供了一套全新的解決方案,並且進一步降低了進行推理時所產生的成本。

七、MoE的適用場景以及其局限性分析

在實際的部署過程當中,MoE與傳統的Transformer架構各有其優勢所在,需要根據具體的資源情況以及需求來進行選擇:

  • 多機器、高吞吐量的場景更適宜選用MoE
    • 專家並行機制:MoE模型當中的專家子網絡可以被拆分到多台機器或者是多個設備上面去並行執行(這個機制被稱為Expert Parallelism),每一台機器只需要去負責少數幾個專家的計算任務,這就避免了因為需要複製整個模型而帶來的顯存方面的壓力。
    • 條件路由方式:門控網絡僅僅需要去傳遞那些必要的路由信息,而不需要去同步所有的參數,這樣一來,通信方面的開銷就得到了顯著的降低,整體的吞吐率也得到了明顯的提升。
    • 彈性擴展能力:當計算集群的規模得到擴容的時候,只需要去增加或者是重新分配專家就可以了,模型的容量與硬件資源之間實現了高度的解耦。
  • 單機器、低顯存或是低吞吐需求的場景更適宜選用稠密Transformer
    • 路由與調度方面的開銷:MoE模型在進行門控計算、專家狀態管理以及跨設備通信這些操作時所產生的開銷,在單機應用場景當中所佔的比重會有所提升,反而可能會增加延遲並且提高實現的複雜度;
    • 部署相對簡單:標準的Transformer架構不需要額外的負載均衡或者是路由策略,相關的代碼和框架也比較成熟,模型的體積與運行效率之間更容易進行權衡;
    • 資源運用效率:對於那些顯存以及算力都比較有限的環境,可以藉助剪枝、量化或者是蒸餾等方法來對稠密網絡進行優化,以此來獲得更高的性價比。

八、總結與展望

回顧MoE模型一路走來的發展脈絡,我們可以觀察到,從最初的“噪聲Top‑K門控”到後來的“跨機器自動分片”,再到諸如“單專家路由”、“多模態專家”、“細粒度切分”以及“分層稀疏調度”等一系列的創新,每一次的技術迭代都是在努力追求“更大的模型容量”與“更少的計算資源消耗”這兩者之間的平衡點。MoE的核心思想在於條件計算(Conditional Computation)這個機制,它賦予了模型高度的可擴展性以及高效性,但與此同時,也帶來了在路由、負載均衡以及通信等方面的一些挑戰。

MoE已經成為了深度學習大模型領域當中的一個重要分支,去理解它的設計原理以及應用場景,對於推動下一代高效智能系統的發展是至關重要的。


一些詞語

Token:它指的是模型在去進行文本處理工作的時候,所用到的最小的一個單位,打個比方,它可以是一個漢字,或者說是一個英文單詞。

參數(Parameters):它指的是神經網絡當中那些可以被訓練的數值,就好比是樂高積木的那些塊數一樣,參數越多,模型也就會越複雜。

條件計算(Conditional Computation):這種機制它是依據輸入的內容,僅僅去激活模型當中的一部分專家來開展運算工作,這就好比是去請教那些專門領域的老師,而不是去召開一個全體人員都參加的會議。

專家(Expert):它指的是在MoE模型裡面所包含的子網絡,每一個專家都會去負責處理特定類型的數據或者是特徵方面的工作,這就好比是不同領域裡面的那些專家老師一樣。

門控網絡(Router/Gating Network):它是一個用來決定每一個輸入的token應該被分配給哪些專家去進行處理的模塊,就好像是一個負責分配任務的調度員那樣。

激活參數(Activated Parameters):它指的是在一次計算過程當中,實際會參與到運算裡面的參數的數量,這個數量通常會遠遠小於模型的總參數量。

稀疏激活(Sparse Activation):它的意思是在每一次計算的時候,都僅僅去激活一部分的專家或者是參數,這樣做可以達到節省計算資源的目的。

稠密模型(Dense Model):它指的是傳統的那些模型,這類模型在每一次進行計算的時候,都需要去調用全部的參數來參與,這就好比是所有成員都要參加會議一樣。

FLOPs(浮點運算次數):它是一個用來衡量模型計算量大小的指標,這個值越低,就代表著計算過程越節省資源。

顯存(GPU Memory):它指的是顯卡上面用來去存儲模型參數以及那些中間結果的空間,顯存方面的消耗越低,就越容易去進行大模型的部署工作。

前饋網絡(Feed-Forward Network,FFN):它是Transformer架構當中的一類神經網絡層,主要負責對輸入數據去進行非線性變換的處理工作。

多頭注意力(Multi-Head Attention):它是Transformer架構當中的一種機制,這種機制可以讓模型能夠同時去關注輸入內容的不同組成部分。

Top-K選擇/路由(Top-K Routing):它指的是門控網絡會去選擇那些得分最高的K個專家來參與到計算當中的一種策略。

Noisy Gating(噪聲門控):它的意思是在進行專家選擇的這個環節,會引入一些噪聲進來,目的是為了提升模型的魯棒性以及改善負載均衡方面的情況。

輔助負載損失(Auxiliary Load Loss):它是一種特定類型的損失函數,人們運用它來對各個專家的工作量進行平衡,用以防止那些熱門專家出現過度繁忙的情況。

變異係數(Coefficient of Variation,CV):它是一個用來衡量各個專家負載均衡程度的統計學上的量,CV這個值越小,就表示分配得越均勻。

專家並行(Expert Parallelism):這種方式會把不同的專家分佈到多台機器上面去,每一台機器僅僅會去執行它自己所負責的那個子網絡的任務。

分佈式並行(Distributed Parallelism):它指的是把模型或者是數據分佈在多台設備上面,來同時進行計算工作,目的是為了提高整體的效率。

Pipeline並行:這種方式是把模型的不同部分分配到不同的設備上面去,就像是一條流水線那樣,分步驟地去進行數據的處理工作。

Tensor並行:它是指把單個神經網絡層的計算任務分散到多台設備上面去,來並行地進行執行。

容量因子(Capacity Factor):它是一個用來控制每一個專家最多能夠去處理多少個token的參數,目的是為了防止單個專家出現過載的情況。

專家容量(Expert Capacity):它指的是每一個專家在一次前向計算過程當中,所能夠處理的最大的token數量。

細粒度專家切分(Fine-Grained Expert Segmentation):它是把前饋網絡進一步地拆分成更多、並且更小的一些專家,用以來提升整體的專業化程度。

共享專家(Shared Experts):它指的是那些為多個任務或者是多個輸入所共享的專家,它們主要負責去處理那些通用的知識。

分層稀疏(Hierarchical Sparsity):這種方法會在不同的網絡層級當中,動態地去調整被激活的專家的數量,以此來實現更為細緻的條件計算。

GQA(Grouped Query Attention):它是一種非常高效的注意力機制,能夠有效提升大型模型在進行推理工作時的效率。

異步卸載(Asynchronous Offloading):它是把一部分的計算任務或者是數據,以異步的方式轉移到其他的設備上面去,目的是為了優化整體的資源利用情況。

Mixture-of-Modality:這種機制是依據輸入的模態(比如說文本、編碼等等),來分配到不同的專家那裡去進行處理,用以提升模型在進行多模態處理工作方面的能力。

剪枝(Pruning):它是指去除掉模型當中那些不太重要的參數,以此來減少模型的體積以及計算量方面。

量化(Quantization):它是運用更低精度的數據類型來對參數進行存儲和計算工作,從而達到降低資源消耗的目的。

蒸餾(Distillation):它是運用一個大型模型來對一個小模型進行訓練,目的是為了讓這個小模型能夠繼承那個大型模型所擁有的能力。

路由(Routing):它指的是門控網絡為每一個輸入的token去選擇合適的專家的那整個過程。

主損失(Main Loss):它是在進行模型訓練的時候,所設定的主要的優化目標,打個比方,就像是交叉熵損失這樣的。

輔助損失(Auxiliary Loss):它是一個輔助性的優化目標,主要被運用來提升模型在某些特性(比如說負載均衡)方面的表現。

專家切分(Expert Partitioning):它指的是把一個大型網絡劃分成為多個專家的這個過程,可以運用諸如聚類、圖分割等方法來實現這個目標。

共激活圖分割(Co-activation Graph Partitioning):它是一種依據神經元激活的相關性來對專家進行劃分的方法。

梯度感知分割(Gradient-aware Partitioning):它是一種依據梯度信息來對專家進行劃分的方法。

專家路由(Expert Routing):它指的是把輸入分配給合適的專家的那整個過程。

Top-1/Top-2 路由:它指的是每一個token僅僅會被分配給那些得分最高的1個或者是2個專家。

容量(Capacity):這個概念它指的是每一個專家在一次前向計算的過程當中,所能夠處理的最大的token數量。

激活比例(Activation Ratio):它指的是在每一次計算當中,那些被激活的參數佔到總參數數量的那個比例。

吞吐率(Throughput):它指的是在單位時間之內,模型所能夠去處理的數據量的大小,這個值越高,就代表著效率越好。

延遲(Latency):它指的是模型在去處理一次輸入的時候所需要花費的時間,這個時間越低自然是越好的。

自動分片(Automatic Sharding):它是指自動地把模型的參數分配到多台設備上面去,用以來提升並行計算的效率。

bfloat16:它是一種低精度的浮點數格式,經常被運用在大型模型的訓練過程當中,能夠起到節省顯存的作用。

YaRN技術:它是一種用來擴展上下文長度的技術,能夠提升大型模型在去處理長文本內容方面的能力。