Encoder、Decoder 与现代大模型架构:从 BERT/GPT 到 MoE
讲清编码器、解码器、编码器-解码器三种架构的区别与各自适合的任务,重点理解仅解码器路线为何成为生成式大模型主流,以及因果掩码、KV Cache、MoE 稀疏专家这些现代架构的关键机制
- 区分 Encoder-only / Decoder-only / Encoder-Decoder 三类架构与代表任务
- 理解因果掩码如何保证自回归生成「只能看左边」
- 理解训练并行与 KV Cache 推理加速的关系
- 建立对 MoE 稀疏专家、参数量与计算量关系的正确直觉
三种架构,三种注意力可见范围
同样是 Transformer Block,堆叠方式和注意力能看到谁,决定了模型擅长什么。区别的核心是掩码(mask):它规定每个位置允许关注哪些位置。
每个词能看到左右全部上下文
双向注意力
擅长理解/编码:分类、抽取、语义向量
代表路线:BERT 类
每个词只能看它和它左边
因果掩码,适合逐词生成
擅长生成:对话、写作、通用大模型
代表路线:GPT 类,现代大模型主流
编码器双向读输入,解码器因果生成并交叉注意输入
擅长输入到输出的转换:翻译、摘要
代表路线:T5 类
因果掩码:自回归生成的护栏
Decoder 训练时整句是一次性并行喂进去的(教师强制),但生成任务要求第 i 个词只能依据前 i−1 个词预测,绝不能「偷看答案」。因果掩码是一个下三角矩阵:把右上部分(未来位置)的注意力分数设为负无穷,Softmax 后权重为 0,于是每个位置只能关注自己和左侧。这样训练目标和逐词生成的推理方式完全一致。
训练:整句并行,因果掩码挡住右侧未来词
学会 P(第i词 | 前i−1词)
推理:从左到右逐词采样生成
已生成内容作为新的左侧上下文
KV Cache:让逐词生成不必每次重算
自回归生成时每新增一个词,朴素做法是把整句重新算一遍注意力,代价随长度平方增长、极其浪费。注意到历史词的 Key、Value 在它们生成后就不再变化,于是把它们缓存下来(KV Cache):每步只算新词的 Q,去和缓存里全部历史 K/V 做注意力,再把新词的 K/V 追加进缓存。这是大模型推理加速的标准机制,代价是占用显存——也是后续各种推理优化(分页注意力、量化 KV)的对象。
训练时整句并行(靠因果掩码保证不偷看),所以训练高效;推理生成天然是一个词接一个词的串行过程,靠 KV Cache 避免重复计算。理解这对矛盾,就理解了很多推理工程优化的出发点。
MoE:把「参数量」和「计算量」解耦
稠密模型每个输入都要经过全部参数。混合专家(MoE)把前馈层换成多个「专家」子网络,再加一个路由器(门控):每个 token 只被分给少数几个专家计算。于是模型可以拥有极大的总参数量(知识容量大),但每个 token 实际激活的参数很少(单步计算可控)。
token 进入 MoE 层
路由器为它打分、选 Top-k 专家
只激活被选中的少数专家计算
其余专家不参与,省算力
按路由权重加权合并输出
MoE 的代价是显存仍要装下全部专家、且负载均衡与路由稳定性是工程难点。它体现了一个重要直觉:模型「有多少知识(总参数)」和「每次调用多少算力(激活参数)」可以分开设计。
今天绝大多数通用对话/生成式大模型走 Decoder-only + 因果掩码 + KV Cache 推理这条主线,再叠加 RoPE、RMSNorm、SwiGLU、MoE 等改进。不必追每个新名词,先把「注意力可见范围、训练/推理方式、参数/计算关系」这三把尺子拿到手,任何新架构都能快速定位。
Decoder-only 大模型中的「因果掩码」作用是?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
从线性回归到神经网络,本质都一样:定义一个带参数的函数 fθ(x),用损失函数衡量它和真实答案的差距,再沿梯度方向更新参数。监督、无监督、强化学习的区别,只在「训练信号从哪里来」。先把这套统一视角立住,后面遇到的任何模型都是它的具体实例,就不会被层出不穷的名词淹没。