? 什么是“正則化”?
在神經網絡中,正則化(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 外 |