AI-Agent 面试题汇总 - Transformer篇(原理与数学模型)
1. Transformer 为什么使用多头注意力机制,为什么不只用一个头?
多头注意力的核心,不是单纯把一个 attention 做很多遍,而是让模型在不同子空间里同时学习不同类型的关系。一个头可能更关注主语和谓语的关系,另一个头可能更关注长距离依赖,还有的头更容易学到局部词序和语义搭配。
如果只用一个头,模型也能做注意力,但它只能在一个投影空间里建模,表达能力会受限。多头的做法是先把输入分别线性映射成多组 (Q,K,V),每组各自做 attention,最后再拼接起来。这样模型就能从多个角度同时看同一句话。
公式一般写成:

其中:

所以多头的本质价值是:增强表示能力,而不是简单重复计算。
2. 为什么 Q 和 K 要用不同的权重矩阵生成,为什么不能直接用同一个值和自己点乘?
因为 Query 和 Key 的角色不一样。Query 表示“我现在想找什么信息”,Key 表示“我这里能提供什么信息”。虽然它们都来自同一份输入,但通过不同线性变换后,模型可以把同一个 token 映射成两种不同语义空间里的表示。
如果直接拿同一个向量和自己点乘,本质上只是在做一种非常受限的相似度计算,模型很难学到“查找”和“被查找”这两种不同角色。而且如果 Q 和 K 完全共享,表达空间会更僵硬,注意力矩阵的可学习性也会下降。
你可以把它理解成:Q 是提问,K 是索引标签,V 是实际内容。提问和索引标签当然不该强行共用一套参数。
3. Transformer 里 attention 为什么用点乘,不用加法?两者在复杂度和效果上有什么区别?
attention 分数最常见的是点乘,也就是:

而加法注意力更像是:

点乘注意力最大的优势是计算快,特别适合矩阵并行。Transformer 本身就是为了高效并行设计的,所以点乘非常自然。在 GPU 上,矩阵乘法有很成熟的优化,而加法注意力通常要多做一次前馈变换和非线性,算起来更慢。
从效果上说,两者本质上都能学相似性,但在高维空间里,点乘更直接,也更容易批量化实现。所以 Transformer 最后选了 scaled dot-product attention,而不是 Bahdanau 那种加法 attention。
4. 为什么在 softmax 之前要对 attention score 做缩放,也就是为什么除以 (\sqrt{d_k})?
这是 Transformer 特别常考的一题。原因是当 (d_k) 很大时,(Q) 和 (K) 的点积值会变大,softmax 输入一旦过大,就会变得非常尖锐,接近 one-hot。这样一来,大部分位置梯度都会变得很小,训练会不稳定。
如果假设 (q_i) 和 (k_i) 独立同分布,均值为 0,方差为 1,那么:

它的方差大约是:
Var(q⋅k)=dk
所以随着维度变大,点积结果的波动会越来越大。为了把这个量级压回去,就除以 (\sqrt{d_k}),这样缩放后方差大致回到常数级,softmax 不容易饱和。
完整公式是:

这一步的本质就是:防止高维点积过大,让训练更稳定。
5. 计算 attention score 的时候怎么对 padding 做 mask?
padding 的位置不是真实 token,所以不能让模型去关注这些位置。做法一般是在 softmax 之前,把 padding 对应位置的 score 加上一个很小的数,比如 (-10^9) 或负无穷。这样经过 softmax 后,这些位置的权重就基本变成 0。
简单写法就是:
softmax(score+mask)
其中 mask 在有效位置是 0,在 padding 位置是一个极小值。
代码示例:
import torch
import torch.nn.functional as F
scores = torch.tensor([[1.2, 0.8, 2.5, 0.3]])
mask = torch.tensor([[0, 0, 1, 1]]) # 1 表示 padding
scores = scores.masked_fill(mask == 1, float('-inf'))
attn = F.softmax(scores, dim=-1)
print(attn)
这样最后两个 padding 位置的权重就会接近 0。
6. 为什么多头注意力里每个 head 要降维?
因为多头不是无限加计算量。如果模型总维度是 (d_{model}),头数是 (h),通常每个头的维度会设成:

这样做的目的是让多个头加起来的总计算量和单头注意力保持在同一个量级。如果每个头都还用完整的 (d_{model}),那头数一多,参数量和计算量都会爆掉。
所以每个 head 降维,一方面是为了控制成本,另一方面也是为了让不同头在不同低维子空间里学不同模式。这不是能力削弱,而是结构设计。
7. 讲一下 Transformer 的 Encoder 模块。
Transformer 的 Encoder 是由多个相同结构堆叠起来的。每一层通常包含两个核心子层:一个是多头自注意力,另一个是位置前馈网络。每个子层外面都会加残差连接和 LayerNorm。
也就是说,一层 Encoder 的基本流程就是:
输入 -> Multi-Head Self-Attention -> Add & Norm -> Feed Forward -> Add & Norm
其中 self-attention 的意思是:当前序列里的每个 token 都可以看同一序列里其他所有 token。
Encoder 的输出是整段输入的上下文表示,这个表示后面可以直接拿去做分类、匹配,也可以交给 Decoder 做生成。
8. 为什么输入词向量之后,通常还要乘以
?
原始 Transformer 论文里有这个细节。词向量 embedding 在初始化后,其数值范围通常比较小,而位置编码是直接加上去的。如果 embedding 太小,位置编码可能会在一开始占比较大,影响语义表示。
所以会把词向量乘上
,让它和位置编码处在更接近的数值尺度上。这样在训练初期,模型更容易平衡“词本身的语义”和“词所在的位
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.
查看22道真题和解析