Mixture of Experts · 架构图与伪代码

理解混合专家模型(MoE)

MoE 解决的不是“怎样少算一点注意力”,而是“怎样在不让每个 token 使用全部参数的前提下扩大模型容量”。本文面向已经理解 Transformer 的读者,从稠密 FFN 出发,追踪一次完整的路由、专家计算和结果合并。

N 选 k 模型保存 N 个专家;每个 token 通常只激活 k 个。总参数量、激活参数量与实际延迟因此成为三件不同的事。
核心定义 架构图 算例 伪代码 MoE 变体 Router 函数 模型实现 系统代价 如何选择

一、MoE 的最短定义

混合专家模型(Mixture of Experts)用一个可学习路由器,为每个输入选择一小部分参数子网络(专家),再把这些专家的输出加权合并。

在现代语言模型里,“专家”通常不是完整 Transformer,而是替换某些层中的 FFN / MLP。注意力层依旧是共享的;变化发生在逐 token 的非线性变换处。2017 年的稀疏门控 MoE 展示了这一条件计算路线,之后 GShard、Switch Transformer 等把它放进大规模 Transformer 与分布式系统中。Shazeer et al., 2017Lepikhin et al., 2020

$$p(x)=\operatorname{softmax}(W_r x),\qquad y=\sum_{i\in\operatorname{TopK}(p(x),k)}p_i(x)E_i(x)$$

这里 \(x\in\mathbb{R}^d\) 是一个 token 的隐藏状态,\(W_r\) 是路由器,\(E_i\) 是第 \(i\) 个专家。公式里真正的“稀疏”来自 TopK:没有被选中的专家不为这个 token 做前向计算。

三个量不要混为一谈。

总参数量决定权重需要多少存储;激活参数量近似决定单 token 做多少矩阵乘;端到端延迟还受专家间通信、批量大小、内存带宽和负载是否均匀影响。因此“激活参数少”不自动等于“单请求更快”。

二、一个 token 如何穿过 MoE 层

把稠密 Transformer 块中的一个 FFN 换成下图的稀疏 MoE。路由器只做一个较小的线性投影并产生专家分数;系统按选择结果把 token 重排成专家批次,分别计算,再恢复原 token 顺序。

Transformer 中的稀疏 MoE 层 token 隐藏状态进入路由器,选择两个专家,经过分发、专家计算和加权合并,再通过残差连接输出。 token x 隐藏状态 d Router softmax(Wᵣx) Top-2: E₂, E₄ DISPATCH · 按专家重排 token Expert 1FFN₁ · 未激活 Expert 2FFN₂(x) Expert 3FFN₃ · 未激活 Expert 4FFN₄(x) COMBINE · 恢复顺序并加权 加权合并 p₂E₂(x)+p₄E₄(x) 再接残差 x 共享 Attention → 稀疏 MoE-FFN → 共享 Attention → 稀疏 MoE-FFN → …
概念图:展示 Top‑2 token-choice 路由。实际实现通常一次处理一批 token,并用 all-to-all 通信把它们送到不同设备上的专家;图中的灰色专家不为当前 token 计算。

为什么通常替换 FFN,而不是注意力?

FFN 对每个 token 独立,天然适合先按专家分组,再做大批量矩阵乘。注意力则需要 token 之间交互,稀疏化后会同时改变信息连接结构与缓存策略,问题更复杂。Switch Transformer 也实验过稀疏注意力,但主架构选择替换 FFN。Fedus et al., 2021

三、一个可手算的 Top‑2 路由例子

假设一个 batch 有 4 个 token、4 个专家,路由器对 token “bank” 输出下列概率。Top‑2 选择 (E_2) 与 (E_4),其余专家跳过。

0.08Expert 1
0.55Expert 2
0.12Expert 3
0.25Expert 4
$$y_{bank}=0.55\,E_2(x_{bank})+0.25\,E_4(x_{bank})$$

有些实现会对选中的两个权重重新归一化,此时系数变成 (0.55/(0.55+0.25)=0.6875) 和 (0.3125)。这不是无关紧要的记号差异:它会改变输出尺度与路由梯度,读代码时应确认实现采用哪一种。

容量才是批处理里的难点。

若 capacity factor 为 1,单专家容量近似为 \(T/N\)。这里 \(T=4,N=4\),每个专家只有 1 个位置;如果三个 token 都选了 \(E_2\),就会溢出。Switch 的静态容量实现可能丢弃超额 token(让残差路径直接通过),提高 capacity factor 则会增加空槽、计算和通信。Switch Transformer §2.2

