稠密模型每次都動用全部
在一般的——*稠密*——模型裡,每個 token 每一步都經過每一個參數。參數加倍,每個 token 的運算就加倍。這個線性耦合就是那道牆:更多參數有幫助,但你每一個 token 都得為它們全部付費,永遠如此,訓練與推論皆然。
混合專家(MoE)打破這個耦合。把區塊裡單一的前饋網路換成許多並行的前饋網路——專家——但讓每個 token 只路由經過其中幾個。一個模型可以裝下 6000 億參數的知識,而任一 token 只碰到 300 億。你買到了容量,卻不必買運算。
路由器決定誰來幹活
MoE 層的腦袋是一個叫路由器(router)或閘(gate)的小網路。對每個 token,MoE 路由為所有專家評分,挑出最高的幾個——常是從比方 64 個中取 top-2——只把 token 送給那幾個,再依路由分數加權混合它們的輸出。路由器與其他一切一起學:訓練過程中,專家悄悄分工,路由器學會哪個 token 該去哪裡。
Top-k 门控:路由器用 softmax 给每个专家打分,但只混合它选中的少数几个。
scores = router(token) # one score per expert, e.g. 64 scores
top = top_k(scores, k=2) # pick the 2 highest-scoring experts
out = sum(softmax(top.scores)[i] * expert[top.idx[i]](token)
for i in range(2)) # blend just those two負載均衡是它會壞的地方
MoE 有一個討厭的失效模式。訓練早期路由器找到剛好稍微好用的幾個專家,送它們更多 token,於是它們被訓練得更多、變得更好——一個富者愈富的螺旋。放著不管,少數幾個專家幹完所有活,其餘成了死重,浪費掉你大部分的容量。修這件事就是專家負載均衡的全部工夫。
- 輔助負載均衡損失——加一個懲罰項,推動路由器把 token 平均散到各專家,直接對抗富者愈富的螺旋。
- 專家容量上限——限制單一專家每批次能接受的 token 數;溢出的 token 被丟棄或原樣通過,讓沒有專家獨吞佇列。
- 加噪或偏置校正路由——訓練時對路由分數加擾動,讓稍微好一點的專家無法立刻壟斷,給冷門專家暖機的機會。
辅助负载均衡损失惩罚每个专家的词元占比 f_i 与其平均路由概率 P_i 的乘积,促使路由趋于均匀分配。
實驗室為何忍受這份頭痛
MoE 帶來真實的複雜度:多一個要調的損失、token 在 GPU 間不均地散開、以及一個可能悄悄崩潰的路由器。實驗室全盤接受,因為擴展的數學好到難以拒絕——在每個 token 固定的運算預算下,稀疏模型達到的 loss 低於同樣活躍規模的稠密模型。DeepSeek、Mixtral 與 Qwen 最大的開放模型全是 MoE。你做的交換很清楚:花記憶體裝下所有專家,靠只跑幾個來省運算。
对数-对数图,显示损失随模型规模增大而下降。