跳到主要内容 大模型面试核心问题解析:Transformer 与训练优化 | 极客日志
Python AI 算法
大模型面试核心问题解析:Transformer 与训练优化 本文涵盖大模型面试中的 25 个核心问题,涉及 Transformer 架构原理、注意力机制计算细节、位置编码策略、归一化方法、微调技术(LoRA、RLHF)、推理加速(KV Cache)及显存优化等。内容聚焦于 Decoder-only 结构优势、RoPE 外推方案、混合精度训练差异及 PyTorch 张量操作等关键技术点,旨在帮助技术人员系统掌握大模型底层逻辑与工程实践要点。
MqEngine 发布于 2025/2/6 更新于 2026/4/20 2 浏览本文整理了大模型领域高频面试问题,涵盖 Transformer 架构原理、注意力机制变体、位置编码策略、训练优化技术(如 LoRA、RLHF)、推理加速方案(KV Cache)以及工程实践细节。旨在帮助开发者系统梳理核心知识点,应对技术面试挑战。
1. 在 Transformer 模型中,为什么 scaled dot-product attention 在计算 QK 内积之后要除以根号 d? 简单来说,就是需要压缩 softmax 输入值,以免输入值过大,进入了 softmax 的饱和区,导致梯度值太小而难以训练。如果不对 attention 值进行 scaling,也可以通过在参数初始化时将方差除以根号 d,同样可以起到预防 softmax 饱和的效果。从数学角度看,Q 和 K 向量的维度为 d,其点积结果的方差约为 d,除以根号 d 后方差变为 1,使分布稳定。
2. Transformer 自注意力计算中,为什么 Q 和 K 要使用不同的权重矩阵进行线性变换投影,为什么不使用同一个变换矩阵,或者不进行变换?
如果 Q 和 K 一样,则矩阵乘积的结果是一个对称矩阵,这样减弱了模型的表达能力。
如果 Q 和 K 一样,乘积结果的对称矩阵中,对角线的值会比较大,导致每个位置过分关注自己。
使用不同的投影矩阵,参数增多,可以增强模型表达能力,允许查询和键值学习不同的特征空间。
3. Transformer 模型中,注意力计算后面使用了两个 FFN 层,为什么第一个 FFN 层先把维提升,第二个 FFN 层再把维度降回原大小?
提升维度:类似 SVM kernel,通过提升维度可以识别一些在低维无法识别的特征,增加非线性映射能力。
提升维度:更大的可训练参数,提升模型的容量,使其能拟合更复杂的函数关系。
降回原维度:方便多层注意力层和残差模块进行拼接,而无需进行额外的处理,保持残差连接的维度一致性。
4. MQA(Multi-Query Attention) 和 GQA(Grouped-Query Attention) 相比 MHA(Multi-Head Attention),计算量变化如何,主要带来了什么优化?
MQA 和 GQA 虽然可训练参数量比 MHA 少,但是计算量和 MHA 相比变化不大,主要在生成 KV 时有少量降低。
Decoder-only 的大模型由于 causal attention 的存在,使用了 KV 缓存加速推理。MQA 和 GQA 能减少 KV 头的数量,节省了缓存,使得在输入长度较长时也能把 KV 放进缓存,显著降低显存占用并提高吞吐量。
5. 为什么现在主流的 LLM 模型基本都是 Decoder-only 的结构?单向注意力模型为什么效果比双向注意力效果好?
双向 Attention 在多层模型训练中容易退化成低秩矩阵,限制了模型容量;而 Decoder-only 模型使用了下三角注意力矩阵,使得训练过程中矩阵是满秩,建模能力更强。
单向注意力模型相比双向注意力模型在训练的时候难度更大,能迫使模型学到更多信息,具备更强的预测能力。
Causal Attention 天然具有位置编码的功能,而双向 Attention 即使交换两个 token 的位置也基本不影响表示,对语序区分能力较弱。
工程上,单向模型支持 KV Cache 等,对于对话场景效率友好,适合自回归生成任务。
轨迹依赖,基模型训练成本高,业界倾向于沿着已经成功的模型继续开发,生态积累效应明显。
6. 在 Bert 中,词向量 token embedding 和 (绝对) 位置编码 position encoding 为什么可以直接相加?
两个向量相加,理论上其效果等价于维度拼接 concat+ 线性变换,而相加的操作在实现上更为方便且计算开销小。
高维空间中 (如 768 维),两个随机向量近似为正交关系。模型在高维度有能力区分出所有组合的情况。假设共有 2 万个词向量,500 个位置,则模型需要在 768 维空间区分 1000 万个点,即使 768 维每个维度只能取 1 和 -1 也具备足够的区分能力。
词向量和位置编码可以认为都是一个 one-hot 向量经过一层线性变换层得到的。两个向量相加等价于把它们的 one-hot 编码拼接后进行线性变换。
没有使用相乘则是出于工程考虑。相加相比相乘结果更为稳定,方便训练,避免数值爆炸或消失。
7. LoRA 和全参数训练在计算量和显存上相比如何?为什么 LoRA 能提升大模型训练效率?
计算量上:LoRA 训练时,在主干模型的(部分)全连接层增加了 LoRA 旁路,前向和后向的计算量都在主干模型的基础上,增加了旁路部分的计算,因此相比全参数训练,略有增加但可忽略不计。
显存上:训练时,显存主要有①模型参数②梯度③中间激活值④优化器参数四个部分。模型参数/梯度/激活值相比全参数训练也略微增加;而优化器则不需要再存储原模型参数的部分,只需要存储 LoRA 旁路部分,这部分节省较多显存。
使用 LoRA 能提升训练效率主要是因为(1)优化器部分的显存需要减少了,可以增大 batch size(2)优化器参数减少了,分布式训练中多卡之间的通信量减少了(3)主干模型由于不用更新,可以进一步量化到 int8/int4 等,减少加载显存。
8. 为什么模型需要 normalization(batchnorm/layernorm 等)?
输入数据包含多个特征,特征之间有不同的量纲和范围(如身高 180 和年龄 18 岁),通过 normalization 进行归一化再经过模型进行线性/非线性组合,能够防止部分特征占据主导,部分特征被忽略。
batchnorm 论文认为:模型一般有多层,前一层的输出是后一层的输入,而训练中前一层的参数更新会导致后一层的输入数据分布变化导致 ICS(internal covariate shift),这样后面的层就不得不频繁剧烈更新适应分布变化,导致分布偏移进入激活函数饱和区而出现梯度消失,另外分布变化也是对 i.i.d.条件的破坏。使用 normalization 可以保持分布的稳定,减小方差,使模型训练可以正常进行。
《How Does Batch Normalization Help Optimization?》设计了实验测量使用 batchnorm 前后的 ICS,发现 batchnorm 实际上并没有缓解 ICS,甚至有所增加。而 batchnorm 能优化模型训练的原因更多是使得损失函数平面更加光滑,而便于梯度下降收敛。
9. Transformer 中 pre-norm 和 post-norm 各有什么优缺点?
原始的 Transformer 用的是 post-norm,它在残差之后进行归一化(add & norm),对参数正则化的效果更强,模型更为鲁棒;post-norm 对每个通路都进行了归一化,使得梯度在回传的时候容易出现消失。
Pre-norm 相对于 post-norm,残差部分存在不经过归一化的通路,因此能够缓解梯度消失,能够训练更深的网络。
也就是说,在层数较少,post-norm 和 pre-norm 都能正常收敛的情况下,post-norm 的效果更好一些;但是 pre-norm 更适合用于训练更深的网络,如现代大模型普遍采用 pre-norm。
10. 对于使用 Multi-Head Attention 的模型,假设 hidden size=D,注意力头数量为 h,每个头维度为 d(假设有 D=d×h),输入上下文长度为 s,batch size=1,计算 self-attention 模块各个部分的计算量(Float Operations)。
QKV 线性变换:6 × s × D^2(矩阵乘法,每个位置有加法和乘法两个运算,因此每个位置需要 2D 次计算)
QK 内积:h × 2 × d × s^2(h 组矩阵分别计算)
scaling:h × s^2
softmax:h × 3 × s^2(softmax 是按列进行的,每列要计算 s 个 exp,s 个 exp 结果的求和,以及 s 次除法)
reduction(权重矩阵乘以 V):h × 2 × d × s^2
11. 旋转位置编码 RoPE 有什么优缺点? 优点:RoPE 以绝对位置编码的方式实现了相对位置编码,使得能够在不破坏注意力形式的情况下,以'加性编码'的方式让模型学习相对位置。
相比其他相对位置编码来说,实现简单,计算量少。
可以应用于线性注意力。
RoPE 具有远程衰减的特性,使得每个位置天然能够更关注到附近的信息。
缺点:RoPE 相比训练式的绝对位置编码具有一定的外推能力,如可以在 2k 数据长度训练的模型进行略长于 2k 的推理。但是相比于 Alibi 等位置编码,其直接外推能力并不算特别好,需要通过线性插值、NTK 插值、YaRN 等方式来优化外推能力。
12. batchnorm 中的 momentum 怎么影响训练效果 batchnorm 在训练时计算每个 batch 内的均值和方差用于 normalization,同时统计一个全局均值和方差用于推理。全局均值和方差计算公式为:
moving_mean = momentum × moving_mean + (1.0 − momentum) × mean
moving_var = momentum × moving_var + (1.0 − momentum) × var
小的 momentum 值对应快的更新速度,能够更快地向真实分布靠近,但是同时也会导致更大的波动;如果更新过慢,则可能导致训练结束时还没有统计到真实的分布,是欠拟合的状态。如果 batch size 比较小,每个 mini batch 和全局差异较大,就不应该用太大的 momentum。
13. 多头注意力相比单头有什么好处? 多头注意力使用多个维度较低的子空间分别进行学习。
一般来说,相比单头的情况,多个头能够分别关注到不同的特征,增强了表达能力。多个头中,会有部分头能够学习到更高级的特征,并减少注意力权重对角线值过大的情况。
比如部分头关注语法信息,部分头关注知识内容,部分头关注近距离文本,部分头关注远距离文本,这样减少信息缺失,提升模型容量。
另外虽然多头注意力的整体计算量比单头要大一点,但是并行度也高一些,有利于硬件加速。
14. kv cache 为什么能加速推理? 对于 GPT 类模型,使用的是单向注意力,每个位置只能看到自己和前面的内容。
在进行自回归解码的时候,新生成的 token 会加入序列,一起作为下一次解码的输入。
由于单向注意力的存在,新加入的 token 并不会影响前面序列的计算,因此可以把已经计算过的每层的 kv 值保存起来,这样就节省了和本次生成无关的计算量。
通过把 kv 值存储在速度远快于显存的 L2 缓存中,可以大大减少 kv 值的保存和读取,这样就极大加快了模型推理的速度。
15. ReLU 有什么优缺点? 优点:(1)计算快,前向只需要进行 max(0, x) 计算,后向则是直接透传;(2)有激活值的时候,梯度恒定为 1,不会爆炸/消失;
缺点:(1)均值不为 0,分布产生偏移(2)输入值小于 0 时,梯度再也无法回传过来,导致神经元坏死(Dead Neuron Problem)。
16. 为什么 Transformer 用 layernorm 而不是 batchnorm 首先,NLP 数据中由于每条样本可能不一样长,会使用 padding,如果对 padding 部分进行 normalization,对效果有负面影响。直观来说,batchnorm 会对同一个特征以 batch 为组进行归一化,而对于文本数据,同一个位置的 token 很可能是没有关联的两个 token,对这样一组数据进行归一化没有什么实际意义。《PowerNorm: Rethinking Batch Normalization in Transformers》论文的实验也表明,在 NLP 数据使用 batchnorm,均值和方差相对 layernorm 会更加震荡,因此效果欠佳。
17. transformer 中,encoder 和 decoder 是怎么进行交互的? decoder 部分的输入,在每层中,先进行一次 self-attention;之后用 encoder 的输出作为 attention 计算中的 K、V,decoder 的输入作为 Q,进行 cross-attention。这种机制允许 decoder 关注 encoder 输出的关键信息,常用于机器翻译等序列到序列任务。
18. PyTorch 中,Tensor 的 view() 和 reshape() 两个方法有什么区别?
功能上:view() 与 reshape() 方法都可以用来改变 tensor 的形状,但是使用条件不同,view() 能做的是 reshape 的子集。
view() 方法需要 tensor 满足连续性,操作后返回一个引用,返回值是视图,没有改变原储存空间的值,多个视图共享同一个物理储存空间的内容。
reshape() 方法不需要 tensor 一定满足连续性。如果 tensor 不满足连续性的要求,则会使用新的储存空间并返回。如果满足连续性需求,则功能和 view() 一致。
连续性:比如一个二维张量,如果按行优先展开成一维的结果,和物理储存顺序是一致的,就是连续的。可以用 is_contiguous() 来判断一个张量是否连续,如果不连续,可以用 contiguous() 得到一份新空间中的连续副本。
19. RLHF 中,PPO 需要哪几个模型,分别是什么作用?
Actor 模型:由 SFT 初始化,就是进行强化学习的主模型,是我们想要最终获得的模型;它不断产生 action 并被 Critic 模型所评价,计算 loss 进行训练。
Reference 模型:一般也是从 SFT 模型初始化,RLHF 中 Reference 模型并不更新参数,只是作为 Actor 模型的参考使用;通过约束 Actor 模型和 Reference 模型的 KL penalty 等,可以防止 Actor 模型被训得跑得太偏。
Reward 模型:提前训练好的,对 SFT 模型进行打分的模型,RLHF 中参数是冻结的。
Critic 模型:一般由 Reward 模型进行初始化,参数可训练,用于预测 Actor 模型生成的 token 的收益。
20. GPT 类模型训练过程中,消耗显存的主要有哪些部分?分别是多少?哪部分占用最多?假设模型有 L 层,词表大小为 V,hidden size 为 H,batch size 为 B,训练窗口长度为 S,使用 Adam 优化器混合精度训练(需要存一阶和二阶动量),注意力头数为 N。 训练过程中,显存消耗主要有模型参数、梯度、optimizer 状态值和中间激活值。
模型参数Φ:词表部分 VH,每层参数 12H^2+13H,总共有Φ=VH+L(12H^2+13H),如果是半精度就是 2Φ
梯度:每个参数对应有一个梯度,总量为Φ,如果是半精度就是 2Φ
optimizer 状态值:每个参数有一个对应梯度,每个参数又对应优化器一个一阶动量和二阶动量。在混合精度训练中,使用半精度进行前向计算和梯度计算,同时优化器备份一份单精度的优化器状态、梯度和参数用于更新参数,因此共有 (Φ+Φ)*2+(Φ+Φ+2Φ)*4=20Φ,除去参数和梯度,优化器占部分 16Φ
激活值:保存激活值是为了计算梯度,因此每个矩阵相乘、softmax、dropout 都需要保存输入值的中间的激活值。总共是 34BSH+5BNS^2,如果都是半精度,就乘以 2。
模型参数、梯度和优化器状态和输入长度无关,是固定值,而激活值随着长度增加,以平方速度增长。以 GPT3(175B)为例,H=12288,L=96,N=96。模型参数量显存越为 350G。以 B=1 计算,如果 S=1024,激活值约为 90G;如果 S=8192,激活值约为 3420G。可见长序列训练时激活值是显存瓶颈。
21. 使用半精度训练时,bf16 和 fp16 格式有什么异同? 二者都是占用 16bit 空间。
fp16 由 1 个符号位、5 个指数位和 10 个尾数位组成。fp16 在表达小数时具有较高的精度,但表示的最大范围相对 bf16 比较小。相比 bf16,在表达较大的数时更容易出现上溢的情况。
bf16 由 1 个符号位、8 个指数位和 7 个尾数位组成。相比于 fp16,bf16 牺牲了一些尾数位以增加指数位,扩大了表达的范围,但是精度降低了,因此对于对精度需求比较高的模型,模型可能效果不如 fp16。
模型训练时使用 bf16 和 fp16 都可以降低内存使用和传输量,提高训练效率。目前主流 GPU 均支持 bf16,推荐优先使用。
22. 支持模型长上下文的方案「NTK-aware interpolation」的思路是什么?
在 NTK 插值之前,线性插值通过在原模型训练的两个位置编码中间,插入新的位置编码,使得同样的取值范围可以容纳更多位置。
而 NTK 插值则是一种非线性插值的方法。它通过仅改变 RoPE 的 base,使得位置编码中不同频率的信号有不同的表现,具体来说就是'高频外推,低频内插'。高频信号使用外推,防止分辨率太低,而低频信号沿用插值的方式,实现方便。
23. LLM 长度外推方案 NTK-by-parts 的思路是什么? NTK-by-parts 的方法在 NTK 插值的基础上又多想了一层。它认为无论是线性插值还是 NTK-aware 插值,都认为 RoPE 的所有分量都对网络有同样的重要性。而 NTK-by-parts 的思路认为,应该区别对待不同分量,他们对网络的影响有所不同。对于波长远小于上下文长度的分量(如波长<=1/32 上下文),就不插值只外推;而对于波长大于等于上下文长度的分量,就只外推不插值;对于介于两者之间的分量,就使用外推和插值的加权和。
使用一个斜坡函数来定义 NTK-by-parts 的分段插值方法,如下所示。
24. LLM 长度外推方案 YaRN 是怎做的? PI/NTK/NTK-by-parts 主要的做法都是使用插值,而随着插值进行,token 之间的距离变得更近(因为现在每一个位置旋转角度变小了),平均最小距离在减小,这样注意力 softmax 的分布会变得更尖,也就是都集中在某个区间。
换句话说,就是 RoPE 原本远距离衰减的特性变弱了,衰减得更不明显,就会导致模型更平均地关注到更多的 token,这样就削弱了注意力机制,导致输出质量下降。
可以通过在 softmax 之前,将中间注意力矩阵乘以温度 t>1 来缓解这个问题。由于 RoPE 被编码为一个旋转矩阵,就可以简单地给旋转矩阵乘以一个系数根号 t 来实现,这样可以不必修改注意力的代码。
YaRN 结合 NTK-by-parts 和这个温度系数,对 attention score 进行调整,有效提升了长上下文下的性能。
25. 对于使用 Group-Query Attention 的模型,假设 hidden size=D,Q 的注意力头数量为 h,每个头维度为 d(假设有 D=d×h),kv 组数为 n,输入上下文长度为 s,batch size=b,模型层数为 L,计算推理时 kv cache 所需的空间。 kv cache 缓存的是经过投影变换之后的 K 和 V 矩阵。
对于 GQA,每层有 n 组 K 和 V,每组的特征维度和 Q 的每个头的特征维度相同,为 D/h。则每层每组 K 和 V 数据量为 sD/h,整个模型共有 2LnsD/h 个数据,因此整个 batch 需要缓存 2bLnsD/h 个数据。如果使用的是半精度浮点数,每个浮点需要两个字节,因此共需要 4bLnsD/h 字节的空间。
掌握上述问题有助于深入理解大模型底层逻辑。建议结合源码阅读与实战项目,巩固理论知识,提升解决复杂工程问题的能力。在实际工作中,灵活运用这些优化技巧,可以显著提升模型训练效率和推理性能。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online