前言

你有没有发现,现在几乎每个大模型都在说自己用了 MoE?从通义千问到 Llama 系列的某些变体,再到一些闭源商业模型,MoE 像是一夜之间成了“高端”的代名词。但与此同时,我们又不断听到另一个词:Transformer。它像是老前辈,默默支撑着整个生成式 AI 的世界。于是问题来了:MoE 是不是要取代 Transformer?它们俩到底谁更重要?

我在做企业级大模型落地的过程中,遇到太多团队被这些术语绕晕了。有人以为上了 MoE 就等于性能翻倍,结果训练崩了;也有人坚持用传统密集 Transformer,却发现算力根本撑不住业务增长。其实关键不在于“选谁”,而在于理解——Transformer 解决的是信息如何流动的问题,MoE 解决的是计算资源如何分配的问题

这篇文章不会堆砌公式,也不会吹捧某种架构为“终极答案”。我想带你一层层剥开这两个概念的本质。你会发现,真正决定一个模型能不能落地、能不能省钱、能不能快速迭代的,从来不是名字有多炫酷,而是你是否清楚每一块结构背后的逻辑代价与工程权衡。接下来的内容,是我多年实践中踩过坑、调过参、看过上线失败也见证过性能飞跃后的系统性梳理。

1. 我们真正需要比较的,不是两个模型,而是两种设计哲学

1.1 大模型落地的第一课:别被名字迷惑

企业在引入大模型时,最容易犯的一个错误就是追热点。看到某个厂商宣传“全球首个万亿参数 MoE 模型”,立刻觉得这是技术跃迁。可当你真的想把它部署到生产环境里,才发现推理延迟高得离谱,显存占用爆炸,训练成本翻了几倍。

我经历过这样的项目。客户拿到一份 PPT,上面写着“采用先进 MoE 架构”,信心满满地要求我们按这个方案重构系统。可当我们深入看代码和配置文件时,发现所谓的 MoE 实际上只是一个简单的专家切换机制,连基本的负载均衡都没有做。结果上线后,90% 的请求都被同一个专家处理,其他专家形同虚设。

这种现象说明一个问题:很多人把 MoE 当成一种“更高级的模型类型”,就像从 ResNet 升级到 EfficientNet 那样。但这完全误解了它的本质。

1.2 比较的前提是维度统一

如果我们非要比较 Transformer 和 MoE,必须先明确一点:

  • Transformer 是一种网络架构范式
  • MoE 是一种参数激活策略

这就好比你在比较“汽车底盘结构”和“发动机点火方式”。前者决定了车怎么承载动力、转向、悬挂;后者决定了哪几个气缸在什么时候工作。它们协同作用,但解决的是不同层面的问题。

所以真正的理解路径不是问“哪个更好”,而是回答三个递进式问题:

  • 信息在这个模型中是如何流动的?
  • 哪些参数参与了每一次前向传播?
  • 系统的扩展性瓶颈在哪里?

这三个问题的答案,才能决定你最终选择什么样的组合方案。

2. 回到起点:Transformer 到底解决了什么问题?

2.1 序列建模的老难题:上下文依赖太长怎么办?

在 Transformer 出现之前,主流的序列模型是 RNN 及其变种 LSTM、GRU。它们的基本思路很直观:像人读句子一样,一个词一个词地处理。

这种逐词推进的方式带来两个致命缺陷:

  • 无法并行化训练,因为当前时刻依赖前一时刻输出
  • 长距离依赖严重衰减,比如第1个词对第100个词的影响几乎归零

我在早期做过语音识别项目,用的就是双向 LSTM。当时最大的困扰是,一旦句子超过30个词,模型就开始“忘记”开头的信息。后来尝试加更深的层,结果梯度消失更严重,训练时间翻倍不说,准确率还下降了。

这就是为什么我们需要一种新的机制——能够一次性看到整句话,并自动判断哪些词之间有关联。

2.2 自注意力机制:让每个词自己找上下文

Transformer 的核心创新,正是自注意力(self-attention)。

