跳转至

深度学习面试准备

适用对象: 准备深度学习/AI相关岗位面试的同学 涵盖范围: 基础概念、CNN、RNN、Transformer、GAN/VAE、训练技巧、工程实践

知识体系


目录


学习资源

基础概念

Q1: 什么是梯度消失和梯度爆炸?如何解决?

梯度消失: 在反向传播中,梯度经过多层连乘后趋近于零,导致深层网络的前几层无法有效更新。常见于使用 Sigmoid/Tanh 的深层网络。

梯度爆炸: 梯度经过多层连乘后变得极大,导致参数更新过猛。

解决方案: - ReLU 激活函数: 正区间梯度恒为 1 - 残差连接: 梯度直接通过 skip connection 回传 - BatchNorm/LayerNorm: 稳定各层的输入分布 - 合理初始化: Xavier/He 初始化 - 梯度裁剪: 限制梯度最大范数 - LSTM: 门控机制缓解梯度消失


Q2: BatchNorm 和 LayerNorm 的区别?各用在什么场景?

BatchNorm: 在 batch 维度上归一化,对每个特征通道计算均值和方差。 - 依赖 batch size,小 batch 下效果差 - 训练和推理行为不同(推理用运行均值) - 适合 CNN

LayerNorm: 在特征维度上归一化,对每个样本独立计算。 - 不依赖 batch size - 训练和推理行为一致 - 适合 Transformer/NLP

\[\text{BN: } \hat{x}_{n,c} = \frac{x_{n,c} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}}$$ $$\text{LN: } \hat{x}_{n} = \frac{x_{n} - \mu_n}{\sqrt{\sigma_n^2 + \epsilon}}\]

Q3: 过拟合的解决方案有哪些?

  1. 数据层面: 数据增强、增加数据量
  2. 模型层面: 减小模型复杂度、Dropout
  3. 正则化: L1/L2 正则化、权重衰减
  4. 训练策略: Early Stopping、学习率调度
  5. 集成方法: 模型集成、TTA
  6. BatchNorm: 有轻微正则化效果
  7. 标签平滑: Label Smoothing

Q4: 解释反向传播算法的原理。

反向传播(Backpropagation)= 链式法则 + 动态规划

  1. 前向传播: 逐层计算输出,记录中间结果
  2. 计算损失: \(L = f(y, \hat{y})\)
  3. 反向传播: 利用链式法则,从输出层到输入层逐层计算梯度
\[\frac{\partial L}{\partial w_l} = \frac{\partial L}{\partial a_L} \cdot \frac{\partial a_L}{\partial a_{L-1}} \cdots \frac{\partial a_{l+1}}{\partial a_l} \cdot \frac{\partial a_l}{\partial w_l}\]

关键的效率在于复用中间梯度——每层的梯度只算一次,传递给前一层。


Q5: 常见的激活函数对比。

激活函数 公式 优点 缺点
Sigmoid \(\frac{1}{1+e^{-x}}\) 输出(0,1) 梯度消失,非零中心
Tanh \(\frac{e^x-e^{-x}}{e^x+e^{-x}}\) 零中心 仍有梯度消失
ReLU \(\max(0,x)\) 计算快,缓解梯度消失 Dead ReLU 问题
LeakyReLU \(\max(0.01x, x)\) 避免 Dead ReLU 略增计算
GELU \(x \cdot \Phi(x)\) Transformer首选 计算稍慢
SiLU/Swish \(x \cdot \sigma(x)\) 平滑,效果好 计算稍慢

Q6: 什么是权重初始化?为什么重要?

不好的初始化会导致: - 激活值饱和(全 0 或全 1)→ 梯度消失 - 激活值爆炸 → 梯度爆炸 - 对称性问题 → 所有神经元学到相同特征

Xavier 初始化(Sigmoid/Tanh): \(W \sim \mathcal{N}(0, \frac{2}{n_{in}+n_{out}})\)

He/Kaiming 初始化(ReLU): \(W \sim \mathcal{N}(0, \frac{2}{n_{in}})\)


Q7: 交叉熵损失的推导和直觉理解?

交叉熵衡量两个分布之间的差异:

\[H(p, q) = -\sum_{i} p_i \log q_i\]

二分类:\(L = -[y \log \hat{y} + (1-y)\log(1-\hat{y})]\)

多分类:\(L = -\sum_{c=1}^{C} y_c \log \hat{y}_c\)\(y\) 是 one-hot)

直觉: 正确类别的预测概率越高,损失越小。如果模型对正确类别给出了很低的概率,损失会非常大(\(-\log(0.01) \approx 4.6\))。


