完整题目
在序列建模任务中,编码器(Encoder)和解码器(Decoder)在结构设计、功能定位和应用场景上有何主要区别?请结合典型任务如机器翻译进行说明。
先区分三类结构
| 结构 | 可见信息 | 主要输出 |
|---|---|---|
| Encoder-only | 通常对有效输入做双向self-attention | 每个输入位置的上下文表示 |
| Encoder-decoder | encoder编码源序列;decoder做masked self-attention并cross-attend encoder memory | 条件生成序列 |
| Decoder-only | 对统一序列做causal self-attention | 下一个token分布 |
Encoder输出通常是随源长度变化的一组token表示 [B,L_src,D],不是单个固定长度上下文向量。它不使用因果mask,但通常需要padding mask或其他任务mask,不能说“无mask”。
在机器翻译中,encoder读取完整源句并产生encoder memory。decoder在每一步只能通过因果self-attention看到已生成的目标前缀,同时通过cross-attention读取整段源序列表示,最终预测下一个目标token。
Decoder-only GPT没有独立encoder,也没有上述encoder-decoder cross-attention;它把指令、上下文和输出前缀放进同一因果序列。Encoder-only模型适合分类、检索和token标注等理解任务,decoder-only适合开放生成,但这些是常见适配关系,不是能力上的绝对排他。
训练时decoder可并行计算所有位置的teacher-forced loss,只是causal mask阻止未来信息;推理时才通常逐token生成并使用KV cache。因而“decoder逐token”主要描述自回归推理,不代表训练无法并行。
继续追问 · 1 个问题
- 为什么现在大模型多为Decoder-only架构?Encoder-only(如BERT)和Decoder-only(如GPT)各适合什么场景?Transformer中编码器和解码器的注意力机制有何具体差异?
换一种问法,检查是否真正理解
场景切入
假设你要做一个翻译系统,比如把英文邮件自动翻译成中文。你会怎么设计编码器和解码器的结构?它们各自负责什么,有什么区别?
层层追问
你理解序列到序列模型吗?……编码器和解码器在机器翻译里分别做什么?……那它们的注意力机制有什么不同?为什么解码器要用因果掩码?
直球架构
请从结构设计、功能和应用场景三个角度,对比序列建模中的编码器和解码器。以机器翻译为例,说明它们的主要区别。
练习口述回答 · 约4分钟
- 先分三种架构而非二分
- 说明encoder输出形状与mask
- 以机器翻译解释cross-attention
- 区分GPT decoder-only
- 澄清训练并行与推理自回归
回答这道题时,我会先把“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训练也只能串行。