2026 年 AI 岗面试高频理论题精选。每题给要点 + 关键公式 + 加分回答三段式,按主题从 Transformer 基础一直串到推理加速、分布式、RAG/Agent。
要点:
Q = K = V = XW),那 QK^T = XW W^T X^T 会变成一个对称矩阵,token i 对 j 的注意力 = j 对 i 的注意力,丧失了方向性。attn(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
Q = X W_Q, K = X W_K, V = X W_V
加分回答:可以点名 ALBERT / Linformer 等工作里尝试过 K=V 共享投影,在小模型上影响不大,但大模型里实测会掉点;另外 MQA/GQA 是在"多头之间"共享 K/V,不是把 Q/K/V 合一,要分清楚这两件事。
要点:
q · k = Σ q_i k_i 是 d_k 个独立项的和,方差为 d_k,标准差为 sqrt(d_k)。Var(q · k) = Var(Σ q_i k_i) = d_k · Var(q_i)·Var(k_i) = d_k
=> 标准差 = sqrt(d_k)
缩放后: (q · k) / sqrt(d_k) ~ 均值 0, 方差 1
加分回答:其实除什么数只是归一化常数的选择,关键是"让方差不随 d_k 增长"。有些工作(如 μP / Tensor Programs)把这个缩放因子改成 1/d_k,配合不同的初始化能让超参在宽度上可迁移,这是更现代的视角。
要点:
head_i = attn(Q W_Q^i, K W_K^i, V W_V^i)
MHA = Concat(head_1, ..., head_h) W_O
典型: d_model = 4096, h = 32, d_head = 128
加分回答:Are Sixteen Heads Really Better than One 这篇发现推理时很多头是冗余的、可以剪掉而不掉点——这就引出了 MQA/GQA 的动机:推理时其实不需要那么多独立的 K/V。另一方面 μP/maximal-update 下头数变化有更可预测的缩放。
要点:
QK^T 这个 N×N 矩阵要读/写 HBM(显存),访存 O(N²),比算 O(N²·d) 还慢——这是 memory-bound。online softmax:
m_new = max(m_old, m_block)
l_new = exp(m_old - m_new) * l_old + exp(m_block - m_new) * l_block
O_new = (l_old * exp(m_old - m_new) * O_old + exp(m_block - m_new) * PV_block) / l_new
加分回答:可以顺着讲 FA-2 做了 warp 级调度优化、FA-3 用上 Hopper 的 async copy 和 FP8。另外反向传播时 FA 需要重算 attention(而不是存下来),这是典型的 time-memory tradeoff——算力便宜访存贵,所以划算。
要点:
KV cache 大小 (per token) = 2 · n_layers · g · d_head · dtype_bytes
MHA g=h=32 : 32·128·2 = 8192 bytes/layer/token (bf16)
GQA g=8 : 8·128·2 = 2048 bytes/layer/token
MQA g=1 : 1·128·2 = 256 bytes/layer/token
加分回答:MQA 推理快但"训练不收敛或 quality drop"是很实际的问题——原 MQA 论文提到要从 MHA checkpoint 做 uptraining 恢复。GQA 是甜点:几乎不掉点 + 显著省 KV cache。现在再进一步有 MLA(DeepSeek 用的)用低秩压缩 KV,压得比 GQA 还狠。
要点:
KV cache 总大小
= 2 · batch · seq_len · n_layers · n_kv_heads · d_head · bytes
例 Llama-3-70B, bf16, GQA g=8, seq=8192, batch=1:
= 2 · 1 · 8192 · 80 · 8 · 128 · 2
≈ 2.5 GB (仅单 batch, 单序列)
加分回答:优化手段:① GQA/MQA/MLA 减 head;② PagedAttention(vLLM)按页管理,避免碎片化;③ 量化 KV cache(int8 / fp8 / int4);④ sliding window / StreamingLLM 丢弃远端;⑤ prefix caching 跨 request 复用公共前缀;⑥ CacheBlend / CacheGen 做 KV 压缩和跨 request 复用。长上下文的系统瓶颈本质就是 KV 太大。
要点:
q_m · k_n 自然变成只依赖 m−n 的函数。拥有"相对位置"的优点,形式简洁,兼容 FlashAttention。-m · |i-j| 的线性惩罚,训练轻,远距离快速衰减,外推能力强,但近距离精度略差。RoPE:
q_m ⊙ [cos(mθ), sin(mθ)] -> 旋转 mθ
k_n ⊙ [cos(nθ), sin(nθ)] -> 旋转 nθ
q_m · k_n = f(q, k, m-n) // 仅依赖相对位置
外推技巧: NTK-aware scaling, YaRN, PI (position interpolation)
加分回答:RoPE 的 base θ=10000 在长上下文会产生"高频位过拟合到训练长度"的问题。YaRN 本质是对低频维度做拉伸、对高频维度保留,再配合少量长文本 fine-tune 就能从 4k 扩到 128k。最新的 DeepSeek/Qwen 基本都走这条路。
要点:
Adam: θ ← θ - lr · (m̂ / (sqrt(v̂) + ε) + wd · θ) // wd 混在梯度里
AdamW: θ ← θ - lr · (m̂ / (sqrt(v̂) + ε)) - lr · wd · θ // wd 解耦
Lion: θ ← θ - lr · sign(β1 · m + (1-β1) · g) - lr · wd · θ
Muon: θ ← θ - lr · NewtonSchulz(M) // M 为动量矩阵
加分回答:LLM 用 AdamW 主因:① 解耦 wd 对 generalization 重要;② 二阶动量自适应 lr 对不同层的梯度尺度差异鲁棒。显存代价:每参数要存 (param, grad, m, v) 共 4x,fp32 优化器状态是 16 bytes/param。Muon 是 2024 年出来后被 Kimi K2 实锤在 1T 规模稳定收敛且更省算力的路径,正在替代一部分 AdamW。
要点:
cosine: lr_t = lr_min + 0.5·(lr_peak - lr_min)·(1 + cos(π·t/T))
WSD: warmup -> const lr_peak -> 末段 sqrt/linear decay to lr_min
加分回答:MiniCPM、Llama 3、DeepSeek 都验证过 WSD 的可扩展性——你可以一边训一边决定"就现在收尾"。Cosine 的本质缺陷是它把 LR schedule 和训练预算耦合了,不符合现代"训到算力/数据耗尽"的范式。
要点:
梯度累积: effective_bs = micro_bs · accum_steps · dp_size
裁剪: g ← g · min(1, clip_norm / ||g||_2)
loss scale (fp16): scale_up 后 backward, unscale 再 step, 溢出就回退 scale
加分回答:fp8 训练(Hopper/Blackwell)的关键是 DeepSeek-V3 那种 block-wise scaling 做到稳定。实操中先用 bf16 warmup 几百步再切 fp8,或部分层保留 bf16(embedding、output head、LayerNorm 一般都不 fp8)。另外梯度累积会放大 BatchNorm 统计的偏差,但 LLM 用 LayerNorm/RMSNorm 所以不成问题。
要点:
SwiGLU(x) = Swish(xW) ⊙ (xV),带 gating 机制,表达力更强,但 FFN 多一个矩阵 V,参数量 1.5x。为了参数量对齐,Llama 把 FFN 的 hidden dim 从 4d 改到 8d/3 ≈ 2.67d。LayerNorm: y = γ · (x - μ) / sqrt(σ² + ε) + β
RMSNorm: y = γ · x / sqrt(mean(x²) + ε)
SwiGLU FFN: FFN(x) = (Swish(x W1) ⊙ (x V1)) W2
dim: d -> d_ff -> d (d_ff ≈ 8d/3)
加分回答:RMSNorm 省的那点算力不是关键——关键是"均值减法在 transformer 里是多余的"这个发现被 Llama 带火了。SwiGLU 的 gating 本质类似于 LSTM 的 input gate,让 FFN 能学到"对某些特征开/关"的动态选择。Noam Shazeer 原文标题就叫《GLU Variants Improve Transformer》。
要点:
常见诱因清单:
- 数据: 异常长序列 / 全重复 token / unicode 错乱 / tokenizer bug
- 精度: fp16 overflow / attention softmax 饱和 / LN 分母为 0
- 优化器: β2 太高导致 v 估计迟钝 / lr 过大
- 并行: grad 同步错位 / PP 边界状态没对齐
加分回答:大模型训练里 spike 几乎是必然事件(PaLM、OPT、Llama 都在 blog 里承认了)。工业界做法是自动检测 + 回退 + skip batch,不是靠人盯。另外 z-loss(让 logsumexp 趋近 0)和 QK-norm 是两个防 spike 的常见 trick,最新的模型基本都带上了。
要点:
loss = -log p(y|x) on (prompt, good-response)。便宜、稳定,是所有对齐的起点,但只学到"怎么说",学不到"别说什么"。| 方法 | 数据 | 稳定性 | 天花板 | 典型场景 |
|---|---|---|---|---|
| SFT | (x, y) demo | 高 | 中 | 冷启动、格式对齐 |
| PPO-RLHF | preference pair + on-policy | 低 | 高 | 通用 chat 对齐 |
| DPO | preference pair (offline) | 高 | 中高 | 轻量对齐、小团队 |
| GRPO | 可验证 reward | 中 | 高 | 数学/代码 reasoning |
加分回答:2024 下半年开始业内共识是"SFT + DPO 做通用对齐,GRPO 做 reasoning 增强"。PPO 在 reasoning 上并没有消失,Anthropic/OpenAI 据信都还在用复杂的 online RL。DPO 的一个已知问题是"likelihood displacement"——chosen 的概率也会降,可以配合 SFT loss 混合或用 IPO/KTO 缓解。
要点:
PPO 目标: max E[ r(x, y) - β · KL(π(·|x) || π_ref(·|x)) ]
等价形式: max E[ r(x, y) ] s.t. KL(π || π_ref) ≤ ε
加分回答:β 是个敏感超参:太小就 mode-collapse 到高 reward 垃圾;太大就训练没进展。通常 β ∈ [0.01, 0.1]。更现代的做法是 adaptive KL(InstructGPT 里的 approach),或者干脆用 DPO 的闭式解——DPO 的推导恰恰证明了"PPO + KL 约束 + BT reward model"有闭式最优,对应的就是 DPO 的 loss。
要点:
π*(y|x) ∝ π_ref(y|x) · exp(r(x,y)/β)。r(x,y) = β · log(π*(y|x)/π_ref(y|x)) + β·log Z(x)。P(y_w ≻ y_l) = σ(r(x,y_w) - r(x,y_l)),Z(x) 在减法里消掉。DPO loss:
L = -E[ log σ( β·log(π(y_w|x)/π_ref(y_w|x))
- β·log(π(y_l|x)/π_ref(y_l|x)) ) ]
直觉: 让模型对 chosen 的 log ratio 大于 rejected, margin 由 β 控制
加分回答:DPO 的关键洞察是"reward model 和 policy 本质是同一个东西的两种参数化"。但这个等价性假设 preference 数据符合 BT 模型、且数据覆盖了 π 的支撑集。实际上 π 训着训着会走到 offline 数据没覆盖的区域,导致 likelihood displacement——这就是 iterative DPO / online DPO / IPO 等变体要解决的问题。
要点:
缓解手段:
加分回答:现在主流 reasoning 模型(R1/o1)为什么能 scale 上去?很大原因是用了可验证 reward(数学答案/代码 pass)代替 learned RM,从根上避免 hacking。这也是为什么这波 RL 是在"结果可验证"的任务上先爆发。推理之外的 creative writing 等任务还在 RM-based,hack 风险仍在。
要点:
GRPO 简化:
对 prompt x 采 G 个 response y_1..y_G
r_i = verifier(y_i) // 0/1 或 [0,1]
A_i = (r_i - mean(r)) / std(r) // 组内优势
loss = -E[ min(ρ_i · A_i, clip(ρ_i, 1±ε) · A_i) ]
+ β · KL(π || π_ref)
ρ_i = π(y_i|x) / π_old(y_i|x)
加分回答:R1 带火了一个核心观察:足够强的 base model + 可验证 reward + 足够算力 ⇒ 涌现 reasoning。但这依赖 base model 的 CoT 能力种子已经存在——7B 以下模型直接跑 RL 涨得就有限。另外 process reward model(PRM)和 outcome reward model(ORM)的对比:ORM 简单但 credit assignment 粗;PRM 更细但标数据贵、容易被 hack。业界目前倾向 ORM 打底 + PRM 精调。
要点:
传统 cache: 每 request 预留 max_seq 的连续显存 -> 浪费巨大
PagedAttention:
block_size = 16
每 request 维护一个 block_table: [b0, b17, b42, ...]
attention kernel 通过 block_table 间接寻址
加分回答:PagedAttention 就是把 OS 的虚拟内存搬到了 KV cache 上——vLLM 原论文标题《Efficient Memory Management for LLM Serving with PagedAttention》。后继 SGLang 的 RadixAttention 更进一步,用基数树组织所有前缀,跨 request 自动复用公共 prefix,对 agent/rag 场景收益极大。
要点:
p_target(x)/p_draft(x) 的比值做 rejection sampling,第一次拒绝的位置从 max(0, p_target - p_draft) 重采样。E[接受数] = (1-α^(γ+1))/(1-α),加速比 ≈ 这个数除以一次 target forward 的时间(比 draft 的 γ 次贵很多所以划算)。接受概率: min(1, p_target(x) / p_draft(x))
若拒绝: 从 p'(x) ∝ max(0, p_target(x) - p_draft(x)) 重采样
期望生成 token 数: (1 - α^(γ+1)) / (1 - α), α = 平均接受率
典型 α = 0.6~0.8, γ = 4~7 -> 2~3x 加速
加分回答:变体很多:Medusa(多头并行猜 k 个位置)、EAGLE(用 target 自己的 feature 做 draft,α 提到 0.85+)、Lookahead decoding(不需要 draft model)。工程上要注意:speculative 对 batch size 友好度差——batch 越大,target 一次 forward 已经很贵,draft 的相对收益就小了。所以它在低并发、低延迟场景(单用户聊天)价值最大。
要点:
Y = (X/s) · (s·W)),让 activation 变得平滑好量化。| 方法 | W | A | 解决问题 | 主要成本 |
|---|---|---|---|---|
| GPTQ | int4 | fp16 | 权重压缩 → 显存/带宽 | 离线校准较慢 |
| AWQ | int4 | fp16 | 权重压缩,更稳 | per-channel scale |
| SmoothQuant | int8 | int8 | W+A 同时量化 | 需找 α 平衡 |
| FP8 | fp8 | fp8 | 硬件原生, 训练也能用 | 需 Hopper+ |
加分回答:Decode 阶段是 memory-bound(每步从 HBM 读全部权重算几 tokens 的 logits),所以 weight-only 量化直接给你 4x 带宽 = ~3–4x 加速。Prefill 是 compute-bound,激活量化(SmoothQuant/FP8)才有收益。所以"聊天场景"优先 AWQ int4,"长 prompt 批量"场景才上 FP8/SmoothQuant。
要点:
并行选型:
加分回答:DeepSeek-V3 推理的 prefill/decode 分离 + 大 EP size(64–320)就是针对 MoE 特性做的:prefill 阶段 compute-bound、适合大 TP;decode 阶段 memory-bound、路由稀疏、适合大 EP 让每卡只装几个 expert。另一个新的思路是 shared expert + routed expert 混合(DeepSeek-MoE),shared expert 是每个 token 都走的稠密部分,缓解 routing 偏差。
要点:
perf = min(peak_flops, intensity · peak_bandwidth)。A100 FLOP/B 比 ≈ 220,所以 intensity < 220 就 memory-bound;decode 永远在左半区。Prefill: N=2048, d=4096
compute: O(N · d²) = 3.4e10 FLOPs
memory : O(N·d + d²) ≈ 1.7e7 bytes
intensity ≈ 2000 -> compute-bound
Decode: N=1, d=4096
compute: O(d²) ≈ 1.7e7
memory : O(d²) ≈ 3.4e7
intensity ≈ 0.5 -> memory-bound
加分回答:这个分析直接导出了现代 LLM serving 的两大设计:① 大 batch decode——把很多 request 的 decode 拼起来提升 intensity;② prefill/decode 分离部署(DistServe、Splitwise、Mooncake)——两个阶段用不同硬件配置,prefill 堆算力/decode 堆带宽,TTFT 和 TPOT 解耦优化。
要点:
| 并行 | 切什么 | 通信 | 单次通信量 |
|---|---|---|---|
| DP | batch | all-reduce grad | O(param) |
| TP | 矩阵维度 | 每层 all-reduce | O(batch·seq·d) × 层数 |
| PP | 层 | 点对点 activation | O(batch·seq·d) × 段数 |
| EP | expert | all-to-all | O(batch·seq·d) × 2层 |
| SP (Megatron) | LN/dropout 的 seq | 配合 TP 的 allgather/RS | O(batch·seq·d) |
加分回答:通信量公式里要盯紧哪些项随 N(卡数)变化。TP 的 all-reduce 是 2·(N-1)/N · M(ring 实现),M 是 tensor 大小。随 N 增大每卡分到的通信量增加缓慢,但延迟线性。所以 TP 很少超过 8(单机)。PP 的 bubble 比例 ≈ (PP-1)/(micro_batch),所以 PP 越大需要 micro-batch 越多才划算。
要点:
显存 per GPU (N=8 DP, 模型 7B, bf16 weight + Adam fp32):
baseline DP: 7B·2 (w) + 7B·2 (grad) + 7B·12 (opt) = 112 GB
ZeRO-1: 7B·2 + 7B·2 + 7B·12/8 = 38.5 GB
ZeRO-2: 7B·2 + 7B·2/8 + 7B·12/8 = 26.25 GB
ZeRO-3: 7B·(2+2+12)/8 = 14 GB
加分回答:ZeRO-3/FSDP + TP + PP 可以组合:3D 并行里 DP 维度用 FSDP,TP 在机内,PP 跨机但每段内再 FSDP。Llama 3 405B 训练用 FSDP + TP=8 + PP=16 + CP(context parallel)。HSDP 是 FSDP 的进化版:在 DP group 内 shard,group 间 replicate,减少跨机 all-gather。
要点:
例: 1024 × H100, 70B, seq=8192
TP = 8 (机内, 80 层 / 8 不分段内也行)
PP = 4 (80 层分 4 段, 每段 20 层)
DP = 32 (1024 / 8 / 4)
micro_batch = 1, num_micro_batches ≥ 16 抑 bubble
DP 内开 FSDP/ZeRO-3 存优化器
加分回答:长上下文要再加 CP (Context Parallel / Ring Attention),切 seq 维,通信 ring all-gather K/V。Llama 3 128k context 训练就用了 CP=8。另外要考察计算通信比:如果 TP 通信占 forward 30%+ 就过头了,TP=4 配合 DP 更好。做 4D/5D 并行时先写一个 cost model 算期望 MFU(典型目标 40–50%)再下手。
要点:
2·(N-1)/N · M,reduce-scatter 是 (N-1)/N · M,all-gather 也是 (N-1)/N · M。ring all-reduce: each GPU sends/recvs 2(N-1)/N · M bytes
= reduce-scatter: (N-1)/N · M + all-gather: (N-1)/N · M
ZeRO-3/FSDP 单 step 通信:
forward all-gather weight: (N-1)/N · M
backward all-gather weight: (N-1)/N · M // 重算
backward reduce-scatter grad: (N-1)/N · M
total ≈ 3 · (N-1)/N · M (DP baseline ≈ 2·(N-1)/N · M)
加分回答:ZeRO-3 通信量比 DP 多 50%,但换来 N 倍显存节省,工程上非常划算——尤其权重远大于激活的大模型。另外 NCCL 的 ring 只是一种拓扑,现代实现(tree、double binary tree)对延迟更友好。跨机 all-reduce 受限于 IB 带宽(H100 NVLink 900GB/s vs IB 400Gbps ≈ 50 GB/s),这就是为什么 TP 不能跨机。
要点:
每层激活显存 ≈ batch · seq · d · (hidden_mult)
full attn+ffn: ~ batch · seq · d · 34 (Megatron 估算)
selective : ~ batch · seq · d · 10
full ckpt : ~ batch · seq · d · 2 (只存输入)
加分回答:更激进有 CPU offload checkpointing(激活甩到 CPU),以及 selective offload(只 offload 最贵几层)。另外 FlashAttention 本身就自带 recompute——attention matrix 不存,backward 重算,属于"免费 checkpointing"。所以开了 FA 后 selective checkpoint 的目标变成了 FFN 的中间激活。
要点:
指标分层:
retriever: Recall@k, hit@k, nDCG@k
generator: answer_correctness | gold context
e2e: answer_correctness | retrieved context
+ faithfulness (no hallucination)
+ answer_relevancy (答到点子上)
加分回答:工程上常见陷阱:retriever hit@10 = 90% 但 e2e 只有 60%——原因一般是 generator 被噪声上下文带偏(lost-in-the-middle)或 gold doc 没排进 top-3。所以 rerank 阶段对 e2e 影响比 recall 提升更大。评测集要人工标 gold passage + 答案,不能只看答案。
要点:
| 范式 | 规划粒度 | 反馈利用 | 典型场景 |
|---|---|---|---|
| ReAct | 逐步 | 下一步调整 | 搜索/问答/多工具 |
| Plan & Execute | 预先全局 | 中途 replan | 稳定工作流 |
| Reflexion | 每 trajectory | 失败后自省 | 代码/数学/可验证任务 |
加分回答:现代 agent 框架通常混合:上层 plan-and-execute 给整体方向,每个子任务内 ReAct,失败后 Reflexion。OpenAI 的 Swarm / Anthropic 的 claude-agent-sdk 都是这种复合结构。另外 agent 评测硬——SWE-bench、WebArena 这些才是真正反映能力的 benchmark,light-weight toy tasks 上的指标会过度乐观。
要点:
问题: N 应用 × M 工具 = N·M 工程
解法: N 应用 ↔ MCP ↔ M server = N + M 工程
加分回答:MCP 火起来的原因不是技术多复杂,而是生态决定的——Anthropic 首推、OpenAI/Google 跟进,形成事实标准。类似 early days 的 OpenAPI。工程上的坑:权限模型(server 能不能读你整个家目录?)、上下文长度(把 resource 全塞 prompt 会爆)、本地 vs 远程 server 的信任边界。新 agent 框架都在往 MCP 兼容方向收敛。
要点:
相似度矩阵 S_ij = (I_i · T_j) / (||I_i||·||T_j|| · τ)
L = (L_i2t + L_t2i) / 2
L_i2t = -1/N Σ_i log( exp(S_ii) / Σ_j exp(S_ij) )
L_t2i = -1/N Σ_i log( exp(S_ii) / Σ_j exp(S_ji) )
"对比" = 把正对拉近, 所有其他对推远
加分回答:InfoNCE 本质是 mutual information 下界的变分估计(van den Oord 的 CPC 论文)。Batch size 直接决定负例数——CLIP 原论文用 batch=32768。小 batch 下对比学习效果差很多,这就是 MoCo 搞 memory queue、SimCLR 坚持大 batch 的原因。温度 τ 太小(< 0.01)容易崩塌,太大(> 0.5)学不细。CLIP 学到的可学习 τ 稳定收敛在 0.01 附近。
要点:
| 维度 | Cross-Attn (Flamingo) | Concat (LLaVA/Qwen-VL) |
|---|---|---|
| 改 LLM 架构 | 是 (加层) | 否 |
| 占 context | 不占 | 占 N 个 token |
| 多图/视频 | 天然友好 | context 吃不消 |
| 训练成本 | 需要冻结 LLM 训练 x-attn | 只训 projector 即可冷启动 |
| 生态兼容 | 差 | 极好 |
加分回答:目前主流是 concat token——原因是生态:你能无缝接任何新出的 LLM(Llama 3、Qwen2.5)来做多模态。Cross-attention 要专门训一个架构改过的 LLM,迭代慢。代价是长视频/多图场景的 context 爆炸,所以会配合 token compression(resampler、Q-Former、pixel shuffle)把 N 压到 64–144。Idefics 和 Chameleon 是少数还在搞 native 多模态的。2025 年的趋势是 any-to-any(Gemini 原生、GPT-4o),架构上更像统一 token space 而不是 concat 或 cross-attn 的二选一。