【发布时间】:2020-04-15 08:37:31
【问题描述】:
我正在尝试在神经网络中手动实现 L2 正则化及其一些变体。我正在做的事情如下:
for name, param in model.state_dict():
if 'weight' in name:
l2_reg += torch.sum(param**2)
loss = cross_entropy(outputs, labels) + 0.0001*l2_reg
这是否等同于在我的优化器中添加“weight_decay = 0.0001”?即:
torch.optim.SGD(model.parameters(), lr=learning_rate , momentum=0.9, weight_decay = 0.0001)
我的问题是我认为它们是等价的,但手动过程比添加“weight_decay = 0.0001”慢了大约 100 倍。这是为什么?我该如何解决?
请注意,我还需要实现我自己的 L2 正则化变体,因此仅添加 'weight_decay = 0.0001' 无济于事。
【问题讨论】:
-
你确定它们是等价的吗?
-
不,我不是。我也尝试过使用 torch.norm(param)**2,但它也比在 SGD 函数中添加“weight_decay = lambda”要慢得多。我该如何解决这个问题?
标签: performance neural-network pytorch