MoE架构详解:稀疏激活如何改变大模型经济学

MoE:用参数量换计算效率 MoE(Mixture of Experts)的核心思想很简单:不是所有参数都需要参与每次计算。通过路由机制,只激活与当前输入最相关的"专家"子网络,在保持大参数量的同时大幅降低计算量。 基本原理 稠密模型 vs 稀疏模型 传统稠密模型:每个token经过所有参数的计算。 输入token → [Attention] → [MLP(d, d_ff)] → 输出 所有参数参与计算 MoE模型:MLP层被替换为多个专家MLP,路由器选择激活哪些专家。 输入token → [Attention] → [Router] → 选择Top-K专家 ↓ [Expert1] [Expert2] ... [ExpertN] ↓ (仅K个被激活) 加权合并 → 输出 关键参数 专家数(N):总专家数量。通常8-64个 激活数(K):每个token激活的专家数。通常2-8个 稀疏率:1 - K/N。如8/64的配置,稀疏率为87.5% 以DeepSeek-V3为例:256个专家,每token激活8个,总参数671B但推理时只激活37B——等效于37B模型的计算量,但拥有671B参数的知识容量。 路由机制 基础路由 最简单的路由方式: def route(token, experts): # 计算token与每个专家的亲和度 scores = softmax(W_router @ token) # [N] # 选择Top-K个专家 top_k_indices = argsort(scores)[-K:] top_k_scores = scores[top_k_indices] # 归一化 top_k_scores /= top_k_scores.sum() # 加权合并 output = sum(experts[i](token) * top_k_scores[i] for i in top_k_indices) return output 负载均衡问题 基础路由有一个严重问题:路由坍缩。模型倾向于总是选择少数几个"好"专家,其他专家得不到训练。 ...

2026-07-16 · 2 min · 218 words · 硅基 AGI 探索者

深度解析MoE架构:混合专家模型如何工作

深度解析MoE架构:混合专家模型如何工作 Mixture of Experts(MoE)是近年来大模型架构领域最重要的创新之一。DeepSeek-V3、Mixtral等模型的成功让MoE从学术概念走向工业实践。理解MoE的工作原理,对于把握大模型架构的发展方向至关重要。 MoE的核心思想 传统密集模型中,每个输入token都要经过所有参数的计算。MoE打破了这一范式:对于每个token,只激活一小部分"专家"网络进行计算。这使得模型可以在不增加计算量的情况下大幅增加参数量。 具体来说,一个MoE层包含N个并行的前馈网络(专家)和一个门控网络(路由器)。对于每个输入,路由器计算一个概率分布,选择Top-K个专家进行计算,然后加权合并这K个专家的输出。 路由机制:MoE的心脏 路由器是MoE最关键的组件。它的设计直接影响模型性能和训练稳定性。 标准Top-K路由 最基础的路由方式:路由器是一个线性层加softmax,输出N个专家的概率分布,选择概率最高的K个。Mixtral 8x7B使用N=8, K=2,即每个token由2个专家处理。 路由的挑战 路由崩塌:训练过程中,路由器可能倾向于将大部分token分配给少数几个专家,导致其他专家"饿死"。解决方法是引入辅助损失函数——当专家负载不均衡时,增加额外的loss惩罚。 Token丢弃:当某个专家接收的token超过容量限制时,多余token被丢弃。这会导致信息损失。我们采用了"容量因子"机制——在训练时动态调整每个专家的容量上限,在负载均衡和计算效率之间取得平衡。 噪声注入:在路由器输出上添加噪声可以改善负载均衡。这看似简单,但效果显著——噪声帮助路由器探索更多路由可能性,避免过早收敛到不均衡的状态。 负载均衡:让每个专家都工作 负载均衡是MoE训练的核心难题。如果某些专家几乎不被激活,模型的有效参数量就远小于标称参数量,造成浪费。 辅助损失法 最经典的方案是引入辅助损失:计算每个专家被选中的频率,与均匀分布的差异作为额外loss。当某个专家被过度使用或过少使用时,loss增加,驱动路由器走向均衡。 Expert Choice路由 传统路由是"token选专家",Expert Choice反过来——“专家选token”。每个专家根据自身专长选择最适合的token。这种方式自然实现了负载均衡,因为每个专家的选择预算是固定的。但Expert Choice在自回归生成中不适用(因为未来token不可见),所以主要用于训练阶段。 序列级均衡 Token级的均衡可能导致序列级别的偏差——某些序列被过度分配给特定专家。我们采用了序列级辅助损失,确保每个序列内的专家分配也是均衡的。 MoE的训练特性 MoE模型的训练与密集模型有显著差异: 训练效率:MoE模型可以在相同计算预算下训练更多参数。DeepSeek-V3用2360亿总参数实现了与密集模型相当的计算量,但性能更强。这是因为每个token只激活少量专家,FLOPS远低于密集模型。 通信开销:在分布式训练中,MoE引入了额外的all-to-all通信——token需要被发送到存储对应专家的GPU上。这使得MoE训练的通信开销显著高于密集模型。解决方案包括:使用专家并行+数据并行混合策略、减少all-to-all的频率、以及通信计算重叠。 训练不稳定性:MoE训练比密集模型更容易出现loss spike。原因包括路由器的离散决策导致梯度不稳定、专家间负载不均衡导致的梯度偏差。我们采用了更大的warmup步数、更小的学习率和梯度裁剪来稳定训练。 推理优化 MoE推理的主要优势是计算效率——尽管模型总参数很大,但每个token只激活一小部分。关键优化点在于: 专家缓存:将不活跃的专家参数卸载到CPU内存或SSD,只在需要时加载到GPU。这使得在有限GPU显存下运行大MoE模型成为可能。 动态批处理:将不同序列中路由到同一专家的token合并处理,提高GPU利用率。这比密集模型的批处理复杂得多,因为每个序列的专家分配不同。 结语 MoE架构代表了"参数效率"的一个新方向——不是让每个参数都参与每次计算,而是让参数各司其职。随着路由算法和分布式训练技术的成熟,MoE正在成为超大模型的主流架构。未来,我们可能会看到更细粒度的MoE——不只是FFN层,注意力层、甚至嵌入层都可能采用专家混合机制。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 42 words · 硅基 AGI 探索者

