Transformer 高频面试题及答案

一、整体架构(1--9)

1. 简单描述 Transformer 模型结构与核心思想

Transformer 出自 2017 年论文 Attention Is All You Need ,是一个完全基于自注意力机制的 Seq2Seq 模型,不再依赖 RNN 循环结构。

整体结构:

  • 输入:词嵌入 + 位置编码
  • Encoder 层(N=6 层堆叠)
  • Decoder 层(N=6 层堆叠)
  • 最后的线性层 + Softmax 输出概率分布

核心思想:

  • 自注意力 替代循环,实现并行计算
  • 直接建模任意两个 token 之间的依赖,解决长距离依赖问题
  • 依靠多头注意力、残差、层归一化实现深度网络稳定训练

2. Transformer Encoder 每一层详细结构

Encoder 一层包含:

  1. 多头自注意力层(Multi-Head Self-Attention)
  2. 残差连接 + 层归一化(LayerNorm)
  3. 前馈网络(Feed Forward Network,FFN)
  4. 残差连接 + 层归一化

顺序固定:Attention → Add&Norm → FFN → Add&Norm。

3. Transformer Decoder 每一层详细结构

Decoder 一层包含:

  1. 掩码多头自注意力(Masked Multi-Head Attention)
  2. 残差 + LayerNorm
  3. 交叉注意力(Encoder-Decoder Attention)
  4. 残差 + LayerNorm
  5. 前馈网络 FFN
  6. 残差 + LayerNorm

多了掩码交叉注意力两个关键模块。

4. Encoder 和 Decoder 的区别是什么?

  • Encoder 是双向注意力 ,可以看到整个输入序列;Decoder 是单向掩码注意力,看不到未来位置。
  • Encoder 只有自注意力;Decoder 多一层交叉注意力,用来对齐 Encoder 的输出。
  • Encoder 用于理解输入(如文本分类、编码);Decoder 用于生成输出(翻译、对话、写作)。

5. Transformer 相比 RNN/LSTM 有哪些优势?

  1. 并行计算RNN 必须按时间步依次计算,Transformer 可一次性处理整个序列,训练速度大幅提升。
  2. 长距离依赖建模更强注意力路径长度 O (1),RNN 是 O (n),长序列梯度更容易消失。
  3. 全局感受野每个 token 都能直接和全序列交互,无需像 RNN 逐步传递信息。
  4. 特征更丰富多头注意力可以同时捕捉语法、语义、指代等多种依赖关系。

6. Transformer 相比 CNN 的优势?

  • CNN 感受野由卷积核大小和层数决定,需要很深才能覆盖全局;Transformer 天然全局。
  • CNN 对位置关系建模固定,注意力是动态权重,更灵活。
  • Transformer 更适合长序列、强语义依赖任务。

7. Transformer 有什么缺点?

  • 复杂度 O (n²),序列变长时计算和显存开销急剧上升。
  • 没有天然位置信息,必须手动加入位置编码。
  • 局部建模(如短语、字符级结构)效率不如 CNN。
  • 对低资源任务容易过拟合,需要大量数据。

8. 为什么 Transformer 可以训练得很深?

主要依靠:

  • 残差连接(Residual Connection):避免梯度消失
  • 层归一化(LayerNorm):稳定训练,减少内部协变量偏移
  • 注意力机制梯度传播路径更友好

9. Transformer 中 Add & Norm 是什么?

  • Add :残差连接,输出 = 子层输出 + 输入
  • Norm:LayerNorm,对每个样本在特征维度做归一化

作用:让深层网络可以稳定收敛,缓解梯度消失。


二、自注意力机制(10--22)

10. 什么是自注意力(Self-Attention)?

自注意力是让序列中每个 token 都和序列内所有 token 计算相关性,根据相关性大小加权聚合信息,得到融合上下文的表示。

区别于普通注意力:

  • 普通注意力:Q 来自目标,K/V 来自源
  • 自注意力:Q、K、V 都来自同一序列

