🧠 大模型基础与 MoE 架构图解

零起点友好:从「Transformer 到底是什么」讲到「一个词进 MoE 后经历什么」——类比 + 步骤图 + 数字实例,看完能给别人讲明白
TransformerMoE 混合专家路由器KV Cache
🎯 本页学习目标
1. 不懂数学也能向别人解释「MoE 是什么、为什么快」
2. 说出一个 token 进入 MoE 层后的四步旅程
3. 会算一笔账:64 个专家选 8 个,参数量和算力各是多少
4. 理解 KV Cache 为什么是长文本的显存大头
建议用时:30 分钟 · 前置:无(本页就是起点)

1 先建立直觉:大模型是怎么「写字」的

所有主流大模型(GPT/DeepSeek/Qwen…)本质都在玩同一个游戏:看到前文,猜下一个词。「人形机器人学习」→ 猜「站」;「今天天气真」→ 猜「好」。把猜出的词接到后面继续猜,一字一句滚出来,就是你看到的流式回答。

而「猜词的大脑」就是 Transformer。它的核心思想一句话:每个词都环顾上下文,决定该重点关注谁(注意力),再独立消化信息(前馈网络 FFN),这样的「关注+消化」模块堆叠几十层,越堆越聪明。

2 一个 Decoder 块的完整数据流

下图是大模型一层(一个 Decoder 块)的标准结构,纵向从上往下读,两条虚线是「残差捷径」——原始信息绕过本层直达深层,防止层数太深时信息丢失:

输入:前文每个词的向量 ① 多头自注意力 每个词环顾其他词:该重点听谁的? ② 残差相加 + 归一化(信息保底通道) ③ 前馈网络 FFN 每个词独立深度加工 —— MoE 改造的就是这一层 ④ 残差相加 + 归一化 → 进入下一层(×N) 残差捷径 残差捷径
图1 · 一个 Decoder 块:注意力(交流)→ FFN(思考),残差捷径保底,循环 N 层

传统模型(如 Llama)里,③ 的 FFN 是一整个大网络,每个词都必须完整过一遍——参数有多少、算力就花多少。MoE 改造的就是这一层:把一个巨型 FFN 拆成一个「专家团队」。

3 MoE 到底是什么:医院分诊的类比

🏥 一句话类比:稠密模型像全科医生——每个病人都由同一位医生从头看到脚,什么病都会一点,但都不精,而且病人再多也只有他一个人(算力瓶颈)。MoE 像三甲医院——挂号处(路由器)看一眼病情,把你分给最对口的 2 位专科医生(专家),其余几十位专科医生休息;同时每位病人还必看一位全科医生(共享专家)处理常规事项。医院雇了几十位专家(总参数大),但每次接诊只出动几个人(激活参数小)——知识容量大、接诊速度快。

4 一个词进入 MoE 层后的四步旅程

以 DeepSeek-V3 为例(256 个路由专家 + 1 个共享专家,每个词选 8 个)。假设输入词是「谐波」:

词向量「谐波」 ① 路由器打分 给 256 位专家各打一个「匹配分」 得分最高的 8 位入选 ② Top-8 选择:数学专家✓ 机械专家✓ 语言专家✓ 代码专家✓ …(其余 248 位休息) 专家 A 加工 专家 C 加工 专家 … 加工 共享专家必过 ③④ 按得分加权求和 匹配分越高的话语权越大(残差后进下一层) 常驻
图2 · MoE 层解剖:路由打分 → Top-8 选择 → 专家各自加工 → 加权求和(共享专家全程参与)

5 算一笔账:为什么「又大又快」不矛盾

拿 DeepSeek-V3 的真实数字算(简化模型):

怎么来的结果
总参数 671B61 层 × 每层 256+1 个专家的 FFN 权重,全部相加下载/显存按这个算
激活参数 ≈37B每个词每层只走 8/256 个专家 + 1 共享专家 + 注意力计算量按这个算
对比同等算力的稠密模型只有 ~37B 参数「知识容量看齐 671B,推理算力看齐 37B」
⚠ 代价也要说清(面试必答):①显存省不了——全部专家都要驻留,所以 MoE 部署喜欢大显存/多卡;②负载均衡问题:路由器天然偏心(马太效应,好专家越来越忙、冷专家越来越废),训练时必须加均衡机制,DeepSeek 的解法是「辅助损失免费」的偏置调节——不直接惩罚路由得分,而是动态微调各专家的入选偏置,均衡与性能不再互斥;③ batch 小的时候专家并行收益下降。

6 新手三连问(FAQ)

