6.1 大模型结构:从 Transformer 到 MoE(混合专家)

这一节从最经典的 Transformer 开始,逐步梳理大模型常见的四种结构范式(Encoder-only / Decoder-only / Encoder-Decoder / Prefix LM),并进一步引出 Dense(稠密)与 MoE(稀疏混合专家)两条技术路线:它们分别代表“每次前向都动用全部参数”与“每次前向只激活部分参数”的两种扩展思路。


1. Transformer 基础结构回顾

Transformer 的核心由两类子层反复堆叠构成:

  • 注意力子层:用于在 token 之间建立信息交互(“看别人”)
  • 前馈子层(FFN):用于对每个 token 的表示进行非线性变换(“自己想”)
  • 残差连接与层归一化(Add & LayerNorm):用于稳定训练、缓解梯度问题

典型的 Transformer(原始论文)分为 EncoderDecoder 两部分。


2. Encoder:双向注意力的理解模块

2.1 Encoder Block 结构

Encoder 的每一层通常是:

  1. Multi-Head Self-Attention(MHA)
  2. Add & LayerNorm
  3. Feed-Forward Network(FFN)
  4. Add & LayerNorm

关键特征:双向注意力(Bidirectional Attention)
Encoder 的 self-attention 不做遮罩,序列中任意位置的 token 都可以互相注意到,因此更擅长“理解上下文”。

2.2 Self-Attention 的核心计算

给定输入表示矩阵 X∈RL×dX \in \mathbb{R}^{L \times d}XRL×dLLL 是序列长度,ddd 是隐藏维度),注意力通过三个线性映射得到:

Q=XWQ,K=XWK,V=XWV Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV

单头注意力输出为:

Attn(Q,K,V)=softmax(QK⊤dk)V \text{Attn}(Q,K,V)=\text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attn(Q,K,V)=softmax(dk QK)V

其中 dkd_kdk 是每个头的 key 维度,1dk\frac{1}{\sqrt{d_k}}dk 1 的缩放用于稳定 softmax 的数值范围。

多头注意力(MHA)把多个头拼接再投影:

MHA(X)=Concat(head1,…,headh)WO \text{MHA}(X)=\text{Concat}(\text{head}_1,\ldots,\text{head}_h)W_O MHA(X)=Concat(head1,,headh)WO


3. Decoder:单向生成模块(避免未来信息泄露)

3.1 Decoder Block 结构(Encoder-Decoder 结构下)

Decoder 的每一层通常是:

  1. Masked Multi-Head Self-Attention(Masked MHA)
  2. Add & LayerNorm
  3. Cross-Attention(Encoder-Decoder Attention)
  4. Add & LayerNorm
  5. FFN
  6. Add & LayerNorm

3.2 Masked Self-Attention:单向因果约束

Decoder 需要做自回归生成:预测当前位置 token 时不能看到未来 token。
因此在 self-attention 的 softmax 前加入 因果 mask(下三角):

Attn(Q,K,V)=softmax(QK⊤+Mdk)V \text{Attn}(Q,K,V)=\text{softmax}\left(\frac{QK^\top + M}{\sqrt{d_k}}\right)V Attn(Q,K,V)=softmax(dk QK+M)V

其中 MMM 是 mask 矩阵,满足:

  • 若位置 j>ij > ij>i(未来位置),则 Mij=−∞M_{ij}=-\inftyMij=
  • 否则 Mij=0M_{ij}=0Mij=0

这样 softmax 后未来位置的概率为 0,从而保证因果性。

3.3 Cross-Attention:利用 Encoder 提供的上下文

Cross-Attention 的本质是:Decoder 用自己的查询 QQQ 去“检索” Encoder 的输出(作为 K,VK,VK,V):

Q=HdecWQ,K=HencWK,V=HencWV Q = H_{\text{dec}}W_Q,\quad K = H_{\text{enc}}W_K,\quad V = H_{\text{enc}}W_V Q=HdecWQ,K=HencWK,V=HencWV

它让 Decoder 在生成时能对输入序列的关键部分对齐与聚焦,例如翻译任务中对齐源语言片段。


4. 四种 LLM 常见结构范式

