大模型常见八股集合(带答案)
前言
整理一些常见八股问题,用于面试复习。
一、Transformer 底层
1、手推自注意力机制公式,为什么要除以 d k \sqrt{d_k} dk?
因为 点积的数值会随着向量维度 (d_k) 增大而变大,如果不除以 d k \sqrt{d_k} dk,softmax
很容易进入“过于尖锐”的区域,导致训练不稳定、梯度变小。直观来说,Attention 里会先算:
Q K T QK^T QKT
其中每个 query 和 key 做点积。假设 (q) 和 (k) 的各维分量都是均值为 0、方差为 1 的随机变量,那么它们的点积
q ⋅ k = ∑ i = 1 d k q i k i q \cdot k = \sum_{i=1}^{d_k} q_i k_i q⋅k=i=1∑dkqiki
是 (d_k) 项的和。由于每一项的方差大致是 1,所以这个点积的方差大约会随着 (d_k) 增长到:
V a r ( q ⋅ k ) ≈ d k \mathrm{Var}(q \cdot k) \approx d_k Var(q⋅k)≈dk
这意味着点积的典型大小会是 d k \sqrt{d_k} dk量级。维度越高,分数越大。
而 softmax 对输入数值大小非常敏感。比如一个 logits 向量如果数值很大,softmax 就会变得非常极端,接近
one-hot:某一个位置概率接近 1,其他位置接近 0。这样会带来两个问题:
- 梯度很小,训练变慢;
- 注意力分布过于尖锐,模型早期不稳定,难以学习合理的权重。
所以用
Q K T d k \frac{QK^T}{\sqrt{d_k}} dkQKT
就是为了把点积的尺度拉回一个更稳定的范围,让它的方差大致保持在 1 附近,从而避免 softmax 饱和。
2、多头注意力的核心意义是什么?单头注意力不行吗?
多头注意力的核心意义,是把一次注意力计算拆成 多个并行的“视角” 去看同一段输入:每个头都会先对 (Q,K,V) 做不同的线性投影,再各自独立算 attention,最后把这些结果拼接起来。Transformer 原论文给出的动机很直接:多头注意力让模型能够在不同位置、不同表示子空间上“联合关注”信息;而如果只用单头,容易把这些信息“平均掉”。
单头不是“不行”,而是 表达能力更受限。单头注意力本质上只有一张注意力分布图,它在某一时刻往往只能突出一种主要关系,比如“主谓关系”或者“代词指代”。但真实语言里,一个 token 往往同时和多个对象有关:既可能要看语法依赖,又可能要看长距离语义,还可能要看位置或实体边界。多头的好处,就是让不同头分别学到不同模式;原论文中明确写到,单头时“averaging inhibits this(平均化会抑制这种能力)”。
可以把它想成“一个人看图”和“一个小组分工看图”的区别。单头像一个人只能给出一份总的关注结果;多头像几个人分别盯不同方面:有人看局部搭配,有人看远距离依赖,有人看句法结构,最后把这些观察汇总。
3、LayerNorm 、RMSNorm和 BatchNorm 的区别,为什么大模型只用 RMSNorm?
可以把它们先抓住一句话:
- BatchNorm:按 一个 batch 来归一化
- LayerNorm:按 单个样本的一层特征 来归一化
- RMSNorm:像 LayerNorm,但不减均值,只按均方根缩放
BatchNorm
BatchNorm 对每个特征维度,统计 一个 mini-batch 里 的均值和方差,再做标准化。原始定义核心是:
x ^ = x − μ batch σ batch 2 + ϵ \hat{x}=\frac{x-\mu_{\text{batch}}}{\sqrt{\sigma^2_{\text{batch}}+\epsilon}} x^=σbatch2+ϵx−μbatch
它依赖 batch 里的其他样本,训练时和推理时还不完全一样:训练用当前 batch统计量,推理通常用滑动平均统计量。BatchNorm 在 CNN 里很成功,但它的效果明显依赖 batch size。
LayerNorm
LayerNorm 不看别的样本,只看 当前这一个样本内部
的隐藏维度,对这一层的特征求均值和方差,再归一化。它对训练和推理做的是同一种计算,而且特别适合 RNN / Transformer
这种序列模型。LayerNorm 论文明确强调:它不像 BatchNorm 那样依赖mini-batch,并且更容易用于循环网络。RMSNorm
RMSNorm 是在 LayerNorm 基础上的“简化版”。它不做中心化(不减均值),只做缩放:
R M S ( x ) = 1 n ∑ i x i 2 x ^ = x R M S ( x ) + ϵ \mathrm{RMS}(x)=\sqrt{\frac{1}{n}\sum_i x_i^2} \qquad \hat{x}=\frac{x}{\mathrm{RMS}(x)+\epsilon} RMS(x)=n1i∑xi2x^=RMS(x)+ϵx
也就是说:
- LayerNorm:减均值,再除标准差
- RMSNorm:直接除均方根
RMSNorm 论文的核心观点就是:LayerNorm 里的 re-centering(重新居中) 可能不是必须的,而保留re-scaling(重新缩放) 已经足够稳定训练,并且更省计算。
4、RoPE 位置编码的原理,相比绝对/相对位置编码好在哪?
绝对位置编码公式:
P E ( p o s , 2 i ) = sin ( p o s 10000 2 i d m o d e l ) , \mathrm{PE}(pos,2i)=\sin\!\left(\frac{pos}{10000^{\frac{2i}{d_{\mathrm{model}}}}}\right),\qquad PE(pos,2i)=sin(10000dmodel2ipos),
P E ( p o s , 2 i + 1 ) = cos ( p o s 10000 2 i d m o d e l ) \mathrm{PE}(pos,2i+1)=\cos\!\left(\frac{pos}{10000^{\frac{2i}{d_{\mathrm{model}}}}}\right) PE(pos,2i+1)=cos(10000dmodel2ipos)
RoPE位置编码公式:
RoPE ( x m ( 2 i ) , x m ( 2 i + 1 ) ) = ( cos ( m θ i ) − sin ( m θ i ) sin ( m θ i ) cos ( m θ i ) ) ( x m ( 2 i ) x m ( 2 i + 1 ) ) , θ i = 10000 − 2 i d \begin{aligned} \operatorname{RoPE}(x_m^{(2i)}, x_m^{(2i+1)}) &= \begin{pmatrix} \cos(m\theta_i) & -\sin(m\theta_i) \\ \sin(m\theta_i) & \cos(m\theta_i) \end{pmatrix} \begin{pmatrix} x_m^{(2i)} \\ x_m^{(2i+1)} \end{pmatrix}, \\ \theta_i &= 10000^{-\,\frac{2i}{d}} \end{aligned} RoPE(xm(2i),xm(2i+1))θi=(cos(mθi)sin(mθi)−sin(mθi)cos(mθi))(xm(2i)xm(2i+1)),=10000−d2i
视频理解:旋转位置编码RoPE的简单理解
RoPE(Rotary Position Embedding,旋转位置编码)的核心思路是:不再把“位置向量”直接加到 token embedding 上,而是按位置对 (Q) 和 (K) 做旋转。这样一来,attention 分数里会自然出现“相对位置差” (m-n),也就是两个 token 之间隔了多远。RoFormer 原论文明确指出,RoPE 是“用旋转矩阵编码绝对位置,同时在self-attention 公式中自然引入显式相对位置依赖”。
你可以先把它想成二维平面上的旋转。假设一个二维向量是 ( x 1 , x 2 ) (x_1,x_2) (x1,x2),位置 (m) 对应一个角度 θ m \theta_m θm,那就把这个向量旋转 θ m \theta_m θm。RoPE 在高维里做的其实就是这件事的并行版本:把隐藏维度两两分组,每一对维度都像复数平面上的一个点,按该位置对应的角度做旋转。
为什么这很妙?因为 attention 里真正参与打分的是 q m ⊤ k n q_m^\top k_n qm⊤kn。如果 q q q 和 k k k都分别按位置 m m m 和 n n n旋转,那么它们点积后的结果会依赖于角度差,也就是 θ m − θ n \theta_m-\theta_n θm−θn,本质上对应相对位置 m − n m-n m−n。这就是 RoPE 最关键的地方:表面上是把绝对位置编码进了向量,结果在注意力分数里体现出来的是相对位置关系。
RoFormer 论文把这点当作它最核心的理论性质之一。拿它和“绝对位置编码”比,最典型的绝对位置编码就是 Transformer 原论文里的 sinusoidal positional encoding:给每个位置一个固定的正弦/余弦向量,然后加到输入 embedding 上。这种做法能告诉模型“这是第 5
个词”“这是第 20 个词”,但 attention 里两个位置之间的相对关系不是直接内建进去的,模型要自己去学“第 20 个和第 5个相差 15”。Transformer 原论文采用了这种绝对位置编码方案。而“相对位置编码”这一路,典型代表是 Shaw 等人在 2018 年的工作:他们直接在 self-attention里额外加入相对距离表示,让模型更直接地知道 token间距离,并且在机器翻译任务上优于绝对位置表示。也就是说,研究界后来越来越意识到:很多语言关系其实更依赖相对位置,而不是绝对位置。RoPE 相比绝对位置编码,优势主要有三点。
第一,更自然地把相对位置信息融进 attention 打分。绝对位置编码是“先加进去,再让模型自己学怎么用”;RoPE是“直接让打分公式对相对位置敏感”。这通常更符合注意力机制本身的需求,因为注意力关心的正是“当前位置该看谁、离我多远”。RoFormer论文明确强调它能“在 self-attention 中自然引入显式相对位置依赖”。
第二,对更长序列往往更友好,外推性更好。绝对位置 embedding
尤其是可学习的位置表,通常受训练时最大长度限制;超出长度要么没法直接用,要么效果变差。RoPE不需要一张固定长度的位置表,而是用旋转规则按位置生成,因此在实现上更容易扩展到更长上下文。第三,实现简洁、参数开销小,而且已经被现代 LLM 大量采用。RoPE 不需要为每个位置学习一个独立向量,本质上只是对 (Q,K)做确定性的旋转变换,因此额外参数少,和标准 attention 结合也很直接。
当然,RoPE 也不是“完美碾压一切”。和一些专门设计的相对位置偏置方法相比,它的归纳偏置更柔和;而且当上下文长度远远超过训练范围时,原始
RoPE 仍可能退化,所以后来社区又发展出了多种 RoPE 变体和缩放方案。Hugging Face 的 RoPE 工具文档就专门列出了多种
RoPE 类型与配置,用来改善长上下文行为。你可以最后记成一句话:
绝对位置编码:告诉模型“我在第几个位置”;
相对位置编码:告诉模型“我和你隔多远”;
RoPE:用“旋转”把绝对位置编码进 (Q,K),但让 attention 分数天然对“相对距离”敏感,所以兼顾了实现简洁、相对位置感知和较好的长上下文扩展性。
5、Decoder-only 架构为什么更适合大模型?Encoder-Decoder 差在哪?
参考:为什么现在的LLM都是Decoder only的架构?
Decoder-only 更适合大模型,因为它最统一。
训练时就是“看前文,预测下一个 token”,推理时用户也是给 prompt 让它接着生成,所以训练目标、数据形式、使用方式完全一致。海量网页、代码、对话都能直接拿来训练,很适合做通用基座模型。Encoder-Decoder 是“先读输入,再生成输出”。 它很适合翻译、摘要、改写这类 输入到输出很明确 的任务,但没有Decoder-only 那么适合统一成“一个模型处理所有生成任务”的范式。
Encoder-only 是“只负责理解,不负责自由生成”。 它擅长分类、检索、匹配、信息抽取这类任务,但不适合拿来做开放式长文本生成。
1、decoder-only的泛化性能更好,ICML有一篇论文做了一系列实验,发现用next token
prediction预训练的decoder-only模型在各种下游任务上zero-shot泛化性能最好;
2、苏剑林强调的注意力满秩的问题,双向attention的注意力矩阵容易退化为低秩状态,而causal attention 的注意力矩阵是下三角矩阵,必然是满秩的,泛化能力能力更强;
3、在工业效率上,decoder-only支持一直复用KV-Cache ,对多轮对话更友好,因为每个token的表示只和它之前的输入有关,而encoder-decoder难以做到;
6、Transformer 里的残差连接是怎么实现的?有什么作用?
参考:残差连接的作用
残差连接的核心作用:通过“原始输入+加工结果”的加法操作,防止深层网络丢失原始信息,就像“保留草稿”一样。
训练时模型通过“梯度”调整参数,梯度从深层反向传播到浅层。如果没有残差连接,梯度经过多层后会变得越来越小(梯度消失),导致浅层参数几乎无法更新。
7、pre norm和post norm的区别
区别就一句:
- Pre-Norm:先做 LayerNorm,再进子层
- Post-Norm:先过子层和残差,再做 LayerNorm
写成公式最清楚:
Pre-Norm
y = x + F ( LN ( x ) ) y = x + F(\text{LN}(x)) y=x+F(LN(x))
Post-Norm
y = LN ( x + F ( x ) ) y = \text{LN}(x + F(x)) y=LN(x+F(x))
这里 (F) 可以是 attention 或 FFN。原始 Transformer 用的是 Post-Norm。
它们的核心区别在训练稳定性。Pre-Norm 更稳,更适合深层大模型。 梯度分为两条路径——直接残差路径不受归一化影响,保证低层梯度稳定传递;子模块路径虽受缩放因子影响,但不影响主梯度流。
Post-Norm 是原版写法,但深层时更难训。 归一化的缩放因子作用于整个梯度路径,深层时累积效应导致低层梯度趋近于零。
7. 为什么大模型都用 GELU 激活函数,不用 ReLU、Swish?
二、微调 & 对齐
三、分布式训练 & 显存优化
1、数据并行、模型并行、流水线并行的区别?
参考:数据并行、模型并行与流水线并行,到底该在什么场景切分?
2、DeepSpeed ZeRO-1/2/3 分别做了什么?显存优化逻辑?
参考:deepspeed 三阶段详解
参考:动画理解Pytorch 大模型分布式训练技术 DP,DDP,DeepSpeed ZeRO技术
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)