【问题标题】:Add sum of squares of model parameters to loss function将模型参数的平方和添加到损失函数
【发布时间】:2019-08-12 07:54:30
【问题描述】:

已知添加模型权重的平方和是一种正则化方法,可防止深度学习模型过度拟合。 目前我的模型有这个损失函数,它在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 功能。任何帮助将不胜感激。

【问题讨论】:

  • 嗨,如果你有一个矩阵中的所有权重,那么你可以编写一个自定义函数来计算权重的平方和。

标签: python deep-learning pytorch


【解决方案1】:

我相信您指的是 L2 正则化。如果确实如此,则 L2 正则化已添加到 torch(SGD、Adam 等)中的optimizer,您可以使用优化器参数中的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 

【讨论】:

  • 我不知道。谢谢你:)
【解决方案2】:

为了完整起见,正如@asymptote 所提到的,并且可以在 Bishop 的 PRML 书中看到:

二次正则化器的特殊情况称为岭 回归(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

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 2021-09-29
    • 2018-09-03
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多