四、Top‑k MoE 的伪代码

下面不是某个框架的可运行实现,而是把关键机制完整暴露出来:路由、容量检查、分发、专家批处理、合并,以及训练时的均衡约束。

# X: [tokens, d_model];experts[i]: FFN_i
function sparse_moe(X, experts, k, capacity_factor, training):
    logits = float32(X) @ router_weight       # [T, N]
    probs  = softmax(logits, axis="expert")
    top_w, top_id = top_k(probs, k)           # [T, k]
    top_w = top_w / sum(top_w, axis=-1)       # 可选:对已选专家重归一化

    capacity = ceil(capacity_factor * T * k / N)
    slots = group_by_expert(X, top_id, capacity)
    # slots 记录 token_id、expert_id、gate_weight;溢出策略由实现决定

    expert_output = empty_like(slots)
    parallel for expert_id in 0 .. N-1:
        expert_output[expert_id] = experts[expert_id](slots[expert_id].tokens)

    Y = zeros_like(X)
    for item in slots:
        Y[item.token_id] += item.gate_weight * expert_output[item]

    if training:
        hard_fraction[i] = count(top_id contains i) / (T * k)
        soft_fraction[i] = mean(probs[:, i])
        balance_loss = alpha * N * sum(hard_fraction * soft_fraction)
        return Y, balance_loss
    return Y

这段伪代码省略了设备拓扑:在专家并行中,group_by_expert 往往对应一次 all-to-all,专家计算后再做一次反向 all-to-all。真正的高性能实现还会做 token 排序、padding、融合 kernel 和通信计算重叠。

负载均衡损失在约束什么?

如果路由器过早偏爱少数专家,热门专家溢出、冷门专家学不到东西。Switch 用硬分配比例 (f_i) 与平均软概率 (P_i) 的点积作为辅助损失:(L_{aux}=\alpha N\sum_i f_iP_i),推动两者接近均匀分布。它是工程折中,不保证语义上“每个专家各司其职”;而且权重过大可能干扰主任务。Switch Transformer §2.2

五、不同 MoE 变体到底改了什么

大多数变体都在回答三个问题:谁选择谁、每个 token 激活几个专家、如何防止负载失衡。把它们沿同一条数据流排列,比按模型发布时间背名字更有用。

五类 MoE 路由变体 对比 Top-1、Top-2、Expert Choice、共享专家和 Soft MoE 的输入输出关系。 路由家族 选择关系 核心取舍 Switch / Top‑1token-choice t E₂ 最少计算与通信单路由决定更脆弱 GShard / Top‑2token-choice t E₂E₄ 组合更丰富、路径有冗余约两份专家计算 Expert Choiceexpert-choice t₁t₂ E chooses 每个专家容量固定每个 token 获得的专家数可变 共享 + 路由专家DeepSeekMoE t 共享 ETop‑k 路由 E 公共知识走固定路径共享专家始终产生计算 Soft MoEsoft assignment 加权 token slot→ experts 连续可微、没有硬丢 token先混合 token,语义与稀疏路由不同
概念比较:箭头表达选择方向,不表示论文中的精确张量布局。Soft MoE 的专家接收由多个 token 加权得到的固定数量 slot,而不是某个原始 token 的硬分配。
变体选择规则主要收益主要代价 / 限制代表工作
Top‑1每个 token 选 1 个专家专家计算与通信最少,路由实现简单单次选择出错没有第二条专家路径;仍需处理热点与溢出Switch Transformer
Top‑2 / Top‑k每个 token 选固定 k 个专家并加权允许专家组合,路由更有冗余计算与通信大致随 k 增长;容量管理更复杂GShardMixtral
Expert Choice每个专家从 token 中选固定容量天然给每个专家固定负载,不再让热门专家溢出一个 token 可能被 0 个或多个专家选中;自回归因果场景的使用方式受约束Zhou et al., 2022
共享专家固定共享专家始终激活,再叠加细粒度 routed experts把常见知识从路由专家中抽出,减少路由专家的重复共享路径不是稀疏的;专家拆得更细会提高调度复杂度DeepSeekMoE
Soft MoE用软权重把 token 压成固定 slots,专家处理 slots 后再软分发回来端到端连续可微,避免硬路由与 token dropping专家处理的是 token 混合物;论文重点验证在视觉模型,不能直接把结论外推到自回归 LLMPuigcerver et al., 2023

