AI-Agent 面试题汇总 - 深度学习篇
1. 谈谈深度学习中的归一化问题
深度学习中的归一化,核心目的是让不同层、不同特征的数值分布更稳定,从而加速训练并提高收敛稳定性。常见归一化包括输入归一化(如像素缩放到[0,1])、BatchNorm、LayerNorm、GroupNorm。BatchNorm在mini-batch维度统计均值方差,适合CNN场景;LayerNorm在特征维度统计,常用于NLP和Transformer。归一化可以缓解梯度消失/爆炸、允许更大学习率、降低参数初始化敏感性。
import torch.nn as nn
# CNN里常见 BatchNorm2d
cnn_block = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU()
)
# Transformer里常见 LayerNorm
ln = nn.LayerNorm(768)
2. LSTM结构推导,为什么比RNN好?
LSTM在RNN基础上引入“门控机制”和“细胞状态”:
- 遗忘门:控制历史信息保留多少
- 输入门:控制当前输入写入多少
- 输出门:控制输出多少状态它通过加法路径维护长期记忆,能显著缓解普通RNN在长序列上的梯度消失问题。因此在长文本、语音等时序任务中,LSTM通常比基础RNN记忆能力更强、训练更稳定。
import torch.nn as nn rnn = nn.RNN(input_size=128, hidden_size=256, batch_first=True) lstm = nn.LSTM(input_size=128, hidden_size=256, batch_first=True)
3. Sigmoid、Tanh、ReLU这三个激活函数有什么优点或不足?
- Sigmoid:输出(0,1),适合概率建模;缺点是两端饱和导致梯度接近0,且输出非零中心。
- Tanh:输出(-1,1),零中心,通常比sigmoid收敛好;但仍有饱和区梯度消失问题。
- ReLU:正半轴梯度恒定、计算简单、收敛快;缺点是负半轴梯度为0,可能出现“神经元死亡”。工程上隐藏层多用ReLU族(ReLU/LeakyReLU/GELU),输出层按任务选择sigmoid或softmax。
import torch import torch.nn.functional as F x = torch.tensor([-2.0, -0.5, 0.0, 1.0, 3.0]) print(torch.sigmoid(x)) print(torch.tanh(x)) print(F.relu(x))
4. 为什么引入非线性激励函数?
如果网络每层都只做线性变换,多层叠加后仍等价于一层线性变换,模型表达能力有限,无法拟合复杂非线性关系。引入激活函数后,网络可以逼近复杂函数,实现高层语义抽象,这是深度学习有效的核心原因之一。
5. 为什么在神经网络中 ReLU 往往优于 Tanh 和 Sigmoid?
ReLU的正区间梯度不衰减,能减少深层网络训练时的梯度消失;同时计算仅需阈值操作,速度快。相比Sigmoid/Tanh,ReLU在深层网络中通常收敛更快、效果更稳。但ReLU也有“死亡神经元”问题,因此很多场景会用LeakyReLU、PReLU、GELU改进。
import torch.nn as nn act1 = nn.ReLU() act2 = nn.LeakyReLU(0.1) act3 = nn.GELU()
6. 为什么LSTM里既有Sigmoid又有Tanh,而不是统一一种?
Sigmoid输出0~1,天然适合作“门控开关”(保留/过滤信息比例);Tanh输出-1~1,适合作状态候选值,便于表达正负语义。两者分工明确:Sigmoid负责“控制流量”,Tanh负责“表达内容”。统一成一种会削弱门控机制或表达能力。
7. 如何解决RNN梯度爆炸和梯度消失问题?
常见手段:
- 使用LSTM/GRU替代基础RNN
- 梯度裁剪(gradient clipping)防止爆炸
- 合理初始化(如Xavier/He)
- 调整学习率与优化器
- 序列截断BPTT
- 引入归一化与残差结构(在可用场景)
# PyTorch 训练时做梯度裁剪 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
8. 什么样的数据集不适合用深度学习?
通常不太适合:
- 数据量很小,且难以做迁移学习/增强
- 特征关系简单,传统模型已足够好
- 对可解释性要求极高且必须规则透明
- 算力、时延、部署资源极其受限
- 标签噪声很大且无法清洗此时可优先试LR、树模型、规则系统或小模型方案。
9. 广义线性模型是怎样被应用在深度学习中的?
广义线性模型(GLM)的思想体现在深度网络输出层设计中:
- 二分类输出层常用 sigmoid + BCE,本质接近逻辑回归
- 多分类输出层常用 softmax + 交叉熵,对应多项分布建模可以理解为“深层网络提特征 + GLM风格输出头做决策”。
import torch.nn as nn
# 二分类头
binary_head = nn.Sequential(
nn.Linear(768, 1),
nn.Sigmoid()
)
# 多分类头
multi_head = nn.Linear(768, 10) # 后接 softmax 在loss里处理
10. 如何解决梯度消失和梯度膨胀?
通用方案:
- 激活函数用ReLU/GELU替代Sigmoid深堆叠
- 使用BatchNorm/LayerNorm
- 残差连接(ResNet思想)
- 合理初始化 + 学习率策略
- 梯度裁剪(尤其RNN)
- 使用AdamW等稳定优化器
- 混合精度时关注loss scale设置
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-4, weight_decay=0.01)
11. 深度学习有哪些熟悉的优化算法?
常见优化器:
- SGD
- SGD + Momentum
- AdaGrad
- RMSProp
- Adam
- AdamW面试上可补一句:工业中AdamW常作为默认起点,视觉大模型和NLP任务普遍使用。
import torch.optim as optim opt_sgd = optim.SGD(model.parameters(), lr=0.1, momentum=0.9) opt_adamw = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
12. Adam怎么更新的?(Adam怎么优化?)
Adam结合了Momentum(一阶矩)和RMSProp(二阶矩)思想:
- 一阶矩估计梯度均值,减少震荡
- 二阶矩估计梯度平方均值,自适应学习率
- 再做偏置校正,得到更稳定更新步长优点是收敛快、对稀疏梯度友好、调参相对容易。常见改进是AdamW,把权重衰减与梯度更新解耦。
13. 讲讲学习率衰减
学习率衰减用于训练后期更精细搜索最优点,避免在最优附近震荡。常见策略:Step Decay、Exponential、Cosine Annealing、Warmup + Cosine。大模型训练常用“前期warmup,后期余弦衰减”。
import torch.optim as optim
optimizer = optim.AdamW(model.parameters(), lr=1e-3)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)
for epoch in range(50):
# train...
scheduler.step()
14. PyTorch里怎么从CPU迁移到GPU?
核心是把模型和数据都迁移到同一device:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)- 每个batch的输入和标签也
.to(device)
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
for x, y in dataloader:
x = x.to(device)
y = y.to(device)
out = model(x)
15. 激活函数Sigmoid的梯度最大点在哪,等于多少?
Sigmoid函数:(\sigma(x)=1/(1+e^{-x}))其导数:(\sigma'(x)=\sigma(x)(1-\sigma(x)))。当(\sigma(x)=0.5)时导数最大,对应(x=0),最大值为(0.25)。
16. batch_size对训练的影响(你图里是“对训练的影响过拟合,怎么处理”)
batch_size影响梯度估计噪声、显存占用和收敛特性:
- 小batch:噪声大,泛化可能更好,但训练不稳定、速度可能慢
- 大batch:训练吞吐高、更稳定,但可能泛化略差,且吃显存过拟合处理不只靠batch_size,还应结合正则化、数据增强、早停、dropout等。
from torch.utils.data import DataLoader train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
17. GELU函数和ReLU函数的区别?
- ReLU:(f(x)=\max(0,x)),硬阈值,简单高效
- GELU:按概率保留输入,曲线更平滑,负值区域并非全截断GELU在Transformer/BERT中非常常见,通常在NLP预训练模型里效果优于ReLU;ReLU在很多CNN与轻量部署场景仍有优势。
import torch.nn as nn relu = nn.ReLU() gelu = nn.GELU()
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.