主题
架构家族:Encoder-only、Decoder-only 与 Encoder-Decoder
一句话:同样是 Transformer block,注意力掩码决定“谁能看见谁”,训练目标决定“学成什么”,于是分成编码器、解码器、编码-解码三族;现代大模型在此之上加了 Pre-Norm、SwiGLU、RoPE、GQA 和 MoE,但骨架没有变。
为什么需要
“Transformer”不是一个模型,而是一族结构。三者最根本的差别只有两点:注意力能不能看见右边,以及训练时预测什么。
- 双向可见 + 掩码语言建模 → 擅长理解,不擅长逐字生成;
- 因果可见 + 下一个 token 预测 → 擅长生成,是当前大模型的主流;
- 编码器双向 + 解码器因果 + 交叉注意力 → 擅长序列到序列的转换。
选错家族不是“效果差一点”,而是成本量级和任务形态都不匹配:用生成模型做检索嵌入,又贵又慢;用编码器做开放式生成,结构上就不支持。
核心机制
一、三族的掩码与目标
| 家族 | 自注意力掩码 | 训练目标 | 典型输出 | 代表 |
|---|---|---|---|---|
| Encoder-only | 双向,全可见 | 掩码语言建模(MLM),随机遮 15% 预测 | 每个 token 的上下文向量 | BERT |
| Decoder-only | 因果,只能看左边 | 下一个 token 预测 | 下一个 token 分布 | GPT 系列、Llama |
| Encoder-Decoder | 编码器双向 + 解码器因果 + 交叉注意力 | 给定输入生成输出 | 输出序列 | T5、BART |
Encoder-only 的每个位置都能看见整句,所以它的向量天然带上下文。BERT-base 用 12 层、768 维、12 个头、约 1.1 亿参数,训练时遮住 15% 的 token 让模型还原。它适合分类、实体识别、句子相似度、检索嵌入;但它没有“逐字生成”的训练目标,开放式生成能力很弱。
Decoder-only 用因果掩码把未来遮住,每个位置只根据左边预测下一个 token。GPT-3 是 96 层、12288 维、96 个头、1750 亿参数、2048 上下文。它的优势是:同一个目标可以覆盖所有文本,预训练分布极广;推理时把任务写成 prompt,模型在上下文里“现学”模式。今天的通用大模型和 Agent 基座基本都是这一族。
Encoder-Decoder 把“理解输入”和“生成输出”分开:编码器双向读完整输入,解码器因果生成,每一步通过交叉注意力去看编码器。T5 用 span corruption 训练:把输入里连续的一段遮掉,让解码器还原。它在翻译、摘要、结构化转换上很自然,但参数利用率不如 Decoder-only 灵活。
二、现代 Decoder-only 的零件
今天的开源大模型,骨架仍然是“注意力 + FFN + 残差 + 归一化”,但零件换了一轮:
| 组件 | 传统做法 | 现代常见做法 | 解决什么 |
|---|---|---|---|
| 归一化位置 | Post-LN | Pre-LN / Pre-RMSNorm | 深层训练更稳 |
| 归一化 | LayerNorm | RMSNorm | 少均值计算和偏置参数 |
| FFN 激活 | ReLU | SwiGLU / GELU | 更好的非线性与门控 |
| 位置编码 | 正弦/可学习绝对 | RoPE | 相对位置与外推 |
| KV 头 | 与 Q 头相同(MHA) | GQA / MQA | 降 KV 显存、提并发 |
| 偏置 | 线性层带 bias | 多数去掉 bias | 省参数、利于融合 |
| 注意力实现 | 朴素矩阵乘 | FlashAttention 等 | 省显存带宽 |
这些替换大多不改变“表达能力”的上限,而是改变训练稳定性、显存占用和吞吐。读模型配置时,先看这几项,就能判断它属于哪一代设计。
三、MoE:把 FFN 换成专家
MoE(Mixture of Experts)把每个 block 的 FFN 换成多个“专家”,再用一个路由器为每个 token 选 top-k 个专家:
text
路由分数 = softmax(x · W_router)
选中 top-k 个专家 → 各自算 FFN → 按路由权重加权求和关键区别是总参数与激活参数分离:Mixtral 8x7B 总参数约 467 亿,但每个 token 只激活约 129 亿(8 个专家选 2 个)。这样可以用更大的总容量存知识,而单 token 的计算量接近一个更小的稠密模型。
代价也很直接:
- 显存按总参数算。所有专家都要加载,不能用“激活参数”估显存;
- 路由可能不均衡。少数专家被过度使用,需要负载均衡损失或容量因子;
- 训练和微调更复杂。专家并行、通信、路由稳定性都要额外处理;
- batch 小时效率低。每个专家分到的 token 少,矩阵乘利用率下降。
MoE 不是“免费变大”,而是把成本从计算部分转移到显存和工程复杂度。
图中三族的分叉点是掩码和目标,不是 block 本身;Decoder-only 这一支继续演化出现代组件和 MoE。理解这张图的好处是:看到一个新模型名,先问它属于哪一族、用了哪些零件,再判断它的能力和成本,而不是从参数量的单一数字下结论。
四、掩码决定信息流
三族的差别可以用允许矩阵直观看到:
- 编码器自注意力:
n_enc × n_enc全 1,每个位置看所有位置; - 解码器自注意力:
n_dec × n_dec下三角,第i行只看前i个位置; - 解码器交叉注意力:
n_dec × n_enc全 1,每个解码位置看全部编码位置。
允许的连接数分别约是 n²、n(n+1)/2、n_dec × n_enc。这解释了为什么编码器适合“全局理解”,解码器适合“逐步生成”:生成到第 i 步时,未来还不存在,只能看左边。
最小上手
用 numpy 打印三种掩码的形状和允许连接数:
python
import numpy as np
n_dec, n_enc = 4, 6
self_enc = np.ones((n_enc, n_enc), dtype=bool)
self_dec = np.tril(np.ones((n_dec, n_dec), dtype=bool))
cross = np.ones((n_dec, n_enc), dtype=bool)
for name, m in [("encoder self", self_enc), ("decoder self", self_dec), ("decoder cross", cross)]:
print(f"{name}: shape={m.shape}, allowed={m.sum()}")输出:
text
encoder self: shape=(6, 6), allowed=36
decoder self: shape=(4, 4), allowed=10
decoder cross: shape=(4, 6), allowed=24编码器 6 个位置之间 36 条连接全通;解码器 4 个位置只允许 10 条(含自身),因为未来被遮住;交叉注意力让 4 个解码位置各看 6 个编码位置,共 24 条。把 np.tril 换成 np.ones,解码器就变成了编码器——掩码是家族之间最小的结构差异,也是最大的行为差异。
生产动作
- 按任务选家族。开放式生成、工具调用、Agent 基座选 Decoder-only;分类、检索、重排优先选 Encoder-only 嵌入模型,成本和延迟通常更低;翻译、摘要、固定格式转换可以评估 Encoder-Decoder。
- MoE 按总参数估显存。部署时所有专家都要常驻;按激活参数算显存会严重低估,直接 OOM。
- 微调看架构。稠密模型和 MoE 的微调策略不同;MoE 的路由、专家负载和并行方式会影响训练稳定性,不能直接套稠密模型的配方。
- 不要跨家族比 tokenizer 和窗口。三族的训练目标、位置方案、词表都可能不同,token 数和上下文行为不可直接比较。
- 榜单排名不替代业务评测。架构只决定能力上限的一部分,数据、后训练、推理配置都会改变实际表现。
边界
- Decoder-only 不是万能。检索嵌入、分类、低延迟重排等任务,小得多的编码器模型往往更划算;生成模型做这些事既慢又贵。
- MoE 不是免费的容量。显存按总参数算,路由和并行带来额外复杂度;小 batch 或单卡部署时优势可能消失。
- 架构只是三分之一的变量。数据质量、后训练配方、推理参数同样决定表现;同名架构的两个模型可能差距很大。
- “Transformer”细节因模型而异。归一化位置、激活、位置编码、注意力实现都可能不同;读配置比记名字可靠。
- 更大不等于更适合。窄任务上,领域小模型可能比通用大模型更准、更便宜、更可控。
讲清楚
Transformer 分三族,分叉点是掩码和目标:编码器双向看全句、用 MLM 学表示;解码器因果看左边、用下一个 token 预测学生成;编码-解码用双向编码器加因果解码器和交叉注意力做序列转换。今天的通用大模型基本是 Decoder-only,因为同一个目标能覆盖所有文本,且推理时可以靠 prompt 现学。
现代零件——Pre-Norm、RMSNorm、SwiGLU、RoPE、GQA——主要改的是稳定性、显存和吞吐,不改变骨架。MoE 把 FFN 换成多个专家,用总参数换容量、用激活参数控计算,代价是显存和工程复杂度。选型先看任务形态,再看成本和评测,不要只看参数量。
适用:Encoder-only / Decoder-only / Encoder-Decoder 与 MoE 模型;具体配置以模型卡为准 | 初稿 2026-10