模块M01: 深度学习基础理论¶
阶段: Stage 4 - 深度学习 预计学习时间: 2-3小时(理论)+ 2-3小时(实践) 难度: ⭐⭐⭐ 中等
📚 学习目标¶
完成本模块后,你将能够:
- ✅ 理解神经网络的基本原理(感知机、多层感知机、激活函数)
- ✅ 掌握反向传播算法的数学推导与计算过程
- ✅ 熟悉常用优化器(SGD、Adam、RMSprop)及其适用场景
- ✅ 理解损失函数的选择与正则化技术
- ✅ 能够使用PyTorch从零实现一个简单的神经网络
- ✅ 掌握张量操作、自动微分机制与模型定义方法
🎯 核心知识点¶
1. 神经网络基础¶
1.1 感知机 (Perceptron)¶
感知机是最简单的神经网络单元,由美国科学家Frank Rosenblatt在1957年提出。
数学表达式:
其中: -x: 输入向量 (特征)
- w: 权重向量
- b: 偏置 (bias)
- f: 激活函数
- y: 输出
限制: 感知机只能解决线性可分问题(如AND、OR),无法解决XOR问题。
1.2 多层感知机 (Multi-Layer Perceptron, MLP)¶
通过堆叠多个神经元层,MLP可以解决非线性问题。
网络结构:
前向传播公式 (Forward Propagation):
1.3 激活函数 (Activation Functions)¶
激活函数引入非线性,使神经网络能够逼近复杂函数。
| 激活函数 | 公式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Sigmoid | σ(x) = 1 / (1 + e^(-x)) | 输出在(0,1),适合概率 | 梯度消失、计算慢 | 二分类输出层 |
| Tanh | tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x)) | 输出在(-1,1),零中心 | 梯度消失 | RNN隐藏层 |
| ReLU | f(x) = max(0, x) | 计算快、缓解梯度消失 | 神经元死亡 | CNN隐藏层(最常用) |
| Leaky ReLU | f(x) = max(0.01x, x) | 避免神经元死亡 | 需调参 | 深度网络隐藏层 |
| GELU | f(x) = x · Φ(x) | 性能优越 | 计算复杂 | Transformer(BERT/GPT) |
| Softmax | σ(x_i) = e^(x_i) / Σe^(x_j) | 输出概率分布 | 不适合隐藏层 | 多分类输出层 |
可视化对比: 参见 notebooks/stage4/01-neural-network.ipynb 第2节
2. 反向传播算法 (Backpropagation)¶
反向传播是训练神经网络的核心算法,通过链式法则计算梯度。
2.1 损失函数 (Loss Function)¶
衡量模型预测与真实值的差距。
常用损失函数:
| 任务类型 | 损失函数 | 公式 | PyTorch实现 |
|---|---|---|---|
| 二分类 | 二元交叉熵 | BCE = -[y·log(ŷ) + (1-y)·log(1-ŷ)] | nn.BCELoss() |
| 多分类 | 交叉熵 | CE = -Σ y_i · log(ŷ_i) | nn.CrossEntropyLoss() |
| 回归 | 均方误差 | MSE = (1/n) · Σ(y - ŷ)² | nn.MSELoss() |
| 回归 | 平均绝对误差 | MAE = (1/n) · Σ|y - ŷ| | nn.L1Loss() |
2.2 梯度计算¶
链式法则 (Chain Rule):
其中:
- L: 损失函数
- y: 输出
- z: 线性组合 (z = w·x + b)
- w: 权重
手动推导示例 (单层网络):
# 前向传播
z = w * x + b
y_pred = sigmoid(z)
loss = (y_true - y_pred) ** 2
# 反向传播
dL_dy = -2 * (y_true - y_pred)
dy_dz = sigmoid(z) * (1 - sigmoid(z))
dz_dw = x
# 梯度
dL_dw = dL_dy * dy_dz * dz_dw
计算图可视化: 参见 notebooks/stage4/01-neural-network.ipynb 第3节
3. 优化器 (Optimizers)¶
优化器决定如何使用梯度更新参数。
3.1 梯度下降 (Gradient Descent)¶
公式:
三种变体:
| 类型 | 每次迭代使用数据量 | 优点 | 缺点 |
|---|---|---|---|
| 批量梯度下降 (BGD) | 全部数据 | 收敛稳定 | 大数据集很慢 |
| 随机梯度下降 (SGD) | 1个样本 | 速度快、可在线学习 | 收敛不稳定 |
| 小批量梯度下降 (Mini-batch GD) | batch_size个样本 | 平衡速度与稳定性 | 需调batch_size |
3.2 常用优化器对比¶
| 优化器 | 核心思想 | 优点 | 缺点 | 推荐学习率 |
|---|---|---|---|---|
| SGD | 基础梯度下降 | 简单、可复现 | 需精细调参 | 0.01-0.1 |
| SGD + Momentum | 累积历史梯度 | 加速收敛、减少震荡 | 需额外参数 | 0.01-0.1 |
| RMSprop | 自适应学习率 | 适合RNN | 需调衰减率 | 0.001 |
| Adam | Momentum + RMSprop | 自适应、鲁棒性强 | 可能过拟合 | 0.001-0.0001 |
| AdamW | Adam + 权重衰减 | 改进正则化 | - | 0.001-0.0001 |
选择建议: - 默认首选: Adam (lr=0.001) - 追求最优性能: SGD + Momentum (lr=0.01, momentum=0.9) + 学习率调度 - Transformer模型: AdamW (lr=5e-5)
公式对比: 参见 notebooks/stage4/01-neural-network.ipynb 第4节
4. 正则化技术 (Regularization)¶
防止过拟合的方法。
4.1 权重衰减 (Weight Decay / L2正则化)¶
原理: 在损失函数中添加权重的L2范数惩罚项。
公式:
PyTorch实现:
4.2 Dropout¶
原理: 训练时随机丢弃部分神经元,测试时使用全部神经元。
典型配置: - 全连接层: dropout=0.5 - CNN卷积层: dropout=0.2-0.3 - RNN/Transformer: dropout=0.1
PyTorch实现:
4.3 Batch Normalization¶
原理: 归一化每个batch的激活值,加速训练。
公式:
优点: - 加速收敛(可使用更大学习率) - 减轻梯度消失/爆炸 - 轻微正则化效果
PyTorch实现:
5. PyTorch基础¶
5.1 张量操作 (Tensor Operations)¶
PyTorch中的张量类似于NumPy数组,但支持GPU加速和自动微分。
创建张量:
import torch
# 从Python列表创建
x = torch.tensor([1, 2, 3])
# 创建特殊张量
zeros = torch.zeros(3, 4) # 全0
ones = torch.ones(2, 3) # 全1
rand = torch.rand(3, 3) # 均匀分布[0,1)
randn = torch.randn(3, 3) # 标准正态分布
常用操作:
# 形状操作
x = torch.randn(2, 3, 4)
print(x.shape) # torch.Size([2, 3, 4])
y = x.view(2, -1) # reshape: (2, 12)
z = x.transpose(1, 2) # 转置: (2, 4, 3)
# 数学运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
c = a + b # 逐元素相加
d = torch.dot(a, b) # 点积: 32
e = torch.matmul(A, B) # 矩阵乘法
# GPU加速
if torch.cuda.is_available():
x_gpu = x.to('cuda') # 移动到GPU
y_gpu = x_gpu * 2
y_cpu = y_gpu.to('cpu') # 移回CPU
5.2 自动微分 (Autograd)¶
PyTorch的核心特性,自动计算梯度。
基本用法:
# 需要梯度的张量
x = torch.tensor([2.0], requires_grad=True)
y = x ** 2 + 3 * x + 1
# 反向传播
y.backward()
# 查看梯度
print(x.grad) # dy/dx = 2x + 3 = 7.0
梯度累积:
x = torch.tensor([1.0], requires_grad=True)
# 第一次前向+反向
y1 = x ** 2
y1.backward()
print(x.grad) # 2.0
# 第二次(梯度会累积)
y2 = x ** 3
y2.backward()
print(x.grad) # 2.0 + 3.0 = 5.0
# 清零梯度
x.grad.zero_()
5.3 模型定义¶
两种方式:
方式1: 使用nn.Module(推荐):
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 实例化模型
model = SimpleNN(input_dim=10, hidden_dim=20, output_dim=2)
方式2: 使用nn.Sequential(简洁):
5.4 训练循环¶
完整示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 1. 准备数据
X_train = torch.randn(100, 10)
y_train = torch.randint(0, 2, (100,))
# 2. 定义模型
model = SimpleNN(10, 20, 2)
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 4. 训练循环
num_epochs = 100
for epoch in range(num_epochs):
# 前向传播
outputs = model(X_train)
loss = criterion(outputs, y_train)
# 反向传播
optimizer.zero_grad() # 清零梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数
# 打印进度
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 5. 评估模型
model.eval()
with torch.no_grad():
test_outputs = model(X_test)
_, predicted = torch.max(test_outputs, 1)
accuracy = (predicted == y_test).sum().item() / len(y_test)
print(f'Accuracy: {accuracy:.2%}')
🔬 实践环节¶
Notebook 1: 手写神经网络 (01-neural-network.ipynb)¶
内容: 1. 从零实现感知机(不使用PyTorch) 2. 实现MLP并在2D数据集上可视化决策边界 3. 手动推导并实现反向传播 4. 对比不同激活函数的效果 5. 可视化梯度下降过程
数据集: 合成数据(XOR问题、螺旋分类)
预期输出: - 决策边界可视化图 - 损失曲线 - 梯度流可视化
Notebook 2: PyTorch基础 (02-pytorch-basics.ipynb)¶
内容:
1. 张量操作练习(创建、索引、切片、运算)
2. 自动微分机制演示(计算图可视化)
3. 使用nn.Module定义模型
4. 在MNIST数据集上训练手写数字分类器
5. 对比不同优化器的收敛速度
6. 实验正则化技术(Dropout、Weight Decay)
数据集: MNIST(手写数字0-9)
预期输出: - 模型在测试集上达到 >95% 准确率 - 不同优化器的损失曲线对比图 - 正则化效果对比(过拟合vs正常化)
📖 推荐阅读¶
必读¶
- Neural Networks and Deep Learning - Michael Nielsen (免费在线书)
- Deep Learning Book Chapter 6: Deep Feedforward Networks - Goodfellow et al.
- PyTorch官方教程: 60分钟入门
选读¶
- CS231n: Convolutional Neural Networks for Visual Recognition - Stanford大学课程(强烈推荐)
- The Matrix Calculus You Need For Deep Learning - 矩阵微积分速查
- An Overview of Gradient Descent Optimization Algorithms - Sebastian Ruder
❓ 常见问题¶
Q1: 为什么使用ReLU而不是Sigmoid?¶
A: ReLU的优势: 1. 计算快: 只需比较大小,无需指数运算 2. 缓解梯度消失: Sigmoid在输入较大/较小时梯度接近0,ReLU在正区间梯度恒为1 3. 稀疏激活: 约50%的神经元输出为0,提高效率
但ReLU也有**神经元死亡**问题(负区间梯度为0),可用Leaky ReLU缓解。
Q2: 如何选择学习率?¶
A: 学习率选择策略:
1. 经验值: Adam使用0.001,SGD使用0.01-0.1
2. 学习率查找 (Learning Rate Finder): 从很小值开始,逐步增大,绘制loss曲线,选择下降最快的点
3. 学习率调度 (Learning Rate Scheduling):
- StepLR: 每N个epoch降低学习率
- CosineAnnealingLR: 余弦退火
- ReduceLROnPlateau: 验证集loss不下降时降低学习率
PyTorch示例:
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
train(...)
scheduler.step() # 更新学习率
Q3: 过拟合怎么办?¶
A: 常用方法(按优先级): 1. 增加数据: 最有效,考虑数据增强 (Data Augmentation) 2. 正则化: - L2正则化 (weight_decay=1e-4) - Dropout (p=0.5) 3. 简化模型: 减少层数或神经元数量 4. Early Stopping: 验证集loss不下降时停止训练 5. Batch Normalization: 轻微正则化效果
诊断方法: - 绘制训练集vs验证集的loss曲线 - 训练loss持续下降但验证loss上升 → 过拟合
Q4: GPU加速如何使用?¶
A: PyTorch中使用GPU的步骤:
# 1. 检查GPU是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'Using device: {device}')
# 2. 将模型移到GPU
model = model.to(device)
# 3. 将数据移到GPU
X_train = X_train.to(device)
y_train = y_train.to(device)
# 4. 训练(其他代码不变)
outputs = model(X_train) # 自动在GPU上计算
注意事项:
- CPU张量和GPU张量不能直接运算
- 使用.to('cpu')将GPU张量移回CPU(如绘图时)
Q5: 梯度消失/爆炸如何解决?¶
A:
梯度消失 (Gradient Vanishing): - 症状: 训练很慢,loss几乎不下降 - 原因: Sigmoid/Tanh在深层网络中梯度衰减到接近0 - 解决方案: 1. 使用ReLU激活函数 2. Batch Normalization 3. 残差连接 (Residual Connection, ResNet)
梯度爆炸 (Gradient Exploding): - 症状: loss变为NaN或Inf - 原因: 梯度在反向传播中指数增长 - 解决方案: 1. 梯度裁剪 (Gradient Clipping):
2. 降低学习率 3. Batch Normalization🚀 下一步¶
完成本模块后,你可以:
- 📘 继续学习 模块M02: 计算机视觉基础 (
docs/stage4/02-cv-basics/README.md) - 🎯 选择一个深度学习项目开始实践(推荐P02: YOLOv11实时检测)
- 📚 深入阅读 Deep Learning Book 的其他章节
📝 学习检查清单¶
完成以下任务表示你已掌握本模块内容:
- 能解释感知机与MLP的区别
- 能手写反向传播的梯度推导(至少单层)
- 理解常用激活函数的优缺点及适用场景
- 能使用PyTorch定义一个多层神经网络
- 能选择合适的损失函数和优化器
- 理解正则化技术的原理并能应用
- 能诊断并解决过拟合/欠拟合问题
- 能使用GPU加速训练
上一模块: 阶段3模块M04: 机器学习进阶 下一模块: 模块M02: 计算机视觉基础 返回: 阶段4目录