欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对L1,L2正则化和dropout的理解

程序员文章站 2022-07-13 10:38:10
...

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