1. 写在前面:大模型面试到底在考什么
很多人准备大模型岗位面试时,会把注意力全放在 Transformer、LoRA、RLHF 这些"新词"上,结果一面就被机器学习基础题问懵。实际上,大模型岗位的面试通常分三层:
- 第一层:机器学习与深度学习基本功。过拟合、正则化、梯度下降、损失函数、优化器、BN/LN,这些是筛人的硬门槛。
- 第二层:算法与数据结构。手写 Attention、Top-K、Softmax、采样、编辑距离、动态规划,考察代码能力。
- 第三层:大模型专项。Transformer 结构、位置编码、KV Cache、并行策略、微调与对齐、推理优化。
本文按这三层组织,每道题给出面试官真正想听的答案要点,而不是教科书式的长篇大论。建议先看每题的"一句话答案",再展开细节。
2. 机器学习高频面试题
2.1 过拟合与欠拟合如何判断、如何解决
一句话答案:看训练集与验证集的指标差距——训练好验证差是过拟合,两者都差是欠拟合。
判断方法:
- 训练 loss 持续下降,验证 loss 先降后升 → 过拟合。
- 训练 loss 和验证 loss 都很高且接近 → 欠拟合。
解决过拟合的手段(按性价比排序):
- 增加数据 / 数据增强:最根本,大模型时代就是扩充语料、做数据配比。
- 正则化:L1/L2、Dropout、Label Smoothing、权重衰减。
- 降低模型复杂度:减层数、减宽度。
- 早停(Early Stopping):验证集指标不再提升就停。
- 集成与蒸馏:多模型平均、知识蒸馏。
解决欠拟合:增大模型容量、增加特征、减少正则强度、训练更久、换更强的优化器。
面试加分点:能说出"过拟合的本质是模型在拟合噪声,正则化本质是给参数空间加先验约束"。
2.2 L1 与 L2 正则化的区别
一句话答案:L1 产生稀疏解(特征选择),L2 让参数整体变小(平滑)。
| 维度 | L1 正则 | L2 正则 |
|---|---|---|
| 惩罚项 | $\lambda\sum | w_i |
| 解的特性 | 稀疏,部分权重为 0 | 稠密,权重趋近 0 但不为 0 |
| 几何解释 | 菱形约束,最优解易落在顶点 | 圆形约束,最优解落在切点 |
| 典型用途 | 特征选择、稀疏模型 | 通用防过拟合、权重衰减 |
从贝叶斯角度看:L1 对应参数服从拉普拉斯先验,L2 对应高斯先验。
2.3 偏差与方差、Bagging 与 Boosting
一句话答案:偏差是"模型太简单学不会",方差是"模型太敏感学不稳";Bagging 降方差,Boosting 降偏差。
- Bagging(随机森林):并行训练多个基学习器,投票/平均,主要降低方差,对强学习器也有效。
- Boosting(GBDT、XGBoost、LightGBM):串行训练,每棵树拟合前一轮残差,主要降低偏差,容易过拟合需控制学习率与树深。
面试常追问:为什么随机森林不用做特征归一化?因为树模型只关心分裂点的相对顺序,对单调变换不敏感。
2.4 常见损失函数及其适用场景
- MSE(均方误差):回归任务,对异常值敏感。
- MAE(平均绝对误差):回归任务,对异常值鲁棒,但零点不可导。
- 交叉熵:分类任务,配合 Softmax 使用,梯度形式简洁。
- Focal Loss:解决类别不平衡,降低易分样本权重。
- 对比损失 / InfoNCE:表征学习、检索、多模态对齐。
大模型预训练用的就是下一 token 的交叉熵,SFT 阶段也是交叉熵(只在回答部分计算 loss)。
2.5 梯度下降的三种形式与优化器演进
- BGD:全量数据算梯度,稳定但慢。
- SGD:单样本更新,噪声大但能跳出局部极小。
- Mini-batch:折中方案,实际工程默认选择。
优化器演进路线:
SGD → SGD+Momentum → AdaGrad → RMSProp → Adam → AdamW
- Momentum:累积历史梯度,抑制震荡、加速收敛。
- AdaGrad:按参数历史梯度平方和自适应调学习率,后期学习率衰减过快。
- RMSProp:用指数移动平均修正 AdaGrad 的衰减问题。
- Adam:Momentum + RMSProp,一阶矩和二阶矩都做偏差修正。
- AdamW:把权重衰减从梯度里解耦出来,是大模型训练的事实标准。
面试加分点:能解释 Adam 的偏差修正为什么必要——初期 mtm_tmt、vtv_tvt 初始化为 0,会偏向 0,需要除以 (1−βt)(1-\beta^t)(1−βt) 校正。
3. 深度学习高频面试题
3.1 反向传播的本质是什么
一句话答案:链式法则 + 动态规划,从输出层往前逐层复用中间梯度。
关键点:
- 前向传播保存中间激活值,反向传播用这些值算梯度。
- 计算图让自动微分可以按拓扑序反向遍历。
- 显存换计算:激活值重计算(Gradient Checkpointing)就是牺牲时间换显存。
3.2 梯度消失与梯度爆炸的成因与对策
成因:深层网络中梯度是多个雅可比矩阵连乘,若谱范数持续小于 1 则消失,大于 1 则爆炸。
对策:
- 梯度消失:ReLU 类激活、残差连接、BatchNorm/LayerNorm、合理的初始化(Xavier/He)。
- 梯度爆炸:梯度裁剪(Gradient Clipping)、权重初始化、降低学习率。
大模型训练中梯度裁剪几乎是标配,通常 clip 到 1.0。
3.3 BatchNorm 与 LayerNorm 的区别,为什么 Transformer 用 LayerNorm
一句话答案:BN 在 batch 维度归一化,LN 在特征维度归一化;NLP 序列长度可变、batch 小,BN 统计量不稳定,所以用 LN。
| 维度 | BatchNorm | LayerNorm |
|---|---|---|
| 归一化维度 | 同一通道跨样本 | 同一样本跨特征 |
| 依赖 batch | 是 | 否 |
| 训练/推理 | 统计量不同,需维护 running mean/var | 一致 |
| 适用场景 | CNN 图像 | RNN/Transformer 序列 |
补充:大模型里常见 RMSNorm,去掉了均值中心化,只做方差归一化,计算更快且效果相当,LLaMA 系列就用它。
3.4 残差连接为什么有效
一句话答案:给梯度提供一条恒等通路,缓解深层网络退化问题。
- 数学上:y=x+F(x)y = x + F(x)y=x+F(x),反向时 ∂y/∂x=1+∂F/∂x\partial y/\partial x = 1 + \partial F/\partial x∂y/∂x=1+∂F/∂x,恒等项保证梯度不会完全消失。
- 直观上:网络只需学习"残差",优化目标更容易。
- 大模型里还有 Pre-LN vs Post-LN 的区别:Pre-LN 训练更稳定,Post-LN 表达力略强但需要 warmup。
3.5 Dropout 的原理与推理时的处理
一句话答案:训练时随机置零部分神经元防止共适应,推理时关闭并按比例缩放。
- 训练:以概率 ppp 置零,保留的神经元除以 (1−p)(1-p)(1−p)(inverted dropout)。
- 推理:直接使用,无需缩放。
- 注意:Dropout 与 BN 同时使用时,训练/推理的方差偏移会带来不一致,需谨慎。
4. 算法与手写代码高频题
4.1 手写 Softmax(含数值稳定性)
面试官最爱考的点是减最大值防溢出。
import numpy as np
def softmax(x, axis=-1):
x = x - np.max(x, axis=axis, keepdims=True) # 数值稳定
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=axis, keepdims=True)
# 测试
logits = np.array([1.0, 2.0, 3.0])
print(softmax(logits)) # [0.09003057 0.24472847 0.66524096]
追问:为什么减最大值不改变结果?因为分子分母同乘 e−maxe^{-max}e−max,比值不变。
4.2 手写 Top-K 采样
大模型解码常用,考察堆的使用。
import heapq
def top_k_filter(logits, k):
"""返回保留 top-k 后的 logits,其余置为 -inf"""
if k <= 0:
raise ValueError("k must be positive")
k = min(k, len(logits))
# 取最大的 k 个值的索引
topk_idx = heapq.nlargest(k, range(len(logits)), key=lambda i: logits[i])
filtered = [-float("inf")] * len(logits)
for i in topk_idx:
filtered[i] = logits[i]
return filtered
logits = [1.2, 3.4, 0.5, 2.8, 4.1]
print(top_k_filter(logits, 2)) # [-inf, 3.4, -inf, 2.8, 4.1]
复杂度 O(nlogk)O(n\log k)O(nlogk),若 kkk 很小可用堆;若 kkk 接近 nnn 可直接排序。
4.3 手写 Attention
import numpy as np
def scaled_dot_product_attention(Q, K, V, mask=None):
"""
Q: (..., seq_q, d_k)
K: (..., seq_k, d_k)
V: (..., seq_k, d_v)
"""
d_k = Q.shape[-1]
scores = np.matmul(Q, K.swapaxes(-1, -2)) / np.sqrt(d_k)
if mask is not None:
scores = np.where(mask, scores, -1e9)
weights = softmax(scores, axis=-1)
return np.matmul(weights, V), weights
要点:缩放因子 dk\sqrt{d_k}dk 防止点积过大导致 Softmax 饱和;mask 用极小值而非 0,避免影响 Softmax 归一化。
4.4 编辑距离(动态规划经典题)
def edit_distance(s1: str, s2: str) -> int:
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = 1 + min(dp[i - 1][j], # 删除
dp[i][j - 1], # 插入
dp[i - 1][j - 1]) # 替换
return dp[m][n]
print(edit_distance("kitten", "sitting")) # 3
时间 O(mn)O(mn)O(mn),空间可用滚动数组优化到 O(min(m,n))O(\min(m,n))O(min(m,n))。
5. 大模型专项高频题
5.1 Transformer 的完整结构讲一遍
一句话答案:Encoder 是自注意力 + FFN 的堆叠,Decoder 多了掩码自注意力和交叉注意力。
核心组件:
- 多头自注意力(MHSA):把 Q/K/V 投影到多个子空间并行计算,再拼接。
- 前馈网络(FFN):两层线性 + 激活,通常中间维度是 4 倍。
- 残差 + LayerNorm:保证深层可训练。
- 位置编码:正弦编码、可学习编码、RoPE、ALiBi。
5.2 为什么 Attention 要除以 dk\sqrt{d_k}dk
点积的方差随维度 dkd_kdk 线性增长,不缩放会让 Softmax 进入饱和区,梯度接近 0。除以 dk\sqrt{d_k}dk 使方差归一化到 1 附近。
5.3 MHA、MQA、GQA 的区别
| 类型 | Q 头数 | K/V 头数 | 显存 | 效果 |
|---|---|---|---|---|
| MHA | h | h | 高 | 最好 |
| MQA | h | 1 | 低 | 略降 |
| GQA | h | g(1<g<h) | 中 | 接近 MHA |
GQA 是当前主流(LLaMA 2/3、Qwen 等),在推理显存和效果之间取得平衡。
5.4 KV Cache 是什么,为什么能加速推理
自回归解码时,每生成一个 token 都要和之前所有 token 做注意力。KV Cache 把历史 token 的 K、V 缓存下来,避免重复计算,把每步复杂度从 O(n2)O(n^2)O(n2) 降到 O(n)O(n)O(n)。
代价是显存:KV Cache 大小约为 2×b×l×hkv×d×bytes2 \times b \times l \times h_{kv} \times d \times \text{bytes}2×b×l×hkv×d×bytes,长上下文时非常可观,于是有了 PagedAttention、KV 量化、GQA 等优化。
5.5 LoRA 的原理与超参选择
一句话答案:冻结原权重,用低秩分解 W+ΔW=W+BAW + \Delta W = W + BAW+ΔW=W+BA 近似增量,只训练 AAA、BBB。
- 秩 rrr 通常取 8~64,越大表达力越强但越易过拟合。
- α\alphaα 控制缩放,实际学习率约为 α/r\alpha/rα/r。
- 优点:显存占用低、可多任务切换、不改变推理结构(可合并回原权重)。
5.6 RLHF 的三阶段流程
- SFT:用人工标注的高质量对话做监督微调。
- 奖励模型(RM):用人类偏好对(chosen/rejected)训练打分模型。
- PPO 强化学习:用 RM 打分作为奖励,优化策略模型,同时用 KL 惩罚约束不要偏离 SFT 模型太远。
后续演进:DPO 直接用偏好对做对比学习,省掉 RM 和 PPO,工程上更简单。
5.7 大模型幻觉的成因与缓解
成因:
- 训练目标是"下一个 token 概率最大",不是"事实正确"。
- 训练数据存在噪声与知识盲区。
- 解码采样引入随机性。
缓解:
- RAG 检索增强,把事实依据放进上下文。
- 工具调用 / 代码执行做事实校验。
- 训练侧:高质量数据清洗、RLHF 对齐、拒绝回答不确定问题。
- 解码侧:降低温度、约束解码。
6. 面试答题策略与常见坑
- 先给结论再展开:面试官时间有限,先说一句话答案,再补充细节。
- 主动说边界条件:比如手写 Softmax 主动提数值稳定性,手写 Attention 主动提 mask 用 -1e9。
- 不要背公式不解释:能推导的尽量推,比如 dk\sqrt{d_k}dk 的方差论证。
- 诚实面对不会的题:说清楚自己的思路边界,比硬编强。
- 准备一个能讲 10 分钟的项目:从问题、方案、指标、踩坑四个维度准备。
7. 总结
机器学习与深度学习基础是大模型面试的地基,算法手写题是筛人的硬指标,大模型专项是区分度所在。建议的复习顺序是:
- 过一遍本文的"一句话答案",建立索引。
- 对不熟的题展开推导,尤其是反向传播、Attention、LoRA。
- 手写代码至少跑通 Softmax、Top-K、Attention、编辑距离。
- 结合自己的项目,把每道题往实际经验上引。
面试不是考试,而是技术对话。把每道题讲成"我遇到过、我这样解决、效果如何",比背标准答案更有说服力。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/zhangchen124/article/details/170737154