大模型常见结构可以概括为四类:

  1. Encoder-only
  2. Decoder-only
  3. Encoder-Decoder
  4. Prefix LM(可视为特殊的 Encoder-Decoder)

下面逐一说明。


4.1 Encoder-only(代表:BERT)

注意力形态:双向
每个 token 可以看见前后上下文,适合表示学习与理解类任务。

  • 优势:上下文建模充分,适合 NLU(分类、抽取、匹配)
  • 局限:不天然适合自回归生成(没有 next-token 的训练目标)

典型任务例子:命名实体识别(NER)
需要“看两边”判断一个词是不是实体,双向上下文能显著帮助 disambiguation。


4.2 Decoder-only(代表:GPT / LLaMA 等)

注意力形态:单向(因果)
训练目标与推理形式一致:永远是 next token prediction。

自回归语言模型的标准目标:

P(x)=∏t=1LP(xt∣x<t) P(x)=\prod_{t=1}^{L}P(x_t\mid x_{<t}) P(x)=t=1LP(xtx<t)

  • 优势:
    • 训练目标与下游生成一致
    • Prompt 化后可统一多任务(问答、摘要、推理、对话)
    • 工程上更简洁,扩展更直接
  • 局限:
    • “理解”并非不能做,但天然是从左到右建模,不像 Encoder 双向那样对称

4.3 Encoder-Decoder(代表:T5 / BART)

输入端双向、输出端单向
Encoder 专心编码输入,Decoder 在 Cross-Attention 的帮助下生成输出。

  • 优势:输入理解更充分,天然适合 Seq2Seq(翻译、改写、摘要)
  • 局限:
    • 结构更复杂,推理与训练成本往往更高
    • 在纯开放式长文本生成上,工业界常倾向 Decoder-only 的统一范式

4.4 Prefix LM(代表:GLM / U-PaLM)

Prefix LM 是一种折中:通过特殊 mask 让 前缀部分可双向注意,而 生成部分保持因果单向

可以理解为把序列切为两段:

  • 前缀段:允许互相看见(双向)
  • 生成段:只能看过去(单向),但可以看前缀全部 token

这种结构兼顾“理解输入”与“生成输出”的统一实现。


5. 为什么很多通用大模型选择 Decoder-only

Decoder-only 的核心优势来自“统一范式”:

  • 训练就是 next-token prediction
  • 推理也是 next-token generation
  • 用 prompt 可以把各种任务转成“生成问题”

从优化角度看,它把大量任务统一成同一种目标:

max⁡∑t=1Llog⁡P(xt∣x<t) \max \sum_{t=1}^{L}\log P(x_t\mid x_{<t}) maxt=1LlogP(xtx<t)

这使得大规模预训练、指令微调、推理范式高度一致,工程复杂度更低、生态更集中。


6. Dense 模型:稠密参数的前向计算

6.1 Dense 的定义

Dense(稠密)模型指:每次前向推理会激活全部参数
典型的 Transformer 就是 Dense:每层的注意力与 FFN 都对所有 token 执行同样的计算路径。

6.2 Dense 模型的计算瓶颈:FFN 占大头

在 Transformer 中,FFN 通常是两层线性层夹一个非线性激活(以 GeLU 为例):

FFN(x)=ϕ(xW1+b1)W2+b2 \text{FFN}(x)=\phi(xW_1+b_1)W_2+b_2 FFN(x)=ϕ(xW1+b1)W2+b2

其中 W1∈Rd×dffW_1\in\mathbb{R}^{d\times d_{\text{ff}}}W1Rd×dffW2∈Rdff×dW_2\in\mathbb{R}^{d_{\text{ff}}\times d}W2Rdff×d,而 dffd_{\text{ff}}dff 往往远大于 ddd(例如 dff≈4dd_{\text{ff}}\approx 4ddff4d)。
因此当模型规模增大时,FFN 的参数与算力开销会非常显著。

一个常见现象是:随着模型变大,FFN 参数占比越来越高,这也是 MoE 往往优先替换 FFN 的原因。


7. Sparse / MoE:用“稀疏激活”扩展模型容量

7.1 MoE 的核心想法

