01-深度学习面试题精选50题¶
适用岗位:AI算法工程师、深度学习研究员 难度分布:基础(20) + 进阶(20) + 高级(10)
1. 基础题(20题)¶
Q1: 反向传播(Backpropagation)的原理? - 前向传播计算损失 → 链式法则从输出层反向计算梯度 → 梯度下降更新参数 - 数学:\(\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}\) - 计算图中每个节点缓存中间值,反向时复用
Q2: 常见激活函数对比?为什么ReLU最常用? | 函数 | 公式 | 问题 | 适用 | |------|------|------|------| | Sigmoid | \(\frac{1}{1+e^{-x}}\) | 梯度消失、非零中心 | 二分类输出 | | Tanh | \(\frac{e^x-e^{-x}}{e^x+e^{-x}}\) | 梯度消失 | RNN | | ReLU | \(\max(0,x)\) | Dead ReLU | CNN/MLP默认 | | GELU | \(x\Phi(x)\) | 计算稍慢 | Transformer/BERT | | SiLU/Swish | \(x\sigma(x)\) | | 现代网络(LLaMA) |
Q3: 梯度下降的变体?Adam优化器详解 - SGD:随机梯度,收敛慢但泛化好 - Momentum:加入动量避免震荡 - Adam:一阶矩(均值) + 二阶矩(方差) + 偏差修正 - \(m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t\) - \(v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2\) - \(\theta_{t+1} = \theta_t - \frac{\alpha \hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon}\) - AdamW:Adam + 权重衰减解耦(2024+标准选择)
Q4: Dropout的原理?训练和推理的区别? - 训练时以概率p随机将神经元输出置0 - 推理时使用所有神经元,但输出乘以(1-p)(或训练时除以1-p = Inverted Dropout) - 作用:正则化、近似模型集成、减少神经元协适应 - 替代:DropPath(残差网络)、DropBlock(CNN)
Q5: 交叉熵损失的推导?为什么分类用CE而非MSE? - \(L_{CE} = -\sum_i y_i \log(p_i)\)(多分类),\(L_{BCE} = -[y\log p + (1-y)\log(1-p)]\)(二分类) - 来源:最大似然估计 → 取负对数 → 交叉熵 - 优于MSE:梯度更大(MSE梯度含sigmoid导数,接近0/1时非常小),收敛更快
Q6: Batch Normalization vs Layer Normalization? | 维度 | BN | LN | |------|----|----| | 归一化维度 | Batch维度(NHW) | 特征维度(CHW) | | 适合 | CNN | Transformer/RNN | | Batch依赖 | 是(小batch不稳定) | 否 | | 推理差异 | 用移动平均 | 和训练一致 |
Q7: 什么是权重初始化?Xavier和He初始化的区别? - 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}})\) - 直觉:保持每层前向/反向方差稳定,避免梯度消失/爆炸
Q8: 什么是残差连接?为什么有效? - \(H(x) = F(x) + x\),学习残差F(x)=H(x)-x而非直接学H(x) - 梯度:\(\frac{\partial L}{\partial x} = \frac{\partial L}{\partial H}(1 + \frac{\partial F}{\partial x})\),恒等项1保证梯度流通 - 允许训练100+层网络
Q9: 卷积、池化、全连接层的参数量计算? - Conv: \(C_{out} \times C_{in} \times k \times k + C_{out}\)(bias) - Pool: 0参数 - FC: \(n_{in} \times n_{out} + n_{out}\)(bias) - 例:3×3 Conv, 64→128通道: 128×64×3×3+128 = 73,856
Q10: 什么是学习率调度?常见策略? - StepLR: 每N个epoch衰减γ倍 - CosineAnnealing: \(\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max}-\eta_{min})(1+\cos(\frac{t}{T}\pi))\) - Warmup+Cosine: 先线性增大再余弦衰减(Transformer标配) - OneCycleLR: 先升后降,训练效率高
Q11: 过拟合和欠拟合的区别及解决方法? - 过拟合:训练好/验证差 → 增数据/正则化/Dropout/早停 - 欠拟合:训练差/验证差 → 增模型容量/减正则化/训练更久
Q12: CNN中的感受野如何计算? - 3层3×3 Conv(stride=1)感受野 = 7×7 - 公式: RF = RF_prev + (k-1) × ∏(strides)
Q13: 什么是转置卷积(反卷积)?用途? - 不是卷积的数学逆运算,而是一种上采样操作 - 对输入插零后做正常卷积 - 用途:分割(FCN)、生成(GAN)、特征图上采样
Q14: L1和L2正则化的区别? - L1(\(\lambda\sum|w|\)):产生稀疏解(特征选择),梯度恒定 - L2(\(\lambda\sum w^2\)):权重衰减,梯度与权重成正比 - L2更常用(AdamW),L1用于需要稀疏的场景
Q15: 什么是梯度裁剪?为什么需要? - 限制梯度范数不超过阈值:\(g = g \cdot \frac{c}{||g||}\) if \(||g|| > c\) - 防止梯度爆炸,在RNN和Transformer训练中必须使用 - 常用阈值:1.0或5.0
Q16: 数据归一化的方法和作用? - Min-Max: 缩放到[0,1] - Z-Score: 标准化到均值0方差1 - 作用:加速收敛、避免不同尺度特征主导梯度
Q17: 混合精度训练的原理? - 前向+反向用FP16计算(速度快、显存省) - 权重主副本和梯度累积用FP32(避免精度损失) - 损失缩放(Loss Scaling)防止梯度下溢
Q18: 什么是知识蒸馏? - Teacher(大模型)的软标签→Student(小模型)学习 - \(L = \alpha L_{hard} + (1-\alpha) T^2 \cdot KL(p_T || p_S)\) - T为温度,T越高软标签越平滑,包含更多暗知识
Q19: GAN的训练过程和损失函数? - G和D交替训练:D最大化区分真假,G最小化D对假样本的判断 - \(\min_G \max_D \mathbb{E}[\log D(x)] + \mathbb{E}[\log(1-D(G(z)))]\) - 训练不稳定→WGAN(Wasserstein距离)、Spectral Normalization
Q20: 什么是注意力机制?Self-Attention vs Cross-Attention? - Self-Attention: Q、K、V来自同一序列(理解自身) - Cross-Attention: Q来自一个序列,K、V来自另一个序列(如解码器看编码器)
2. 进阶题(20题)¶
Q21: Transformer架构详解(Encoder/Decoder/层数/头数/FFN) Q22: Multi-Head Attention为什么比单头好? Q23: 各种Normalization对比(BN/LN/GN/RMSNorm) Q24: 分布式训练:数据并行 vs 模型并行 vs 流水线并行 Q25: 混合精度+梯度累积+梯度检查点的组合使用 Q26: 自监督学习的范式(对比学习/MAE/DINO) Q27: Vision Transformer vs CNN的深度对比 Q28: 扩散模型 vs GAN vs VAE对比 Q29: 图神经网络(GNN)的核心思想(消息传递) Q30: 联邦学习的原理和通信优化 Q31: 模型量化(INT8/INT4/GPTQ/AWQ)的原理 Q32: 模型剪枝的方法(结构化vs非结构化) Q33: Neural Architecture Search (NAS)的方法 Q34: 元学习(Meta-Learning)的范式 Q35: 对比学习中temperature参数的作用 Q36: Transformer中FFN的作用(知识存储) Q37: 为什么Decoder-only架构成为LLM主流? Q38: FlashAttention的IO优化原理 Q39: MoE(混合专家)模型的训练策略 Q40: 如何设计高效的训练数据pipeline?
3. 手撕代码题(10题)¶
Q41: 手写多头注意力
class MultiHeadAttention(nn.Module): # 继承nn.Module定义神经网络层
def __init__(self, d_model, n_heads): # __init__构造方法,创建对象时自动调用
super().__init__() # super()调用父类方法
self.d_k = d_model // n_heads
self.n_heads = n_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
def forward(self, Q, K, V, mask=None):
B, L, _ = Q.shape
Q = self.W_q(Q).view(B, L, self.n_heads, self.d_k).transpose(1,2) # 链式调用,连续执行多个方法
K = self.W_k(K).view(B, -1, self.n_heads, self.d_k).transpose(1,2)
V = self.W_v(V).view(B, -1, self.n_heads, self.d_k).transpose(1,2)
scores = Q @ K.transpose(-2,-1) / (self.d_k ** 0.5)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
attn = torch.softmax(scores, dim=-1)
out = (attn @ V).transpose(1,2).contiguous().view(B, L, -1)
return self.W_o(out)
Q42: 手写Transformer Encoder Block Q43: 手写交叉熵损失(带label smoothing) Q44: 手写Cosine Annealing with Warmup Q45: 手写简单的ResNet Block Q46: 手写RoTary Position Embedding (RoPE) Q47: 手写简单的VAE (Encoder+Decoder+重参数化) Q48: 手写梯度裁剪 Q49: 手写Focal Loss Q50: 手写简单的GAN训练循环
最后更新:2026年2月




