Dense vs MoE 架构对比:从 Qwen3 Model Card 切入

一句话:2026 年的大模型基本就两类——Dense(密集)MoE(混合专家)。这篇用 Qwen3-32B(Dense)和 Qwen3-30B-A3B(MoE)两个参数量相近但结构不同的模型做对照,把 Dense/MoE 差异、关键架构参数(嵌入词表 / 头数 / 层数 / 专家数)、GQA 分组注意力YaRN 上下文外推一次讲清。


目录


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 优缺点对照

维度DenseMoE
推理速度(同总参数)
思考深度(同总参数)
显存占用中等(要装下所有专家)
训练难度中等(路由不稳、负载不均)
当前主流场景小到中模型(≤ 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 LMCausal LMCausal LM
总参数量32.8B30.5B235B
激活参数32.8B(全部)3.3B22B
非嵌入参数31.2B29.9B234B
层数(Layers)644894
GQA 头数(Q / KV)64 / 832 / 464 / 4
专家数128128
激活专家88
原生上下文32K32K32K
YaRN 扩展上下文128K128K128K

读这张表的核心心法: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。

词表大 = 多语言支持好。纯英文模型词表通常只有 32K64K,多语言模型常在 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)

经验值:

模型尺寸典型层数
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 比例特点
MHAMulti-Head Attention1 : 1每个头都有自己的 K、V。细节最强,显存爆炸
MQAMulti-Query AttentionN : 1所有 Q 头共享一组 K、V。最省显存最快,容易丢细节
GQAGrouped Query AttentionN : 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_sizelayersQ 头数KV 头数head_dim
小(3B~7B)2048~409630~4016~324~864~128
中(13B~30B)4096~512040~6032~648128
大(65B~70B)819280648128
MoE(30B-A3B 类)204848324128
MoE(200B+)5120~819290+644~8128

6. 与本知识库其他章节的关联


7. 术语速查

术语全称含义
DenseDense Model稠密 / 密集模型,每次推理所有参数都参与
MoEMixture of Experts混合专家模型,每次只激活部分专家
Causal LMCausal Language Model因果语言模型,自回归预测下一个 token
Embedding词嵌入层,把 token id 变成向量
hidden_size隐藏层维度,单个 token 的向量长度
head_dim单个注意力头处理的子维度
MHA / MQA / GQAMulti-Head / Multi-Query / Grouped Query Attention三种注意力变体
RoPERotary Position Embedding旋转位置编码
YaRNYet another RoPE extensioN methodRoPE 的长上下文外推改进
RouterMoE 里决定”用哪几个专家”的路由层
Active ParamsActivated ParametersMoE 每次实际参与计算的参数量
A3B / A22BActivated 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