2026大模型面试:Transformer与注意力机制必考28题(含答案)
精选自100道采集题目,保留最高频最核心的28题 | 难度:⭐基础 ⭐⭐进阶 ⭐⭐⭐深入
一、Self-Attention核心原理(5题)
- ⭐⭐ [高频] Attention的计算步骤是什么?请写出Scaled Dot-Product Attention的公式。
一句话秒答: Attention就是"算相似度、归一化、加权求和"三板斧,公式是 Attention(Q,K,V)=softmax (QKTdk)V\text{Attention}(Q,K,V) = \text{softmax}\!\left(\dfrac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dk QKT)V。
展开来说: 你把输入 XXX 过三个线性层拿到 Q,K,VQ, K, VQ,K,V,然后 QKTQK^TQKT 算出每对token之间的"你跟我有多像"分数矩阵,除以 dk\sqrt{d_k}dk 是怕数值太大把softmax怼到饱和区(想象一下softmax输入全是几百的数,输出直接变one-hot了,梯度全没了)。softmax归一化之后你就拿到了注意力权重,最后拿这个权重去对 VVV 做加权求和------本质上就是个"软性检索",用相似度从一堆value里捞你最需要的信息。
面试加分: 你可以补一句------这个缩放因子 dk\sqrt{d_k}dk 的来源其实是假设Q和K各分量独立同分布、均值0方差1,那点积的方差正好是 dkd_kdk,除以 dk\sqrt{d_k}dk 就把方差压回1。这个推导经常被追问,提前说了面试官会觉得你是真懂。
- ⭐⭐ [字节] Self-Attention中Q、K、V分别代表什么?为什么需要三个不同的矩阵而不是用同一个?
一句话秒答: Q是"我想找什么",K是"我有什么标签",V是"我实际带的货"------三者解耦才能让"怎么找"和"拿什么"分开学。
展开来说: 你可以用搜索引擎类比来理解:Q是你输入的搜索词,K是每个网页的关键词标签(用来和搜索词匹配),V是网页正文内容(匹配上了就返回这个)。如果三个共用一个矩阵,那注意力矩阵变成 XXTXX^TXXT 后过softmax,这玩意是个对称矩阵,意味着"A关注B的程度"和"B关注A的程度"完全一样,这对自然语言来说太不合理了------"我爱你"里"我"对"你"的注意力和"你"对"我"的注意力显然不该相同。三个独立投影矩阵 WQ,WK,WVW_Q, W_K, W_VWQ,WK,WV 让模型能在不同的语义子空间里分别学"怎么匹配"和"匹配到了取什么"。
面试加分: 如果面试官追问"那两个矩阵行不行",你可以说:只用Q和V(或K和V)也能跑,但匹配空间和取值空间就被耦合了,相当于强制要求"你怎么算相关性"和"你拿什么回来"共享参数,自由度减半。三元组是表达力和参数效率的最优平衡点。
- ⭐⭐⭐ [高频] Self-Attention为什么要使用(Q, K, V)三元组,而不是只用(Q, V)或(K, V)或只用(V)?
一句话秒答: 三元组把"谁和谁匹配"和"匹配到了取什么内容"完全解耦,是表达力天花板最高的设计。
展开来说: 咱们做个思想实验------只用V的话,注意力权重由 VVTVV^TVVT 决定,值本身决定了自己该被谁关注,这跟"我长得帅所以你必须看我"一样不讲道理,模型没有独立的"选择机制"。用(Q,V)或(K,V)两元组呢,比只用V好,但匹配端只有一个投影矩阵,Q和K共享参数,等于"搜索词和索引标签必须用同一套编码方式",灵活性打折。(Q,K,V)三元组的好处是:Q专门负责"我在找什么",K专门负责"我能被什么样的查询命中",V专门负责"命中后你能拿到什么"------三者各司其职,从参数量看只是多了几个线性层(增量很小),但表达能力的提升是本质性的。
面试加分: 你可以提一下从信息论角度理解------QK的匹配空间和V的内容空间正交,相当于模型可以学到"注意力分布由语义相关性决定,但输出内容可以从完全不同的表示空间聚合"。这种解耦设计在后续很多架构中被反复验证是最优的。
- ⭐⭐ [字节] Self-Attention和传统Seq2Seq模型中的Attention有什么区别?
一句话秒答: 传统Attention是Decoder去"查"Encoder的跨序列注意力,Self-Attention是一个序列自己内部"互看"。
展开来说: 传统Seq2Seq里的Attention------比如Bahdanau Attention------是Decoder当前时间步的隐状态当Q,去和Encoder所有时间步的隐状态(K/V)做匹配,本质是"翻译到这一步了,我回头看看原文哪个词最相关"。但它有个致命限制:Encoder内部仍然是RNN逐步计算的,token之间的交互要沿着时间步慢慢传播。Self-Attention就激进多了------同一个序列里每个token都直接跟所有其他token算注意力,不需要RNN做中介,全局依赖一步到位,而且完全并行。这就是Transformer能把RNN按在地上摩擦的根本原因。
面试加分: 你可以补充说Transformer的Decoder里其实两种Attention都有------先做Masked Self-Attention(序列内部互看),再做Cross-Attention(Q来自Decoder,K/V来自Encoder),这个设计同时继承了两种机制的优点。不过到了GPT这种Decoder-only架构,Cross-Attention就没了,全靠Self-Attention打天下。
- ⭐⭐ [高频] Attention机制能捕获长距离依赖的原理是什么?与RNN相比有什么优势?
一句话秒答: Attention任意两个位置之间路径长度是O(1),RNN是O(n)------信息不用"接力传递"了,一步到位。
展开来说: 你想想RNN的信息流------第1个token的信息要传到第100个token,得经过99个时间步的隐状态传递,每一步都会被矩阵乘法和激活函数"揉"一遍,信号衰减得厉害,梯度也是一样的道理(这就是经典的梯度消失问题)。LSTM和GRU加了门控机制缓解了一些,但本质上还是逐步传递。Self-Attention就不一样了,第1个token和第100个token直接算一个attention score,信息一步就过去了,路径长度恒为1。而且所有位置的计算可以并行------一个矩阵乘法 QKTQK^TQKT 就把所有位置对的相似度全算完了,GPU利用率拉满。
面试加分: 当然也要提一下代价------Self-Attention的复杂度是 O(n2)O(n^2)O(n2),序列长了这个平方项就爆了。所以才有了各种高效Attention变体(FlashAttention、稀疏Attention、线性Attention等)。面试时展现出"知道优势也知道局限"的辩证思维,比单纯吹Attention强多了。
二、Transformer架构细节(7题)
- ⭐⭐ [字节] 请详细描述Transformer的整体架构,包括Encoder和Decoder各有哪些子模块。
一句话秒答: Encoder是"Self-Attention + FFN"堆N层,Decoder在这基础上多一个Cross-Attention,再加上残差连接和LayerNorm。
展开来说: 原始Transformer是个经典的Encoder-Decoder结构,各堆6层。Encoder每层两个子层:Multi-Head Self-Attention和FFN,每个子层都套一个"残差连接 + LayerNorm"。Decoder每层三个子层:先是Masked Multi-Head Self-Attention(加了causal mask,确保生成第 iii 个token时只能看到前面的token),然后Cross-Attention(Q来自Decoder,K/V来自Encoder最后一层的输出),最后FFN,同样每个子层都有残差+LN。输入端是Token Embedding加Positional Encoding,输出端是一个线性层接softmax映射到词表概率分布。整个架构的精髓在于------完全用注意力替代了RNN/CNN,第一次实现了序列建模的全面并行化。
面试加分: 可以提一嘴现代LLM的演变:GPT系列砍掉了Encoder和Cross-Attention,只保留Decoder;LLaMA进一步把Post-Norm换成Pre-Norm、ReLU换成SwiGLU、绝对位置编码换成RoPE。面试官会觉得你对"从论文到工程"的演进脉络很清楚。
- ⭐⭐⭐ [高频] Transformer的点积模型为什么要除以sqrt(d_k)进行缩放?不缩放会有什么问题?
一句话秒答: 除以 dk\sqrt{d_k}dk 就是为了把点积的方差压回1,不让softmax进入饱和区导致梯度消失。
展开来说: 这个问题背后有个优雅的数学推导。假设Q和K的每个分量都是独立的、均值0方差1的随机变量,那 q⋅k=∑i=1dkqikiq \cdot k = \sum_{i=1}^{d_k} q_i k_iq⋅k=∑i=1dkqiki 的期望是0,方差是 dkd_kdk(因为每一项 qikiq_i k_iqiki 的方差是1,dkd_kdk 个独立项加起来方差就是 dkd_kdk)。dkd_kdk 一般是64或128,这意味着点积值的标准差有8到11左右,softmax输入动辄几十上百。softmax在输入值很大时输出趋近于one-hot------一个位置接近1其余接近0------梯度几乎为零,训练直接卡死。除以 dk\sqrt{d_k}dk 之后方差回到1,softmax输出比较"软",梯度正常流动。这就是为什么这个机制叫"Scaled Dot-Product Attention"。
面试加分: 你可以对比一下加性Attention(Bahdanau那种用小型神经网络算注意力分数的方式)------加性Attention没有这个缩放问题,因为它用tanh压缩了输出范围。但点积Attention的矩阵乘法在GPU上效率高得多,所以工程上全都用点积+缩放。
- ⭐⭐ [高频] Multi-Head Attention的作用是什么?为什么多头比单头效果好?
一句话秒答: 多头就是让模型同时从多个"视角"看同一段文本------有的头盯语法,有的头盯语义,有的头盯位置关系。
展开来说: 单头Attention只能学到一种注意力分布模式,但语言里的依赖关系是多层次的。比如"他昨天在北京开的那个会很成功"这句话,"他"和"开"之间有主谓关系(语法头),"北京"和"会"之间有地点修饰关系(语义头),"昨天"需要被附近的词关注(位置头)。Multi-Head的做法是把 dmodeld_{model}dmodel 维的Q/K/V切成 hhh 份,每份独立做Attention,最后concat起来过一个线性层。公式是 MultiHead(Q,K,V)=Concat(head1,...,headh)WO\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, ..., \text{head}h)W^OMultiHead(Q,K,V)=Concat(head1,...,headh)WO。关键是------每个头的维度 dk=dmodel/hd_k = d{model}/hdk=dmodel/h,总计算量和单头几乎一样,但表达能力强了一个量级,跟CNN里多个卷积核的道理一模一样。
面试加分: 实验表明8头是个常见的甜蜜点。头太少表达力不够,头太多每个头的维度太小也不行(比如维度只有8的向量能学到啥?)。另外后续研究发现不同头确实学到了可解释的模式------有些头专门关注相邻词,有些头专门关注动词的主语,这不是玄学,是可以可视化验证的。
- ⭐⭐ [高频] Transformer中残差连接(Residual Connection)的作用是什么?去掉会怎样?
一句话秒答: 残差连接就是"给梯度修一条高速公路"------不管中间的变换学了啥,信息和梯度都有一条直通路径保底。
展开来说: 公式很简单:output=x+SubLayer(x)\text{output} = x + \text{SubLayer}(x)output=x+SubLayer(x),输出等于原始输入加上子层的变换。这有两个好处:第一,反向传播时梯度可以沿着这条"加法捷径"直接传到浅层,不用穿过所有中间层的非线性变换,有效缓解梯度消失;第二,它提供了一个"恒等映射兜底"------就算子层学废了(输出接近零),整个模块的输出至少还等于输入,保证网络不会"越深越差"。这是ResNet那篇论文的核心洞察,Transformer直接借过来了。去掉残差连接的话,超过6层的Transformer基本训不动,loss下不去,大量实验反复验证过。
面试加分: 你可以进一步提一下Pre-Norm和Post-Norm的区别------Pre-Norm把LN放在子层前面(x+SubLayer(LN(x))x + \text{SubLayer}(\text{LN}(x))x+SubLayer(LN(x))),残差路径上干干净净没有任何归一化阻碍,梯度更加畅通。这也是为什么现代大模型都用Pre-Norm的原因。
- ⭐⭐ [高频] Transformer中FFN(前馈网络)的结构是什么?为什么中间层维度要扩大4倍?
一句话秒答: FFN就是"升维→激活→降维"的两层MLP,扩大4倍是为了在高维空间里做更丰富的非线性特征变换。
展开来说: 公式是 FFN(x)=W2⋅ReLU(W1x+b1)+b2\text{FFN}(x) = W_2 \cdot \text{ReLU}(W_1 x + b_1) + b_2FFN(x)=W2⋅ReLU(W1x+b1)+b2,W1W_1W1 把 dmodeld_{model}dmodel 升到 4dmodel4d_{model}4dmodel,W2W_2W2 再压回 dmodeld_{model}dmodel。为什么要这么做呢?因为Attention层虽然能建模全局依赖,但它本质是线性加权求和------softmax之后对V做加权平均------非线性能力有限。FFN就是来补这个短板的,它承担了主要的"特征变换"角色。升到4倍维度相当于给信息一个更大的"操作空间",在高维里做非线性变换(激活函数起作用的地方),然后再压缩回来。4倍是个经验值,太小了表达力不够,太大了参数量爆炸。
面试加分: 现代LLM里FFN基本都换成了SwiGLU或GeGLU变体,公式变成 FFN(x)=(W1x⊗σ(W3x))W2\text{FFN}(x) = (W_1 x \otimes \sigma(W_3 x))W_2FFN(x)=(W1x⊗σ(W3x))W2,多了一个门控分支。为了保持总参数量不变,扩展比从4倍调整为 83\frac{8}{3}38 倍(约2.67倍)。LLaMA、Qwen、Mistral全都是这个配方。面试时提到这个说明你不只知道论文,还了解工程实践。
- ⭐⭐⭐ [高频] Transformer的计算复杂度是多少?Self-Attention的时间和空间复杂度分别是什么?
一句话秒答: Self-Attention时间复杂度 O(n2d)O(n^2 d)O(n2d),空间复杂度 O(n2)O(n^2)O(n2)------那个 n2n^2n2 就是长序列场景下的命门。
展开来说: 拆开来看:QKTQK^TQKT 是两个 n×dn \times dn×d 矩阵相乘,得到 n×nn \times nn×n 的注意力矩阵,时间 O(n2d)O(n^2 d)O(n2d),空间 O(n2)O(n^2)O(n2);再乘以V又是 O(n2d)O(n^2 d)O(n2d)。FFN那边是两次 d×4dd \times 4dd×4d 的矩阵乘法,时间 O(nd2)O(nd^2)O(nd2),空间 O(nd)O(nd)O(nd)。所以单层总复杂度是 O(n2d+nd2)O(n^2 d + nd^2)O(n2d+nd2)。有意思的是------当 n<dn < dn<d(比如序列长度2048、模型维度4096),FFN的 nd2nd^2nd2 才是大头;当 n>dn > dn>d(超长序列),Attention的 n2dn^2 dn2d 才爆炸。这就是为什么短序列场景下大家不太care Attention效率,长序列场景下各种高效Attention方案才纷纷涌现。
面试加分: 可以补充说FlashAttention并没有降低计算复杂度(它是exact attention),它降低的是IO复杂度------把HBM访问量从 O(n2)O(n^2)O(n2) 降到 O(n2d/M)O(n^2 d/M)O(n2d/M),减少了内存瓶颈。真正降低计算复杂度的是稀疏Attention(如BigBird的 O(nn)O(n\sqrt{n})O(nn ))和线性Attention(O(nd)O(nd)O(nd))。
- ⭐⭐ [高频] 为什么Transformer可以并行训练而RNN不行?
一句话秒答: RNN的 hth_tht 依赖 ht−1h_{t-1}ht−1,是条计算链,必须串行;Transformer所有位置的Attention是一个矩阵乘法,天然并行。
展开来说: RNN的递推公式 ht=f(ht−1,xt)h_t = f(h_{t-1}, x_t)ht=f(ht−1,xt) 决定了你必须先算完 h1h_1h1 才能算 h2h_2h2,先算完 h2h_2h2 才能算 h3h_3h3------整个序列是一条串行链,GPU有再多核也只能干等着。Transformer的Self-Attention就不一样了,QKTQK^TQKT 是个矩阵乘法,一步就把所有位置对的注意力分数全算出来了,所有位置同时处理。训练时因为Teacher Forcing,Decoder也可以一次性看到完整序列(用causal mask挡住未来信息),所有位置的loss同时算出来。这个并行性优势在GPU上是碾压级的------同样是处理一个长度1024的序列,RNN要循环1024步,Transformer一个forward pass就完事。
面试加分: 注意这里说的是训练时的并行性。推理(自回归生成)时Transformer也得一个一个token生成,不过每一步内部的计算仍然是并行的,而且有KV-Cache避免重复计算。这个区分很多候选人会搞混,面试官经常用这个来区分水平。
三、位置编码(5题)
- ⭐ [高频] 为什么Transformer需要位置编码?如果不加位置编码会怎样?
一句话秒答: Self-Attention是"位置无关"的------打乱token顺序输出不变,所以必须靠位置编码告诉模型"谁在前谁在后"。
展开来说: 这其实是Self-Attention的一个"先天缺陷"。你看Attention的计算------对每一对token算点积相似度然后加权求和------整个过程跟token在哪个位置完全无关。数学上叫"置换不变性"(Permutation Invariant):你把"猫吃鱼"的三个token打乱成"鱼猫吃",Attention算出来的结果只是对应打乱一下,模型完全分不清这两句话。这就离谱了,自然语言的意思严重依赖词序啊。所以你必须通过某种方式把位置信息"注入"进去。原始Transformer用正弦/余弦函数生成固定位置编码加到Embedding上;BERT/GPT用可学习的位置Embedding;到了LLaMA时代则用旋转位置编码RoPE直接作用在Q/K上。
面试加分: 可以提一个有趣的实验------去掉位置编码后模型在情感分类这种"词袋任务"上掉得不多,但在需要理解语序的任务(比如NLI、阅读理解)上暴跌。这说明位置编码的重要性跟任务的"语序敏感度"正相关。
- ⭐⭐ [高频] 绝对位置编码和相对位置编码的区别是什么?各自的优缺点?
一句话秒答: 绝对位置编码给每个位置一个"门牌号",相对位置编码只关心"你和我隔多远"------后者外推性好得多。
展开来说: 绝对位置编码的思路很直觉------位置0有个向量、位置1有个向量......要么是固定的正弦函数算出来的,要么是可学习的Embedding查表得到的,直接加到token embedding上。问题是:训练时最长见过512,推理时来个2048,位置513-2048的编码从来没见过(可学习的)或者虽然有值但没被训练优化过(正弦的),效果就崩了。相对位置编码的思路不一样------我不care你在哪个绝对位置,我只care你和我隔了几个位置。这个信息直接嵌入到Attention的计算里(比如在attention score上加一个跟距离相关的偏置)。好处是不管序列多长,相对距离的分布特征是稳定的,所以外推性天然好。
面试加分: 现代大模型的主流选择是RoPE(LLaMA/Qwen/Mistral系列)和ALiBi(BLOOM/MPT),两者都属于"相对位置"阵营但实现思路完全不同。RoPE是对Q/K做旋转变换让内积天然包含相对位置,ALiBi是在attention score上加线性距离惩罚。面试时能把这俩对比清楚,说明你对位置编码的理解不是皮毛。
- ⭐⭐⭐ [高频] RoPE(旋转位置编码)的核心思想是什么?它是如何通过绝对位置编码实现相对位置信息的?
一句话秒答: RoPE对Q/K向量做位置相关的旋转,使得内积自然只依赖相对位置------用绝对位置的旋转角实现相对位置的效果。
展开来说: RoPE的核心idea非常优雅。它把Q/K向量的每两个相邻维度看成一个二维平面上的向量,然后按照位置 mmm 旋转一个角度 mθim\theta_imθi(不同维度对用不同频率的 θi\theta_iθi)。数学上写出来是 f(q,m)=RΘ,m⋅qf(q, m) = R_{\Theta,m} \cdot qf(q,m)=RΘ,m⋅q,其中 RRR 是旋转矩阵。关键性质来了:旋转后的Q和K做内积时,⟨f(q,m),f(k,n)⟩=g(q,k,m−n)\langle f(q,m), f(k,n) \rangle = g(q, k, m-n)⟨f(q,m),f(k,n)⟩=g(q,k,m−n)------旋转角度在内积中相减了!这意味着虽然我们对每个位置施加的是绝对旋转角(mθm\thetamθ 和 nθn\thetanθ),但最终的注意力分数只取决于 m−nm-nm−n(相对位置)。你可以这么直觉理解:两个指针分别转了 mmm 圈和 nnn 圈,它们之间的夹角就是 m−nm-nm−n 圈。
面试加分: RoPE的几个实用优势值得提:不引入任何额外参数;实现就是element-wise的乘法和加法,计算开销极小;天然兼容causal mask;配合NTK-aware scaling或YaRN可以做长度外推。DeepSeek、LLaMA、Qwen全家桶都在用RoPE,已经是事实标准了。
- ⭐⭐ [腾讯] ALiBi位置编码的原理是什么?它和RoPE有什么区别?
一句话秒答: ALiBi不碰Embedding,直接在attention score上减一个跟距离成正比的惩罚------离得越远,分数越低,简单粗暴但有效。
展开来说: ALiBi的公式简洁到令人发指:score(i,j)=qiTkj−m⋅∣i−j∣\text{score}(i,j) = q_i^T k_j - m \cdot |i-j|score(i,j)=qiTkj−m⋅∣i−j∣,就是在标准的注意力分数上减去一个线性距离惩罚。每个attention head有自己的斜率 mmm(按几何级数取值,比如8个头的 mmm 分别是 12,14,...,1256\frac{1}{2}, \frac{1}{4}, ..., \frac{1}{256}21,41,...,2561),不同头以不同的"近视程度"看世界。跟RoPE对比来看:RoPE是在向量空间里动手术(旋转Q/K),改变的是表示本身;ALiBi是在分数层面做后处理,表示不变。RoPE的表达力理论上更强(旋转保留了向量的模长信息),但ALiBi的外推性更好------因为线性惩罚对任意距离都有定义,远距离自然衰减,不需要额外的插值或scaling技巧。
面试加分: 实际工程选型上,RoPE + 长度外推方案(如YaRN)已经成为绝对主流(LLaMA/Qwen/Mistral/DeepSeek全在用),ALiBi则在BLOOM和MPT中使用。面试时如果被问"你会怎么选",可以说:如果模型主要在训练长度内使用,RoPE表达力更强;如果需要大幅外推且不想做额外适配,ALiBi更省心。
- ⭐⭐⭐ [高频] 什么是位置编码的外推性问题?训练长度为512的模型能处理长度为2048的文本吗?
一句话秒答: 外推性就是"训练时只见过短序列,推理时能不能处理长序列"------大多数编码方案直接外推都会崩。
展开来说: 这个问题在大模型时代特别现实。训练时你的上下文窗口是4K,用户一上来甩给你一个16K的文档怎么办?可学习绝对位置编码最惨------位置4097之后根本没有对应的embedding向量,直接报错或者乱来。正弦位置编码理论上任意长度都能算出值,但超出训练长度后模型没见过那些pattern,效果断崖式下跌。RoPE的情况比较微妙------直接外推效果一般,但它有一系列补救方案:位置插值(PI)把位置索引线性压缩(比如把0-8191映射到0-4095的范围内),NTK-aware scaling调整旋转频率的base,YaRN综合了插值和频率调整。ALiBi因为只是加线性偏置,对任意距离天然有定义,外推性最好。
面试加分: 实际工程中很少直接"裸外推",标准做法是在目标长度上做少量continue pretraining(比如拿几B tokens的长文本微调一下)。LLaMA-2从4K扩到32K就是这么干的。面试时说出这个实践经验,比纯讲理论加分多了。
四、注意力变体与高效Attention(6题)
- ⭐⭐ [高频] MHA、MQA、GQA分别是什么?它们之间的区别和联系是什么?
一句话秒答: 三者的区别就是K/V头共享的程度------MHA完全不共享,MQA全部共享成1个,GQA分几组共享,是效率和质量的trade-off。
展开来说: MHA(Multi-Head Attention)是原版设计,每个Q头对应独立的K/V头,假设有32个头就有32组K/V,KV-Cache占用巨大。MQA(Multi-Query Attention)走极端------所有Q头共享同一组K/V,KV-Cache直接压缩到 1/h1/h1/h,推理飞快,但部分任务质量掉了一点。GQA(Grouped-Query Attention)是折中方案------把32个Q头分成比如4组或8组,每组共享一个K/V头。这样KV-Cache压缩到 g/hg/hg/h(比如 4/32=1/84/32 = 1/84/32=1/8),质量几乎不掉但推理速度接近MQA。LLaMA-2 70B和Qwen系列用的就是GQA。你可以这么理解:MHA是每个学生一个老师,MQA是全校一个老师,GQA是每个班一个老师------GQA在教学质量和师资成本之间取了个最佳平衡。
面试加分: 面试官可能追问"MQA是怎么从MHA转过来的"------其实可以做checkpoint转换:把MHA训好的模型的K/V头取平均合并成一个(或几个),然后少量continue training恢复质量。GQA论文里专门讨论了这个uptrain方案。
- ⭐⭐⭐ [高频] FlashAttention的核心思想是什么?它是如何减少HBM访问来加速Attention计算的?
一句话秒答: FlashAttention是IO-aware的精确注意力算法------通过分块(tiling)在SRAM里算完注意力,避免把 n×nn \times nn×n 的注意力矩阵写入HBM。
展开来说: 传统Attention实现有个致命问题:先算 QKTQK^TQKT 得到 n×nn \times nn×n 的矩阵存到HBM,再读出来做softmax存回HBM,再读出来乘V存回HBM------来来回回读写好几轮,而Attention计算是内存带宽瓶颈型的(计算量不大但数据搬运量巨大)。FlashAttention的核心思路是:别把这个 n×nn \times nn×n 矩阵存到HBM了!把Q/K/V按block切分,每个block加载到SRAM(GPU的片上高速缓存,容量小但带宽是HBM的10倍),在SRAM里完成该block的注意力计算,只把最终结果写回HBM。最关键的技术难点是softmax需要看到完整的一行才能归一化,但FlashAttention用了"在线softmax"技巧------维护一个running max和running sum来增量计算softmax,这样分块处理也能得到数学上精确一致的结果。
面试加分: 强调"精确"二字------FlashAttention不是近似算法,结果和标准实现bit-wise一致。这一点很重要,因为之前有很多稀疏Attention、线性Attention都是近似的,质量多少有损。FlashAttention实现了"既要又要"------速度提升2-4倍、显存省到 O(n)O(n)O(n)、精度零损失。
- ⭐⭐⭐ [字节] FlashAttention利用了GPU的哪些硬件特性?什么是tiling和kernel fusion?
一句话秒答: 核心就是利用了GPU的"SRAM快但小、HBM大但慢"的内存层次结构,通过tiling分块和kernel fusion算子融合来减少HBM读写。
展开来说: GPU的内存有两层:HBM是主存,容量几十GB但带宽约2TB/s;SRAM是片上缓存,容量只有十几到二十MB但带宽高达19TB/s,快了近10倍。Attention计算的瓶颈不是算力而是内存带宽------你有大量中间结果要读写,HBM的带宽吃不消。Tiling就是把大矩阵切成小块,每块大小精心设计成恰好fit进SRAM,一次只处理一个block的注意力计算,全程在SRAM里完成,只把最终输出写回HBM。Kernel Fusion是另一个关键优化------传统实现中matmul、softmax、dropout、matmul是四个独立的CUDA kernel,每个kernel执行完都要把中间结果写回HBM再让下一个kernel读进来;fusion之后合并成一个kernel,中间结果全部留在寄存器和SRAM里,HBM读写量大幅减少。
面试加分: FlashAttention-2进一步优化了两个维度:一是减少了非matmul操作的占比(matmul可以利用Tensor Core,其他操作只能用普通CUDA core),二是优化了thread block之间的work partitioning------FA-1在batch和head维度并行,FA-2增加了在序列长度维度的并行,GPU利用率更高。能说出FA-1到FA-2的改进差异,面试官会觉得你是真看过论文的。
- ⭐⭐ [高频] KV-Cache的原理是什么?为什么Decoder-only模型推理时需要KV-Cache?
一句话秒答: KV-Cache就是把已经算过的K和V向量存起来,新token生成时直接用缓存而不重新算------空间换时间。
展开来说: 自回归生成时,生成第 ttt 个token需要用它的Q和前面所有token的K做注意力计算,然后对所有V加权求和。如果没有KV-Cache,每生成一个新token你就得把整个序列从头到尾重新算一遍K和V------生成100个token就重复算了100次,前面的计算全是冗余的。KV-Cache的做法是:每生成一个token就把它的K和V append到缓存里,下一步生成时只需要算新token的Q/K/V,然后用新的Q去和缓存里所有的K做注意力就行了。这样每一步只做增量计算,总复杂度从 O(n3)O(n^3)O(n3) 降到 O(n2)O(n^2)O(n2)。代价是显存占用------KV-Cache大小等于 2×层数×序列长度×KV头数×dk×精度字节2 \times \text{层数} \times \text{序列长度} \times \text{KV头数} \times d_k \times \text{精度字节}2×层数×序列长度×KV头数×dk×精度字节,长序列大batch的时候可能占好几十GB。
面试加分: KV-Cache的显存管理是大模型推理工程的核心挑战之一。简单预分配max_length的连续显存会造成60-80%的浪费(因为大多数请求不会用到最大长度),这就引出了PagedAttention/vLLM的分页管理方案。面试时把KV-Cache和PagedAttention串起来讲,逻辑链路非常清晰。
- ⭐⭐⭐ [高频] PagedAttention的原理是什么?它解决了什么问题?
一句话秒答: PagedAttention就是把操作系统的虚拟内存分页机制搬到KV-Cache管理上------不再要求连续显存分配,按需动态分页,显存利用率接近100%。
展开来说: 传统KV-Cache管理就像"给每个客人预留一整张大桌子"------你预估他最多吃10道菜(max_length),就给他摆一张10人桌,结果他可能就吃了3道菜就走了,剩下7个位子全浪费。而且桌子必须是连续的一排座位,显存碎片还没法利用。PagedAttention的做法是:把KV-Cache切成固定大小的物理页(比如每页16个token),用一张页表(block table)记录"逻辑位置→物理页"的映射。请求来了按需分配物理页,用完就回收,不需要连续显存。好处有三个:一是显存利用率接近100%(只有最后一页可能有碎片);二是支持copy-on-write------beam search的多个候选序列可以共享前缀的KV-Cache,只在分叉点才复制,显存节省巨大;三是同等显存下batch size可以提升2-4倍,吞吐量直接翻番。
面试加分: PagedAttention是vLLM的核心技术,已经成为LLM推理服务的事实标准。你可以补充说vLLM还做了continuous batching------不同请求在不同时间到达、不同时间结束,但它们的KV-Cache可以动态地在显存里插空分配,不需要等一个batch全部结束才能开始下一个。这种系统级优化跟PagedAttention的分页机制是相辅相成的。
- ⭐⭐⭐ [面经] Multi-Latent Attention(MLA,DeepSeek-V2使用)的核心思想是什么?
一句话秒答: MLA把K和V联合压缩到一个低维的latent向量来缓存,推理时再解压还原------KV-Cache压缩到GQA的几分之一。
展开来说: GQA已经通过减少KV头数来压缩KV-Cache了,但MLA更激进------干脆不分别存K和V了,直接用一个低维latent向量 ct=WDKV⋅htc_t = W_{DKV} \cdot h_tct=WDKV⋅ht 联合表示它们。推理时需要K和V的话再解压:K=WUK⋅ctK = W_{UK} \cdot c_tK=WUK⋅ct,V=WUV⋅ctV = W_{UV} \cdot c_tV=WUV⋅ct。这本质上是对KV做了低秩压缩。但还有个更巧妙的trick:通过矩阵变换的"吸收"(absorb)操作,可以把上投影矩阵 WUKW_{UK}WUK 吸收进 WQW_QWQ,这样Attention计算直接用 ctc_tct 就行,根本不需要显式地把K/V解压出来。DeepSeek-V2/V3中MLA只需要缓存一个512维的latent向量(对比一下,传统MHA要缓存好几千维的K+V),显存节省是数量级的,但模型质量保持在MHA水平。
面试加分: MLA的一个技术细节值得注意------RoPE和MLA有兼容性问题。因为RoPE对Q/K做了位置相关的旋转,而"吸收"trick要求K的投影矩阵可以被吸收进Q,旋转操作会破坏这种吸收性。DeepSeek的解法是把一小部分维度单独拿出来加RoPE(decoupled rotary position embedding),其余维度不加RoPE,这样既保留了位置信息又不破坏吸收trick。能说出这个细节,说明你是真读了论文而不是看了个博客摘要。
五、Normalization与激活函数(3题)
- ⭐⭐ [高频] Batch Normalization和Layer Normalization的区别是什么?为什么Transformer用LN而不是BN?
一句话秒答: BN跨batch归一化(同一特征、不同样本),LN跨特征归一化(同一样本、不同特征)------NLP里序列长度不一且batch小,BN的统计量不靠谱,所以用LN。
展开来说: 你把一个batch的数据想象成一个三维张量(batch × seq_len × hidden_dim)。BN是在batch这个维度上切一刀------取所有样本的同一个特征位置,算均值和方差做归一化。这在CV里效果很好(同一个像素通道的分布跨图片相对稳定),但在NLP里就出问题了:第一,不同句子长度不一样,短句子补了pad,统计量被污染;第二,推理时需要用训练时积累的running mean/var,但NLP的分布变化大,这个估计不准;第三,batch size太小的话统计量方差大,不稳定。LN完全不看batch维度------它对单个样本、单个token的所有hidden维度算均值和方差,每个token独立归一化。不依赖batch大小,不受序列长度影响,推理时也不需要额外状态,干净利落。
面试加分: 你可以提一下Group Normalization和Instance Normalization------GN是LN和BN之间的折中(把channel分组归一化),IN是把每个channel独立归一化。在NLP领域基本就是LN一统天下,到了RMSNorm之后连LN里的"减均值"都省了。
- ⭐⭐ [字节] Pre-Norm和Post-Norm的区别是什么?各自的优缺点?现在大模型普遍用哪种?
一句话秒答: Pre-Norm把LN放子层前面,残差路径干干净净梯度畅通,训练稳定;Post-Norm把LN放子层后面,理论性能上限略高但深层训练不稳定。现代大模型清一色用Pre-Norm。
展开来说: Post-Norm是原始Transformer的做法:LN(x+SubLayer(x))\text{LN}(x + \text{SubLayer}(x))LN(x+SubLayer(x)),LN在残差连接的外面包了一层。问题是梯度反向传播时必须穿过这个LN才能走残差路径,LN会缩放梯度,深层网络里这个缩放累积起来会导致训练不稳定,需要精心调learning rate和warmup。Pre-Norm则是:x+SubLayer(LN(x))x + \text{SubLayer}(\text{LN}(x))x+SubLayer(LN(x)),LN被"塞"到子层里面去了,残差路径 xxx 上没有任何东西阻挡,梯度可以一路无损地传回最浅层。这使得Pre-Norm可以轻松堆到100+层都不需要warmup。不过有研究指出Post-Norm在充分训练后的最终性能可能略高于Pre-Norm(因为残差路径上有LN做归一化,特征分布更统一),但这个微小的性能差距远不值得训练稳定性的代价。
面试加分: DeepNet提出了一种折中方案------还是用Post-Norm,但在残差连接上乘一个大于1的缩放系数(x⋅α+SubLayer(x)x \cdot \alpha + \text{SubLayer}(x)x⋅α+SubLayer(x)),这样可以稳定训练1000层的Post-Norm网络。不过工程界目前还是Pre-Norm + RMSNorm的组合最流行,LLaMA/GPT/Qwen/Mistral全都是这个配方。
- ⭐⭐ [高频] RMSNorm和LayerNorm有什么区别?为什么LLaMA等模型选择RMSNorm?
一句话秒答: RMSNorm是"偷懒版LayerNorm"------去掉了减均值的步骤,只除以RMS(均方根),速度更快效果一样好。
展开来说: LayerNorm的完整公式是先减均值再除标准差最后仿射变换:y=γ⋅x−μσ2+ϵ+βy = \gamma \cdot \dfrac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \betay=γ⋅σ2+ϵ x−μ+β。RMSNorm把它简化成了只除以RMS再乘缩放因子:y=γ⋅x1d∑xi2+ϵy = \gamma \cdot \dfrac{x}{\sqrt{\frac{1}{d}\sum x_i^2 + \epsilon}}y=γ⋅d1∑xi2+ϵ x------没有减均值的re-centering步骤,也没有偏置 β\betaβ。为什么能这么简化?实验发现LayerNorm的re-centering(减均值)对最终模型质量的贡献微乎其微,去掉它省了一次reduce求均值操作和一次减法,计算量省了大约10-15%。别小看这点优化------归一化操作在Transformer里出现频率极高(每个子层前都有一个),积少成多是很可观的。而且RMSNorm的CUDA kernel实现更简洁高效,内存访问模式更友好。
面试加分: 可以提一个更深的洞察------为什么re-centering不重要?一种解释是Pre-Norm结构里,残差连接会不断把原始信息加回来,特征的均值已经被残差路径隐式地"稳定"了,LN里额外做re-centering就成了多余操作。LLaMA、Qwen、Mistral、DeepSeek全都用RMSNorm + Pre-Norm,这已经是2024-2026年大模型的标配三件套之一了。
六、Decoder-Only架构与LLM设计(2题)
- ⭐⭐ [高频] 为什么现在的大语言模型(LLM)几乎都采用Decoder-only架构?
一句话秒答: Decoder-only在自回归语言建模上训练效率最高、scaling曲线最好、范式最统一------一个架构通吃所有任务。
展开来说: 这个问题可以从五个维度来理解。第一,训练效率:Decoder-only的causal mask让序列里每个位置都能作为预测目标,一个长度为N的序列提供N-1个训练信号,而BERT那种MLM只mask了15%的token,信号密度差了好几倍。第二,Scaling Law友好:GPT-3论文以及后续Chinchilla等研究反复验证,同等算力下Decoder-only的loss曲线最平滑、最低,scale up的收益最可预期。第三,范式统一:所有NLP任务都可以转化为"给一段前缀,续写下文"的格式,不需要针对不同任务设计不同架构。第四,工程简洁:只有一个模型结构,推理逻辑就是自回归生成,KV-Cache管理简单明了。第五,涌现能力:In-Context Learning、Chain-of-Thought这些能力主要在大规模Decoder-only模型上被观察到,Encoder-only和Encoder-Decoder模型上表现弱很多。
面试加分: 面试官可能会反问"那Encoder-Decoder就没有优势了吗?"------其实在翻译、摘要这种有明确input/output边界的任务上,T5这样的Encoder-Decoder架构在同等参数量下确实更高效(Encoder可以双向编码输入,信息利用更充分)。但Decoder-only靠暴力scale up已经弥补了这个差距,而且统一范式的好处太大了。工程上一个模型走天下比维护多个架构划算得多。
- ⭐ [字节] Encoder-only、Encoder-Decoder、Decoder-only三种架构分别适合什么任务?
一句话秒答: Encoder-only做理解(分类、NER),Encoder-Decoder做转换(翻译、摘要),Decoder-only做生成(对话、写作)------但大模型时代Decoder-only已经通吃了。
展开来说: Encoder-only架构(BERT、RoBERTa)用双向注意力编码输入,擅长"理解"类任务------你给它一句话,它告诉你情感是正面还是负面、实体是人名还是地名。但它不擅长生成,因为没有自回归解码能力。Encoder-Decoder架构(T5、BART)天然适合"输入→输出"的转换任务------Encoder双向理解输入,Decoder自回归生成输出,翻译和摘要就是最典型的场景。Decoder-only架构(GPT系列、LLaMA)只用causal attention做自回归生成,看起来最"简陋",但通过prompt engineering可以把任何任务都转化成生成任务。而且规模一上去,它在理解类任务上也不比BERT差------GPT-4做情感分类、NER的效果秒杀大多数fine-tuned BERT模型。
面试加分: 一个有趣的趋势是------小模型场景下Encoder-only仍然有生存空间。比如你要部署一个文本分类服务,BERT-base只有110M参数,inference飞快,效果也够用,没必要上7B的LLaMA。但凡涉及到生成、多任务、少样本学习的场景,Decoder-only就是唯一的选择了。面试时展现出"不是所有问题都需要最大的锤子"的工程思维,比一味鼓吹大模型要成熟得多。