對L1,L2正則化和dropout的理解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章