本文为参与DataWhale组队学习期间,对李宏毅教授《深度学习》课程第2章"实践方法论"的学习总结。内容基于个人理解整理,主要面向深度学习初学者。
一、训练问题诊断方法论
1.1 问题定位流程
1.2 关键指标对照表
现象 | 训练损失 | 验证损失 | 问题类型 |
---|---|---|---|
模型欠拟合 | 高 | 高 | 模型偏差 |
优化失败 | 高 | 高 | 局部最优 |
典型过拟合 | 低 | 高 | 模型复杂度过高 |
数据不匹配 | 低 | 中 | 分布差异 |
二、模型偏差与优化问题
2.1 模型复杂度验证
残差网络对比实验(基于ResNet论文复现):
# 残差块实现
class BasicBlock(nn.Module):
def __init__(self, inplanes, planes):
super().__init__()
self.conv1 = nn.Conv2d(inplanes, planes, 3, padding=1)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, 3, padding=1)
self.bn2 = nn.BatchNorm2d(planes)
def forward(self, x):
identity = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += identity
return F.relu(out)
2.2 优化失败验证方法
层数对比实验(CIFAR-10数据集):
网络深度 | 训练损失 | 验证准确率 | 结论 |
---|---|---|---|
20层 | 0.15 | 72.3% | 基准模型 |
56层 | 0.38 | 68.1% | 优化失败 |
56层+残差 | 0.12 | 75.6% | 优化改进 |
三、过拟合解决方案
3.1 正则化技术对比
方法 | 数学表达 | PyTorch实现 |
---|---|---|
L2正则化 | L′=L+λ2∣w∣2L' = L + \frac{\lambda}{2}|w|^2L′=L+2λ∣w∣2 | optim = torch.optim.Adam(model.parameters(), weight_decay=1e-4) |
Dropout | hi={0phi1−potherwiseh_i = \begin{cases} 0 & p \\ \frac{h_i}{1-p} & \text{otherwise} \end{cases}hi={01−phipotherwise | nn.Dropout(p=0.5) |
早停法 | - | EarlyStopping(patience=10) |
3.2 数据增强实践
图像增强示例:
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor()
])
四、交叉验证实现
4.1 K折交叉验证流程
4.2 代码实现示例
from sklearn.model_selection import KFold
kf = KFold(n_splits=5)
for fold, (train_idx, val_idx) in enumerate(kf.split(dataset)):
train_subsampler = SubsetRandomSampler(train_idx)
val_subsampler = SubsetRandomSampler(val_idx)
train_loader = DataLoader(dataset, sampler=train_subsampler)
val_loader = DataLoader(dataset, sampler=val_subsampler)
# 训练与验证流程
五、数据不匹配检测
5.1 分布差异分析方法
方法 | 适用场景 | 实现工具 |
---|---|---|
KL散度 | 概率分布差异 | scipy.stats.entropy |
TSNE可视化 | 高维数据分布 | sklearn.manifold.TSNE |
分类器检测 | 特征空间差异 | 训练二分类模型 |
5.2 领域适应解决方案
# 领域对抗训练示例
class DANN(nn.Module):
def __init__(self):
super().__init__()
self.feature_extractor = nn.Sequential(...)
self.domain_classifier = nn.Sequential(...)
self.task_classifier = nn.Sequential(...)
def forward(self, x, alpha):
features = self.feature_extractor(x)
reverse_features = GradientReversal.apply(features, alpha)
domain_output = self.domain_classifier(reverse_features)
task_output = self.task_classifier(features)
return task_output, domain_output
六、实践案例:时间序列预测
6.1 模型架构设计
class TemporalModel(nn.Module):
def __init__(self, input_size, hidden_size):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.regressor = nn.Linear(hidden_size, 1)
def forward(self, x):
out, _ = self.lstm(x) # (batch, seq_len, hidden_size)
return self.regressor(out[:, -1, :])
6.2 异常点处理策略
# 滑动窗口检测
def detect_anomalies(series, window_size=30):
rolling_mean = series.rolling(window=window_size).mean()
residuals = series - rolling_mean
return np.abs(residuals) > 3 * residuals.std()
关键结论:
- 模型性能诊断需建立系统化分析流程
- 优化失败需通过架构改进(如残差连接)解决
- 数据不匹配问题需要专门的领域适应方法
- 交叉验证是模型选择的黄金标准
扩展阅读:
- 《Deep Learning》Chapter 7: Regularization
- PyTorch官方教程:Optimization Recipes
- ICML 2015: Domain-Adversarial Training
版权声明:本文实验数据基于CIFAR-10、NASDAQ公开数据集,代码实现参考PyTorch官方文档,遵循MIT协议发布