MoE(Mixture of Experts)用多个“专家网络”来替代原本的单个 FFN,并通过“路由器/门控网络”选择其中一部分专家参与计算。

一个 MoE 层通常由:

  • NNN 个专家网络 {f1,…,fN}\{f_1,\ldots,f_N\}{f1,,fN}(多数情况下每个专家是一个 FFN)
  • 一个路由器(Router / Gate)GGG(用于分配 token 到专家)

关键特性:每个 token 只激活少数专家(稀疏)
因此可以在 计算量不同比例增长 的情况下,显著扩大参数总量(模型容量)。


8. MoE 层放在哪里:通常替换 FFN

MoE 最常见的放置方式是:在 Transformer block 中,用 MoE-FFN 替换原本的 Dense FFN:

  • Attention 子层仍然是 dense 的(所有参数参与)
  • FFN 子层变为稀疏专家(只激活部分专家)

直觉解释:Attention 负责跨 token 信息交互;FFN 负责“每个 token 的非线性变换”。
当模型越做越大,FFN 的成本与参数占比更突出,用 MoE 替换 FFN 最能“用稀疏换容量”。


9. Router / Gate:token 如何选择专家

9.1 Router 输出专家概率分布

对每个 token 的隐藏状态 xxx,Router 通过线性层得到 logits:

z=xWr z = xW_r z=xWr

再通过 softmax 得到对 NNN 个专家的概率分布:

pi=exp⁡(zi)∑j=1Nexp⁡(zj) p_i=\frac{\exp(z_i)}{\sum_{j=1}^{N}\exp(z_j)} pi=j=1Nexp(zj)exp(zi)

这里 pip_ipi 表示把该 token 分配给第 iii 个专家的倾向。

9.2 Top-kkk Routing:只选少数专家

稀疏 MoE 常用 Top-kkk 路由:对每个 token,只选择概率最大的 kkk 个专家参与计算。
设被选中的专家集合为 Ek(x)\mathcal{E}_k(x)Ek(x),则 MoE 输出常写为加权和:

y=∑i∈Ek(x)pifi(x) y=\sum_{i\in \mathcal{E}_k(x)}p_i f_i(x) y=iEk(x)pifi(x)

  • k=1k=1k=1:每个 token 只走一个专家路径(最稀疏、最省算)
  • k=2k=2k=2:常见设定(如不少模型采用 Top-2),在稀疏与稳定性之间折中

10. 一个直观例子:同一句话里不同 token 走不同专家

考虑一段混合文本(概念性说明):

  • 自然语言部分:包含问句词、标点、实体名
  • 代码部分:包含缩进、关键字、特殊符号

在 MoE 中,Router 往往会让某些 token 的分配呈现一致性,例如:

  • 代码缩进 token 频繁被分配到某一固定专家
  • 问句开头的特定词(如 Question)常被路由到同一专家
  • 标点、数字、某些功能性 token 可能形成更稳定的路由偏好

这种现象的含义是:专家更像是在处理“token 类型与上下文形态”的差异,而不是“领域学科”的差异。


11. 专家是否会学到“学科领域”知识?

需要特别注意:MoE 的专家通常不会稳定地对应“心理学专家 / 生物学专家”这类语义领域划分。
更常见的观察是:

  • 专家对 句法形态、token 类别、局部上下文模式 更敏感
  • 专家专长可能出现在:标点、数字、专有名词、动词形态、代码缩进等

原因在于:路由发生在 token 级别、层级别,且训练目标往往是语言建模或生成,模型更容易在“局部统计规律”上形成稳定分工。


12. Encoder-Decoder MoE 与 Decoder-only MoE 的差异现象

在一些分析工作中,常见的现象是:

  • Encoder 侧更容易看到某些专家在特定 token 类型上出现“更明显的专业化”
  • Decoder 侧的路由有时更接近“更均匀或更分散”的使用形态(但这不等价于专家完全没有差异)

一种直觉解释是:

  • Encoder 的任务更像“全局理解与表征压缩”,token 的功能角色更清晰(例如某些填空标记、结构标记)
  • Decoder 的任务是“逐步生成”,隐藏状态不断被自回归目标牵引,路由呈现的分工可能更依赖层次位置与生成阶段