深度解析MoE架构:混合专家模型如何工作

深度解析MoE架构:混合专家模型如何工作 Mixture of Experts(MoE)是近年来大模型架构领域最重要的创新之一。DeepSeek-V3、Mixtral等模型的成功让MoE从学术概念走向工业实践。理解MoE的工作原理,对于把握大模型架构的发展方向至关重要。 MoE的核心思想 传统密集模型中,每个输入token都要经过所有参数的计算。MoE打破了这一范式:对于每个token,只激活一小部分"专家"网络进行计算。这使得模型可以在不增加计算量的情况下大幅增加参数量。 具体来说,一个MoE层包含N个并行的前馈网络(专家)和一个门控网络(路由器)。对于每个输入,路由器计算一个概率分布,选择Top-K个专家进行计算,然后加权合并这K个专家的输出。 路由机制:MoE的心脏 路由器是MoE最关键的组件。它的设计直接影响模型性能和训练稳定性。 标准Top-K路由 最基础的路由方式:路由器是一个线性层加softmax,输出N个专家的概率分布,选择概率最高的K个。Mixtral 8x7B使用N=8, K=2,即每个token由2个专家处理。 路由的挑战 路由崩塌:训练过程中,路由器可能倾向于将大部分token分配给少数几个专家,导致其他专家"饿死"。解决方法是引入辅助损失函数——当专家负载不均衡时,增加额外的loss惩罚。 Token丢弃:当某个专家接收的token超过容量限制时,多余token被丢弃。这会导致信息损失。我们采用了"容量因子"机制——在训练时动态调整每个专家的容量上限,在负载均衡和计算效率之间取得平衡。 噪声注入:在路由器输出上添加噪声可以改善负载均衡。这看似简单,但效果显著——噪声帮助路由器探索更多路由可能性,避免过早收敛到不均衡的状态。 负载均衡:让每个专家都工作 负载均衡是MoE训练的核心难题。如果某些专家几乎不被激活,模型的有效参数量就远小于标称参数量,造成浪费。 辅助损失法 最经典的方案是引入辅助损失:计算每个专家被选中的频率,与均匀分布的差异作为额外loss。当某个专家被过度使用或过少使用时,loss增加,驱动路由器走向均衡。 Expert Choice路由 传统路由是"token选专家",Expert Choice反过来——“专家选token”。每个专家根据自身专长选择最适合的token。这种方式自然实现了负载均衡,因为每个专家的选择预算是固定的。但Expert Choice在自回归生成中不适用(因为未来token不可见),所以主要用于训练阶段。 序列级均衡 Token级的均衡可能导致序列级别的偏差——某些序列被过度分配给特定专家。我们采用了序列级辅助损失,确保每个序列内的专家分配也是均衡的。 MoE的训练特性 MoE模型的训练与密集模型有显著差异: 训练效率:MoE模型可以在相同计算预算下训练更多参数。DeepSeek-V3用2360亿总参数实现了与密集模型相当的计算量,但性能更强。这是因为每个token只激活少量专家,FLOPS远低于密集模型。 通信开销:在分布式训练中,MoE引入了额外的all-to-all通信——token需要被发送到存储对应专家的GPU上。这使得MoE训练的通信开销显著高于密集模型。解决方案包括:使用专家并行+数据并行混合策略、减少all-to-all的频率、以及通信计算重叠。 训练不稳定性:MoE训练比密集模型更容易出现loss spike。原因包括路由器的离散决策导致梯度不稳定、专家间负载不均衡导致的梯度偏差。我们采用了更大的warmup步数、更小的学习率和梯度裁剪来稳定训练。 推理优化 MoE推理的主要优势是计算效率——尽管模型总参数很大,但每个token只激活一小部分。关键优化点在于: 专家缓存:将不活跃的专家参数卸载到CPU内存或SSD,只在需要时加载到GPU。这使得在有限GPU显存下运行大MoE模型成为可能。 动态批处理:将不同序列中路由到同一专家的token合并处理,提高GPU利用率。这比密集模型的批处理复杂得多,因为每个序列的专家分配不同。 结语 MoE架构代表了"参数效率"的一个新方向——不是让每个参数都参与每次计算,而是让参数各司其职。随着路由算法和分布式训练技术的成熟,MoE正在成为超大模型的主流架构。未来,我们可能会看到更细粒度的MoE——不只是FFN层,注意力层、甚至嵌入层都可能采用专家混合机制。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 42 words · 硅基 AGI 探索者
混合深度MoD

