回答这道题时,我会先把“decoder”分清。原始Transformer里的decoder属于encoder-decoder结构,既有目标侧的masked self-attention,也有读取encoder输出的cross-attention。GPT所说的decoder-only只有因果self-attention,没有独立encoder和这类cross-attention。把这两种decoder混在一起,后面的结构比较就会错。
Encoder通常读取完整有效输入,因此self-attention可以同时利用当前位置左右两边的信息。它输出的不是一个固定长度上下文向量,而是随源序列长度变化的一组token表示,形状可以写成B、L_src、D。分类任务可能再取CLS或池化成固定向量,但那是下游读出方式,不是encoder本身只输出一个向量。
Encoder也不是无mask。它通常不使用阻止未来信息的causal mask,但变长batch里仍要用padding mask挡住补齐位置,还可能有任务特定mask。Decoder的目标侧self-attention则需要causal mask,保证位置i不能看到未来目标token;两种mask解决的是不同问题。
以机器翻译为例,encoder先读取完整源句,得到每个源token的上下文表示,也就是encoder memory。Decoder在生成第i个目标token时,通过masked self-attention读取已经生成的目标前缀,再用cross-attention把query对准encoder memory中的相关源位置,最后输出下一个token分布。这样同时利用目标语言历史和完整源语言信息。
Decoder-only模型把系统指令、用户输入和已生成前缀放在同一个因果序列里,所有条件都通过causal self-attention传递。它没有独立的源序列编码阶段。Encoder-only模型常用于分类、检索、rerank和token标注,decoder-only常用于开放生成,encoder-decoder适合输入输出边界明确的条件生成;这些是常见适配,不是说某类结构绝对不能做其他任务。
还要区分训练和推理。自回归decoder在推理时通常逐token生成,因为下一个token依赖前一个结果;训练使用teacher forcing时,整段目标已知,可以一次并行计算各位置logit,只用causal mask防止信息泄漏。不能因为推理逐token,就说decoder训练也只能串行。
所以我会用信息可见范围、是否有cross-attention、输出形式和训练推理方式四条轴来比较。这样既能解释机器翻译,也能说明为什么BERT类encoder、T5类encoder-decoder和GPT类decoder-only虽然都基于Transformer,却有不同的默认使用场景。
从接口看,encoder-decoder可以分别缓存源侧memory和目标侧KV;decoder-only则把条件和输出放在同一因果上下文。二者的缓存复用、长度预算和服务调度不同,也进一步说明“decoder”这个词不能脱离完整架构解释。实际选型还要比较输入输出长度比例和任务数据。
多模态模型还可能让文本decoder通过cross-attention读取图像encoder表示,这仍属于条件生成结构;若先把图像和文本都变成统一token再做因果建模,则更接近decoder-only。判断名称时应看真实信息流和attention连接。