11. Scaled Dot-Product Attention 计算步骤

  1. 根据输入 X 分别线性投影得到 Q、K、VQ = XW_Q,K = XW_K,V = XW_V
  2. 计算 Q 和 K 的相似度矩阵:Q @ K.T
  3. 缩放 :除以 √d_k
  4. 如有需要,加入 Mask 遮挡无效位置
  5. Softmax 归一化得到注意力权重
  6. 权重与 V 加权求和得到最终输出

12. 写出注意力公式

Attention(Q,K,V)=softmax(dk​​QKT​)V

13. 为什么要除以 √d_k?

当维度 d_k 较大时,QK^T 的内积会变得很大,导致 Softmax 输出趋近于 one-hot 分布,进入饱和区,梯度几乎为 0,无法训练。

除以 √d_k 可以将方差控制在 1 左右,保证 Softmax 梯度正常回传。

14. 什么是多头注意力(Multi-Head Attention)?

将 Q、K、V 通过线性层映射到低维,切分成 h 个 "头",每个头独立计算自注意力,最后把所有头的结果拼接,再经过一次线性投影输出。

论文默认 h=8。

15. 多头注意力详细计算流程

  1. 输入 X 做线性变换得到 Q、K、V
  2. 按头切分:(batch, seq_len, d_model) → (batch, h, seq_len, d_k)其中 d_model = h × d_k
  3. 每个头分别计算 Scaled Dot-Product Attention
  4. 把 h 个头的输出在最后一维拼接
  5. 经过一个线性层投影回 d_model 维度

16. 多头注意力为什么比单头效果好?

单头注意力只能学习一种语义关联模式;多头可以并行学习:

  • 语法结构依赖
  • 语义相似依赖
  • 指代关系(如代词指向名词)
  • 局部 / 全局不同粒度依赖

表达能力更强,特征更丰富。

17. 什么是交叉注意力(Cross Attention)?

出现在 Decoder 中,也叫 Encoder-Decoder Attention。

  • Q 来自上一层 Decoder
  • K、V 来自Encoder 的最终输出

作用:让生成的每个位置,都能对齐并关注输入序列的相关部分,类似传统注意力机器翻译。

18. 自注意力、交叉注意力、掩码注意力区别

  • 自注意力:Q/K/V 同源,双向可见
  • 交叉注意力:Q 来自 Decoder,K/V 来自 Encoder
  • 掩码注意力:Q/K/V 同源,但用 mask 遮住未来位置,只能看左边

19. 自注意力时间复杂度与空间复杂度

设序列长度 n,模型维度 d。

  • 时间复杂度:**O(n²·d)**QK^T 是 n×n 矩阵乘法,是主要开销。
  • 空间复杂度:**O(n²)**存储注意力权重矩阵。

20. 为什么不直接用余弦相似度做注意力?

余弦相似度需要归一化,计算更复杂;点积 + 缩放计算高效、可微、易于 GPU 加速,效果足够好。

21. 注意力权重为什么会出现大量接近 0?

长序列中很多 token 语义无关,Softmax 后权重被 "稀释",大量权重趋近于 0,这也是稀疏优化、FlashAttention 的动机。

22. 自注意力如何理解 "关注"?

权重大小代表关注程度:

  • 权重高 = 该位置对当前 token 语义重要
  • 权重低 = 无关或次要本质是一种动态加权池化

三、Mask 机制(23--27)

23. Transformer 中有几种 Mask?分别作用

两种核心 Mask:

  1. Padding Mask 对句子填充的 <pad> token 做遮挡,不让注意力关注无效位置。
  2. Sequence Mask(Look-ahead Mask) Decoder 中使用,把当前位置右侧所有位置遮住,防止模型看到未来信息。

24. Look-ahead Mask 如何实现?

构建一个上三角矩阵(含对角线),未来位置设为 -inf,经过 Softmax 后概率变为 0。例如序列长度 3:

plaintext

复制代码
[[0, -inf, -inf],
 [0,    0, -inf],
 [0,    0,    0]]

