共计 1346 个字符,预计需要花费 4 分钟才能阅读完成。
过拟合的数学判定
过拟合现象可通过训练误差和验证误差的对比来判定。设训练损失为 $L_{train}$,验证损失为 $L_{val}$,当满足以下条件时判定为过拟合:

$$ L_{train} \ll L_{val} $$
且两者的差值持续增大。典型表现为训练准确率持续上升时,验证准确率开始下降。
Dropout 神经元随机失活
- 在前向传播时以概率 $p$ 随机丢弃神经元
- PyTorch 实现只需在网络中添加
nn.Dropout(p=0.5)层 - 效果上等价于训练时对多个子网络进行集成
L1/L2 正则化的权重惩罚
- L2 正则化(权重衰减):$L = L_0 + \lambda\sum w_i^2$
- L1 正则化:$L = L_0 + \lambda\sum |w_i|$
- 关键差异:L1 会产生稀疏权重,L2 使权重均匀减小
Early Stopping 机制
- 当验证损失连续 $N$ 个 epoch 不下降时终止训练
- 典型阈值设置:$N=10$(需根据数据集调整)
- 需注意验证集比例建议保持在 20%-30%
数据增强策略
- 图像数据常用增强组合:
- 随机水平翻转
- 色彩抖动(亮度 / 对比度调整)
- 随机裁剪(需保持主体完整性)
- 过度增强会导致语义失真
Batch Normalization
- 通过标准化每层的输入分布来稳定训练
- 计算公式:$\hat{x} = \frac{x – E[x]}{\sqrt{Var[x] + \epsilon}}$
- 允许使用更大的学习率
模型集成方法
- Bagging:并行训练多个模型(如随机森林)
- Boosting:序列化训练(如 AdaBoost)
- 深度学习常用 Snapshot Ensemble 等变体
迁移学习技巧
- 冻结预训练网络的特征提取层
- 仅微调最后的全连接层
- 适合小样本场景
PyTorch 实现示例
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 512)
self.dropout = nn.Dropout(0.5) # Dropout 层
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.dropout(x) # 应用 Dropout
return self.fc2(x)
# 带 L2 正则化的优化器
optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
weight_decay=1e-4 # L2 系数
)
性能对比测试
| 方法 | CIFAR-10 准确率 | 训练时间增幅 |
|---|---|---|
| Baseline | 78.2% | – |
| +Dropout | 82.1% | +15% |
| +L2 Regularization | 81.7% | +5% |
| +Data Augmentation | 83.4% | +20% |
实践避坑指南
- 学习率与正则化协同:
- 高学习率需要配合更强的正则化
-
建议初始设置:lr=0.001, weight_decay=1e-4
-
验证集划分原则:
- Early Stopping 需要足够大的验证集
-
小数据集建议使用交叉验证
-
数据增强边界:
- 避免旋转角度超过±30 度
- 色彩抖动不宜超过原始值 20%
延伸思考
- 混合欠拟合 / 过拟合诊断:
- 检查训练 loss 是否收敛
-
分析各层权重分布
-
小样本场景优选方案:
- 迁移学习 + 轻量数据增强
- 模型蒸馏技术
正文完
发表至: 未分类
近两天内
