| Q18 | How does the encoder-decoder structure work at a high level in the Transformer model
1️⃣ 考察意图
面试官想确认你是否真正理解 Transformer 编码器-解码器架构的核心设计哲学,而非仅仅背诵“编码器处理输入,解码器生成输出”这种教科书定义。考察类型是系统设计 + 工程取舍。刁钻点在于:为什么需要这种不对称结构?解码器中的“交叉注意力”到底解决了什么单用自注意力解决不了的问题?答好了能展示你对 seq2seq 任务本质(信息压缩与逐步生成)的深刻理解,以及区分不同架构(如 GPT 纯解码器 vs T5 编码器-解码器)的工程直觉。
2️⃣ 标准答
Transformer 的编码器-解码器结构本质上是为**序列到序列(seq2seq)**任务设计的,典型场景是机器翻译、文本摘要、语音识别。核心思想是:先理解全局,再逐步生成。
1. 编码器:双向上下文理解
- 编码器由 N 层(原论文 N=6)相同的层堆叠,每层包含多头自注意力和前馈网络。
- 关键设计:自注意力是双向的——每个 token 都能看到输入序列中的所有 token(包括它自己)。这通过移除注意力掩码实现,让模型能捕捉完整的上下文依赖,比如“it”指代的是前文哪个名词。
- 输出:编码器最终输出一个上下文表示序列(形状为
[batch, seq_len, d_model]),它是对整个输入序列的压缩编码,但保留了每个位置的信息。这个序列不包含任何关于目标序列的信息。
2. 解码器:自回归生成 + 交叉注意力
- 解码器同样由 N 层堆叠,但每层比编码器多一个交叉注意力子层。结构是:掩码自注意力 → 交叉注意力 → 前馈网络。
- 掩码自注意力:解码器生成时是自回归的——一次只生成一个 token,且只能看到当前位置及之前已生成的 token。因此,自注意力使用上三角掩码(mask),将未来 token 的注意力分数设为
-inf,防止信息泄露。 - 交叉注意力:这是编码器-解码器结构的核心。解码器中的每个 token 通过交叉注意力,从编码器输出的上下文表示中查询相关信息。具体来说:
- Query 来自解码器当前层的输出。
- Key 和 Value 来自编码器的最终输出。
- 这允许解码器在生成每个 token 时,动态地“回顾”输入序列的任意部分,而不是依赖固定长度的向量。例如,翻译长句时,生成“the”时可能关注输入中的“le”,生成“cat”时关注“chat”。
- 训练 vs 推理:
- 训练:使用教师强制(Teacher Forcing)。解码器一次性接收完整的目标序列(但用掩码防止看到未来 token),并行计算所有位置的损失。这加速训练,但会导致暴露偏差(训练时看到的都是真实 token,推理时可能遇到错误 token)。
- 推理:自回归生成。解码器从
<start>token 开始,每次生成一个 token,将新 token 拼接到输入中,重复直到生成<end>token。这很慢(O(T²) 复杂度),但准确。
3. 实际落地的坑与解法
- 坑:推理速度慢。自回归生成是瓶颈,尤其对于长序列。
- 解法:使用KV Cache。在解码器推理时,将每层交叉注意力的 Key 和 Value 缓存起来,避免重复计算。对于掩码自注意力,同样缓存已生成 token 的 Key 和 Value。这能将推理复杂度从 O(T³) 降到 O(T²)。
- 坑:编码器-解码器参数不均衡。编码器需要处理长输入,解码器需要生成短输出,但两者层数相同(如 T5-base 都是 12 层),导致编码器过深、解码器过浅。
- 解法:T5 论文发现,对于摘要任务,编码器层数多于解码器层数(如 18 层编码器 + 6 层解码器)效果更好。这体现了任务特性:理解长文本需要更多层,生成短文本则不需要。
- 坑:暴露偏差。训练时用教师强制,推理时自回归,导致分布偏移。
- 解法:计划采样(Scheduled Sampling)——训练时以一定概率用模型自己的预测替换真实 token,但会引入训练不稳定。更现代的方法是强化学习(如 RLHF)或对比学习(如 SimPO)来对齐训练和推理。
4. 典型应用与变体
- T5:将一切任务统一为“文本到文本”格式,使用编码器-解码器结构。输入加前缀(如“summarize:”),输出是目标文本。
- BART:类似 T5,但编码器是双向(类似 BERT),解码器是自回归(类似 GPT)。适合文本生成和噪声恢复。
- 为什么 GPT 不用编码器-解码器?GPT 是纯解码器架构,只做自回归生成。它通过因果掩码(causal mask)模拟编码器-解码器效果,但无法像交叉注意力那样显式地“回顾”输入序列。对于翻译等任务,纯解码器需要将输入和目标拼接成一个序列,导致输入长度翻倍,且无法利用双向上下文。
总结:编码器-解码器结构通过编码器做双向理解、解码器做自回归生成、交叉注意力做信息桥接,完美适配 seq2seq 任务。它的设计体现了“先压缩,后生成”的哲学,但推理速度慢和暴露偏差是主要工程挑战。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,编码器通过双向自注意力对整个输入序列做全局理解,输出上下文表示;第二,解码器通过掩码自注意力做自回归生成,并通过交叉注意力从编码器输出中动态查询信息;第三,训练时用教师强制并行计算,推理时自回归生成,实际工程中常用 KV Cache 加速推理。总结一句:编码器-解码器结构通过‘先理解后生成’的设计,完美解决了序列到序列任务中信息压缩与逐步生成的矛盾。”
4️⃣ 高频追问 & 应对
追问 1:为什么解码器需要两个注意力层(掩码自注意力和交叉注意力),而不是一个?
掩码自注意力负责建模已生成序列的内部依赖(比如“the cat”中“cat”依赖“the”),确保生成时不会看到未来 token。交叉注意力负责从输入序列中获取外部信息(比如翻译时“cat”需要关注输入中的“chat”)。如果只用交叉注意力,解码器无法建模目标序列内部的语法和语义结构;如果只用掩码自注意力,解码器无法获取输入信息。两者缺一不可。
追问 2:编码器-解码器结构在推理时如何实现 KV Cache?具体缓存哪些张量?
推理时,解码器每生成一个 token,都需要计算交叉注意力。如果每次重新计算编码器输出的所有 Key 和 Value,复杂度是 O(T²)。KV Cache 的做法是:在解码器每一层,将交叉注意力的 Key 和 Value(来自编码器输出)缓存起来,因为编码器输出在整个推理过程中不变。对于掩码自注意力,同样缓存已生成 token 的 Key 和 Value。这样,每次生成新 token 时,只需计算新 token 的 Query,然后从缓存中取出所有 Key 和 Value 做注意力计算。这能将推理复杂度从 O(T³) 降到 O(T²),内存占用从 O(T²) 降到 O(T)。
追问 3:T5 和 BART 都是编码器-解码器结构,它们有什么区别?
核心区别在于编码器的注意力模式。T5 的编码器使用双向自注意力(无掩码),类似 BERT,能捕捉完整上下文。BART 的编码器使用带噪声的双向自注意力(如 token 掩码、文本填充),类似去噪自编码器。解码器两者都是自回归。因此,T5 更适合需要精确理解输入的任务(如翻译、问答),BART 更适合需要从噪声中恢复的任务(如文本修复、摘要)。此外,T5 使用相对位置编码(Relative Position Bias),BART 使用绝对位置编码。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“编码器输出一个固定长度的向量,解码器基于这个向量生成序列” → ✅ 正确说法是“编码器输出一个上下文表示序列(长度等于输入序列),解码器通过交叉注意力动态地从这个序列中查询信息,而不是依赖一个固定向量”。
- ❌ 说“解码器的自注意力也是双向的” → ✅ 解码器的自注意力是因果的(causal),使用上三角掩码,只能看到当前位置及之前的 token。
- ❌ 说“训练和推理时解码器的输入方式一样” → ✅ 训练时使用教师强制(一次性输入完整目标序列),推理时自回归(逐步输入已生成序列)。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“编码器-解码器结构如何影响检索增强生成”切入。例如,在 RAG 中,编码器处理检索到的文档,解码器生成答案。可以讨论交叉注意力如何让解码器聚焦于相关文档片段,以及如何优化长文档的编码(如使用 Sliding Window Attention)。
- 如果你只做过传统 NLP:用“机器翻译”类比。编码器相当于“理解源语言句子”,解码器相当于“逐词生成目标语言句子”。可以对比传统 seq2seq(如 LSTM + Attention)与 Transformer 编码器-解码器的区别,强调 Transformer 如何通过自注意力解决长距离依赖。
- 如果你是校招无项目:聚焦 T5 论文复现。描述如何用 Hugging Face Transformers 库加载 T5 模型,在 CNN/DailyMail 数据集上做摘要微调,并对比不同输入长度(512 vs 1024 tokens)下的 ROUGE 分数。强调你理解了编码器-解码器结构如何影响输入输出长度限制。
- “Attention Is All You Need” (Vaswani et al., 2017) - 原始 Transformer 论文
- “Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer” (T5, Raffel et al., 2020)
- “BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension” (Lewis et al., 2020)
- “The Annotated Transformer” (Harvard NLP) - 带代码的逐行解读
- “Efficient Transformers: A Survey” (Tay et al., 2022) - 讨论编码器-解码器变体的效率优化