深度学习基础
核对日期:2026-05-13。
1. 阶段目标
本阶段目标是理解神经网络如何从数据中学习表示,并能用 PyTorch 完成一个可复现的小型训练实验。
学完本阶段,你应该能做到:
- 用自己的话解释前向传播、损失函数、反向传播和优化器。
- 理解 tensor、shape、batch、epoch、learning rate 等训练基础概念。
- 能写出 PyTorch 基础训练循环。
- 能识别过拟合、欠拟合、梯度问题和数据问题。
- 能记录实验参数、指标曲线和错误样例。
- 知道 CNN、RNN、Attention 分别解决过什么问题,以及为什么 Transformer 会成为后续重点。
本阶段的核心产出是:
- 一个 PyTorch 训练实验。
- 一份训练曲线和错误样例分析。
- 一份深度学习实验记录模板。
2. 学习前置条件
建议已完成:
- 线性代数、概率和优化最小基础。
- 机器学习基础。
- Python、NumPy、pandas 基础。
不要求:
- 手推复杂反向传播。
- 训练大模型。
- 了解 Transformer 细节。
3. 核心知识地图
4. 详细讲义
4.1 深度学习和传统机器学习的差异
传统机器学习通常依赖人工特征工程;深度学习更强调通过神经网络从原始或半原始数据中学习表示。
| 维度 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征 | 人工设计较多 | 模型自动学习较多 |
| 数据需求 | 中小数据也可用 | 通常需要更多数据 |
| 计算需求 | 相对低 | 相对高 |
| 可解释性 | 通常更好 | 通常更弱 |
| 典型场景 | 表格数据 | 图像、语音、文本、代码 |
工程判断:表格数据不要默认上深度学习;图像、语音、自然语言等复杂数据通常更适合深度学习。
4.2 Tensor 和 shape
Tensor 是多维数组,是深度学习计算的基本对象。
常见 shape:
| 数据 | 常见 shape | 含义 |
|---|---|---|
| 表格 batch | [batch_size, features] | 多条样本和特征 |
| 图片 batch | [batch_size, channels, height, width] | 多张图片 |
| 文本 token | [batch_size, seq_len] | 多条文本 token 序列 |
| 隐藏状态 | [batch_size, seq_len, hidden_dim] | 每个 token 的表示 |
很多深度学习 bug 不是算法错,而是 shape 理解错。训练时要习惯打印中间 tensor shape。
4.3 神经网络层
神经网络由层组成。每层把输入变换为输出。
常见层:
- Linear:线性变换。
- ReLU / GELU:激活函数,引入非线性。
- Conv2d:图像局部特征提取。
- Embedding:把离散 ID 映射为向量。
- Dropout:训练时随机丢弃部分激活,防止过拟合。
- LayerNorm / BatchNorm:稳定训练。
4.4 前向传播
前向传播是模型从输入计算输出的过程:
input -> layer1 -> activation -> layer2 -> logits -> prediction
输出可能是:
- 分类 logits。
- 回归数值。
- 序列中每个 token 的概率分布。
4.5 损失函数
损失函数衡量模型输出和真实标签的差距。
| 任务 | 常见损失 | 说明 |
|---|---|---|
| 回归 | MSE / MAE | 预测数值误差 |
| 二分类 | Binary Cross Entropy | 是否属于正类 |
| 多分类 | Cross Entropy | 多类别分类 |
| 语言模型 | Token-level Cross Entropy | 下一个 token 预测 |
损失函数是训练目标,但不一定等于业务指标。例如分类任务训练用交叉熵,但业务更关心召回率或误报率。
4.6 反向传播和优化器
反向传播负责计算每个参数对损失的影响,优化器负责根据梯度更新参数。
训练循环:
for batch in dataloader:
optimizer.zero_grad()
outputs = model(batch["x"])
loss = loss_fn(outputs, batch["y"])
loss.backward()
optimizer.step()
你不需要手写复杂反向传播,但必须理解:
loss.backward()计算梯度。optimizer.step()更新参数。zero_grad()防止梯度累积污染下一步。
4.7 Batch、epoch 和 learning rate
| 概念 | 含义 | 风险 |
|---|---|---|
| Batch | 一次训练使用的一小批样本 | 太小不稳定,太大占内存 |
| Epoch | 完整看完训练集一次 | 太多可能过拟合 |
| Learning rate | 参数更新步长 | 太大震荡,太小收敛慢 |
| Scheduler | 动态调整学习率 | 配置错误可能训练变差 |
4.8 过拟合和正则化
深度学习模型容量强,容易记住训练集。
常见防护:
- 更多数据。
- 数据增强。
- Dropout。
- Weight decay。
- Early stopping。
- 降低模型复杂度。
判断过拟合:
训练 loss 持续下降,验证 loss 开始上升
4.9 CNN、RNN、Attention 的直觉
| 架构 | 核心思想 | 典型场景 | 局限 |
|---|---|---|---|
| CNN | 局部感受野和权重共享 | 图像 | 长距离依赖弱 |
| RNN | 按顺序处理序列 | 早期 NLP、时间序列 | 难并行、长依赖困难 |
| Attention | 动态关注上下文相关位置 | NLP、代码、多模态 | 计算成本随序列增长 |
理解 Attention 是进入 Transformer 的前置。Transformer 可以看作把 Attention 作为核心计算模式的深层网络。
4.10 PyTorch 项目基本结构
建议结构:
dl-experiment/
├── data/
├── notebooks/
├── src/
│ ├── dataset.py
│ ├── model.py
│ ├── train.py
│ └── evaluate.py
├── outputs/
│ ├── checkpoints/
│ ├── metrics.json
│ └── errors.csv
└── README.md
训练实验必须记录:
- 数据集版本。
- 模型结构。
- 超参数。
- 随机种子。
- 训练/验证指标。
- 最佳 checkpoint。
- 错误样例。
5. 关键概念表
| 概念 | 含义 | 工程意义 | 常见问题 |
|---|---|---|---|
| Tensor | 多维数组 | 模型计算统一格式 | shape 错误 |
| Dataset | 数据读取逻辑 | 控制样本和标签 | 标签错位 |
| DataLoader | 批量加载数据 | batch、shuffle、并行 | 训练/验证混用 |
| Module | PyTorch 模型单元 | 封装网络结构 | forward 不清晰 |
| Autograd | 自动求梯度 | 训练基础 | 误用 no_grad |
| Loss | 优化目标 | 指导训练 | 和业务指标不一致 |
| Optimizer | 参数更新 | 决定收敛 | 学习率不合适 |
| Checkpoint | 模型保存 | 可恢复和复现 | 只保存最后一次 |
6. 工程案例
6.1 MNIST 手写数字分类
目标:输入图片,输出数字类别。
学习点:
- 图像 tensor shape。
- 分类损失。
- 训练/验证循环。
- 混淆矩阵。
- 错误样例可视化。
6.2 简单文本分类
目标:输入评论,判断情感正负。
学习点:
- 文本 tokenization。
- Embedding 层。
- 序列长度 padding/truncation。
- 类别不平衡处理。
6.3 图像迁移学习
目标:用预训练模型做小数据集分类。
学习点:
- 预训练表示复用。
- 冻结 backbone。
- 微调最后几层。
- 小数据过拟合风险。
6.4 训练日志分析
目标:通过曲线判断训练是否正常。
典型现象:
| 曲线表现 | 可能问题 |
|---|---|
| loss 不下降 | 学习率、数据、标签或模型错误 |
| 训练好验证差 | 过拟合 |
| 指标剧烈波动 | batch 太小、学习率太大 |
| 验证集异常好 | 数据泄漏 |
7. 常见误区与反模式
| 反模式 | 表现 | 后果 | 修正 |
|---|---|---|---|
| 只加层数 | 模型越来越深 | 过拟合、训练慢 | 先分析数据和错误 |
| 不记录实验 | 改了参数没记录 | 无法复现最好结果 | 固定实验日志 |
| 只看训练集 | 训练准确率很高 | 线上失败 | 看验证和测试 |
| 不看错误样例 | 只报平均指标 | 不知道模型错在哪 | 保存并分类错误 |
| shape 靠猜 | 维度错误频繁 | 训练 bug 多 | 打印 shape 和断言 |
| 盲目用大模型 | 小任务直接上复杂模型 | 成本高、调试难 | 从小模型 baseline 开始 |
8. 阶段练习
8.1 Tensor 练习
- 创建
[32, 10]的随机 tensor,表示 32 条样本和 10 个特征。 - 创建
[16, 3, 224, 224]的图片 batch,说明每个维度含义。 - 对一个 batch 计算均值和标准差。
- 打印一个简单模型每层输出 shape。
8.2 PyTorch 训练练习
- 用
torch.nn.Linear写一个二分类模型。 - 写完整训练循环。
- 加入验证循环。
- 保存验证集最优 checkpoint。
8.3 调参练习
比较以下配置:
- 学习率
1e-1、1e-3、1e-5。 - batch size
16、64、256。 - 有无 dropout。
记录 loss 曲线和结论。
8.4 错误样例练习
从验证集里找 10 个模型预测错误样例,按原因分类:
- 标签可能错误。
- 输入质量差。
- 类别边界模糊。
- 模型能力不足。
- 数据分布少见。
9. 项目任务
9.1 项目要求
完成一个 PyTorch 训练实验:
- 选择一个小数据集,例如 MNIST、Fashion-MNIST、IMDb 子集或自定义小数据集。
- 实现 Dataset / DataLoader。
- 实现模型、训练、验证和测试。
- 记录训练曲线。
- 输出混淆矩阵或错误样例表。
- 写出改进计划。
9.2 实验报告模板
# 深度学习实验报告
## 1. 任务和数据集
## 2. 数据预处理
## 3. 模型结构
## 4. 训练配置
## 5. 指标结果
## 6. 训练曲线
## 7. 错误样例分析
## 8. 复现实验步骤
## 9. 改进计划
9.3 评分标准
| 维度 | 分值 | 标准 |
|---|---|---|
| 数据管道 | 20 | Dataset/DataLoader 正确,训练验证分离 |
| 模型实现 | 20 | 模型结构清晰,forward 可读 |
| 训练循环 | 25 | 包含 train/eval、loss、optimizer、checkpoint |
| 实验记录 | 20 | 有参数、曲线、指标和错误样例 |
| 分析质量 | 15 | 能解释失败原因和改进方向 |
10. 验收题
- 前向传播和反向传播分别做什么?
- 为什么需要激活函数?
loss.backward()和optimizer.step()分别做什么?- 为什么训练前要
optimizer.zero_grad()? - 学习率过大和过小分别有什么表现?
- 如何识别过拟合?
- Dropout 和 weight decay 分别有什么作用?
- CNN、RNN、Attention 的核心差异是什么?
- 为什么验证集不能参与训练?
- 为什么深度学习实验必须记录随机种子和超参数?
11. 延伸阅读
官方与课程
- PyTorch Learn the Basics: https://docs.pytorch.org/tutorials/beginner/basics/intro.html
- PyTorch Recipes: https://docs.pytorch.org/tutorials/recipes/recipes_index.html
- Dive into Deep Learning: https://d2l.ai/
- fast.ai Practical Deep Learning: https://course.fast.ai/
进阶理解
- Distill: https://distill.pub/
- The Illustrated Transformer: https://jalammar.github.io/illustrated-transformer/
12. 本阶段总结
深度学习的关键不是“堆更多层”,而是理解数据、表示、损失、优化和泛化之间的关系。你应该能从训练曲线、验证指标和错误样例判断模型为什么成功或失败。
下一阶段会进入 Transformer 与大模型原理。Transformer 可以看作深度学习在序列建模和上下文建模上的一次关键架构跃迁,也是现代 LLM、RAG 和 Agent 能力的底座。