13. MoE 的工程难点:负载不均衡与训练不充分

13.1 为什么会不均衡

最朴素的路由策略会导致:

  • Router 更偏向选择少数“早期学得快”的专家
  • 这些专家被反复选中,训练更充分,变得更强
  • 其他专家被选中更少,几乎得不到梯度更新,逐渐“闲置”

最终形成恶性循环:专家使用高度集中,既影响效果也影响并行效率。


14. 负载均衡:Load Balancing Loss 的作用

为避免 token 过度集中到少数专家,MoE 训练常加入 负载均衡损失
其目标是鼓励路由分布更均匀,让所有专家都能被使用与训练,同时提高硬件并行效率。

虽然具体形式各家实现不同,但目标一致:

  • 防止“热点专家”过载
  • 防止“冷门专家”几乎不训练

15. Group Size:为什么会引入 group 的概念

在训练中,路由与负载均衡往往不是在“全局 batch 一次性”统计,而是把全局 batch 切成多个 group 来计算负载均衡相关量。

设全局 batch 中 token 总数为 BBB,group 数为 GGG,则每个 group 大约包含:

BG \frac{B}{G} GB

  • group 更小:统计更局部,波动更大,但计算与通信可能更轻
  • group 更大:统计更稳定,但内存、计算、通信成本更高

16. Capacity 与 Capacity Factor(CF):专家能吃下多少 token

16.1 Capacity 的基础设定

每个专家在一次前向中能处理的 token 数量有上限,否则会造成溢出与性能问题。
一个常见的基础容量设定是按平均分配:

Capacity=tokensexperts \text{Capacity}=\frac{\text{tokens}}{\text{experts}} Capacity=expertstokens

16.2 引入 Capacity Factor(CF)

为了在负载不均衡时少丢 token,可以用 Capacity Factor 扩大容量:

Capacity=CF×tokensexperts \text{Capacity}=\text{CF}\times\frac{\text{tokens}}{\text{experts}} Capacity=CF×expertstokens

  • CF 越大:缓冲更充足,丢弃 token 更少
  • 代价:需要更多额外 buffer,带来额外内存与计算开销

这就是 MoE 的典型权衡:更稳定的路由与更少的 token 丢弃,往往意味着 更高的资源成本


17. MoE 层的类型:Sparse / Dense / Soft

根据“每个输入如何聚合专家输出”,路由/门控策略大致可分三类:

  1. Sparse(稀疏):Top-kkk 路由,只激活少数专家(主流 MoE)
  2. Dense(密集):所有专家都参与,但权重不同(计算更贵)
  3. Soft(完全可微的融合):输入或专家输出做连续融合,强调可微与稳定,但工程代价通常更高

当前大规模模型实践里,最常见的是 Sparse Top-kkk,因为它在计算上最划算。


18. Dense vs MoE

  • Dense:参数全部参与每次前向,路径固定、训练简单、并行友好,但扩展到超大规模时算力成本高
  • MoE:总参数可很大,但每次只激活部分专家,计算更省;代价是路由、负载均衡、容量控制、并行通信等带来复杂性

可以把 MoE 看作一种“用稀疏激活换取更大模型容量”的扩展路径:
让模型拥有更大的参数存储与潜在表达能力,同时把每次推理的实际计算限制在一个较小的子网络上。


19. MoE 的整体工作流小结

一个典型的稀疏 MoE-FFN 子层,对每个 token 的流程可以概括为:

  1. Router 计算专家概率分布 pip_ipi
  2. 选出 Top-kkk 专家集合 Ek(x)\mathcal{E}_k(x)Ek(x)
  3. 将 token 输入送到被选专家执行 fi(x)f_i(x)fi(x)
  4. 用门控权重加权求和得到输出 yyy
  5. 训练时加入负载均衡损失,控制路由分布
  6. 用 capacity 与 CF 控制每个专家可处理 token 上限,避免溢出与过多丢弃

最终,MoE 在“效果 / 计算 / 并行效率”之间形成一套独特的工程权衡体系,这也是它在超大规模模型中被广泛采用的重要原因。

Logo

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

更多推荐