跳到主要内容大模型核心面试题与 Transformer 原理详解 | 极客日志PythonAI算法
大模型核心面试题与 Transformer 原理详解
本文整理了大模型面试中的高频问题,涵盖 Transformer 架构细节、注意力机制优化、位置编码方案、训练策略及推理加速技术。内容涉及缩放点积注意力、MQA/GQA 对比、RoPE 外推方法、LoRA 微调显存优化、KV Cache 原理以及 RLHF 流程等核心知识点。同时解析了 PyTorch 张量操作差异、混合精度训练格式选择及长上下文处理方案,旨在帮助开发者深入理解大模型底层原理并应对技术面试挑战。
日志猎手2 浏览 大模型核心面试题与 Transformer 原理详解
本文整理了大模型面试中的高频问题,涵盖 Transformer 架构细节、注意力机制优化、位置编码方案、训练策略及推理加速技术。内容涉及缩放点积注意力、MQA/GQA 对比、RoPE 外推方法、LoRA 微调显存优化、KV Cache 原理以及 RLHF 流程等核心知识点。
1、在 Transformer 模型中,为什么 scaled dot-product attention 在计算 QK 内积之后要除以根号 d?
简单来说,这是为了压缩 softmax 的输入值,防止输入值过大进入 softmax 的饱和区。当输入值过大时,softmax 的输出会趋近于 one-hot 分布,导致梯度值极小,从而难以进行有效的反向传播训练。
如果不进行 scaling,理论上可以通过在参数初始化时将方差除以根号 d 来预防 softmax 饱和的效果,但直接对 QK 内积结果进行 scaling 是更通用且标准的做法。这有助于保持梯度的稳定性,确保模型能够正常收敛。
2、Transformer 自注意力计算中,为什么 Q 和 K 要使用不同的权重矩阵进行线性变换投影,为什么不使用同一个变换矩阵,或者不进行变换?
- 对称性限制:如果 Q 和 K 使用相同的权重矩阵,矩阵乘积的结果将是一个对称矩阵。这会减弱模型的表达能力,因为对称矩阵限制了特征空间的自由度。
- 对角线关注:如果 Q 和 K 相同,乘积结果的对称矩阵中,对角线的值通常会比较大,导致每个位置过分关注自己(Self-attention),而忽略了其他 token 的信息。
- 参数容量:使用不同的投影矩阵增加了可训练参数的数量,从而增强了模型的表达能力,使其能够学习到更复杂的特征映射关系。
3、Transformer 模型中,注意力计算后面使用了两个 FFN 层,为什么第一个 FFN 层先把维提升,第二个 FFN 层再把维度降回原大小?
- 特征升维:类似于 SVM 中的核技巧,通过提升维度可以将低维空间中不可线性分离的特征映射到高维空间,从而识别出在低维无法识别的特征模式。
- 增加容量:提升维度意味着拥有更大的可训练参数量,提升了模型的容量,使其能够拟合更复杂的函数。
- 维度对齐:降回原维度是为了方便多层注意力层和残差模块进行拼接,无需进行额外的维度转换处理,保持了网络结构的连贯性。
4、MQA(Multi-Query Attention) 和 GQA(Grouped-Query Attention) 相比 MHA(Multi-Head Attention),计算量变化如何,主要带来了什么优化?
- 参数量与计算量:MQA 和 GQA 的可训练参数量比 MHA 少,但是计算量和 MHA 相比变化不大,主要在生成 KV 时有少量降低。
- 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 向量经过一层线性变换层得到的。两个向量相加等价于把它们的 one-hot 编码拼接后进行线性变换。
- 工程稳定性:没有使用相乘则是出于工程考虑。相加相比相乘结果更为稳定,方便训练,避免了数值爆炸的风险。
7、LoRA 和全参数训练在计算量和显存上相比如何?为什么 LoRA 能提升大模型训练效率?
- 计算量:LoRA 训练时,在主干模型的(部分)全连接层增加了 LoRA 旁路,前向和后向的计算量都在主干模型的基础上,增加了旁路部分的计算,因此相比全参数训练略有增加。
- 显存占用:训练时,显存主要有模型参数、梯度、中间激活值、优化器参数四个部分。模型参数/梯度/激活值相比全参数训练略微增加;而优化器则不需要再存储原模型参数的部分,只需要存储 LoRA 旁路部分,这部分节省较多显存。
- 效率提升原因:
- 优化器部分的显存减少了,可以增大 batch size。
- 优化器参数减少了,分布式训练中多卡之间的通信量减少了。
- 主干模型由于不用更新,可以进一步量化到 int8/int4 等,进一步降低显存需求。
8、为什么模型需要 normalization(batchnorm/layernorm 等)?
- 特征量纲统一:输入数据包含多个特征,特征之间有不同的量纲和范围(如身高 180 和年龄 18 岁)。通过 normalization 进行归一化再经过模型进行线性/非线性组合,能够防止部分特征占据主导,部分特征被忽略。
- 缓解内部协变量偏移:BatchNorm 论文认为,模型一般有多层,前一层的输出是后一层的输入。训练中前一层的参数更新会导致后一层的输入数据分布变化,导致 ICS(Internal Covariate Shift)。这样后面的层就不得不频繁剧烈更新适应分布变化,导致分布偏移进入激活函数饱和区而出现梯度消失。使用 normalization 可以保持分布的稳定,减小方差,使模型训练可以正常进行。
- 损失函数平滑:《How Does Batch Normalization Help Optimization?》设计了实验测量使用 batchnorm 前后的 ICS,发现 batchnorm 实际上并没有缓解 ICS,甚至有所增加。而 batchnorm 能优化模型训练的原因更多是使得损失函数平面更加光滑,便于梯度下降收敛。
9、Transformer 中 pre-norm 和 post-norm 各有什么优缺点?
- Post-norm:原始的 Transformer 用的是 post-norm,它在残差之后进行归一化(add & norm)。它对参数正则化的效果更强,模型更为鲁棒;post-norm 对每个通路都进行了归一化,使得梯度在回传的时候容易出现消失。
- Pre-norm:相对于 post-norm,残差部分存在不经过归一化的通路,因此能够缓解梯度消失,能够训练更深的网络。但是模型的等效'深度'受到影响,L+1 层网络近似于一个 L 层的宽网络。
- 适用场景:也就是说,在层数较少,post-norm 和 pre-norm 都能正常收敛的情况下,post-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:h × 2 × d × s^2(权重矩阵乘以 V)。
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 有什么优缺点?
- 计算快,前向只需要进行 max(0, x) 计算,后向则是直接透传。
- 有激活值的时候,梯度恒定为 1,不会爆炸或消失。
- 均值不为 0,分布产生偏移。
- 输入值小于 0 时,梯度再也无法回传过来,导致神经元坏死(Dead ReLU 问题)。
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 在生成当前 token 时,参考 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 类模型训练过程中,消耗显存的主要有哪些部分?分别是多少?哪部分占用最多?
训练过程中,显存消耗主要有模型参数、梯度、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 格式有什么异同?
fp16:由 1 个符号位、5 个指数位和 10 个尾数位组成。fp16 在表达小数时具有较高的精度,但表示的最大范围相对 bf16 比较小。相比 bf16,在表达较大的数时更容易出现上溢的情况。
bf16:由 1 个符号位、8 个指数位和 7 个尾数位组成。相比于 fp16,bf16 牺牲了一些尾数位以增加指数位,扩大了表达的范围,但是精度降低了,因此对于对精度需求比较高的模型,模型可能效果不如 fp16。
模型训练时使用 bf16 和 fp16 都可以降低内存使用和传输量,提高训练效率。
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