L1L2正則化
L1,L2正則化目的是爲了防止過擬合。爲何會出現過擬合?答:權重過大。所以L1和L2正則化就是用來防止權重過大的。
他們是怎麼做的呢?
很簡單:我們優化參數都是通過最小化損失函數來優化,那麼只要我通過某種策略把“防止權重過大”這個目的也加入到損失函數中就可以。
L1正則化是這樣做的:loss = 損失函數+權重的絕對值之和
L2正則化是這樣做的:loss = 損失函數+權重的平方和再開根號
注意我們的目標是最小化loss。所以當權重過大時loss自然會很大,而優化算法會讓loss變小自然會讓權重變小。
L1正則化pytorch實現
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(torch.abs(param))
L2正則化pytorch優化器都幫我們實現了,只要weight_decay這個參數不爲0即可。
dropout
這從名字就可以看出這個算法怎麼做的。就是神經網絡會在訓練過程中會剔除一些邊。這樣就能防止過擬合
def __init__(self):
super(mnist_model, self).__init__()
self.feats = nn.Sequential(
nn.Conv2d(1, 32, 5, 1, 1),
nn.MaxPool2d(2, 2),
nn.ReLU(True),
nn.BatchNorm2d(32),
nn.Conv2d(32, 64, 3, 1, 1),
nn.ReLU(True),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, 3, 1, 1),
nn.MaxPool2d(2, 2),
nn.ReLU(True),
nn.BatchNorm2d(64),
nn.Conv2d(64, 128, 3, 1, 1),
nn.ReLU(True),
nn.BatchNorm2d(128)
)
self.classifier = nn.Conv2d(128, 10, 1)
self.avgpool = nn.AvgPool2d(6, 6)
self.dropout = nn.Dropout(0.5) # 每條邊剔除的概率是0.5