Q8: SGD、Adam、AdamW 的对比?

SGD + Momentum: - 泛化性好,但需要精心调参 - 适合图像分类等任务

Adam: - 自适应学习率,对每个参数维护一阶和二阶动量估计 - 收敛快,但泛化可能不如 SGD

AdamW: - Adam + 正确的权重衰减(解耦 weight decay 和 L2 正则化) - Transformer 的标准选择


Q9: 什么是残差连接?为什么有效?

残差连接(ResNet): \(y = F(x) + x\)

有效原因: 1. 梯度直通: 梯度可以通过 skip connection 直接回传,缓解梯度消失 2. 恒等映射容易学: 如果某层是冗余的,网络只需学 \(F(x) = 0\) 3. 集成效应: ResNet 可以看作不同深度子网络的隐式集成


Q10: Dropout 的原理和训练/推理的区别?

训练时: 以概率 \(p\) 随机将神经元输出置零,剩余输出除以 \((1-p)\)(Inverted Dropout)。 - 效果类似集成学习(每次训练一个不同的子网络) - 减少神经元间的共适应性

推理时: 不使用 Dropout,使用完整网络。由于训练时已做了缩放,推理时无需额外调整。


面试流程

CNN相关

Q11: 卷积操作的参数量和输出尺寸怎么计算?

参数量: \(\text{params} = C_{out} \times (C_{in} \times K_h \times K_w + 1)\)(+1 是 bias)

输出尺寸: \(O = \lfloor\frac{I + 2P - K}{S}\rfloor + 1\)

其中 \(I\) = 输入尺寸, \(P\) = padding, \(K\) = kernel size, \(S\) = stride。


Q12: 1×1 卷积的作用?

  1. 通道降维/升维: 改变通道数而不改变空间维度,减少计算量
  2. 跨通道信息融合: 相当于对每个空间位置做通道间的全连接
  3. 增加非线性: 配合激活函数增加网络表达能力

在 GoogLeNet、ResNet bottleneck、MobileNet 中广泛使用。


Q13: 感受野是什么?怎么计算?

感受野: 输出特征图上一个点对应输入图像的区域大小。

递推公式:\(RF_l = RF_{l-1} + (K_l - 1) \times \prod_{i=1}^{l-1} S_i\)

例如 3 层 3×3 卷积(stride=1)的感受野 = 7×7。


Q14: 深度可分离卷积为什么高效?

标准卷积参数: \(C_{in} \times C_{out} \times K^2\)

深度可分离卷积 = Depthwise + Pointwise: - Depthwise: \(C_{in} \times K^2\)(每个通道独立卷积) - Pointwise: \(C_{in} \times C_{out}\)(1×1 卷积混合通道) - 总计: \(C_{in}(K^2 + C_{out})\)