为什么 MoE 模型下载文件那么大?能只下载用到的专家吗?
因为 671B 全部专家都在文件里,而「每个词只用 8 个」是运行时动态决定的——不同的问题会激活完全不同的专家组合,你无法提前知道哪 8 个会被用到,所以必须全下。量化(INT4)可以把体积压到 1/4(见 07-05)。
路由器怎么知道该选哪个专家?
路由器本身就是一个很小的神经网络层(线性层+TopK),和整个模型一起被训练出来——训练中它逐渐学会「数学题该送数学专家」。它不是人写规则的,是学出来的分诊直觉。
MoE 推理一定比同参数稠密模型快吗?
算力(FLOPs)上一定更省(只走激活路径);但工程上还要看显存带宽和 batch 大小——专家权重散布在显存里,访存不友好时实际加速会打折。正确表述是「激活算力小」,而非「任何场景都快」。

7 KV Cache:长文本的隐形吞金兽

模型逐词生成时,新词要和之前所有词做注意力。为免重复计算,历史词的 K/V 向量被缓存(KV Cache)。它的体积 ≈ 2(K和V)× 层数 × 每头维度 × 词数 × 并发数——上下文翻倍,它翻倍;并发翻倍,它再翻倍。长上下文推理时,显存大头往往不是模型权重,而是它。下一页的 MLA 就是把 K/V 压进低维隐空间,让这个「吞金兽」瘦身一个量级。

8 数学补充:注意力与负载均衡

不怕公式——本页只有两个「必考级」式子,每个符号都说人话。

① 缩放点积注意力(Transformer 的心脏):

\mathrm{Attention}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^{\mathsf T}}{\sqrt{d_k}}\right)V

② MoE 辅助负载均衡损失:

\mathcal{L}_{aux}=\alpha \cdot N \cdot \sum_{i=1}^{N} f_i \cdot P_i

其中 fᵢ = 专家 i 实际处理的 token 比例(结果口径),Pᵢ = 路由器平均分给专家 i 的概率(意图口径),N = 专家数,α = 均衡强度。fᵢ·Pᵢ 对「越抢手」的专家乘积越大,最小化它就会把过热专家的 token 推向冷专家。为什么不能强行均衡到完全均匀?因为「专家专业化」本身就是 MoE 的能力来源——数学题就该挤爆数学专家。均衡的目的只是「没有专家被彻底饿死」:一旦均衡惩罚过强,路由器被迫把 token 撒胡椒面,专家不再专业化,模型质量直接受损。这正是 DeepSeek-V3 把均衡从损失函数里拿出来、改成对偏置的动态微调(「辅助损失免费」)的原因——均衡与质量不再互斥。

9 常见误区

🚫 误区 1 · 「MoE 推理一定比稠密快」:只看激活算力是 FLOPs 口径。专家权重散布在整个显存里,每换一个被选中的专家就要「远距离取权重」,瓶颈常在访存带宽而非计算;batch 小、显存不富余时实际速度可能不如同算力稠密模型。严谨表述:「激活算力一定小,工程速度看访存与 batch」。
🚫 误区 2 · 「激活 37B=模型只有 37B」的口径混淆:37B 是每个 token 实际流经的参数量(计算量口径);671B 总参数决定知识容量与下载/显存占用。三个口径一句话:下载与显存看总参、计算量看激活参、知识容量看总参——把「模型只有 37B 知识」当结论就全错了。
🚫 误区 3 · KV Cache 公式里的「2」被乱解释:体积公式中的 2 = K 和 V 各缓存一份,不是「双层网络」也不是「双向注意力」。常见错误是把 2 当成可省略的系数——真省掉其中一份,注意力就没有 V 可做加权求和了,公式本身也就不成立。
🚫 误区 4 · 「负载均衡损失越强越好」:α 拉满 = 强迫路由均匀 = 专家失去专业化 = 质量下降(见上文公式解释)。均衡的目标是「没有专家被饿死」,不是「人人工作量相等」。DeepSeek 用辅助损失免费的偏置调节,正是为了不拿质量换均衡。

10 本节自测