25. Padding Mask 如何实现?

根据真实序列长度生成 mask,pad 位置为 True,在计算注意力时将这些位置设为 -inf。

26. 为什么 Decoder 必须用 Mask?

Transformer 是自回归生成模型(autoregressive),生成第 t 个 token 时,只能依赖 1~t-1,不能依赖 t+1...... 否则相当于 "偷看答案",无法真实推理。

27. Encoder 为什么不需要 Sequence Mask?

Encoder 任务是理解整个句子,需要双向上下文,比如 "我喜欢苹果" 中 "苹果" 和 "我" 互相相关。


四、位置编码 & 嵌入(28--35)

28. Transformer 为什么需要位置编码?

自注意力是排列等变的,打乱序列顺序输出不变,但语言是有序的,必须显式注入位置信息。

29. 论文中位置编码公式

使用正弦余弦位置编码:PEpos,2i​PEpos,2i+1​​=sin(pos/100002i/dmodel​)=cos(pos/100002i/dmodel​)​

  • pos:位置
  • i:维度下标
  • 偶数维度 sin,奇数维度 cos

30. 为什么用正弦余弦位置编码?

  • 可以外推到比训练更长的序列
  • 相对位置信息可通过三角函数恒等变换表达
  • 无需学习,节省参数

31. 绝对位置编码 vs 相对位置编码

  • 绝对位置:直接编码每个位置的序号(如正弦、可学习位置嵌入)
  • 相对位置:编码两个位置之间的距离

主流大模型(GPT、LLaMA、RoPE)都偏向相对位置编码,更长序列泛化更好。

32. 位置编码如何加入模型?

直接与词嵌入按元素相加输入 = 词嵌入 + 位置编码

33. 可学习位置编码 vs 正弦编码

  • 可学习:数据驱动,效果通常略好,但不能外推更长序列
  • 正弦编码:无需训练,泛化强,支持任意长度

34. 什么是 RoPE 位置编码?

旋转位置编码,Rotary Position Embedding:

  • 将 Q、K 按位置做旋转
  • 注意力内积自然包含相对位置信息
  • 长序列效果优秀,LLaMA、GPT-NeoX 等均使用

35. ALiBi 位置编码是什么?

Attention with Linear Biases,不使用显式位置嵌入,而是在注意力权重上直接加距离偏置,距离越远偏置越小,训练稳定、支持超长序列。


五、LayerNorm、FFN、残差(36--42)

36. 为什么用 LayerNorm 而不是 BatchNorm?

  • 序列长度不固定,BatchNorm 在批次上归一化不稳定
  • NLP 中样本长度差异大,Batch 维度统计不可靠
  • LayerNorm 对单个样本在特征维度归一化,更适合序列任务

37. Pre-Norm 和 Post-Norm 区别

  • Post-Norm(原始 Transformer):子层 → Add → Norm
  • Pre-Norm(主流大模型):Norm → 子层 → Add

Pre-Norm 训练更稳定,更容易深层训练,GPT、LLaMA 都用 Pre-Norm。

38. 残差连接为什么重要?

深层网络梯度容易消失,残差提供一条直连通路,梯度可以直接回传到底层,保证深度模型可训练。

39. 前馈网络 FFN 结构

两层线性变换 + 激活函数:FFN(x)=max(0,xW1​+b1​)W2​+b2​

原始用 ReLU,现在多用 GELU、Swish。

40. FFN 作用是什么?

注意力负责 ** token 之间信息交互 **,FFN 对每个 token 单独做非线性特征变换,提升模型表达能力。

41. FFN 中间维度为什么通常是 4×d_model?

经验设计,扩大维度可以学习更丰富的特征映射,压缩回来保留关键信息。

42. 为什么 Transformer 不怎么用卷积?

注意力已经可以灵活建模全局与局部依赖;但后续有融合范式,如 Transformer + CNN(CoAtNet)。


六、训练、优化、初始化(43--48)

43. Transformer 用什么优化器?

