Transformer 架构与预训练原理

本章聚焦 Transformer 核心组件拆解、预训练目标设计、关键参数调优及面试高频追问。面试中常见的提问路径如下(红色箭头指向高频追问方向)。

Transformer面试框架 架构核心 位置编码·注意力·FFN 训练目标 MLM·NSP·去噪自编码 关键参数 层数·头数·维度·dropout 高频追问 缩放因子·位置编码选择 深度追问 面试中通常从架构出发,逐步深入训练目标与参数调优,最后被追问实现细节

面试问答卡片

Q1:请详细解释 Transformer 的 Encoder 结构,并说明 Multi-Head Attention 的计算过程。

面试官考察点:对核心组件理解的深度,能否清晰描述矩阵计算与缩放点积注意力的细节。

回答框架:先概述 Encoder 由 N 个相同层组成,每层包含多头自注意力 + 前馈网络 + 残差连接 + 层归一化;再重点展开注意力:Q/K/V 来自同一输入,先做线性投影,分 h 个头,每个头内做缩放点积注意力,最后拼接并线性变换。

简短示例回答(60-100字):“Encoder 每层包括多头自注意力与 FFN,外加残差连接和层归一。注意力中,将输入分别映射为 Q/K/V,按头数分割后计算 softmax(Q·K^T/√d_k)·V,其中缩放因子 √d_k 用于稳定梯度。最后拼接所有头输出并通过线性层。”

可能追问:① 为什么需要除以 √d_k?② 多头机制如何实现?③ 为什么使用残差连接?

避坑提醒:不要只背公式,要结合代码或训练经验说明缩放因子对 softmax 梯度的影响。回答时用具体数字举例(如 d_k=64,头数=12)更有说服力。

Q2:BERT 和 的预训练目标有何不同?为什么会导致结构差异?

面试官考察点:对预训练范式的理解,能否从训练目标推导模型架构设计决策。

回答框架:先点明 BERT 使用 MLM(掩码语言模型)+ NSP(下一句预测),适合双向编码理解任务; 使用自回归语言模型(从左到右预测下一个词),适合生成任务。再说明目标差异导致 BERT 用 Encoder、 用 Decoder(因果掩码)。

简短示例回答(60-100字):“BERT 的 MLM 要求模型从双向上下文预测被掩码的词,因此采用双向 Encoder; 用自回归语言模型,只能看到左侧上下文,所以用带因果掩码的 Decoder。NSP 进一步增强了句子级别理解,而 的生成目标天然支持文本续写。”

可能追问:① BERT 为什么弃用 NSP(RoBERTa 实验)?② 去噪自编码(如 T5)与 MLM 的异同?③ 训练时如何构造数据?

避坑提醒:不要只说名称,要讲清楚“预测目标迫使模型学习何种表征”。提到 RoBERTa 对 NSP 的消融实验可体现前沿理解。

Q3:训练大模型时,如何设置层数、隐藏维度、注意力头数?它们之间的比例关系是什么?

面试官考察点:参数设计的经验直觉,能否说出常见配置(如 BERT-base 12层/768维/12头)及背后 trade-off。

回答框架:先给出典型计算:参数量 ≈ N×(4d² + 8d²)(注意力+FFN),其中 N 层数,d 隐藏维度。通常头数 h 取 12 或 16,且 d/h 为 64 或 128。再说明层数影响深度、维度影响表达能力,两者需平衡显存与计算。

简短示例回答(60-100字):“以 BERT-base 为例:12 层、768 维、12 头,每头 64 维。层数多能提取更深语义,但需更多显存;维度大则词嵌入更丰富,但计算量平方增长。经验法则:保持 d/h ≈ 64~128,确保每个头有足够容量。”

可能追问:① 如何选取 layer_norm_epsilon?② dropout 一般设多少?③ 如果显存不够,你优先减层数还是减维度?

避坑提醒:不要只给出公式,要结合训练稳定性讨论。例如说“dim 太大易导致 attention 分布过度尖锐,需配合合适的初始化方案”。

项目案例

项目名称:基于 Transformer 的金融文本预训练模型(FinBERT)
业务背景:金融机构需要从海量研报、公告中提取实体关系与情感,通用 BERT 在金融领域效果差,需领域预训练。
规模指标:预训练语料 50GB(200 万篇文档);模型参数量 110M(12 层/768 维/12 头);训练使用 8 卡 A100,耗时 7 天。
技术栈:PyTorch + HuggingFace Transformers + DeepSpeed ZeRO-2 + Apex 混合精度。
核心难点:1) 金融词汇多、专有名词分词不准确 → 扩展词表至 52k;2) 长文档超出 512 长度 → 采用 Segment-Level 预训练;3) 训练不稳定(loss 震荡)→ 调整 learning rate warmup 比例 + 梯度裁剪。
面试高频追问:
  • 为什么不直接微调通用 BERT 而要领域预训练?—— 通用模型在金融实体识别 F1 低 15%,领域预训练后提升至 88%。
  • 长文档处理如何设计 loss?—— 将文档切为多个 512 段,每个段单独预测,同时增加跨段注意力(但训练成本高)。
  • 训练不稳定怎么排查?—— 先看梯度 norm,若爆炸则增大梯度裁剪阈值;若 loss 跳变,检查数据是否混入噪声。
可迁移回答话术:
  • “当通用模型在特定领域效果不佳时,优先考虑领域词汇扩充与继续预训练,而非简单微调。我们在 FinBERT 中首先分析 tokenization 的 OOV 率,然后从零预训练了领域词表。”
  • “长文本处理是常见痛点,我的经验是分段训练 + 全局 pooling,或使用 Longformer 等稀疏注意力。具体选择取决于显存预算。”