将模型参数的平方和添加到损失函数

时间:2019-08-12 07:54:30

标签: python deep-learning pytorch

已知增加模型权重的平方和是一种防止深度学习模型过度拟合的正则化方法。 目前,我的模型具有此损失函数,该函数在pytorch中实现:

lossfunc = nn.NLLLoss(ignore_index=0)

然后我像这样计算训练损失:

 ... 
loss = lossfunc(out_perm, dec_pp[:,1:])

我想成为像这样的人

loss = lossfunc(out_perm, dec_pp[:,1:])+sum_square_wights(enc)+sum_square_wights(dec)

但是不知道如何实现sum_square_wights函数。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我相信您是指L2正则化。如果确实如此,则L2正则化已添加到割炬的optimizer(SGD,Adam等)中,并且您可以使用优化器参数中weight_decay的非零值来控制它。

关于L1正则化,应该执行以下操作:

l1_criterion = nn.L1Loss(size_average=False)
l1_reg_loss = 0
for param in model.parameters():
    l1_reg_loss += l1_criterion (param)

lambda = 0.0005
loss += lambda * l1_reg_loss 

答案 1 :(得分:1)

为完整起见,如@asymptote所述,在Bishop的PRML书中可以看到:

二次正则器的特殊情况称为ridge 回归(Hoerl和Kennard,1970年)。在神经环境中 网络,这种方法称为重量衰减。

对于好奇的读者,我们可以使用L2正则化损失函数,如下所示:

criterion = torch.nn.MSELoss()
lmbd = 1e-8  # for custom L2 regularization
loss = criterion(y_pred, y_train)

reg_loss = None
for param in model.parameters():
    if reg_loss is None:
        reg_loss = torch.sum(param ** 2)
    else:
        reg_loss = reg_loss + param.norm(2) ** 2

loss += lmbd * reg_loss