变体之外,还有两个正交维度

专家放在哪里:可以每层都用 MoE,也可以隔层使用或保留前后若干稠密层。专家如何部署:专家并行把不同专家放在不同设备,常与数据并行、张量并行、流水线并行组合。这些是层布局与系统策略,不应和路由算法混成一个“MoE 类型”。

六、Sigmoid Router 与 Softmax Router

两者的核心差异不是“能不能做 Top‑K”,而是路由器怎样表达专家之间的关系:Softmax 把专家放在同一个有限预算里竞争;Sigmoid 先让每个专家独立判断相关性。

$$p_i=\frac{e^{z_i}}{\sum_j e^{z_j}}\quad\text{(Softmax)},\qquad g_i=\sigma(z_i)=\frac{1}{1+e^{-z_i}}\quad\text{(Sigmoid)}$$

Softmax 的全部权重之和恒为 1。提高一个 logit 会通过分母压低其他专家的概率,因此路由梯度天然跨专家耦合。Sigmoid 的归一化前 Jacobian 是逐专家对角的:某个专家的分数不会因为另一专家的 logit 上升而自动下降,更接近多标签相关性判断。

比较轴Softmax RouterSigmoid Router
专家关系相互竞争,共享总权重 1归一化前独立打分,可同时高或同时低
权重总和对全部专家恒为 1不固定;常在 Top‑K 后重新归一化
原始梯度一个 logit 影响所有 softmax 概率激活函数阶段逐专家独立
表达偏置“在这些专家里谁更合适”“每个专家各自有多合适”
输出尺度天然受总和约束直接混合时随门值总和变化,需归一化或缩放
典型实现Switch、GShard、Mixtral、MiniMax‑Text‑01DeepSeek‑V3、GLM‑4.5、Kimi K2、MiniMax‑M2/M3

三个相同 logit 的直觉

logits   = [2.00, 2.00, 2.00]
softmax  = [0.33, 0.33, 0.33]  # 三者一样好,但总预算只有 1
sigmoid  = [0.88, 0.88, 0.88]  # 三者各自都很合适

为什么两者经常选中相同的 Top‑K?

对单个 logit 而言,\(\exp(z)\)、Softmax 中的对应分量和 \(\sigma(z)\) 都严格单调递增。因此,在没有专家偏置、分组掩码或其他校正时,直接按分数 Top‑K 与按原始 logit Top‑K 的排序相同。换 Router 往往不改变“选了谁”,真正改变的是选中专家的混合权重和反向传播。

Top‑K 后重新归一化不会让两者完全相同。

Softmax 权重的比值是 \(e^{z_i-z_j}\);归一化 Sigmoid 的比值是 \(\sigma(z_i)/\sigma(z_j)\)。它们通常不同。重新归一化会把两者输出都约束到固定总尺度,使前向差距缩小;但归一化又会让被选专家之间重新产生梯度耦合,而未选专家仍通常没有主任务梯度。

因此,Sigmoid 不是免费的“更好 Router”。它减少了全体专家在激活函数阶段的零和竞争,但仍需要 Top‑K、负载控制和输出尺度设计。MiniMax‑M2 的技术报告把这种独立打分作为设计动机;DeepSeek‑V3 则把归一化 Sigmoid 与专家校正偏置、分组限制组合使用。MiniMax‑M2 SeriesDeepSeek‑V3 Technical Report

七、DeepSeek、GLM、Kimi 与 MiniMax 如何实现 MoE

这几家的近期公开权重都采用 token-choice Top‑K:token 经 Router 打分,按专家重排并通过 all-to-all 分发,专家执行 SwiGLU 类 FFN,再按门值合并。真正拉开差异的是专家颗粒度、共享路径、路由校正和负载均衡作用域

$$\operatorname{MoE}(x)=E_{\mathrm{shared}}(x)+\lambda\sum_{i\in\mathcal{T}(x)}\tilde g_i(x)E_i(x)$$

这是便于比较的概念式:没有 shared expert 时第一项为零;\(\mathcal{T}(x)\) 是校正与分组约束后的 Top‑K 集合;\(\tilde g_i\) 通常由未加校正偏置的原始门值归一化得到;\(\lambda\) 是模型配置中的 routed scaling factor。残差连接位于这个 FFN 子层之外。

