深度学习面试准备¶
适用对象: 准备深度学习/AI相关岗位面试的同学 涵盖范围: 基础概念、CNN、RNN、Transformer、GAN/VAE、训练技巧、工程实践
目录¶
- 基础概念(Q1-Q10)
- CNN相关(Q11-Q15)
- RNN/序列模型(Q16-Q20)
- Transformer/注意力(Q21-Q28)
- 生成模型(Q29-Q33)
- 训练技巧与优化(Q34-Q40)
基础概念¶
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
Q3: 过拟合的解决方案有哪些?¶
- 数据层面: 数据增强、增加数据量
- 模型层面: 减小模型复杂度、Dropout
- 正则化: L1/L2 正则化、权重衰减
- 训练策略: Early Stopping、学习率调度
- 集成方法: 模型集成、TTA
- BatchNorm: 有轻微正则化效果
- 标签平滑: Label Smoothing
Q4: 解释反向传播算法的原理。¶
反向传播(Backpropagation)= 链式法则 + 动态规划。
- 前向传播: 逐层计算输出,记录中间结果
- 计算损失: \(L = f(y, \hat{y})\)
- 反向传播: 利用链式法则,从输出层到输入层逐层计算梯度
关键的效率在于复用中间梯度——每层的梯度只算一次,传递给前一层。
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: 交叉熵损失的推导和直觉理解?¶
交叉熵衡量两个分布之间的差异:
二分类:\(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 卷积的作用?¶
- 通道降维/升维: 改变通道数而不改变空间维度,减少计算量
- 跨通道信息融合: 相当于对每个空间位置做通道间的全连接
- 增加非线性: 配合激活函数增加网络表达能力
在 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: 多头注意力的作用?¶
- 不同的子空间: 每个头可以关注不同类型的关系
- 并行计算: 多头可以并行
- 提升表达能力: 相当于集成多个注意力模式
每个头的维度 \(d_k = d_{model} / h\),总参数不变。
Q24: Transformer 中有哪些 Mask?各有什么作用?¶
- Padding Mask: 屏蔽填充位置,防止关注
<pad> - Look-ahead Mask(因果掩码): 防止解码器看到未来 token
- 两者在解码器中组合使用
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 的训练为什么不稳定?¶
- 博弈困难: 两个网络需要同步提升,很难平衡
- 模式崩塌: G 只生成少数样本就能骗过 D
- 梯度问题: D 太强时 G 的梯度消失
- 评估困难: 没有明确的收敛指标
Q30: WGAN 相比原始 GAN 有什么改进?¶
用 Wasserstein 距离(Earth Mover's Distance)替代 JS 散度:
优点: - 即使两个分布不重叠也有有意义的梯度 - 提供了有意义的损失指标 - WGAN-GP 用梯度惩罚保证 Lipschitz 约束
Q31: VAE 的 ELBO 是什么?¶
ELBO(Evidence Lower Bound)= 对数似然的下界:
- 重构项: 解码器的重建能力
- KL项: 编码器分布接近先验
最大化 ELBO 等价于最大化数据的对数似然。
Q32: VAE 生成的图像为什么模糊?¶
- 像素级 MSE/BCE 损失: 倾向于预测所有可能输出的平均值
- KL 正则化: 强制隐空间接近高斯分布,限制了表达能力
- 后验坍缩: KL 项过强时,编码器学到的信息很少
改进: 使用感知损失、对抗损失(VAE-GAN)、VQ-VAE。
Q33: Diffusion Model 的基本原理?¶
前向过程: 逐步向数据添加高斯噪声,直到变成纯噪声 反向过程: 学习逐步去噪,从噪声恢复数据
训练目标: 预测添加的噪声 \(\epsilon\)
优点: 训练稳定,生成质量极高。缺点: 采样慢(需要多步去噪)。
训练技巧与优化¶
Q34: 学习率 warmup 的作用?¶
训练初期参数远离最优值,梯度方向不稳定。如果直接用大学习率,可能导致训练发散。
Warmup 在前几千步线性增加学习率,让模型先"稳住",然后再用大学习率快速学习。
Q35: Label Smoothing 是什么?¶
将硬标签 [0, 0, 1, 0] 变成软标签 [0.025, 0.025, 0.925, 0.025]。
效果: 防止模型过于自信,提高泛化能力。
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: 模型量化的几种方式?¶
- 动态量化: 权重静态量化,激活运行时量化
- 静态量化 (PTQ): 用校准数据确定量化参数,训练后直接量化
- 量化感知训练 (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 的梯度下溢
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¶
- 理解 > 记忆: 面试官更看重你对原理的理解,而非背公式
- 代码能力: 能手写关键组件(自注意力、LSTM、梯度下降)
- 工程经验: 知道实际训练中的坑和调参技巧
- 项目经验: 准备 1-2 个深度学习实战项目,能讲清楚 why/how
- 前沿知识: 了解最新进展(Diffusion, LLM, ViT)
返回: 深度学习学习指南