原始论文用 Adam,参数:

  • β1=0.9,β2=0.98
  • ε=1e-9并使用学习率预热策略

44. 什么是学习率预热(Warmup)?

训练初期学习率从 0 逐步升高到最大值,再缓慢衰减。原因:

  • 初期参数随机,大步长易不稳定
  • 预热让模型平稳进入训练状态

45. Transformer 标签平滑是什么?

Label Smoothing:把真实标签 1 换成 1−ε,错误类别分配 ε/(n−1),防止模型过于自信,缓解过拟合。

46. 为什么 Transformer 初始化很重要?

Q、K 内积量级受初始化影响大,初始化不当会导致 Softmax 饱和或梯度爆炸。

通常采用 ** Xavier 或 He 初始化 **。

47. 共享权重是什么?

  • 词嵌入矩阵与输出线性层共享权重
  • 部分模型 Encoder 和 Decoder 嵌入共享

减少参数量,同时提升 embedding 质量。

48. 梯度裁剪有什么用?

注意力和残差可能导致梯度突然变大,梯度裁剪防止梯度爆炸,保证训练稳定。


七、经典变体与大模型(49--58)

49. 什么是 BERT 式 Transformer?

只用 Encoder,双向 Transformer,做掩码语言模型 MLM,擅长理解类任务:分类、抽取、推理。

50. 什么是 GPT 式 Transformer?

只用 Decoder,单向自回归,擅长生成类任务:对话、写作、翻译、代码。

51. 什么是 T5?

完整 Encoder-Decoder 结构,统一所有 NLP 任务为 "文本到文本" 模式。

52. 什么是 ViT(Vision Transformer)?

把图片切成 patch 展平成序列,用纯 Transformer 做图像分类,开创视觉大模型时代。

53. 长序列 Transformer 优化思路

  • 稀疏注意力(Longformer、BigBird)
  • 线性复杂度注意力(Performer、Linformer)
  • 分块注意力(FlashAttention、PagedAttention)
  • 滑动窗口注意力

54. FlashAttention 核心思想

  • 分块计算注意力,减少 HBM 与 SRAM 数据搬运
  • 时间复杂度不变,但实际速度大幅提升
  • 支持极长序列,是当前大模型训练标配

55. 为什么现在大模型多用 Decoder-only?

  • 统一自回归范式,简单易扩展
  • scaling 规律稳定,参数越大效果越好
  • 适合多任务通用生成

56. Transformer 为什么能成为大模型基座?

  • 可并行、易缩放
  • 表达能力强,适配多模态
  • 深度可训练,性能随参数指数级提升

57. 注意力机制存在的意义是什么?

提供一种可微、动态、全局的信息聚合方式,让模型自动学习 "该关注什么"。

58. 未来 Transformer 可能怎么演进?

  • 更低复杂度的线性注意力
  • 与 MLP、CNN、State Space 模型融合
  • 动态稀疏激活
  • 多模态统一架构
相关推荐
承渊政道2 小时前
【递归、搜索与回溯算法】(floodfill算法:从不会做矩阵题,到真正掌握搜索扩散思想)
数据结构·c++·算法·leetcode·矩阵·dfs·bfs
谭欣辰2 小时前
字典树:高效字符串处理利器
c++·算法
俺爱吃萝卜2 小时前
Java 性能调优实战:从 JVM 内存模型到垃圾回收算法优化
java·jvm·算法
M ? A2 小时前
Vue slot 插槽转 React:VuReact 怎么处理?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
鹿角片ljp2 小时前
LeetCode215: 数组中的第K个最大元素 —— 从快速选择到堆排
算法·排序算法
2501_913061342 小时前
网络原理之HTTP
java·网络·面试
天若有情6732 小时前
用动态规划思路,一步一步实现响应式数据(从本质到落地)
算法·动态规划·代理模式
isNotNullX2 小时前
数据挖掘是什么?数据挖掘算法有哪些?
人工智能·算法·数据挖掘
剑挑星河月2 小时前
73.矩阵置零
数据结构·算法·leetcode·矩阵