它的原理可以用一句话概括:
每个输入词元都会生成三个向量——查询(Query)、键(Key)、值(Value)。然后通过 Q 和 K 的相似度计算权重,再用这些权重对 V 加权求和,得到新的表示。

这个过程允许模型在处理“苹果”这个词时,同时考虑“手机”、“发布会”、“iOS”等远距离相关词,而不受位置限制。

更重要的是,这个操作可以完全并行化。GPU 能一次性处理所有词之间的关系,极大提升了训练效率。

2.3 编码器-解码器结构:信息转换的双阶段流水线

原始的 Transformer 论文提出了完整的编码器-解码器架构。

2.3.1 编码器的作用:理解输入

编码器部分由多个相同的层堆叠而成。每一层包含两个子模块:

  • 自注意力层:捕获输入内部的关系
  • 前馈神经网络(FFN):进行非线性变换

每一层都会逐步提炼语义信息。比如第一层可能识别语法结构,第二层识别命名实体,第三层开始理解意图。

我在做法律文书分析时观察到,浅层注意力多集中在标点符号和段落格式上,而深层注意力则聚焦于条款引用和责任主体判定。

2.3.2 解码器的作用:生成输出

解码器同样由多层组成,但它比编码器多了第三个组件:

  • 编码器-解码器注意力层:让解码器关注编码器输出的关键部分

这一层的作用类似于翻译中的“对齐”。例如,在将中文“北京市”翻译成英文时,模型会特别关注编码器中对应“北京”和“市”的位置。

此外,解码器使用掩码自注意力(masked self-attention),确保在生成第 t 个词时看不到后面的词,维持因果顺序。

3. 那么,MoE 到底改变了什么?

3.1 参数爆炸时代的困境:越大就越慢吗?

随着模型规模突破百亿、千亿甚至万亿参数,一个新的矛盾浮现出来:

我们想要更强的能力,就需要更多的参数。
但我们每增加一次参数,推理和训练的成本就成倍上升。

这个问题在企业场景中尤为突出。很多公司愿意投入资金训练大模型,却无法承受线上服务每秒几毫秒的延迟增长。

这时候人们开始思考:是否可以让模型变得“更大”,但实际运行时只用“一小部分”?

这就是 MoE 的出发点。

3.2 MoE 的基本思想:不是所有人都上班,而是按需上岗

3.2.1 什么是“专家”?

在标准 Transformer 中,每个 FFN 层是一个固定的全连接网络,所有输入都走同一套参数。

而在 MoE 中,这个 FFN 层被替换为一组独立的小型 FFN,每一个就是一个“专家”。

这些专家共享同一个输入空间,但各自拥有不同的参数。它们可能擅长不同类型的任务:

  • 有的专攻数学表达式解析
  • 有的熟悉诗歌押韵模式
  • 有的精通代码缩进规则

3.2.2 路由器的角色:智能调度员

既然有多个专家,就需要一个决策机制来决定谁来处理当前输入。

这个角色由“路由器”(Router)承担。它接收当前 token 的表示,输出一个概率分布,表示各个专家对该 token 的适配程度。

最常见的做法是计算 Router 输出的 top-k 个专家,只将该 token 分配给这 k 个专家处理。

举个例子:

  • 输入:“print('Hello, world!')”
  • Router 判断这是 Python 代码
  • 激活编号为 #7 和 #13 的专家(假设它们专门处理编程语言)
  • 其他专家保持休眠状态

这样,虽然模型总参数量很大,但每次前向传播只激活少量参数,显著降低计算负担。

4. 结构对比:它们究竟在哪一级别上不同?

4.1 架构层级上的错位比较

很多人误以为 MoE 是 Transformer 的替代品,是因为他们默认两者是同级别的选项。实际上,MoE 并没有重新设计信息流动路径,它只是替换了其中一个组件。

我们可以画出如下的层次关系:

模型整体架构
├── Transformer(定义信息流)
│   ├── 编码器堆栈
│   │   └── N 个编码器层
│   │       ├── 自注意力层
│   │       └── FFN 层 ← 这里可以被 MoE 替代
│   └── 解码器堆栈
│       └── N 个解码器层
│           ├── 掩码自注意力
│           ├── 编码器-解码器注意力
│           └── FFN 层 ← 同样可被 MoE 替代
└── MoE(定义参数激活方式)
    ├── 多个专家(小型 FFN)
    └── 路由器(门控网络)

