人工智能-张晨光头像

大模型面试必问:机器学习、深度学习与算法高频题精讲

1. 写在前面:大模型面试到底在考什么

很多人准备大模型岗位面试时,会把注意力全放在 Transformer、LoRA、RLHF 这些"新词"上,结果一面就被机器学习基础题问懵。实际上,大模型岗位的面试通常分三层:

  • 第一层:机器学习与深度学习基本功。过拟合、正则化、梯度下降、损失函数、优化器、BN/LN,这些是筛人的硬门槛。
  • 第二层:算法与数据结构。手写 Attention、Top-K、Softmax、采样、编辑距离、动态规划,考察代码能力。
  • 第三层:大模型专项。Transformer 结构、位置编码、KV Cache、并行策略、微调与对齐、推理优化。

本文按这三层组织,每道题给出面试官真正想听的答案要点,而不是教科书式的长篇大论。建议先看每题的"一句话答案",再展开细节。

2. 机器学习高频面试题

2.1 过拟合与欠拟合如何判断、如何解决

一句话答案:看训练集与验证集的指标差距——训练好验证差是过拟合,两者都差是欠拟合。

判断方法:

  • 训练 loss 持续下降,验证 loss 先降后升 → 过拟合。
  • 训练 loss 和验证 loss 都很高且接近 → 欠拟合。

解决过拟合的手段(按性价比排序):

  1. 增加数据 / 数据增强:最根本,大模型时代就是扩充语料、做数据配比。
  2. 正则化:L1/L2、Dropout、Label Smoothing、权重衰减。
  3. 降低模型复杂度:减层数、减宽度。
  4. 早停(Early Stopping):验证集指标不再提升就停。
  5. 集成与蒸馏:多模型平均、知识蒸馏。

解决欠拟合:增大模型容量、增加特征、减少正则强度、训练更久、换更强的优化器。

面试加分点:能说出"过拟合的本质是模型在拟合噪声,正则化本质是给参数空间加先验约束"。

2.2 L1 与 L2 正则化的区别

一句话答案:L1 产生稀疏解(特征选择),L2 让参数整体变小(平滑)。

维度L1 正则L2 正则
惩罚项$\lambda\sumw_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。

维度BatchNormLayerNorm
归一化维度同一通道跨样本同一样本跨特征
依赖 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(nlog⁡k)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 头数显存效果
MHAhh高最好
MQAh1低略降
GQAhg(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 的三阶段流程

  1. SFT:用人工标注的高质量对话做监督微调。
  2. 奖励模型(RM):用人类偏好对(chosen/rejected)训练打分模型。
  3. PPO 强化学习:用 RM 打分作为奖励,优化策略模型,同时用 KL 惩罚约束不要偏离 SFT 模型太远。

后续演进:DPO 直接用偏好对做对比学习,省掉 RM 和 PPO,工程上更简单。

5.7 大模型幻觉的成因与缓解

成因:

  • 训练目标是"下一个 token 概率最大",不是"事实正确"。
  • 训练数据存在噪声与知识盲区。
  • 解码采样引入随机性。

缓解:

  • RAG 检索增强,把事实依据放进上下文。
  • 工具调用 / 代码执行做事实校验。
  • 训练侧:高质量数据清洗、RLHF 对齐、拒绝回答不确定问题。
  • 解码侧:降低温度、约束解码。

6. 面试答题策略与常见坑

  • 先给结论再展开:面试官时间有限,先说一句话答案,再补充细节。
  • 主动说边界条件:比如手写 Softmax 主动提数值稳定性,手写 Attention 主动提 mask 用 -1e9。
  • 不要背公式不解释:能推导的尽量推,比如 dk\sqrt{d_k}dk​​ 的方差论证。
  • 诚实面对不会的题:说清楚自己的思路边界,比硬编强。
  • 准备一个能讲 10 分钟的项目:从问题、方案、指标、踩坑四个维度准备。

7. 总结

机器学习与深度学习基础是大模型面试的地基,算法手写题是筛人的硬指标,大模型专项是区分度所在。建议的复习顺序是:

  1. 过一遍本文的"一句话答案",建立索引。
  2. 对不熟的题展开推导,尤其是反向传播、Attention、LoRA。
  3. 手写代码至少跑通 Softmax、Top-K、Attention、编辑距离。
  4. 结合自己的项目,把每道题往实际经验上引。

面试不是考试,而是技术对话。把每道题讲成"我遇到过、我这样解决、效果如何",比背标准答案更有说服力。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/zhangchen124/article/details/170737154

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--