公开模型版本Routed experts每 tokenSharedRouter 与均衡
DeepSeek‑V3256Top‑81Sigmoid;8 组取 4 组;动态校正偏置主导批级均衡;另有极小序列级辅助损失
GLM‑4.5160Top‑81Sigmoid;loss-free bias;公开配置不做有效分组限制;序列级辅助权重 0.0001
Kimi K2384Top‑81Sigmoid;noaux_tc 校正选择;无分组限制;seq_aux=true、系数 0.001
MiniMax‑Text‑01 / M132Top‑20Softmax Top‑K;Switch 风格辅助均衡,系数 0.001
MiniMax‑M2256Top‑80Sigmoid;可学习专家偏置;公开配置辅助系数 0.001
MiniMax‑M3 文本骨干128Top‑41Sigmoid;routing bias;路由缩放 2.0

表中数字来自相应技术报告、官方仓库或官方权重配置,描述的是列出的具体版本,不代表各公司所有模型。配置字段能证明公开推理图的结构,但不一定完整披露训练时偏置更新算法。

DeepSeek‑V3:细粒度专家、共享专家与节点受限路由

DeepSeek‑V3 有 61 个 Transformer 层,前 3 层使用 dense FFN;之后每个 MoE 层包含 256 个 routed experts 和 1 个始终执行的 shared expert,每个 token 选择 8 个 routed experts。公开配置使用 Sigmoid、Top‑K 后归一化和 2.5 的 routed scaling factor。DeepSeek‑V3 官方配置

路由先将专家分为 8 组,并只在得分最高的 4 组里选择 Top‑8,以限制跨节点通信。负载控制为每个专家维护校正偏置:偏置只参与“选谁”,最终混合权重仍来自原始 Sigmoid affinity。过载专家的偏置降低,欠载专家的偏置升高。论文称其为 auxiliary-loss-free 主均衡策略,但同时明确保留了一个权重极小的序列级辅助损失,防止单条序列内出现极端失衡。DeepSeek‑V3 §2.1.2

GLM‑4.5:更深、更窄的 DeepSeek 风格 MoE

GLM‑4.5 有 92 层,前 3 层 dense;后续 MoE 层有 160 个 routed experts、Top‑8、1 个 shared expert,每个专家的中间维度为 1536。它同样采用 Sigmoid 与 loss-free balance routing,选中权重归一化后乘 2.5。公开配置的 n_group=1topk_group=1 意味着没有 DeepSeek‑V3 那样的跨组筛选。论文还披露:偏置更新率在前 15T token 为 0.001,之后归零,并使用权重 0.0001 的序列级均衡损失。GLM‑4.5 Technical Report官方配置

Kimi K2:更多专家、单层 dense 与较大的路由缩放

Kimi K2 的官方仓库报告 1T 总参数、32B 激活参数、61 层,其中只有第 1 层为 dense;其余 MoE 层有 384 个 routed experts、Top‑8 和 1 个 shared expert,每个专家中间维度 2048。官方配置沿用 DeepSeek‑V3 兼容实现,使用 Sigmoid、topk_method=noaux_tc、Top‑K 归一化和 2.827 的路由缩放;n_group=topk_group=1 表示不做分组筛选。Kimi K2 官方仓库官方配置

它也不是“完全没有辅助正则”:公开配置保留 seq_aux=trueaux_loss_alpha=0.001。因此更准确的描述是:Top‑K 选择走无强辅助损失的校正偏置路径,同时保留序列级约束。

MiniMax:从 32 选 2 到细粒度 Sigmoid MoE

MiniMax‑Text‑01 与 M1代表较早的大专家路线:32 个专家、Top‑2、专家中间维度 9216、无 shared expert。官方 Text‑01 实现对 router logits 做 Softmax,并使用 Switch 风格的辅助负载损失;公开配置的系数为 0.001。其主要架构重点还包括 Lightning Attention 与全注意力混合,而不是新路由算法。MiniMax‑01 官方仓库官方实现

MiniMax‑M2改为 256 个细粒度专家、Top‑8、无 shared expert,模型报告为 229.9B 总参数、9.8B 激活参数。它使用 Sigmoid 和可学习的 expert-specific bias;官方配置仍列出 0.001 的辅助损失系数,因此应理解为“大幅降低依赖”,而非证明训练阶段绝对没有辅助损失。MiniMax‑M2 SeriesM2 官方配置