从图中可以看出,MoE 并不是一个独立的模型架构,而是一种模块替换策略。它嵌入在 Transformer 的 FFN 位置,形成“MoE-Transformer”混合结构。

4.2 动态与静态的区别才是关键

特性 标准 Transformer(密集) MoE 扩展版本
FFN 类型 单一固定网络 多个并行专家
参数激活 每次全部激活 每次仅激活 top-k
计算模式 静态路径 动态路由
模型容量 与计算量正比增长 可超线性扩展
推理延迟 稳定可控 受负载均衡影响

这张表揭示了一个重要事实:MoE 的优势不在精度提升,而在性价比优化。它允许我们在有限算力下容纳更大的模型容量,从而获得更强的语言理解和生成能力。

5. 工程现实:MoE 真的那么容易落地吗?

5.1 理论美好,但硬件吃紧

我在某金融客户现场部署 MoE 模型时,第一次真实感受到理论与实践的巨大鸿沟。

理论上,MoE 推理速度应该更快,因为它只激活部分参数。
但实际上,我们的 GPU 显存很快就满了,吞吐量反而不如原来的密集模型。

原因出在以下几个方面:

5.1.1 显存占用并未减少

尽管每次只激活少数专家,但所有专家的参数仍然必须加载到显存中。一个 1T 参数的 MoE 模型,哪怕只用 10%,也需要完整保留 1T 参数的空间。

这意味着:

  • 显存压力没有缓解
  • 模型加载时间更长
  • 多实例部署困难

5.1.2 路由带来的额外开销

路由器本身也是一个小型神经网络,它需要对每个 token 进行打分,并执行 top-k 操作。这部分计算虽然不大,但在高并发场景下累积起来不可忽视。

特别是在 batch size 较大时,top-k 操作会成为瓶颈。我们测试发现,在 A100 上处理 512 序列长度 + 2k batch size 时,路由决策耗时占到了总前向传播的 8%。

5.1.3 负载不均导致资源浪费

理想情况下,每个专家应该被均匀调用。但在实际中,某些专家会被频繁访问,而另一些长期闲置。

我们监控到一组数据:

  • 最活跃的专家处理了 37% 的请求
  • 最冷门的专家仅被调用 0.2%
  • 超过 60% 的专家利用率低于 5%

这种情况造成严重的“热点”问题。热门专家所在的 GPU 负载飙升,不得不降频运行,整体吞吐下降。

5.2 如何解决 MoE 的工程挑战?

5.2.1 引入辅助损失函数:强制平衡

为了缓解负载不均问题,业界普遍采用一种叫做“辅助损失”(auxiliary loss)的技术。

它的核心思想是:

  • 监控每个专家被选中的频率
  • 添加一个正则项,惩罚过于集中或过于分散的选择
  • 在训练过程中引导路由器走向均衡

我在训练一个 16-expert MoE 模型时加入了这一机制,最终将最大专家负载从 37% 降到 12%,最小从 0.2% 提升到 6.5%,整体利用率曲线平滑了许多。

5.2.2 使用专家并行(Expert Parallelism)

传统的张量并行或流水线并行无法有效应对 MoE 的稀疏性。

于是 Google 提出了“专家并行”策略:将不同的专家分布到不同的设备上,只有当某个专家被激活时,对应设备才参与计算。

这样做有两个好处:

  • 单卡显存压力大幅降低
  • 可以横向扩展专家数量

不过这也带来了通信开销。当一个 token 被路由到远程专家时,需要跨设备传输数据。我们在 RDMA 网络下测试发现,跨节点调用延迟增加了约 1.3ms,对实时性要求高的场景仍需谨慎。

5.2.3 设置容量因子(Capacity Factor)

为了避免某个专家被过多 token 拥挤,通常会设置一个“容量上限”。

例如设定容量因子为 1.25,意味着每个专家最多处理平均负载的 1.25 倍。超出的部分要么丢弃,要么重新路由。

