共计 1249 个字符,预计需要花费 4 分钟才能阅读完成。
什么是过拟合?
过拟合就像学生死记硬背考试题却不会举一反三——模型在训练集上表现完美(比如准确率 99%),但在新数据上表现糟糕。这通常因为模型过度记忆了训练数据的噪声和细节,而非学习通用规律。
方案一:数据增强(Data Augmentation)
原理说明
通过人工扩展训练数据集,让模型看到更多数据变体。比如对图片进行旋转、裁剪,对文本进行同义词替换,既增加数据多样性又保留原始标签含义。
适用场景
- 数据量不足时(尤其图像分类任务)
- 模型开始记忆特定样本特征时
代码示例(图像增强)
from torchvision import transforms
# 定义增强管道
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(), # 50% 概率水平翻转
transforms.RandomRotation(15), # 随机旋转±15 度
transforms.ColorJitter(brightness=0.2), # 亮度变化
transforms.ToTensor()])
方案二:L1/L2 正则化
原理说明
通过在损失函数中增加权重惩罚项:
– L1(Lasso 回归):促进稀疏权重,适合特征选择
– L2(岭回归):限制权重幅度,适合通用场景
适用场景
- 特征数量远大于样本量时
- 需要控制模型复杂度时
PyTorch 实现
import torch.nn as nn
# L2 正则化(权重衰减)model = nn.Sequential(nn.Linear(100, 50),
nn.ReLU(),
nn.Linear(50, 10)
)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=0.01) # weight_decay 即 λ 系数
方案三:早停法(Early Stopping)
原理说明
监控验证集指标,当连续 N 轮(patience)没有改进时停止训练。需注意:
(横轴 epoch,纵轴 loss,验证集曲线开始上升时停止)
适用场景
- 训练时间长的深度模型
- 难以确定合适 epoch 数时
实现示例
from pytorchtools import EarlyStopping
es = EarlyStopping(patience=5, verbose=True)
for epoch in range(100):
val_loss = validate(model)
es(val_loss, model)
if es.early_stop:
print("早停触发")
break
生产环境避坑指南
- 正则化系数选择
- 从 0.001 开始尝试,按 0.1 倍率调整
-
观察训练 / 验证 loss 差距是否缩小
-
数据增强误区
- 文本增强可能改变语义(如否定词替换)
-
医学影像增强需保真(不能随意翻转)
-
早停法陷阱
- 验证集划分要具有代表性
- 波动较大时可增大 patience 值
思考与实践
- 设计实验:在 MNIST 数据集上分别测试三种方法,记录测试集准确率变化
- 早停优化:当验证 loss 波动±5% 时,可改用滑动平均 loss 判断
正文完
发表至: 未分类
近一天内