混合深度(MoD):动态计算深度

计算量的另一维度的稀疏化 MoE在"宽度"维度上实现了稀疏激活——不同token使用不同的专家。而Mixture-of-Depth(MoD)在"深度"维度上实现稀疏化——不同token经过不同数量的Transformer层。 这个想法直指一个核心观察:不是所有token都需要同等深度的计算。简单token(如停用词、常见短语)可能在几层之后就已经获得了充分的表示,而复杂token(如多义词、需要推理的位置)则需要更深的处理。 MoD的工作原理 基本架构 在MoD架构中,每一层都有一个路由器,决定哪些token需要继续经过当前层的计算,哪些可以"跳过"当前层直接传递到下一层: class MoDLayer(nn.Module): def __init__(self, d_model, n_heads, d_ff, capacity_ratio=0.5): super().__init__() self.router = nn.Linear(d_model, 1) # 输出一个标量路由分数 self.self_attn = MultiHeadAttention(d_model, n_heads) self.ffn = FFN(d_model, d_ff) self.norm1 = nn.RMSNorm(d_model) self.norm2 = nn.RMSNorm(d_model) self.capacity_ratio = capacity_ratio # 参与计算的token比例 def forward(self, x): batch_size, seq_len, d_model = x.shape # 路由决策 router_scores = self.router(x).squeeze(-1) # [batch, seq_len] n_process = int(seq_len * self.capacity_ratio) # 选择top-k个token参与计算 _, process_indices = torch.topk(router_scores, n_process, dim=-1) process_mask = torch.zeros_like(router_scores, dtype=torch.bool) process_mask.scatter_(1, process_indices, True) # 只有被选中的token经过注意力计算 processed = x.clone() if process_mask.any(): selected = x[process_mask].unsqueeze(0) attn_out = self.self_attn(self.norm1(selected)) ffn_out = self.ffn(self.norm2(attn_out)) selected = selected + attn_out + ffn_out processed[process_mask] = selected.squeeze(0) # 未选中的token直接传递(残差连接的等价效果) return processed 路由器的设计 路由器极其简单——只是一个单层线性映射加sigmoid,输出一个标量分数。这个分数表示"这个token需要当前层处理的程度"。 选择策略有两种: Top-k选择:固定比例的token参与计算,保证计算量可预测 阈值选择:分数超过阈值的token参与计算,计算量动态变化 实践中,Top-k选择更受青睐,因为它保证了计算量的可预测性,便于批处理和资源调度。 与MoE的关系与区别 MoD和MoE是正交的两种稀疏化策略: 维度 MoE MoD 稀疏方向 宽度(选择不同专家) 深度(选择是否计算) 路由目标 哪个专家 是否参与 计算节省 减少FFN计算量 减少整层计算量 可组合 — 可以与MoE叠加 两者可以组合使用:在MoE层的FFN部分使用专家路由,同时在层级别使用MoD路由。这种"双重稀疏"可以进一步降低计算量。 ...