压缩比: \(\frac{1}{C_{out}} + \frac{1}{K^2}\)(K=3 时约为 \(\frac{1}{8} \sim \frac{1}{9}\)


Q15: 转置卷积(反卷积)的原理?

转置卷积不是卷积的逆运算,而是卷积的转置操作。用于上采样,将小尺寸特征图放大。

输出尺寸: \(O = (I-1) \times S - 2P + K + \text{output\_padding}\)

注意棋盘效应(Checkerboard Artifacts)— 可以用 resize + 普通卷积替代。


面试过程

RNN序列模型

Q16: LSTM 和 GRU 的区别?

LSTM: 3 个门(遗忘门、输入门、输出门)+ 细胞状态 - 参数: \(4 \times (d_h^2 + d_h \times d_x + d_h)\) - 更强大,适合长序列

GRU: 2 个门(重置门、更新门) - 参数: \(3 \times (d_h^2 + d_h \times d_x + d_h)\) - 参数更少,训练更快 - 小数据集上可能更好(不容易过拟合)


Q17: BPTT 算法和梯度消失的关系?

BPTT(Backpropagation Through Time)将 RNN 展开为前馈网络,然后反向传播。

梯度包含连乘项 \(\prod_{t=k}^{T} \frac{\partial h_t}{\partial h_{t-1}}\),当展开步数很长时: - Sigmoid/Tanh: 导数 < 1 → 连乘趋近 0(梯度消失) - 导数 > 1 → 连乘指数增长(梯度爆炸)

LSTM 通过细胞状态的加法更新缓解梯度消失。


Q18: Seq2Seq 模型中 Teacher Forcing 是什么?

Teacher Forcing: 训练时,解码器每步的输入使用真实标签(而非上一步的预测结果)。

  • 优点: 加速收敛,稳定训练
  • 缺点: 曝光偏差(Exposure Bias)— 训练和推理的输入分布不同

Scheduled Sampling: 训练过程中逐渐降低 Teacher Forcing 的比例。


Q19: Beam Search 和 Greedy Search 的区别?

Greedy Search: 每步选概率最高的 token。快但不一定全局最优。

Beam Search: 每步保留 beam_width 个最佳候选序列,最终选总概率最高的。 - beam_width=1 就是 Greedy - 通常 beam_width=4~10


Q20: 双向 RNN 有什么优缺点?

优点: - 每个位置能看到前后文信息 - 适合理解类任务(分类、NER)

缺点: - 不能用于自回归生成(会"偷看"未来) - 计算量翻倍


知识图谱

Transformer注意力

Q21: 自注意力的计算复杂度是多少?为什么是瓶颈?

\(O(n^2 d)\),其中 \(n\) 是序列长度,\(d\) 是维度。

\(Q K^T\) 产生 \(n \times n\) 的注意力矩阵,当 \(n\) 很大时(如 \(n=16384\)),内存和计算都不可接受。

解决方案: Flash Attention、线性注意力、稀疏注意力、滑动窗口。


Q22: 为什么要除以 \(\sqrt{d_k}\)

\(d_k\) 较大时,\(q^T k\) 的方差约为 \(d_k\)。方差大 → softmax 输入值分散 → 梯度趋近于零。

除以 \(\sqrt{d_k}\) 将方差恢复到 1,让 softmax 处于梯度友好的区间。


Q23: 多头注意力的作用?

  1. 不同的子空间: 每个头可以关注不同类型的关系
  2. 并行计算: 多头可以并行
  3. 提升表达能力: 相当于集成多个注意力模式

每个头的维度 \(d_k = d_{model} / h\),总参数不变。


Q24: Transformer 中有哪些 Mask?各有什么作用?

  1. Padding Mask: 屏蔽填充位置,防止关注 <pad>
  2. Look-ahead Mask(因果掩码): 防止解码器看到未来 token
  3. 两者在解码器中组合使用

Q25: 位置编码的几种方式?优缺点?

方式 特点 外推能力
正弦位置编码 固定,不可学习 有一定外推能力
可学习位置编码 灵活,BERT/GPT使用 不能外推
RoPE 旋转矩阵编码相对位置 良好外推
ALiBi 注意力分数中加线性偏置 优秀外推

Q26: Pre-Norm 和 Post-Norm 的区别?

Post-Norm(原始 Transformer): \(x = \text{Norm}(x + \text{Sublayer}(x))\) - 训练不稳定,需要 warmup - 最终性能可能更好

Pre-Norm: \(x = x + \text{Sublayer}(\text{Norm}(x))\) - 训练更稳定(梯度更好地保持) - 现代模型多使用 Pre-Norm


Q27: BERT 和 GPT 的区别?

特性 BERT GPT
架构 Transformer Encoder Transformer Decoder
预训练 MLM + NSP 因果语言建模(CLM)
注意力 双向(可以看全文) 单向(只看左侧)
适合任务 理解类(分类、NER) 生成类(文本生成)

Q28: Flash Attention 为什么快?

核心: IO 感知(IO-Aware)算法。标准注意力需要将 \(n \times n\) 的注意力矩阵写入 GPU HBM(高带宽内存),而 Flash Attention 通过分块计算(tiling),让注意力矩阵始终在 SRAM(片上内存)中,大幅减少 HBM 读写次数。

  • 计算复杂度不变(仍是 \(O(n^2)\)
  • 内存减少到 \(O(n)\)
  • 实际速度快 2-4 倍

技能矩阵

生成模型

Q29: GAN 的训练为什么不稳定?

  1. 博弈困难: 两个网络需要同步提升,很难平衡
  2. 模式崩塌: G 只生成少数样本就能骗过 D
  3. 梯度问题: D 太强时 G 的梯度消失
  4. 评估困难: 没有明确的收敛指标

Q30: WGAN 相比原始 GAN 有什么改进?

Wasserstein 距离(Earth Mover's Distance)替代 JS 散度:

\[W(p_r, p_g) = \inf_{\gamma \in \Pi(p_r, p_g)} \mathbb{E}_{(x,y)\sim\gamma}[\|x-y\|]\]

优点: - 即使两个分布不重叠也有有意义的梯度 - 提供了有意义的损失指标 - WGAN-GP 用梯度惩罚保证 Lipschitz 约束


Q31: VAE 的 ELBO 是什么?

ELBO(Evidence Lower Bound)= 对数似然的下界:

\[\text{ELBO} = \mathbb{E}_{q(z|x)}[\log p(x|z)] - KL(q(z|x) \| p(z))\]
  • 重构项: 解码器的重建能力
  • KL项: 编码器分布接近先验

最大化 ELBO 等价于最大化数据的对数似然。


Q32: VAE 生成的图像为什么模糊?

  1. 像素级 MSE/BCE 损失: 倾向于预测所有可能输出的平均值
  2. KL 正则化: 强制隐空间接近高斯分布,限制了表达能力
  3. 后验坍缩: KL 项过强时,编码器学到的信息很少

改进: 使用感知损失、对抗损失(VAE-GAN)、VQ-VAE。


Q33: Diffusion Model 的基本原理?

前向过程: 逐步向数据添加高斯噪声,直到变成纯噪声 反向过程: 学习逐步去噪,从噪声恢复数据

\[q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)\]

训练目标: 预测添加的噪声 \(\epsilon\)

优点: 训练稳定,生成质量极高。缺点: 采样慢(需要多步去噪)。


公司面试风格

训练技巧与优化

Q34: 学习率 warmup 的作用?

训练初期参数远离最优值,梯度方向不稳定。如果直接用大学习率,可能导致训练发散。

Warmup 在前几千步线性增加学习率,让模型先"稳住",然后再用大学习率快速学习。


Q35: Label Smoothing 是什么?

将硬标签 [0, 0, 1, 0] 变成软标签 [0.025, 0.025, 0.925, 0.025]。

\[y_{smooth} = (1-\epsilon) \cdot y_{onehot} + \epsilon / K\]

效果: 防止模型过于自信,提高泛化能力。


Q36: 知识蒸馏中温度参数 T 的作用?

\(T > 1\) 使 softmax 输出更"平滑",揭示类别间的相似度关系("暗知识")。

\(T = 1\): Teacher 可能输出 [0.99, 0.005, 0.005] \(T = 5\): Teacher 可能输出 [0.60, 0.20, 0.20]

高温下的软标签包含更多信息,有助于 Student 学习。


Q37: 模型量化的几种方式?

  1. 动态量化: 权重静态量化,激活运行时量化
  2. 静态量化 (PTQ): 用校准数据确定量化参数,训练后直接量化
  3. 量化感知训练 (QAT): 训练时模拟量化噪声,精度损失最小

精度: QAT > PTQ > 动态量化 复杂度: QAT > PTQ > 动态量化


Q38: 如何选择优化器和学习率?

场景 推荐
CNN + ImageNet SGD + Momentum, lr=0.1, cosine decay
Transformer/NLP AdamW, lr=1e-4~3e-4, warmup + cosine
GAN Adam, lr=2e-4, β1=0.5
微调预训练模型 AdamW, lr=1e-5~5e-5

Q39: 混合精度训练是什么?

使用 FP16 和 FP32 混合进行训练: - FP16 计算: 前向传播和反向传播(更快,更省显存) - FP32 参数: 主权重副本(保持精度) - Loss Scaling: 防止 FP16 的梯度下溢

Python
scaler = torch.amp.GradScaler('cuda')
with torch.amp.autocast('cuda'):
    output = model(input)
    loss = criterion(output, target)
scaler.scale(loss).backward()  # 链式调用,连续执行多个方法  # 反向传播计算梯度
scaler.step(optimizer)
scaler.update()

Q40: 如何诊断和解决训练中的问题?

症状 可能原因 排查方法
Loss 不下降 学习率不对 用 LR Finder
Loss = NaN 梯度爆炸 梯度裁剪,降低学习率
训练好验证差 过拟合 Dropout, 数据增强, early stopping
训练验证都差 欠拟合 增大模型, 增加训练时间
训练震荡 学习率过大 / batch太小 降低学习率, 增大 batch

调试流程: 1. 先在小数据集上过拟合(验证模型和代码正确) 2. 逐步增加数据和正则化 3. 注意观察梯度分布和激活值分布


简历优化

面试Tips

  1. 理解 > 记忆: 面试官更看重你对原理的理解,而非背公式
  2. 代码能力: 能手写关键组件(自注意力、LSTM、梯度下降)
  3. 工程经验: 知道实际训练中的坑和调参技巧
  4. 项目经验: 准备 1-2 个深度学习实战项目,能讲清楚 why/how
  5. 前沿知识: 了解最新进展(Diffusion, LLM, ViT)

薪资谈判

职业路径

复习路线图

返回: 深度学习学习指南