这个参数非常关键。设得太低会导致信息丢失;设得太高又失去负载控制意义。我们在多个任务上做了调参实验,发现最佳值通常在 1.1~1.3 之间浮动,具体取决于输入分布的多样性。

6. 什么时候该用 MoE?我的实战判断标准

6.1 不是所有场景都需要 MoE

在我参与过的十几个大模型项目中,成功应用 MoE 的不到一半。其余的要么退回密集架构,要么改用混合策略。

关键在于认清自己的需求边界。

6.1.1 推荐使用 MoE 的情况

业务涉及多种领域或模态

例如客服系统既要处理产品咨询,又要识别发票内容,还要支持多语言。不同专家可以自然分工。

训练预算充足但推理资源受限
MoE 训练成本接近小模型,适合预算有限但追求高性能的企业。

存在明显的任务聚类特征
如果你能预判输入大致分为几类(如代码/文本/表格),MoE 更容易收敛出专业化的专家。

6.1.2 不建议使用 MoE 的情况

输入高度同质化
比如纯新闻摘要生成,所有文本风格一致,专家难以分化,MoE 优势无法体现。

对延迟极其敏感
路由判断、跨设备通信等额外步骤可能引入抖动,不适合高频交易或工业控制类应用。

团队缺乏底层优化能力
MoE 需要定制化调度、监控、容错机制,普通 ML 工程师很难驾驭。

7. 组合之道:Transformer + MoE 才是未来主流

7.1 最优解不在对立,而在协同

越来越多的证据表明,顶级模型并不是在“Transformer 或 MoE”之间做选择,而是在探索“如何更好地融合”。

7.1.1 分层混合策略

有些模型只在深层使用 MoE,浅层保持标准 FFN。

原因很简单:

  • 浅层负责通用特征提取,不需要专业化
  • 深层靠近输出,语义更具体,更适合专家分工

我们在一个医疗问答模型中尝试了这种结构,发现效果比全层 MoE 更好,且训练稳定性大幅提升。

7.1.2 动静结合的设计

另一种趋势是“静态专家 + 动态路由”的结合。

比如预先定义几类专家:

  • 文本理解专家
  • 数值计算专家
  • 逻辑推理专家

然后在训练中允许路由器自由组合使用。这种方式既保证了结构可解释性,又保留了灵活性。

8. 我的体会:技术选型背后是成本思维

8.1 参数不是越多越好,而是“谁在干活”更重要

这些年我越来越意识到,大模型落地的核心不是追求参数量破纪录,而是搞清楚:

每次预测背后,到底有多少参数真正起了作用?

一个 10B 的密集模型,每次推理调动全部 10B 参数。
一个 100B 的 MoE 模型,每次只调动 10B 参数,但这些参数更专业、更高效。

从用户角度看,响应质量可能差不多。但从企业角度看,后者意味着更低的单位服务成本。

这才是 MoE 的真正价值。

8.2 架构演进的本质是资源调度的精细化

回顾深度学习的发展史,其实就是一场“计算资源利用率”的进化。

  • CNN 让卷积核共享参数,减少冗余
  • Attention 让模型自主选择关注点,避免无效计算
  • MoE 让参数按需激活,实现条件执行

每一步都在回答同一个问题:如何用最少的有效计算,完成最复杂的任务?

MoE 不是终点。未来可能会出现“时间专家”、“位置专家”、“情绪专家”,甚至动态生成临时专家来应对突发请求。

9. 总结:它们不是对手,而是搭档

Transformer 定义了信息如何流动。
MoE 决定了哪些参数参与运算。

一个是骨架,一个是神经系统。
一个管流程,一个管调度。

当我们谈论大模型加速时,真正重要的不是换掉哪个部件,而是建立起“按需执行”的工程意识。

那些看似神奇的性能突破,往往来自对基础组件的重新编排,而非颠覆式创新。

我见过太多团队盲目追逐新技术名词,却忽略了最根本的问题:你的业务真的需要这么多专家吗?
如果你的答案是否定的,那么再先进的架构也只是负担。

技术的意义,永远在于解决问题,而不是制造复杂。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