BERT和Transformer Encoder的差异有哪些
1️⃣ 考察意图
这道题表面是背概念,实际是考察你对 Transformer 架构的“工程化改造”理解深度。面试官想看你是否清楚 BERT 不是“直接套用 Encoder”,而是针对 NLP 预训练做了 4 个关键手术:输入格式、位置编码、预训练任务、输出头。刁钻点在于:很多人只记得“BERT 用 Encoder”,却说不清为什么去掉 Decoder、为什么用可学习位置编码、为什么加 [CLS] 标记。答好了能展示你对模型设计取舍(trade-off)的直觉,以及从论文到落地的迁移能力。
2️⃣ 标准答
核心差异:BERT 是 Transformer Encoder 的“预训练特化版”,不是直接复制。
- 架构剪裁:去掉了 Decoder,只保留 Encoder 堆叠
- Transformer 原始设计是 Encoder-Decoder 结构,用于 seq2seq(如翻译)。BERT 砍掉 Decoder,只堆叠 Encoder(Base 12 层,Large 24 层),因为它的目标是理解型任务(分类、NER、QA),不需要生成。
- 工程取舍:去掉 Decoder 减少了参数量(约 40%),但失去了自回归生成能力。所以 BERT 不能做文本生成,只能做编码。
- 输入格式:引入 [CLS] 和 [SEP] 特殊标记,支持句子对输入
- Transformer Encoder 输入是 token 序列,没有特殊标记。BERT 在序列开头加 [CLS](其最终隐藏状态用于分类),句子间加 [SEP] 分隔,并添加 Segment Embedding(0/1 区分句子 A/B)。
- 为什么这么做:为了统一处理单句和句子对任务(如 NLI、QA)。[CLS] 的隐藏状态通过自注意力聚合了全局信息,省去了额外池化层。
- 实际落地的坑:Segment Embedding 只支持 2 个句子,处理多轮对话时需自己拼接或改用 RoPE 等相对位置编码。
- 位置编码:可学习绝对位置编码 vs 正弦波固定编码
- 原始 Transformer 使用正弦波位置编码(固定,无需训练),BERT 改用可学习位置编码(初始化后随训练更新)。
- 为什么这么做:可学习编码能自适应任务分布。正弦波假设位置间关系是线性的,但 NLP 中位置重要性可能非线性(如句首词更重要)。实验表明可学习编码在 GLUE 上比正弦波高 0.5-1 个点。
- 工程取舍:可学习编码需要预设最大长度(BERT 是 512),超出则无法处理。所以 BERT 不能直接处理长文档,需用 Longformer 或 RoPE 方案。
- 预训练任务:MLM + NSP vs 无预训练
- Transformer Encoder 原始论文没有预训练,是随机初始化后做监督学习。BERT 引入 Masked Language Model(MLM,15% token 被 mask,预测原词)和 Next Sentence Prediction(NSP,预测两句子是否连续)。
- 为什么 MLM 有效:双向上下文建模。GPT 用自回归(从左到右),BERT 用 mask 迫使模型同时看左右,学到更深层语义。
- 实际落地的坑:MLM 训练-推理不一致(推理时无 mask),需用 [MASK] 替换策略(80% [MASK]、10% 随机词、10% 原词)缓解。NSP 后来被 RoBERTa 证明效果有限,可去掉。
- 输出头:分类 vs 全序列输出
- Transformer Encoder 输出所有 token 的隐藏状态,用于下游任务时需自己加头。BERT 预置了 [CLS] 输出用于分类,同时保留所有 token 输出用于序列标注(如 NER)。
- 为什么这么做:统一接口,减少下游适配成本。但 [CLS] 在长文本上可能丢失细粒度信息,此时需用 token-level 输出 + CRF 层。
总结:BERT 是 Transformer Encoder 的“预训练特化版”,通过剪裁 Decoder、改造输入/位置编码、设计 MLM+NSP 任务,将 Encoder 从通用编码器变成了理解型预训练模型。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从架构、输入、位置编码、预训练、输出五个层面回答。架构上,BERT 去掉了 Decoder,只保留 Encoder 堆叠;输入上,加了 [CLS] 和 [SEP] 特殊标记,支持句子对;位置编码上,用可学习绝对位置编码替代正弦波;预训练上,引入 MLM 和 NSP 任务;输出上,[CLS] 用于分类,全序列输出用于标注。总结一句:BERT 是 Transformer Encoder 的预训练特化版,每个改动都服务于理解型任务。”
4️⃣ 高频追问 & 应对
追问 1:为什么 BERT 不用正弦波位置编码?可学习编码有什么缺点?
正弦波假设位置间关系是线性的,但 NLP 中句首词往往更重要(如 [CLS]),可学习编码能自适应这种非线性重要性。缺点是最大长度固定(512),超出无法处理。实际中,长文档任务需改用 RoPE(旋转位置编码)或 ALiBi(线性偏置),它们支持外推到更长序列。例如,ChatGLM 用 RoPE 支持 2048 长度。
追问 2:MLM 的 15% mask 比例是怎么确定的?为什么不是 10% 或 20%?
论文实验表明,15% 是 trade-off:太低(如 10%)模型学不到足够上下文;太高(如 20%)训练信号过强,模型过度依赖 mask 标记,推理时性能下降。实际中,RoBERTa 尝试过动态 mask(每次训练不同位置),效果更好。如果任务数据稀疏,可适当提高比例(如 20%),但需配合更多训练步数。
追问 3:BERT 的 [CLS] 输出真的能代表整个句子吗?什么时候会失效?
[CLS] 通过自注意力聚合全局信息,理论上能代表句子。但在长文本(>512 token)或细粒度任务(如情感极性细粒度分类)中,[CLS] 可能丢失局部细节。失效场景:多义词消歧(需上下文 token)、长文档分类(需分段处理)。解法:改用 token-level 输出 + 池化(如 mean pooling),或加一个 Transformer 层专门聚合。
5️⃣ 避坑 · 常见错误答法
- ❌ “BERT 就是 Transformer Encoder,完全一样。” → ✅ “BERT 是 Transformer Encoder 的预训练特化版,在输入、位置编码、预训练任务上做了关键改动,不能直接等同。”
- ❌ “BERT 用正弦波位置编码,因为原始论文用了。” → ✅ “BERT 改用可学习位置编码,因为能自适应任务分布,在 GLUE 上比正弦波高 0.5-1 个点。”
- ❌ “BERT 的 [CLS] 输出就是句子向量,直接用于分类。” → ✅ “[CLS] 通过自注意力聚合全局信息,但在长文本或细粒度任务中可能失效,需结合 token-level 输出。”
6️⃣ 简历呼应
- 如果你有 BERT 微调项目:从“实际落地坑”切入,比如“我在做文本分类时发现 [CLS] 在长文本上效果差,改用 mean pooling 提升了 2%”。
- 如果你只做过传统 NLP(如 CRF、LSTM):用“架构演进”类比,比如“LSTM 到 BERT 就像从单向到双向,BERT 的 MLM 让模型同时看左右,类似 BiLSTM 但更强大”。
- 如果你是校招无项目:聚焦“论文复现”,比如“我复现了 BERT 的 MLM 预训练,发现可学习位置编码比正弦波收敛更快,验证了论文结论”。
- BERT 原始论文:Devlin et al., “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”, 2018
- Transformer 原始论文:Vaswani et al., “Attention Is All You Need”, 2017
- RoBERTa 改进:Liu et al., “RoBERTa: A Robustly Optimized BERT Pretraining Approach”, 2019
- 位置编码对比:Su et al., “RoFormer: Enhanced Transformer with Rotary Position Embedding”, 2021
- 工程实践:Hugging Face Transformers 库 BERT 源码解析(
bert.py)