参考答案
核对日期:2026-05-13。
1. 阶段练习参考方向
1.1 Tensor 练习
示例:
import torch
x = torch.randn(32, 10)
images = torch.randn(16, 3, 224, 224)
batch_mean = images.mean()
batch_std = images.std()
维度解释:
[32, 10]:32 条样本,每条 10 个特征。[16, 3, 224, 224]:16 张图片,3 个通道,高 224,宽 224。
打印模型每层 shape 的重点是验证数据流,而不是猜维度。可以在 forward 中临时打印,也可以用 hook 或 summary 工具。
1.2 PyTorch 训练练习
最小训练循环应包含:
for epoch in range(num_epochs):
model.train()
for features, labels in train_loader:
optimizer.zero_grad()
logits = model(features)
loss = criterion(logits, labels)
loss.backward()
optimizer.step()
model.eval()
with torch.no_grad():
for features, labels in val_loader:
logits = model(features)
val_loss = criterion(logits, labels)
关键检查:
- 训练阶段
model.train()。 - 验证阶段
model.eval()和torch.no_grad()。 - 每步更新前
optimizer.zero_grad()。 - checkpoint 保存验证集最佳结果,而不是最后一轮。
1.3 调参练习
参考结论通常是:
1e-1可能过大,loss 震荡或发散。1e-3常作为合理起点。1e-5可能收敛太慢。- 小 batch 噪声大但可能泛化好;大 batch 稳定但显存高,也可能泛化变差。
- dropout 能缓解过拟合,但过强会欠拟合。
最终结论要基于 loss 曲线、验证指标和错误样例,而不是只看单次最高分。
1.4 错误样例练习
错误样例分类应包含:
| 类别 | 判断依据 | 后续动作 |
|---|---|---|
| 标签可能错误 | 人看也认为标签不合理 | 清洗或复核标签 |
| 输入质量差 | 模糊、截断、噪声大 | 数据增强或过滤 |
| 类别边界模糊 | 多个类别都合理 | 调整标签体系 |
| 模型能力不足 | 相似样本普遍错 | 改模型或特征 |
| 数据分布少见 | 训练集中少见场景 | 补数据或重采样 |
2. 项目评分样例
高分 PyTorch 实验应具备:
- Dataset / DataLoader 清晰,训练、验证、测试严格分离。
- 模型结构可读,forward 维度明确。
- 训练循环包含 loss、optimizer、scheduler 或 checkpoint。
- 实验记录包含随机种子、超参数、曲线和指标。
- 错误样例不是附录装饰,而能导出改进方向。
不合格表现:
- 只在训练集上看准确率。
- 验证集参与训练或调参后当测试集汇报。
- 不保存配置,最好结果无法复现。
- 只说“增加模型层数”作为改进计划。
3. 验收题参考答案
- 前向传播和反向传播分别做什么?
前向传播把输入经过模型计算得到预测和 loss;反向传播根据 loss 计算各参数梯度,为参数更新提供方向。
- 为什么需要激活函数?
激活函数引入非线性。没有非线性,多层线性网络仍等价于一个线性变换,无法表达复杂模式。
loss.backward()和optimizer.step()分别做什么?
loss.backward() 计算梯度并累积到参数的 .grad;optimizer.step() 根据梯度和优化算法更新参数。
- 为什么训练前要
optimizer.zero_grad()?
PyTorch 默认梯度累积。如果不清零,当前 batch 的梯度会叠加上之前 batch 的梯度,导致更新错误,除非你有意做梯度累积。
- 学习率过大和过小分别有什么表现?
过大表现为 loss 震荡、发散、指标不稳定;过小表现为 loss 下降很慢、训练时间长、可能停在较差结果。
- 如何识别过拟合?
训练集 loss 持续下降、训练指标很好,但验证集 loss 上升或指标下降。错误样例可能集中在验证集长尾或分布变化场景。
- Dropout 和 weight decay 分别有什么作用?
Dropout 随机屏蔽部分神经元,减少共适应;weight decay 惩罚过大的权重,约束模型复杂度。两者都常用于缓解过拟合。
- CNN、RNN、Attention 的核心差异是什么?
CNN 擅长局部模式和空间结构;RNN 按序处理序列,适合时间依赖但并行性差;Attention 直接建模 token 之间关系,便于并行和长距离依赖建模。
- 为什么验证集不能参与训练?
验证集用于模型选择和调参。如果参与训练,验证指标会失真,无法判断模型对未见数据的泛化能力。
- 为什么深度学习实验必须记录随机种子和超参数?
深度学习结果受初始化、数据顺序、增强、硬件和超参数影响。记录这些信息才能复现结果、比较实验和定位退化。