共计 1692 个字符,预计需要花费 5 分钟才能阅读完成。
1. 背景与痛点:为什么我们需要对抗过拟合?
过拟合就像学生死记硬背考试题,遇到新题目就束手无策。具体表现为:
- 训练集准确率很高(比如 98%),但测试集骤降(比如 60%)
- 模型记住了训练数据的噪声和异常值
- 决策边界呈现不自然的锯齿状(如下图左)

2. 五大防治武器库
2.1 Dropout:随机让神经元「失明」
原理:前向传播时以概率 p(常用 0.5)随机关闭神经元,迫使网络不依赖特定神经元。好比团队中随机有人请假,迫使每个人都能独当一面。
PyTorch 实现:
import torch.nn as nn
model = nn.Sequential(nn.Linear(784, 256),
nn.ReLU(),
nn.Dropout(p=0.5), # 关键代码
nn.Linear(256, 10)
)
2.2 L1/L2 正则化:给参数戴上「紧箍咒」
- L2(权重衰减):惩罚大权重,使参数分布更平滑
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5) # L2 系数 - L1:会产生稀疏解,适合特征选择
2.3 数据增强:给模型制造「幻觉」
CV 常用技巧:
– 随机裁剪(RandomCrop)
– 颜色抖动(ColorJitter)
– 水平翻转(HorizontalFlip)
NLP 对应方法:
– 同义词替换
– 随机插入 / 删除
– 回译(中 -> 英 -> 中)
2.4 早停法:在成绩下滑前收手
监控验证集 loss,当连续 N 次(patience)不下降时停止训练:
from pytorch_lightning.callbacks import EarlyStopping
early_stop = EarlyStopping(
monitor='val_loss',
patience=5, # 容忍轮次
mode='min'
)
2.5 批标准化:稳定神经元的「饮食」
BN 层通过标准化每批数据的分布,减少内部协变量偏移:
nn.Sequential(nn.Linear(784, 256),
nn.BatchNorm1d(256), # 关键层
nn.ReLU())
3. 实验对比:方法效果可视化
| 方法 | 训练集 Acc | 测试集 Acc | 过拟合程度 |
|---|---|---|---|
| 原始模型 | 99.2% | 82.3% | 严重 |
| +Dropout | 95.1% | 88.7% | 中等 |
| +L2 正则化 | 93.8% | 89.2% | 较轻 |
| 组合使用 | 91.5% | 90.1% | 轻微 |
4. 生产环境落地建议
- 小数据集 :优先数据增强 + 早停
- 高维特征 :L1 正则化做特征选择
- 深层网络 :Dropout+BN 组合拳
超参数调优技巧:
1. Dropout 率从 0.3-0.5 开始尝试
2. L2 系数在 1e- 4 到 1e- 2 之间搜索
3. BN 层放在激活函数前效果更好
5. 代码实战:PyTorch 完整示例
# 定义带防护措施的模型
class SafeNet(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(nn.Linear(784, 512),
nn.BatchNorm1d(512),
nn.ReLU(),
nn.Dropout(0.4),
nn.Linear(512, 256),
nn.BatchNorm1d(256),
nn.ReLU(),
nn.Linear(256, 10)
)
def forward(self, x):
return self.layers(x)
# 训练配置
model = SafeNet()
optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
weight_decay=1e-4) # L2 正则
criterion = nn.CrossEntropyLoss()
# 早停回调
early_stopping = EarlyStopping(
patience=10,
verbose=True
)
6. 延伸思考
其他可能的方向:
– 模型蒸馏(用大网络指导小网络)
– 半监督学习(利用无标签数据)
– 网络结构搜索(自动设计合适容量的模型)
建议从 MNIST 数据集开始实验,逐步尝试不同方法的组合效果。记住:防治过拟合就像调理身体,需要多种方法协同作用才能达到最佳效果。
正文完
发表至: 未分类
近一天内
