Q976LLM 基础概念真题解析LLM 基础AgentAlpha 社区真题库约 9 分钟更新 2026-09-29

BERT的Encoder与Decoder掩码有什么区别

BERT的Encoder与Decoder掩码有什么区别

1️⃣ 考察意图

面试官想考察你对Transformer架构底层掩码机制的理解深度,而非简单背诵概念。这是典型的“工程取舍+系统设计”类问题,刁钻点在于:很多人能说出“Encoder用双向注意力,Decoder用因果掩码”,但说不清为什么这样设计、实现时有哪些坑、以及掩码如何影响训练与推理的差异。答好了能展示你对自注意力机制、自回归生成、Teacher Forcing的底层理解,以及从论文(如BERT、GPT)到工程落地的硬实力。

2️⃣ 标准答

核心差异:Encoder掩码用于双向上下文编码,Decoder掩码用于单向自回归生成,两者在功能和实现上截然不同。

1. Encoder掩码:Padding Mask + 全可见

  • 作用:忽略填充位置(Padding Token),防止模型对无效位置计算注意力。例如,输入序列长度不同时,短序列用[PAD]补齐,掩码矩阵将这些位置设为负无穷(或0,取决于实现)。
  • 实现:通常是一个0/1矩阵,1表示有效位置,0表示填充位置。在Softmax前,将填充位置对应的注意力分数设为-1e9,使Softmax后权重趋近0。
  • 注意力范围:所有有效token之间完全可见,即每个token可以关注序列中所有其他有效token(包括前后)。这对应BERT的“双向编码”特性,能捕捉完整上下文。
  • 工程取舍:为什么不用全0矩阵?因为Padding Mask必须与有效位置区分,否则模型会学到“关注填充位置”的噪声。实际落地中,如果序列长度差异大(如长文档),Padding会浪费计算资源,常用动态批处理(Dynamic Batching)或按长度分组来优化。

2. Decoder掩码:Padding Mask + Causal Mask(因果掩码)

  • 作用:除Padding Mask外,还需Causal Mask,防止当前token看到未来token。这是自回归生成的核心:预测第i个token时,只能依赖前i-1个token。
  • 实现:Causal Mask是一个下三角矩阵(包括对角线),上三角部分设为负无穷。结合Padding Mask时,通常将两者相加或取并集:先构建下三角矩阵,再对填充位置强制掩码。例如,PyTorch中通过torch.tril生成,再与Padding Mask做逻辑与。
  • 注意力范围:每个token只能关注自身及之前的位置。这对应GPT等自回归模型的“单向编码”特性。
  • 实际落地的坑:训练时使用Teacher Forcing(输入完整目标序列),但掩码仍要生效,否则模型会“作弊”看到未来token。一个常见错误是忘记在推理时移除Teacher Forcing的掩码依赖——训练时掩码是静态的(基于完整序列),推理时需逐步生成,掩码矩阵需动态扩展(每次生成一个token,掩码矩阵增加一行一列)。如果直接复用训练时的掩码逻辑,会导致推理时无法正确屏蔽未来位置。

3. 为什么这样设计?

  • Encoder:需要双向上下文来理解语义(如BERT的MLM任务),掩码只屏蔽填充,不限制注意力方向。
  • Decoder:需自回归生成,因果掩码保证生成顺序,避免信息泄露。如果Decoder也用双向注意力,模型在生成第i个词时就能看到第i+1个词,导致训练和推理不一致(推理时没有未来token)。
  • 训练 vs 推理差异:训练时Decoder通过Teacher Forcing并行计算所有位置(掩码保证因果性),推理时需逐步生成,每次只计算一个token的注意力。这导致推理速度慢,常用KV Cache优化(缓存已生成token的Key和Value)。

4. 具体方法名与论文

  • 掩码实现:Transformer原论文(Vaswani et al., 2017)中,Encoder用(1 - mask) * -1e9,Decoder用下三角矩阵。BERT(Devlin et al., 2019)继承Encoder掩码,GPT(Radford et al., 2018)继承Decoder掩码。
  • 优化技巧:FlashAttention(Dao et al., 2022)通过分块计算和在线Softmax,避免显式构建大掩码矩阵,减少显存占用。
  • 工程取舍:Decoder掩码的因果性导致训练时无法利用未来信息,但这是自回归模型的必要代价。如果任务允许(如非自回归生成),可改用Masked Language Modeling(MLM)方式,但生成质量通常不如自回归。

3️⃣ 答题模板(30 秒电梯版)

