预计时长:6-8周
目标:掌握神经网络原理,熟练使用PyTorch进行模型开发
| 主题 | 内容 | 重要程度 |
|---|---|---|
| 感知机 | 单层线性分类器 | ⭐⭐⭐ |
| 多层感知机(MLP) | 多层全连接网络 | ⭐⭐⭐⭐⭐ |
| 前向传播 | 输入→隐藏层→输出 | ⭐⭐⭐⭐⭐ |
| 通用逼近定理 | MLP可拟合任意函数 | ⭐⭐⭐ |
输入层 隐藏层1 隐藏层2 输出层
x1 ────┐ ┌──── h1 ────┐ ┌──── h1 ────┐ ┌──── y1
x2 ────┼────┼──── h2 ────┼───┼──── h2 ────┼───┼──── y2
x3 ────┼────┼──── h3 ────┼───┼──── h3 ────┘ └──── y3
... │ └──── ... ───┘ └──── ... ───────────────
xn ────┘
| 激活函数 | 公式 | 优点 | 缺点 | 使用场景 |
|---|---|---|---|---|
| Sigmoid | σ(x) = 1/(1+e^(-x)) | 输出(0,1) | 梯度消失、非零中心 | 二分类输出 |
| Tanh | tanh(x) | 零中心 | 梯度消失 | 早期RNN |
| ReLU | max(0,x) | 计算快、缓解梯度消失 | 死神经元 | 默认选择 |
| LeakyReLU | max(αx,x) | 避免死神经元 | α需调参 | 替代ReLU |
| GELU | x·Φ(x) | 平滑、效果好 | 计算稍慢 | Transformer |
| Swish | x·σ(x) | 平滑、效果好 | 计算稍慢 | 现代网络 |
- 理解各激活函数的特点
- 知道什么时候选择什么激活函数
- 手写实现各激活函数及其导数
| 主题 | 内容 | 重要程度 |
|---|---|---|
| 计算图 | 前向计算的图表示 | ⭐⭐⭐⭐⭐ |
| 链式法则 | 复合函数求导 | ⭐⭐⭐⭐⭐ |
| 梯度反向传播 | 从输出到输入传播梯度 | ⭐⭐⭐⭐⭐ |
| 梯度消失/爆炸 | 深层网络的问题 | ⭐⭐⭐⭐ |
前向传播:
z = Wx + b
a = σ(z)
反向传播:
∂L/∂W = ∂L/∂a · ∂a/∂z · ∂z/∂W
= δ · x^T
其中 δ = ∂L/∂z(误差信号)
- 理解计算图和自动微分
- 手推简单网络的反向传播
- 理解梯度消失/爆炸的原因
| 损失函数 | 公式 | 使用场景 |
|---|---|---|
| MSE | mean((y-ŷ)²) | 回归问题 |
| MAE | mean(|y-ŷ|) | 回归(对异常值鲁棒) |
| 交叉熵 | -Σy·log(ŷ) | 分类问题 |
| 二元交叉熵 | -[y·log(ŷ)+(1-y)·log(1-ŷ)] | 二分类 |
| Focal Loss | -α(1-p)^γ·log(p) | 类别不平衡 |
| Hinge Loss | max(0, 1-y·ŷ) | SVM |
SGD → Momentum → NAG → AdaGrad → RMSprop → Adam → AdamW
│ │ │ │ │
│ 加速收敛 自适应学习率 结合两者 权重衰减解耦
| 优化器 | 特点 | 适用场景 | 重要程度 |
|---|---|---|---|
| SGD | 简单,需调学习率 | 调参充分时效果最好 | ⭐⭐⭐⭐ |
| SGD+Momentum | 加速收敛 | 通用 | ⭐⭐⭐⭐ |
| Adam | 自适应,收敛快 | 默认选择 | ⭐⭐⭐⭐⭐ |
| AdamW | Adam+解耦权重衰减 | Transformer | ⭐⭐⭐⭐⭐ |
m_t = β1·m_{t-1} + (1-β1)·g_t # 一阶动量
v_t = β2·v_{t-1} + (1-β2)·g_t² # 二阶动量
m̂_t = m_t / (1-β1^t) # 偏差校正
v̂_t = v_t / (1-β2^t)
θ_t = θ_{t-1} - α·m̂_t / (√v̂_t + ε)
- 理解各优化器的原理
- 手写实现SGD和Adam
- 在实验中对比不同优化器
| 操作类型 | 常用函数 | 重要程度 |
|---|---|---|
| 创建张量 | torch.tensor, zeros, ones, randn | ⭐⭐⭐⭐⭐ |
| 形状操作 | view, reshape, squeeze, unsqueeze | ⭐⭐⭐⭐⭐ |
| 索引切片 | 基本索引, 高级索引 | ⭐⭐⭐⭐⭐ |
| 数学运算 | 加减乘除, matmul, sum, mean | ⭐⭐⭐⭐⭐ |
| 设备管理 | .to(device), .cuda(), .cpu() | ⭐⭐⭐⭐⭐ |
import torch
# 创建张量
x = torch.randn(3, 4)
y = torch.zeros(3, 4)
# 形状操作
x = x.view(2, 6)
x = x.unsqueeze(0) # 增加维度
# GPU操作
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = x.to(device)
# 矩阵运算
z = torch.matmul(x, y.T)| 概念 | 说明 | 重要程度 |
|---|---|---|
| requires_grad | 是否需要计算梯度 | ⭐⭐⭐⭐⭐ |
| backward() | 反向传播计算梯度 | ⭐⭐⭐⭐⭐ |
| grad | 存储梯度 | ⭐⭐⭐⭐⭐ |
| no_grad() | 禁用梯度计算 | ⭐⭐⭐⭐⭐ |
| detach() | 从计算图分离 | ⭐⭐⭐⭐ |
# 自动微分
x = torch.randn(3, requires_grad=True)
y = x ** 2 + 2 * x + 1
loss = y.sum()
loss.backward()
print(x.grad) # dy/dx = 2x + 2
# 禁用梯度(推理时)
with torch.no_grad():
output = model(input)import torch.nn as nn
class MLP(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__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
# 使用Sequential
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10)
)from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):
def __init__(self, data, labels):
self.data = data
self.labels = labels
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx], self.labels[idx]
# DataLoader
dataset = CustomDataset(X, y)
dataloader = DataLoader(
dataset,
batch_size=32,
shuffle=True,
num_workers=4
)
for batch_x, batch_y in dataloader:
# 训练代码
passimport torch
import torch.nn as nn
from torch.optim import Adam
# 模型、损失函数、优化器
model = MLP(784, 256, 10).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=0.001)
# 训练循环
num_epochs = 10
for epoch in range(num_epochs):
model.train()
total_loss = 0
for batch_x, batch_y in train_loader:
batch_x, batch_y = batch_x.to(device), batch_y.to(device)
# 前向传播
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
# 验证
model.eval()
with torch.no_grad():
val_loss = 0
correct = 0
for batch_x, batch_y in val_loader:
outputs = model(batch_x)
val_loss += criterion(outputs, batch_y).item()
pred = outputs.argmax(dim=1)
correct += (pred == batch_y).sum().item()
accuracy = correct / len(val_loader.dataset)
print(f'Epoch {epoch+1}: Train Loss={total_loss:.4f}, Val Acc={accuracy:.4f}')# 保存模型
torch.save(model.state_dict(), 'model.pth')
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss,
}, 'checkpoint.pth')
# 加载模型
model.load_state_dict(torch.load('model.pth'))
checkpoint = torch.load('checkpoint.pth')
model.load_state_dict(checkpoint['model_state_dict'])| 组件 | 作用 | 重要程度 |
|---|---|---|
| 卷积层 | 局部特征提取 | ⭐⭐⭐⭐ |
| 池化层 | 下采样、降维 | ⭐⭐⭐⭐ |
| BatchNorm | 稳定训练 | ⭐⭐⭐⭐⭐ |
| 残差连接 | 解决梯度消失 | ⭐⭐⭐⭐⭐ |
| 网络 | 年份 | 特点 | 了解程度 |
|---|---|---|---|
| LeNet | 1998 | 开创性工作 | 了解 |
| AlexNet | 2012 | 深度学习复兴 | 了解 |
| VGG | 2014 | 3x3卷积堆叠 | 了解 |
| ResNet | 2015 | 残差连接 | 重点理解 |
| EfficientNet | 2019 | 复合缩放 | 了解 |
- 理解卷积运算的原理
- 理解残差连接的作用
- 能读懂CNN相关代码
| 主题 | 内容 | 重要程度 |
|---|---|---|
| RNN原理 | 序列处理、隐状态传递 | ⭐⭐⭐⭐⭐ |
| 梯度问题 | 梯度消失/爆炸 | ⭐⭐⭐⭐⭐ |
| LSTM | 门控机制解决长期依赖 | ⭐⭐⭐⭐⭐ |
| GRU | LSTM简化版 | ⭐⭐⭐⭐ |
| 双向RNN | 前向+后向信息 | ⭐⭐⭐⭐ |
h_t = tanh(W_hh · h_{t-1} + W_xh · x_t + b)
y_t = W_hy · h_t + b_y
遗忘门: f_t = σ(W_f · [h_{t-1}, x_t] + b_f)
输入门: i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
候选值: C̃_t = tanh(W_C · [h_{t-1}, x_t] + b_C)
细胞状态: C_t = f_t * C_{t-1} + i_t * C̃_t
输出门: o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
隐状态: h_t = o_t * tanh(C_t)
import torch.nn as nn
# LSTM层
lstm = nn.LSTM(
input_size=128,
hidden_size=256,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.2
)
# 前向传播
output, (h_n, c_n) = lstm(input_seq)
# output: (batch, seq_len, hidden_size*2)
# h_n: (num_layers*2, batch, hidden_size)- 理解RNN处理序列的原理
- 理解LSTM门控机制
- 用LSTM实现文本分类
| 技术 | 作用 | 使用场景 | 重要程度 |
|---|---|---|---|
| Dropout | 随机丢弃神经元 | 全连接层 | ⭐⭐⭐⭐⭐ |
| BatchNorm | 批量归一化 | CNN | ⭐⭐⭐⭐⭐ |
| LayerNorm | 层归一化 | Transformer/RNN | ⭐⭐⭐⭐⭐ |
| Weight Decay | L2正则化 | 通用 | ⭐⭐⭐⭐ |
| Early Stopping | 提前停止 | 通用 | ⭐⭐⭐⭐ |
BatchNorm: 对batch维度归一化,训练测试行为不同
LayerNorm: 对特征维度归一化,训练测试行为相同
Transformer使用LayerNorm因为:
1. 序列长度可变
2. batch_size可能很小
3. 训练测试一致性
目标:用MLP和CNN实现手写数字分类
要求:
- 构建简单MLP达到95%+准确率
- 构建CNN达到99%+准确率
- 实现完整训练流程
目标:用LSTM实现电影评论情感分类
要求:
- 文本预处理和词向量
- 构建LSTM分类模型
- 达到85%+准确率
完成以下任务后,进入阶段四:
-
神经网络原理
- 理解前向传播和反向传播
- 手推简单网络的梯度
- 了解各激活函数和优化器
-
PyTorch
- 熟练使用张量操作
- 能够构建自定义Dataset和DataLoader
- 能够独立编写完整训练循环
- 会保存和加载模型
-
网络架构
- 了解CNN基本结构
- 理解LSTM门控机制
- 实现文本分类任务
-
实践项目
- 完成MNIST分类(准确率99%+)
- 完成IMDB情感分类(准确率85%+)
完成本阶段后,进入阶段四:NLP基础