笔记:对MoE混合专家模型的学习和思考

目录

一、概念

[(1)稠密模型(Dense Model)](#(1)稠密模型(Dense Model))

[(2)混合专家模型(Mixture of Experts, MoE)](#(2)混合专家模型(Mixture of Experts, MoE))

二、结构原理

三、基本流程

(1)输入进入当前层

[(2)Router 对输入打分](#(2)Router 对输入打分)

[(3)被选中的 Expert 处理输入](#(3)被选中的 Expert 处理输入)

[(4)将多个 Expert 的结果聚合](#(4)将多个 Expert 的结果聚合)

(5)输出传给后续网络

四、筛选机制

(1)路由机制

(2)专家筛选

(3)负载均衡

五、思考


参考1: 图文跨模态融合基础 1 :大语言模型(LLM) -CSDN博客

参考2: https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts

一、概念

稠密模型(Dense Model)和混合专家模型(MoE,Mixture of Experts)是当前主流大模型(LLM)的常用架构,二者均建立在经典的Transformer架构之上,但在参数分配和Token处理上有一定的差别。

根据我们对大模型的学习可以知道,大模型本质上是一个基于 Transformer 的自回归解码器,其基本流程是:输入 Token 先经过嵌入层映射到高维向量空间,再通过多层注意力机制与前馈网络逐层提取特征,最终输出下一个 Token 的概率分布。在这一过程中,注意力模块主要负责建模上下文依赖关系,而前馈网络(FFN)则承担特征变换与非线性表达的重要作用。

简单来说:稠密模型(Dense)是全员计算,MoE 模型是稀疏激活、专家分工 。核心区别在于:稠密模型每次激活全部参数,MoE 只激活少数专家,从而在保持大容量的同时降低计算成本。

(1)稠密模型(Dense Model)

机制全参数激活 。每个输入(token)都经过模型所有参数计算。

结构:标准 Transformer,FFN 是单一、完整的全连接层。

比喻全能大厨------ 做任何菜都动用所有厨具。

代表:Llama 1/2、GPT-3、BERT。

(2)混合专家模型(Mixture of Experts, MoE)

机制稀疏激活 。每层 FFN 替换为N 个专家(小 FFN)+ 1 个门控(Router) 。门控为每个输入选择 Top-K 个专家 计算(通常 K=1 或 2)。

结构

  • 专家(Experts):多个并行小网络,各司其职。
  • 门控(Gate/Router):分配输入到最合适的专家。

比喻专家团队 + 分诊台------ 任务分给专科医生。

代表:DeepSeek-V3、Qwen 3-MoE、Switch Transformer。

本文主要对MoE做一个笔记,Dense Model主要是传统大模型,无需刻意学习,若要了解见参考1。

二、结构原理

相比于传统Dense Model,MoE每次的推理不会调用全部的参数 。一般来讲,对于一个MoE模型,会给出总共的参数量和可激活参数量。对于输入,MoE会先经过一个路由(Router) 对输入内容进行打分,对于每一个专家网络(Expert) 都有一个相应的分数,最后会挑选出分数最高的专家进行处理。

需要注意的是,MoE 中的专家通常是"层内并列、层间独立"的:不同层的专家虽然结构相同,但参数并不共享,Token 也会在每一层重新进行路由选择。另外每个专家的职能无法被具象的描述,如"心理学专家"、"生物学专家"等,而是对于特定token和上下文的一种特定偏好。

对于 Expert,我们可以将其理解为 Transformer 某一层中并列放置的多个前馈子网络(FFN),而不是一个完整的大模型。每个 Expert 都具有独立参数,并在训练过程中逐渐形成不同的功能偏好,因此更擅长处理某一类输入模式。这样一来,MoE 的核心并不是单纯"把大模型拆开",而是通过"路由选择 + 专家分工"的方式,使不同输入能够调用更合适的参数子集。

MoE的专家网络的设定,让其与传统Dense Model相比,MoE能在不显著增加单次推理计算量的前提下,引入更大的总参数规模,从而提升模型容量与表达能力。也就是说,Dense 是"所有参数同时参与计算",而 MoE 是"总参数很多,但每次只激活其中一部分"。前者结构更统一、计算更稳定,后者则更强调按需调用和专家协同。

因此,MoE 可以看作是在 Transformer 框架下,对前馈层进行稀疏化扩展的一种架构设计。它保留了大模型高容量的优势,同时通过稀疏激活降低了实际计算开销,这也是当前许多大规模语言模型采用 MoE 结构的重要原因。

三、基本流程

可以把 MoE 的整体流程概括成 "输入---路由---专家计算---聚合---输出" 五步。

(1)输入进入当前层

在大语言模型里,输入通常不是原始文本本身,而是文本经过分词、嵌入和前面若干层处理后得到的 token 表示向量

当这些向量进入某一层的 MoE 模块时,就开始进行专家选择。

(2)Router 对输入打分

MoE 层里会有一个 路由器(Router)

它会根据当前 token 的隐藏表示,对这一层的所有专家分别计算一个分数。这个分数表示:

  • 当前 token 更适合交给哪个 expert 处理
  • 哪些 expert 更可能对这个 token 有用

一般不会让所有 expert 都参与,而是只选分数最高的少数几个,比如 top-1top-2

(3)被选中的 Expert 处理输入

被选中的 expert 本质上通常是若干个并列的 前馈网络(FFN)

每个 expert 都有自己独立的参数,因此即使结构相同,学到的处理方式也可能不同。

于是,当前 token 只会被送到被选中的 expert 中进行计算,而不会经过所有专家。

这就是 MoE 的核心:稀疏激活

(4)将多个 Expert 的结果聚合

如果只选了一个 expert,那么它的输出就直接作为这一层 MoE 的结果。

如果选了多个 expert,比如 top-2,那么通常会根据 router 给出的权重,对多个 expert 的输出进行 加权求和或聚合,形成该 token 在这一层的最终输出。

也就是说:

  • Router 不仅负责"选谁"
  • 往往还负责"每个 expert 占多大权重"

(5)输出传给后续网络

聚合后的结果会继续沿着 Transformer 的后续路径往下走,例如:

  • 残差连接
  • 归一化
  • 下一层注意力或下一层 MoE/FFN

如果后面还有别的 MoE 层,那么到了下一层会 重新路由一次

同一个 token 在不同层里,可能会被分配给完全不同的 expert。

四、筛选机制

(1)路由机制

Router在本质上,也是一个FNN,用于根据特定输入选择专家。它输出概率值,并用这些概率值来选择最佳匹配的专家。对于MoE,一般存在两种机制即**"稀疏专家,Sparse MoE"** 和"稠密专家,Dense MoE", 两者都使用路由器来选择专家,但稀疏 MoE 只选择少数专家,而密集 MoE 选择所有专家,但分布可能不同。

(2)专家筛选

专家遴选的本质,就是先由路由器对输入进行打分,再将分数转为概率分布,据此选出最匹配的专家,并对专家输出加权聚合,形成最终结果。

第一步,路由打分。

输入先与路由器权重矩阵相乘,得到一个打分向量 。这个向量可以理解为:当前输入对各个专家的原始匹配分数。

第二步,概率归一化。

再对,得到。此时每个分量都表示当前输入分配给对应专家的概率或权重,也就是各专家对该输入的相对适配程度。

第三步,专家选择与加权输出。

路由器根据选择最合适的专家(或 top-k 个专家),然后将这些被选中专家的输出 按对应权重进行加权求和,得到最终输出。如果是稀疏MoE,就不会调用全部专家,而只调用得分最高的少数几个专家。

(3)负载均衡

负载均衡是指在 MoE 训练过程中,尽量避免只有少数专家被频繁调用,而其余专家长期闲置的机制。

在理想情况下,不同输入应当被较为合理地分配到不同专家,使各个 expert 都能参与训练并形成分工。但如果路由器总是偏向少数几个专家,就会出现两个问题:

  • 专家塌缩:部分专家几乎承担了所有计算,其他专家学不到东西;
  • 资源浪费:模型虽然总参数很多,但真正发挥作用的只有少数专家。

因此,MoE 中通常会加入负载均衡损失,对路由结果进行约束,使专家的调用频率和分配权重尽量更均匀。这样做的目的不是让所有专家绝对平均,而是防止路由过度集中,提升专家利用率和训练稳定性。

可以概括成一句话:负载均衡就是通过额外约束,防止 MoE 中路由过于集中到少数专家,从而让更多专家都能被有效使用。

五、思考

假设在某一个范畴,没有更好的专家覆盖,比如打分都低于某个阈值,那效果会不会比稠密差呢?

MoE 可能比稠密差,原因主要有几个:

(1)路由错误

本来这类输入就难分,router 还可能选错 expert。

一旦选错,剩下没被激活的 expert 再强也没用。

(2)专家覆盖不全

训练数据里这类样本少,或者训练过程中没有形成稳定分工,导致没有 expert 专门学到这块。

(3)稀疏激活带来的局部信息损失

稠密模型对每个输入都让同一套 FFN 全量参与;

MoE 只让少数 expert 参与。

如果"少数 expert"覆盖不到这个 corner case,表现就会掉。

因此,在局部难例、长尾分布、覆盖不足的区域,MoE 确实可能比稠密更差。

工程上如何缓解MoE对Expert打分都低的情况?

常见办法有:

  • top-2 / top-k 路由:别只选一个 expert,降低押错宝风险
  • shared expert / shared FFN:保留一条"所有输入都能过的公共稠密通路"
  • load balancing:避免所有数据只训练少数 expert
  • 更好的辅助损失或路由正则
  • 扩大长尾样本覆盖

其中最该注意的是 shared expert

这东西本质上就是在说:

就算专科都不靠谱,至少还有一个"公共医生"兜底。

这能明显缓解你说的"这块输入没人覆盖"的问题。

假如我用的是成品冻结MoE,那么其相对于稠密模型的计算能力,除了算的快的话差距是不是也会很小?

这里要分三种情况:

1. 和"同等激活计算量"的稠密模型比

比如:

  • MoE:总参数 100B,但每次只激活 12B
  • 稠密:一个 12B dense model

这种比法下,MoE 往往不只是更快 ,而且通常能力还会更强一些,因为:

  • 它虽然每次只算 12B 左右
  • 但它背后有更大的总参数池
  • 不同 token 可以调用不同专家

所以本质上它是在用稀疏路由 换取更大总容量

这也是 MoE 设计最核心的收益:

在接近 12B 的单次计算成本下,得到接近更大模型的一部分容量收益。

所以这时候差距不一定小

2. 和"同等总参数量"的稠密模型比

比如:

  • MoE:总参数 100B
  • Dense:也是 100B

那 dense 往往每次都要把 100B 全算一遍,计算代价大很多。

这时 MoE 的主要优势当然是省算力

但能力上不一定谁绝对更强,因为:

  • dense 是全参数协同
  • MoE 是分专家稀疏协同

有些任务 dense 更稳,有些任务 MoE 更强。

所以这时不能简单说"冻结后差距很小",因为它们的结构优势根本不同。

3. 和"一个已经很强的中等规模 dense 成品模型"比

如果拿一个冻结成品 MoE ,去和一个同代际、同训练质量、同用途的 dense 模型比,实际体验里常常会出现:

  • 整体差距没有想象中那么夸张
  • 很多普通任务上,差距确实可能不大
  • 但在某些更复杂、分布更杂、知识覆盖更广的场景里,MoE 可能更有上限

也就是说:

MoE 的优势常常不是"每道题都碾压",而是"在相近推理成本下,把能力上限再往上抬一点"。

相关推荐
鸟电波2 小时前
硬件笔记——Allegro绘制PCB(未完待续)
笔记·嵌入式硬件·智能硬件
憨波个2 小时前
【说话人日志】从固定输出到可变说话人数:EEND-EDA
人工智能·深度学习·音频·语音识别
中屹指纹浏览器2 小时前
2026分布式多账号运维体系中指纹浏览器的架构设计与工程落地
经验分享·笔记
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章49-人脸检测
图像处理·人工智能·opencv·算法·计算机视觉
人工智能AI技术2 小时前
“小飞贼”Little Snitch杀入Linux,内核级流量拦截
人工智能
永霖光电_UVLED2 小时前
CEA-Leti 和 CEA-List 已宣布与 Powerchip 半导体制造公司 (PSMC) 合作
人工智能·生成对抗网络·汽车·制造·激光
ai产品老杨2 小时前
异构计算时代的安防底座:基于 x86/ARM 双架构与多芯片适配的 AI 视频云平台架构解析
arm开发·人工智能·架构
JustNow_Man2 小时前
【opencode】使用方法
linux·服务器·网络·人工智能·python
lvyuanj2 小时前
Java AI开发实战:Spring AI完全指南
java·人工智能·spring