“这个问题我从三个层面回答:第一,功能层面,Encoder掩码只屏蔽填充位置,允许双向注意力;Decoder掩码额外加因果掩码,强制单向自回归。第二,实现层面,Encoder用0/1矩阵,Decoder用下三角矩阵结合Padding Mask,训练时静态,推理时动态扩展。第三,设计原因,Encoder需要完整上下文编码,Decoder需防止信息泄露。总结一句:掩码差异本质是双向编码与自回归生成的根本矛盾。”

4️⃣ 高频追问 & 应对

追问 1:为什么Decoder训练时用Teacher Forcing,但掩码还要生效?直接输入完整序列不就行吗?

应对策略:Teacher Forcing只是输入方式,掩码是注意力机制的限制。如果不加因果掩码,模型在计算第i个token的注意力时,能看到第i+1个token的embedding,导致训练时“作弊”——模型学会依赖未来信息,但推理时没有未来信息,造成训练-推理不一致(Exposure Bias)。所以掩码必须生效,强制模型只依赖过去信息。实际中,Exposure Bias可通过Scheduled Sampling(逐步用模型生成替换真实token)缓解,但因果掩码是基础。

追问 2:如果我想在Decoder中实现双向注意力(如T5的Span Corruption),掩码怎么改?

应对策略:T5的Decoder不是纯自回归,它用Prefix LM方式:输入部分(前缀)用双向注意力,生成部分用因果掩码。实现时,掩码矩阵分为两块:前缀区域全1(双向),生成区域下三角(因果)。这需要自定义掩码矩阵,不能直接用标准下三角。工程上,可通过构造一个分段掩码矩阵,前缀部分设为0(不掩码),生成部分设为上三角负无穷。注意,前缀长度需在训练和推理时保持一致,否则会引入分布偏移。

追问 3:FlashAttention如何优化掩码计算?它改变了掩码逻辑吗?

应对策略:FlashAttention不改变掩码逻辑,而是优化计算方式。它通过分块(Tiling)将注意力计算拆成小块,在SRAM中完成,避免显式构建大掩码矩阵(如[seq_len, seq_len])。对于Decoder的因果掩码,FlashAttention在分块时跳过上三角块的计算,减少计算量。实际中,FlashAttention的掩码实现是隐式的:每个块内,通过行索引和列索引判断是否在因果范围内,不在则跳过。这比显式构建掩码矩阵更高效,尤其适合长序列(如8K+ tokens)。

5️⃣ 避坑 · 常见错误答法

  • ❌ 说“Encoder掩码是0/1矩阵,Decoder掩码是下三角矩阵” → ✅ 正确说法:Encoder掩码是0/1矩阵(屏蔽填充),Decoder掩码是下三角矩阵(因果掩码)与Padding Mask的结合,两者维度相同但值不同。
  • ❌ 说“训练时Decoder掩码是动态的,推理时是静态的” → ✅ 正确说法:训练时掩码是静态的(基于完整序列),推理时是动态的(每生成一个token扩展一次)。
  • ❌ 说“BERT的Encoder和Decoder都用双向注意力” → ✅ 正确说法:BERT只有Encoder(双向注意力),没有Decoder;GPT只有Decoder(因果掩码)。混淆两者说明对架构理解不深。

6️⃣ 简历呼应

  • 如果你有RAG项目:从检索与生成的掩码差异切入。例如,检索阶段(Encoder)用双向注意力编码query和文档,生成阶段(Decoder)用因果掩码生成答案。强调掩码对检索质量(双向上下文)和生成流畅度(自回归)的影响。
  • 如果你只做过传统NLP:用序列标注(如NER)类比Encoder掩码(全可见),用语言模型(如n-gram)类比Decoder掩码(只依赖过去)。强调掩码是Transformer实现“上下文感知”和“顺序生成”的关键机制。
  • 如果你是校招无项目:聚焦论文复现。例如,在PyTorch中实现一个简化版Transformer,打印掩码矩阵可视化(用matplotlib),并对比训练和推理的掩码差异。展示你对源码(如Hugging Face Transformers)的理解。
  • Transformer原论文:Attention Is All You Need (Vaswani et al., 2017)
  • BERT论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (Devlin et al., 2019)
  • GPT论文:Improving Language Understanding by Generative Pre-Training (Radford et al., 2018)
  • FlashAttention论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness (Dao et al., 2022)
  • Hugging Face Transformers源码中_make_causal_mask和_expand_mask函数实现

—— 本场面试完 ——

我们不做玩具级 Demo 教学。训练营的作业是开源项目和论文——我们想陪伴你,做出能改变生活、最后改变世界的项目。