第3章 大模型算法基础:Transformer、注意力机制、预训练原理
本章覆盖大模型底层核心:Transformer 结构、注意力机制、预训练范式。面试中常从原理推导、代码实现、变体改进三个层面考察。以下先给出典型公司侧重点与面试官画像,再提供3个核心问答卡片。
公司侧重点与面试官画像
| 公司类型 | 侧重点 |
|---|---|
| 头部大厂(BAT/TMD) | 对Transformer变体(RoPE、FlashAttention)和工程优化有严格追问;考察预训练数据配比、损失设计 |
| 硬科技/垂直领域 | 关注长序列场景(文档理解、多模态对齐)中的注意力改进;常问位置编码实现细节 |
| 创业公司/创新团队 | 侧重实际部署:KV Cache、量化、序列并行;会问预训练收敛速度与涌现能力的关系 |
面试官画像: 多数为高级算法工程师/技术负责人。对细节抠得很细(如LayerNorm放在哪?为什么要pre-norm)。喜欢让候选人手写Scaled Dot-Product Attention代码,并追问反向传播梯度。
❓ 问题1:请解释Transformer中Scaled Dot-Product Attention的计算过程及为何要scaling?
面试官考察点: 对注意力机制原理的深入理解,是否掌握数值稳定性问题,能否推导softmax后的梯度。
回答框架:
- 1. 输入 Q/K/V,维度 d_k;
- 2. 计算 Q·K^T,除以 sqrt(d_k) 防止内积过大导致softmax梯度消失;
- 3. 可选 mask(padding或causal),应用 softmax 得到权重;
- 4. 加权求和 V 得到输出。
简短示例回答: Scaled Dot-Product Attention 中 Q·K^T 的方差为 d_k,当 d_k 较大时,softmax 输入落在梯度饱和区。除以 sqrt(d_k) 后方差归一化,保留梯度流。实现上常用 mask 填充 −∞,再 softmax,避免无效位置参与加权。
可能追问:
- 为什么不是除以 d_k 而是 sqrt(d_k)?
- 如果去掉 scaling,训练早期会出现什么现象?
- Multi-Head Attention 中,每个头的 d_k 通常取多少?
⚠ 避坑提醒: 不要只说“防止softmax梯度消失”,要解释清楚方差与 d_k 的关系。不要漏掉 causal mask 在自回归任务中的应用。避免混淆 LayerNorm 和 scaling 的位置。
❓ 问题2:Transformer中的位置编码(Sinusoidal / RoPE / ALiBi)有什么区别?为什么需要位置编码?
面试官考察点: 是否清楚自注意力对位置的无感知性,能否对比不同编码方案的设计哲学,尤其是相对位置编码的优势。
回答框架:
- 1. 必要性:自注意力具有置换不变性,缺乏序列顺序信息;
- 2. Sinusoidal:位置,通过正弦/余弦函数生成固定向量,可外推;
- 3. RoPE:旋转位置编码,在 QK 点积中引入相对位置,对长序列更友好;
- 4. ALiBi:直接对注意力 logit 添加线性偏置,牺牲部分精度换取长度外推能力。
简短示例回答: RoPE 将位置信息通过旋转矩阵注入 Q/K,使得点积结果自然包含相对位置差,无需额外计算。相比 Sinusoidal,RoPE 在处理长序列时更稳定,且能推广到训练长度之外的序列。ALiBi 则直接向 logit 添加线性衰减偏置,适用于超长上下文任务。
可能追问:
- RoPE 中旋转角度的基频如何设置?为什么一般取 10000?
- 如果用可学习的位置编码,外推性差的原因?
- LLaMA 为什么选用 RoPE 而不是 ALiBi?
⚠ 避坑提醒: 不要只说“位置编码解决序列顺序”,要强调自注意力的置换不变性。小心区分“位置”与“相对位置”的计算复杂度。回答 RoPE 时需提到复数和旋转矩阵,不能只给感性理解。
❓ 问题3:预训练(Pre-training)的核心原理是什么?常见的预训练任务有哪些?对模型性能的影响?
面试官考察点: 是否理解预训练的本质是学习通用语言表示,能否区分 MLM、CLM、PLM 等任务,以及预训练数据规模与下游任务的关系。
回答框架:
- 1. 原理:在大规模无标注数据上通过自监督任务学习上下文表示,获得泛化能力;
- 2. 常见任务:MLM(Bert)、CLM()、Span Masking(T5)、PLM(XLNet);
- 3. 影响:预训练数据分布和大小决定模型知识上限,任务设计影响表示的解码方式;
- 4. 后续:通过微调或指令学习适配具体场景。
简短示例回答: 预训练本质是学习语言建模能力,例如 MLM 通过随机遮盖15% ,让模型利用双向上下文预测。该任务强迫模型捕获词汇共现和句法依赖。 使用 CLM(下一个预测),更符合生成式任务。预训练数据量大、质量高,模型在下游任务上的 few-shot 能力越强。
可能追问:
- 预训练阶段为什么要用 dynamic masking 而不是 static?
- sentence-level预训练目标(如NSP)为什么逐渐被弃用?
- 大模型中预训练与对齐(RLHF)的关系是什么?
⚠ 避坑提醒: 注意区分预训练(Pre-training)与微调(Fine-tuning)的边界。不要将自注意力机制原理与预训练任务混淆。回答“预训练作用”时,避免空谈“学到语义”,应举具体任务例子说明学到什么。