2026-07-02 · 2 min · 254 words · 硅基 AGI 探索者
MoE混合专家架构

MoE混合专家架构2026详解

MoE的核心动机:解耦参数量与计算量 传统密集模型的参数量与计算量是线性绑定的——一个70B模型每次前向传播需要计算全部70B参数。MoE(Mixture of Experts)打破了这一绑定:通过路由机制只激活部分专家,使得总参数量可以远大于单次计算量。 DeepSeek-V3以671B总参数量实现了仅37B的激活计算量,在保持顶级性能的同时将推理成本降低了5-10倍。这是MoE在2026年成为超大模型首选架构的直接原因。 稀疏MoE的工作原理 基本结构 一个MoE层由三个核心组件构成: 路由器(Router/Gate):一个小型线性层,输出每个token分配给各专家的概率 专家网络(Experts):多个并行的FFN,每个专家是一个独立的FFN 组合层:根据路由概率加权组合各专家的输出 class MoELayer(nn.Module): def __init__(self, d_model, d_ff, n_experts, top_k=2): super().__init__() self.router = nn.Linear(d_model, n_experts, bias=False) self.experts = nn.ModuleList([ FFN(d_model, d_ff) for _ in range(n_experts) ]) self.top_k = top_k def forward(self, x): batch_size, seq_len, d_model = x.shape x_flat = x.view(-1, d_model) # 路由 router_logits = self.router(x_flat) # [N, n_experts] router_probs = F.softmax(router_logits, dim=-1) # Top-K选择 topk_probs, topk_indices = torch.topk(router_probs, self.top_k, dim=-1) topk_probs = topk_probs / topk_probs.sum(dim=-1, keepdim=True) # 分发到专家 output = torch.zeros_like(x_flat) for i in range(self.top_k): expert_indices = topk_indices[:, i] # [N] expert_weights = topk_probs[:, i] # [N] for expert_id in range(len(self.experts)): mask = (expert_indices == expert_id) if mask.any(): expert_input = x_flat[mask] expert_output = self.experts[expert_id](expert_input) output[mask] += expert_weights[mask].unsqueeze(-1) * expert_output return output.view(batch_size, seq_len, d_model) Top-K路由 每个token只被路由到K个专家(通常K=1或2)。这实现了计算量的稀疏化——在N=256个专家的情况下,每次只激活约0.8%的参数。 负载均衡:MoE的关键难题 如果不加约束,路由器会倾向于将大部分token分配给少数"优秀"专家,导致其他专家得不到训练。这就是负载不均衡问题。 辅助损失(Auxiliary Loss) GShard提出的经典方法,在训练损失中加入一项鼓励均匀分配的惩罚: L_aux = α * N * Σ(f_i * P_i) 其中 f_i 是分配给专家i的token比例,P_i 是路由器对专家i的平均概率。当分配均匀时 L_aux 最小。 ...

2026-07-02 · 2 min · 275 words · 硅基 AGI 探索者
moe architecture evolution

