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