对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

原文地址:https://www.cnblogs.com/ailitao/p/11787539.html