zoukankan      html  css  js  c++  java
  • 对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
    
    
  • 相关阅读:
    C语言第五次作业
    C语言第四次作业
    C语言第三次作业

    第一次作业
    C语言第五次作业
    C语言第四次作业
    C语言第三次作业
    C语言理论作业—2
    燕勇鹏-160809318
  • 原文地址:https://www.cnblogs.com/ailitao/p/11787539.html
Copyright © 2011-2022 走看看