MoE 混合专家架构:从 Mixtral 到 DeepSeek V4 的演进

MoE:用稀疏激活突破参数效率极限 混合专家(Mixture of Experts, MoE)架构是 2024-2026 年大模型领域最重要的架构创新。它让模型在不增加推理计算量的前提下大幅扩展参数量,实现了"大模型的能力,小模型的速度"。本文将从原理到工程,全面解析 MoE 的演进。 一、MoE 基本原理 1.1 稀疏激活的核心思想 标准 Transformer 中,每个 Token 都通过所有参数计算(密集激活)。MoE 则让每个 Token 只激活部分参数(稀疏激活): $$\text{MoE}(x) = \sum_{i \in \text{TopK}(G(x))} G(x)_i \cdot E_i(x)$$ 其中: $G(x) = \text{softmax}(W_g \cdot x)$ 是路由器(Gate/Router) $\text{TopK}(G(x))$ 选择概率最高的 $K$ 个专家 $E_i(x)$ 是第 $i$ 个专家的输出 ┌─────────────────────────────────────────────────────┐ │ MoE 层结构 │ ├─────────────────────────────────────────────────────┤ │ │ │ Input x ──► Router G(x) ──► Top-K 选择 │ │ │ │ │ ┌─────┬─────┬─────┬───┴───┐ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌────┐┌────┐┌────┐┌────┐ ┌────┐ │ │ │ E1 ││ E2 ││ E3 ││ E4 │...│En │ │ │ │FFN ││FFN ││FFN ││FFN │ │FFN│ │ │ └─┬──┘└─┬──┘└─┬──┘└─┬──┘ └─┬─┘ │ │ │ │ │ │ │ │ │ │ g1 │ g2 │ g3 │ │ │ │ │ │ │ │ │ │ │ └─────┴──┬──┴─────┴───────┘ │ │ │ │ │ ▼ │ │ Σ gi · Ei(x) = Output │ │ │ └─────────────────────────────────────────────────────┘ 1.2 为什么 MoE 有效 MoE 的优势在于参数解耦: ...

2026-06-28 · 5 min · 869 words · 硅基 AGI 探索者
mixture of experts deep dive

混合专家模型深入剖析:从 GShard 到 DeepSeek V4

MoE 核心原理 混合专家(Mixture of Experts, MoE)的核心思想:用路由器选择性地激活部分参数,实现参数总量大但计算量小。 给定输入 $x \in \mathbb{R}^d$,MoE 层的计算为: $$y = \sum_{i=1}^{N} g_i(x) \cdot E_i(x)$$ 其中 $g_i(x)$ 为门控函数(路由器),$E_i$ 为第 $i$ 个专家。稀疏激活的关键是 $g_i(x)$ 只对 Top-k 个专家非零: $$g_i(x) = \begin{cases} \text{softmax}(W_g x)_i & \text{if } i \in \text{Top-k}(W_g x) \ 0 & \text{otherwise} \end{cases}$$ class MoELayer(nn.Module): def __init__(self, d_model, num_experts=8, top_k=2): super().__init__() self.gate = nn.Linear(d_model, num_experts, bias=False) self.experts = nn.ModuleList([ FeedForward(d_model) for _ in range(num_experts) ]) self.top_k = top_k self.num_experts = num_experts def forward(self, x): # x: (B, L, d) logits = self.gate(x) # (B, L, num_experts) topk_logits, topk_idx = logits.topk(self.top_k, dim=-1) topk_weights = F.softmax(topk_logits, dim=-1) output = torch.zeros_like(x) for i in range(self.top_k): expert_idx = topk_idx[..., i] # (B, L) weight = topk_weights[..., i:i+1] # (B, L, 1) for j in range(self.num_experts): mask = (expert_idx == j) if mask.any(): expert_input = x[mask] expert_output = self.experts[j](expert_input) output[mask] += weight[mask] * expert_output return output 路由算法演进 1. Top-k 路由(标准方案) 最常用的路由策略。每个 token 选择得分最高的 k 个专家。问题:容易出现"赢者通吃"——少数专家被过度使用。 ...

2026-06-25 · 3 min · 523 words · 硅基 AGI 探索者
鲁ICP备2026018361号