MiniMax‑M3 的文本骨干又调整为 128 个 routed experts、Top‑4,并加入 1 个 shared expert;公开配置为 Sigmoid、routing bias 和 2.0 的路由缩放。配置能确认推理结构,但其公开技术材料没有像 DeepSeek‑V3 那样完整说明偏置如何随训练负载更新,因此不应仅凭字段名断言两者算法完全相同。MiniMax‑M3 官方配置

不要把 MiniMax H3 视频模型算进上述文本 MoE。

MiniMax 官方将 H3‑Omni‑Transformer 描述为 33B 参数的 dense 单流 Transformer,并明确说明注意力层和 FFN 层没有模态专用结构。若某个 H3 实验在训练后把 dense FFN 按隐藏维切成 28 份,再蒸馏一个 Top‑8 Router,它属于稠密模型的训练后 MoE 近似:这些切片最初共同实现一个函数,不等同于从预训练开始端到端分化的独立专家。可借鉴 shared expert、Sigmoid + 路由偏置和 grouped GEMM,但应把它与官方文本 MoE 分开评价。MiniMax H3 官方仓库

八、MoE 真正困难的部分在系统与训练

1. 负载不均衡

路由器可能把大量 token 发给同一个专家。静态容量系统需要丢 token 或预留空槽;动态容量系统虽可避免丢弃,却会被最慢的热门专家拖住。负载均衡辅助损失、路由噪声、Expert Choice 和无辅助损失的偏置校正,都是在解决同一问题的不同办法。

2. 跨设备通信

稠密 FFN 的 token 留在原设备上;专家并行 MoE 要先把 token 发到拥有对应专家的设备,再把结果发回。两个 all-to-all 可能吞掉理论 FLOP 节省,尤其是在小 batch、设备互联较慢或路由高度不均时。GShard 的贡献不仅是模型结构,也包括让这类分片计算可表达、可扩展的系统方法。GShard, 2020

3. 训练稳定性

硬路由会让输入分布和专家获得的梯度随训练变化。Switch 报告了路由器局部使用 float32、缩小参数初始化尺度等稳定化手段;ST‑MoE 又提出 router z-loss,惩罚过大的路由 logits。它们说明 MoE 并非“把 FFN 复制 N 份”就能稳定训练。Zoph et al., 2022

4. 推理时仍要保存大量权重

一个 token 只访问少量专家,但服务节点仍需容纳或按需加载全部专家。低并发解码时,每步 token 少,专家矩阵乘不容易形成大批次;权重读取和跨卡通信可能主导延迟。MoE 的优势最容易在高吞吐批处理与足够快的设备互联上兑现。

不能跨论文直接比较“几倍更快”。

Switch、Expert Choice、Soft MoE 与 DeepSeekMoE 的报告分别使用不同架构、任务、硬件、训练预算和质量阈值。它们能证明某个设计在各自实验边界内有效,不能组成一张公平排行榜。

九、什么时候该选哪一种

你的首要约束优先考虑先验证什么
想要最简单的稀疏基线Top‑1 / Switch溢出率、每专家 token 数、all-to-all 占比
愿意多算一点换专家组合Top‑2Top‑2 相对 Top‑1 的质量增益是否覆盖通信成本
固定专家容量是硬约束Expert Choicetoken 覆盖率,以及推理任务是否允许批内专家选 token
担心通用知识挤占路由专家共享专家 + 细粒度专家共享专家计算占比、路由专家冗余与实际专门化
视觉编码器中希望连续软路由Soft MoEslot 数、token 混合是否损伤任务需要的局部信息
MoE 专家会自然学成“数学专家”“代码专家”吗?

不应默认如此。路由只被主任务和均衡约束间接训练,专家可能按语言、语法模式、token 位置或难以命名的特征分工,也可能高度冗余。可解释的专门化需要路由统计、专家消融和反事实替换等证据,不能只看几个被路由的示例。

MoE 是模型压缩吗?

不是。MoE 通常增加总参数与权重存储,只降低每个 token 激活的参数比例。量化、剪枝、蒸馏才主要面向存储或部署压缩;它们可以与 MoE 组合。

收束

MoE 的核心不是“很多专家”,而是条件计算:让不同 token 使用不同参数。它把 Transformer 的容量扩展问题改写成路由问题,也把一部分 FLOP 压力转换成了负载均衡、显存和网络通信压力。Top‑1、Top‑2、Expert Choice、共享专家与 Soft MoE 并没有统一胜者;选择取决于任务是否允许相应路由、系统能否高效聚合专家批次,以及你愿意为稳定性付出多少复杂度。

评论加载中...