1. 一句话说清 MoE 的核心思想?
💡 解析: B 正确——MoE 的本质就是把 FFN 拆成专家团队、按词路由,「雇几十位专科医生、每次只出诊几位」。A 错在「加深层数」是稠密模型的常规加深手段,与专家路由无关——层数深不等于单次算力省,参数照样全跑;C 把 MoE 混淆成 ensemble(多模型投票):那是多个独立模型的组合推理,MoE 是同一个模型内部的分工,所有专家共享底座与路由,不是几台机器投票;D 错在压缩词表只减少 embedding/输出层的参数量,而大模型的计算大头在 FFN,词表再小也省不了主要算力。
2. 一个 token 经过 MoE 层的四步顺序是?
💡 解析: C 是四步正序「先打分、再点名、后干活、按票加权」。A 错在把「专家加工」提到最前——还没被路由选中,加工无从谈起,顺序因果就错了;B 错得更乱:没打分就先 TopK 没有依据(选谁?),而「求和→加工」是因果倒置——求和是对各专家加工结果按分数加权,加工没做求和无从谈起;D 同样把「加权」放在「选择」之前——没有打分就没有权重来源,且打分被排到最后,逻辑上闭环不了。另记一个细节:共享专家不参与 Top-8 竞争、每个词必过,四个干扰项都没体现这一点。
3. MoE 模型部署时显存按什么准备?
💡 解析: A 正确——「哪个词用哪 8 个专家」是运行时随输入动态决定的,无法预知,所以全部专家必须全量驻留显存。B 错在把「激活参数」当显存口径:激活 37B 只决定每步算多少,不参与本步计算的专家权重也必须躺在显存里待命;C 错在「只装被选中的 8 个」同样不成立——选中的组合随问题变化,静态只装 8 个等于每次换题都要重新加载几十 GB 权重,不可行;D 「只装共享专家」错得更远:共享专家只是必经的常驻通道,路由专家才是知识存储的大头。这就是「显存换算力」:MoE 用显存足迹换单次计算量。
4. 训练 MoE 时的「负载均衡」要解决什么?
💡 解析: B 正确——负载均衡要解决的就是路由偏心导致的马太效应:好专家越来越忙、训练越来越充分,冷专家得不到 token 越来越废,最终专家利用率两极分化。A 错在「让每个词长度一致」是 dataloader/padding 的事,与路由分布无关;C 「平衡显存与硬盘」是存储分层问题,负载均衡发生在训练时的 token 分配上,两者毫不相干;D 错得最隐蔽:「让所有专家输出相同」恰恰是均衡的灾难——专家输出趋同等于退化回一个稠密 FFN,专业化消失、MoE 白做。均衡追求「都有活干」,绝不是「干一样的活」。
5. 长上下文推理时显存大头通常是?
💡 解析: A 正确——KV Cache 随「词数×并发」线性膨胀:上下文翻倍它翻倍、并发翻倍再翻倍,长文本下轻松反超固定权重。B 错在权重虽大但恒定:权重在服务期是一次性占用的「房租」,不随对话变长而增长,上下文够长时反被 KV Cache 超过;C 错在路由器只是每层一个小的线性层+TopK,参数量在模型里占比微乎其微;D 词表只影响 embedding 与输出头,同样是固定开销,与序列长度、并发数都无关。记结论:权重是固定房租,KV Cache 是随住随涨的水电费——MLA(下一页)就是冲它来的。
6. 残差连接去掉会怎样?
💡 解析: C 正确——残差是「信息保底通道+梯度高速公路」,去掉后梯度要逐层连乘衰减,几十层的网络连收敛都困难。A 错在「更快」与事实相反:残差还额外增加一次逐元素相加的开销,它换来的是可训练性而非速度;B 「没影响」是彻头彻尾的错误,ResNet 论文的核心发现就是没有残差的深层网络会退化(degradation)——层数越深训练误差反而越高,这不是过拟合而是优化失败;D 「只影响 MoE」错在残差属于所有深层网络(Transformer/CNN/ResNet)的基础组件,稠密模型同样离不开,与 MoE 无关。
7. 「激活参数 37B」的正确理解?
💡 解析: D 正确——激活参数是计算量口径:每个词每层只流经 8/256 个路由专家+共享专家+注意力,约 37B;知识容量仍是 671B。A 错在「只下载 37B」:权重文件是完整的,671B 一个专家都不少,下载与存储从不打折;B 错在把激活量当知识总量——模型「懂多少」由全部专家决定,若只有 37B 知识,MoE 就失去了大容量的存在意义;C 错在显存口径:显存要装下全部 671B(见第 3 题),37B 只是单次前向流经的量。三个口径背熟:下载/显存看总参,计算量看激活参,知识容量看总参。
8. MoE 推理一定比同激活参数的稠密模型快吗?
💡 解析: B 正确且严谨:FLOPs 上必省(只走激活路径),但实际速度还受显存带宽、batch 大小、专家分布影响,工程上会打折。A 「一定快」太绝对——访存不友好时专家权重来回搬运,带宽瓶颈能让理论加速打折甚至倒挂,见本页误区 1;C 「一定慢」与事实相反:激活算力约省 18 倍(671B→37B),正常 batch 下确实更快;D 「与硬件无关」错得离谱——MoE 的实际加速恰恰强依赖硬件:多卡大显存+高带宽时收益最大,消费级单卡反而吃亏。面试能说出「算力口径 vs 访存口径」这层区分即加分。
📌 本节小结:大模型=猜词机;Decoder块=注意力(交流)+FFN(思考)+残差保底;MoE 把 FFN 换成「路由分诊的专家团队」——总参 671B 是知识容量、激活 37B 是计算量;KV Cache 随上下文与并发膨胀,是 MLA 的靶子。
🤔 思考题:1. 如果让「底盘/机械臂/导航」各养一组专家,路由会学到什么?有什么风险?2. 上下文 8K→128K,KV Cache 变多少倍?谁的架构能救(提示:下一页)。

11 参考来源(更新至 2026-08)