✅ 什么是“正则化”?
在神经网络中,正则化(Regularization)= 抑制过拟合的技巧
目的是让模型在训练集和测试集上都表现得好(泛化能力强)。
🧠 常见的正则化手段包括:
方法 | 类型 | 通常放在哪里? | 作用 |
---|---|---|---|
L1 / L2 正则项 | 权重正则 | 优化器参数中 | 控制权重大小,避免过拟合 |
Dropout | 激活正则 | 通常放在全连接层或 ReLU 后 | 随机屏蔽神经元,增加鲁棒性 |
BatchNorm | 激活正则 + 稳定训练 | Conv/Linear 后、ReLU 前 | 归一化激活分布,加快训练 |
Data Augmentation | 输入层面 | 数据加载阶段 | 扩展数据多样性 |
Early Stopping | 训练控制 | 训练过程监控 | 防止模型训练太过拟合 |
Weight Decay | 权重正则 | Optimizer 中设置 | 相当于 L2 正则 |
✅ 那“放在哪里”呢?逐个来看:
🔸 1. L1 / L2 正则(Weight Decay)
放在:优化器设置中
代码示例:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
作用在模型所有可训练权重上
不影响网络结构,只影响训练时的权重更新
🔸 2. Dropout
通常放在:Linear 或 ReLU 后面
不能放在卷积层后直接用(容易丢信息)
nn.Linear(128, 64), nn.ReLU(), nn.Dropout(p=0.5),
注意:训练时才启用 Dropout,验证/测试时自动关闭
🔸 3. BatchNorm
放在 Conv/Linear 输出后,ReLU 前
在训练和测试阶段行为不同(训练时统计均值方差)
🔸 4. Data Augmentation
放在数据加载前,例如:
transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), ])
与模型结构无关,但非常有效
🔸 5. Early Stopping
放在训练 loop 外部控制,基于验证集监控性能
✅ 一个典型的结构示例
nn.Conv2d(3, 16, 3, padding=1), nn.BatchNorm2d(16), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(512, 128), nn.BatchNorm1d(128), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(128, 10) # 输出层,不加正则
✅ 总结一句话:
正则化是“无处不在”的,但每种方法都在“它该在的地方”。
正则化类型 | 该放哪里 |
---|---|
Dropout | Linear/ReLU 后 |
BatchNorm | Conv/Linear 后,ReLU 前 |
L2 | Optimizer 里 |
Augmentation | 数据预处理阶段 |
EarlyStopping | 训练 loop 外 |