Dense vs MoE 架构对比:从 Qwen3 Model Card 切入
一句话:2026 年的大模型基本就两类——Dense(密集) 和 MoE(混合专家)。这篇用 Qwen3-32B(Dense)和 Qwen3-30B-A3B(MoE)两个参数量相近但结构不同的模型做对照,把 Dense/MoE 差异、关键架构参数(嵌入词表 / 头数 / 层数 / 专家数)、GQA 分组注意力、YaRN 上下文外推一次讲清。
目录
- 1. 一图看懂 Dense vs MoE
- 2. 用 Qwen3 两个模型做实战对照
- 3. GQA:注意力机制的”分组优化”
- 4. YaRN:把短上下文模型”拉长”的技术
- 5. 模型参数经验值速查
- 6. 与本知识库其他章节的关联
- 7. 术语速查
- 8. 来源与评分
1. 一图看懂 Dense vs MoE
1.1 通俗类比
Dense(稠密 / 密集模型):一个全科医生开的小诊所
- 不管你是感冒还是骨折,都他一个人看
- 看病的时候把脑子里所有知识都过一遍(神经网络的每个参数都参与计算)
- 优点:思考深、个人能力强
- 缺点:精力有限,慢
MoE(Mixture of Experts,混合专家模型):一家有分诊台 + 多个专科医生的医院
- 入口先经过路由层(Router,相当于分诊台)做分流
- 每次只调用其中 2~8 个相关专家(专家 = 神经网络的局部子模块)
- 总参数可以堆得很大(堆专家就行),但每次激活参数只是一小部分
- 优点:又大又快
- 缺点:单个专家不如同尺寸 Dense 那么”通才”
1.2 结构示意
Dense 推理一次:
输入 → [全部参数都算一遍] → 输出
↑ 32B 参数全用上
MoE 推理一次:
输入 → 路由层 → 选 8 个专家 → 只这 8 个算 → 输出
↑ 总 128 个专家
↑ 每次激活的参数 = 总参数的 3~10%
1.3 优缺点对照
| 维度 | Dense | MoE |
|---|---|---|
| 推理速度(同总参数) | 慢 | 快 |
| 思考深度(同总参数) | 强 | 弱 |
| 显存占用 | 中等 | 大(要装下所有专家) |
| 训练难度 | 中等 | 高(路由不稳、负载不均) |
| 当前主流场景 | 小到中模型(≤ 70B) | 大模型(≥ 70B 几乎都转 MoE) |
1.4 深化类比(出自 LINUX DO @flymyd)
-
Dense = 智商 150 的天才:一个人 STEM 全打通,但精力有限;可能精通数学就不太会炒菜,甚至搞出”铁钉炒鸡蛋”
-
MoE = 8 个智商 120 的人组成的团队:奥数比不过 150 天才(这类题只有”做出来 / 做不出来”),但他们集合起来覆盖的技能面更广
-
Dense = 大嘴大胃袋巨人:吃多少消化多少
-
MoE = 胃袋和巨人一样大但嘴很小的奇怪生物:总容量很大,但每口能吞下去的有限
⚠️ “MoE 更好” 的说法不准确。在同等总参数下 MoE 更省算力,但在同等激活参数下 Dense 思维更深。选型要看场景:拼实时响应选 MoE,拼推理质量选 Dense。
2. 用 Qwen3 两个模型做实战对照
阿里 Qwen3 系列同时有 Dense 和 MoE 版本,参数量还故意做得相近,是天然的对照实验材料。
2.1 Model Card 基础参数
| 参数项 | Qwen3-32B(Dense) | Qwen3-30B-A3B(MoE) | Qwen3-235B-A22B(大 MoE) |
|---|---|---|---|
| 类型 | Causal LM | Causal LM | Causal LM |
| 总参数量 | 32.8B | 30.5B | 235B |
| 激活参数 | 32.8B(全部) | 3.3B | 22B |
| 非嵌入参数 | 31.2B | 29.9B | 234B |
| 层数(Layers) | 64 | 48 | 94 |
| GQA 头数(Q / KV) | 64 / 8 | 32 / 4 | 64 / 4 |
| 专家数 | — | 128 | 128 |
| 激活专家 | — | 8 | 8 |
| 原生上下文 | 32K | 32K | 32K |
| YaRN 扩展上下文 | 128K | 128K | 128K |
读这张表的核心心法:MoE 模型的架构是由”激活参数”决定的,不是总参数。
- Qwen3-30B-A3B 总共 30.5B,但只激活 3.3B → 它的”骨架”实际上对标的是 3B 级别 Dense
- Qwen3-32B 是真·32B 全激活 Dense → 骨架就是 32B 级别
所以 30B-A3B 的层数(48)、隐藏维度(2048)、注意力头数(32)都比 32B 小,是合理的。
2.2 关键参数逐项解读
嵌入词表(Embedding)
Embedding 参数量 = 词表大小 × 隐藏层维度
- Qwen3 全系列共用同一份词表,
vocab_size = 151936 - Qwen3-32B:
hidden_size = 5120→ 嵌入参数约 1.6B - Qwen3-30B-A3B:
hidden_size = 2048→ 嵌入参数约 0.6B
💡 隐藏知识点:Qwen3 的输入嵌入层与输出投影层不共享权重(tie_word_embeddings: false),所以实际嵌入参数要 ×2。
词表大 = 多语言支持好。纯英文模型词表通常只有 32K
64K,多语言模型常在 100K200K。
隐藏层维度(hidden_size)
- 每个 Token 进来先被嵌入为一个向量,向量的长度就是
hidden_size - 维度越高 → 模型对每个 Token 的”内部表示”越细腻
- 代价:维度变高,所有矩阵运算量都跟着平方级涨
类比:hidden_size 像是描述一个人的”性格维度数”——只用 3 个维度描述一个人很粗糙(外向/内向、爱不爱钱、爱不爱学习),用 5120 个维度就细到能区分每个人。
注意力头数(num_attention_heads)
- 头数 ≈ 模型”同时关注几件事”的并行度
- 隐藏维度大 → 头数也跟着大(这样每个头分到的子维度还够用)
- 经验值:
hidden_size / head_dim = 头数(Qwen3 里head_dim = 128,所以 5120/128 = 40 头不对……实际是 64 头,说明 head_dim 不是严格 128 分配)
详见本库 注意力机制 § 多头注意力。
隐藏层数(num_hidden_layers)
- 层数 = Transformer 块堆叠的层数
- 层数越深 → 抽象推理能力越强(详见 大模型如何理解文本 § 层级抽象)
- 代价:层数太多,推理串行延迟拉长
经验值:
| 模型尺寸 | 典型层数 |
|---|---|
| 3B~7B(小) | 30~50 层 |
| 30B~70B(中) | 50~80 层 |
| 200B+(大) | 90~120 层 |
专家数与激活专家(MoE 专有)
num_experts:总专家数(Qwen3 MoE = 128)num_experts_per_tok:每个 Token 经过每一层时激活几个专家(Qwen3 MoE = 8)- 注意是”每 Token 激活 8 个”,不是”每次推理激活 8 个”——每个 Token 都做一次专家选择
类比:分诊台不是给整个病人指一个科室就完事,而是病人每过一个走廊(每一层)都要重新分诊一次。
3. GQA:注意力机制的”分组优化”
GQA = Grouped Query Attention,分组查询注意力。
它在标准多头注意力(MHA)和省内存版(MQA)之间做权衡。看 Qwen3 模型卡里的 64 for Q and 8 for KV 就是 GQA 表达——64 个 Q 头共享 8 组 KV。
3.1 三种注意力的区别
| 名称 | 全称 | Q : KV 比例 | 特点 |
|---|---|---|---|
| MHA | Multi-Head Attention | 1 : 1 | 每个头都有自己的 K、V。细节最强,显存爆炸 |
| MQA | Multi-Query Attention | N : 1 | 所有 Q 头共享一组 K、V。最省显存最快,容易丢细节 |
| GQA | Grouped Query Attention | N : G(中间值) | 折中。Q 头分成 G 组,每组共享一对 KV |
3.2 关键认知
- Q 数量 = 模型每一层”从几个不同角度去理解输入”的并行度 → 决定思考广度
- KV 数量 = 需要缓存的”记忆条目数” → 决定显存占用和显存搬运速度
KV 必须存在显存里,且每次推理都要读取。KV 多 → 显存压力大 + 显存带宽成为瓶颈 → 推理变慢。
3.3 选型逻辑
我要细节准确度 → MHA(早期 GPT、LLaMA 1)
我要极致快 → MQA(PaLM、StarCoder)
我要平衡 → GQA(LLaMA 2/3、Qwen2/3、Mistral)→ 2026 主流
GQA 当下是几乎所有新模型的默认选择。
4. YaRN:把短上下文模型”拉长”的技术
YaRN = Yet another RoPE extensioN method,一种 RoPE 位置编码的外推改进。
4.1 为什么会有”原生上下文” vs “扩展上下文”两个数
Qwen3 标的是 Context Length: 32,768 natively and 131,072 tokens with YaRN——原生 32K,YaRN 扩展到 128K。
原生上下文 = 预训练时模型实际见过的最长文本长度。在这个长度内性能最好。超出这个范围,模型是没见过的,会”看一眼就发疯”。
4.2 RoPE 是什么(基础铺垫)
RoPE = Rotary Position Embedding,旋转位置编码。
它是 Transformer 给每个 Token 标”我在序列里第几个”的方式之一。传统正弦余弦位置编码(详见 Transformer § 位置编码)是加法叠加,RoPE 改成了乘法旋转——理论好处是支持任意长度外推。
4.3 YaRN 怎么”拉长”上下文
用一个尺子的类比(出自 LINUX DO @flymyd):
模型 = 一把刻度 0~32K 的尺子
要量 64K 的文本:
方案 A(什么都不做):超出 32K 部分 = 古神 = 模型看一眼就发疯,开始乱吐 Token
方案 B(RoPE 朴素外推):把 64K 压扁到 32K 尺子上 = 文字变糊但能看
方案 C(YaRN):宏观结构压缩、微观细节尽量保留 = 文字仍清晰
技术上:
- 朴素 RoPE 外推:所有位置一刀切压缩(动态压缩倍率 = 输入长度 / 原生长度)→ 损失细节
- YaRN:低频维度(宏观信息)大幅压缩,高频维度(细节)尽量不压缩 → 既能读长文,又保住细粒度理解
4.4 实际使用心法
| 场景 | 建议 |
|---|---|
| 文本 ≤ 原生上下文 | 不开 YaRN,原生性能最好 |
| 文本 = 1~2 倍原生 | 开 YaRN,性能可接受 |
| 文本 ≥ 4 倍原生 | 即使开 YaRN,质量也会显著下降(细节流失) |
⚠️ “原生 32K + YaRN 128K” 不代表 128K 也好用。真正长上下文还得看模型是不是专门做了长上下文训练(如 Qwen2.5-1M、Gemini 1.5 Pro)。详见 上下文窗口与 Token 计费。
5. 模型参数经验值速查
读 Model Card 时如果不熟悉数字大小,可以用这张表做”合理性自检”——和经验值差太多的就要怀疑是不是配置异常。
| 尺寸级别 | hidden_size | layers | Q 头数 | KV 头数 | head_dim |
|---|---|---|---|---|---|
| 小(3B~7B) | 2048~4096 | 30~40 | 16~32 | 4~8 | 64~128 |
| 中(13B~30B) | 4096~5120 | 40~60 | 32~64 | 8 | 128 |
| 大(65B~70B) | 8192 | 80 | 64 | 8 | 128 |
| MoE(30B-A3B 类) | 2048 | 48 | 32 | 4 | 128 |
| MoE(200B+) | 5120~8192 | 90+ | 64 | 4~8 | 128 |
6. 与本知识库其他章节的关联
- 架构基础:本笔记的”层数 / 头数 / 隐藏维度”假设你知道 Transformer 块长啥样。基础不熟去看 Transformer.md
- 注意力机制:GQA 的前置是多头注意力。详见 注意力机制.md
- 大模型理解能力的来源:层数多为什么更聪明?详见 大模型如何理解文本.md § 层级抽象
- 上下文窗口与 Token:YaRN 这一节延续 上下文窗口与Token计费.md 的 token 视角
- MoE 的具体实现:DeepSeek 是 MoE 工程化的代表,详见 DeepSeek.md § MoE
- 选完模型怎么部署:见 本地部署模型量化选型.md(Model Card 阅读 / config.json / 精度 / 量化 / 显卡匹配)
- 不同家族的 Dense / MoE 选择:各家LLM模型特点速查.md(DeepSeek/Qwen/GLM/MiniMax 等开源家族的 Dense 与 MoE 阵容对比)
- MoE 对显存的真实需求:NVIDIA显卡架构与AI算力.md(总参数 ≠ 激活参数,但显存占的是总参数)
7. 术语速查
| 术语 | 全称 | 含义 |
|---|---|---|
| Dense | Dense Model | 稠密 / 密集模型,每次推理所有参数都参与 |
| MoE | Mixture of Experts | 混合专家模型,每次只激活部分专家 |
| Causal LM | Causal Language Model | 因果语言模型,自回归预测下一个 token |
| Embedding | — | 词嵌入层,把 token id 变成向量 |
| hidden_size | — | 隐藏层维度,单个 token 的向量长度 |
| head_dim | — | 单个注意力头处理的子维度 |
| MHA / MQA / GQA | Multi-Head / Multi-Query / Grouped Query Attention | 三种注意力变体 |
| RoPE | Rotary Position Embedding | 旋转位置编码 |
| YaRN | Yet another RoPE extensioN method | RoPE 的长上下文外推改进 |
| Router | — | MoE 里决定”用哪几个专家”的路由层 |
| Active Params | Activated Parameters | MoE 每次实际参与计算的参数量 |
| A3B / A22B | Activated 3B / 22B | 模型名后缀,表示激活参数 |
8. 来源与评分
来源:LINUX DO @flymyd《简单易懂的 LLM 相关知识梳理 ep.3-1 认识大语言模型》(2026-01-06,文档共建版块)
整体评分:8.5 / 10
采纳的部分:
- ✅ 用 Qwen3-32B vs Qwen3-30B-A3B 做对照实验的思路(精彩)
- ✅ 诊所 / 医院、智商天才 / 团队、巨人胃袋、尺子 / 古神等所有比喻
- ✅ GQA 中 Q : KV 的工程含义(思考广度 vs 显存压力)
- ✅ YaRN 的尺子比喻 + 宏观/微观区别压缩的解释
- ✅ Model Card 实际参数对照
未采纳 / 改写的部分:
- ✏️ 原文叙事偏散文体(“在又一个普通的清晨…“),改成工程化对照结构
- ✏️ 原文部分细节假设读者已经懂 Transformer,本笔记加了交叉链接
- ✏️ 增加了”模型参数经验值速查表”,原文没有
- ✏️ 增加了 GQA 三类对比的表格(原文只讲了原理)
- ✏️ 部署相关(数据精度、量化方法、显卡选型)拆到 本地部署模型量化选型.md
可商榷处:
- 原文说”Dense 像智商 150 天才”——这个类比对小模型成立,但对 70B+ Dense 不准确,70B Dense 已经接近 MoE 的”团队”规模了
- 原文”奥数题只存在做得出来和做不出来”——这是个强表述,实际上 MoE 在数学题上也能渐进改善
— 本笔记整理于 2026-05-24