Neural network 对于chainer或pytorch中的不同权重集,是否可以使用不同的L1/L2正则化参数?

Neural network 对于chainer或pytorch中的不同权重集,是否可以使用不同的L1/L2正则化参数?,neural-network,pytorch,Neural Network,Pytorch,(例如)在pytorch中将noutput目标值的简单线性模型作为神经网络实施时: l1=L.Linear(ninput, noutput) (电话) 添加此钩子将对所有权重执行L2正则化,在所有位置施加相同的alpha=0.01: optimizer.add_hook(optimizer.WeightDecay(rate=0.01)) 对于从所有ninput输入单元到其中一个noutput输出单元的每组权重,是否可以使用不同的alpha?因为我们在pytorch中工作,所以可以自己添加其他

(例如)在pytorch中将
noutput
目标值的简单线性模型作为神经网络实施时:

l1=L.Linear(ninput, noutput)
(电话)

添加此钩子将对所有权重执行L2正则化,在所有位置施加相同的alpha=0.01:

optimizer.add_hook(optimizer.WeightDecay(rate=0.01))

对于从所有
ninput
输入单元到其中一个
noutput
输出单元的每组权重,是否可以使用不同的alpha?

因为我们在pytorch中工作,所以可以自己添加其他标量来损失函数。所以假设你的损失是L(假设它是交叉熵损失),你有一个线性层,定义为:

l1 = nn.Linear(in,out)
现在,如果您想对每组权重进行不同的正则化,那么您所要做的就是使用(即使用索引选择)收集权重,并将其添加到最终损失中:

loss = L (crossentropy loss) + sum ( alpha * norm(l1.weight[k]))

alpha超参数和范数主要是L2范数,在pytorch中,它只是
torch.norm(l1.weight)
其中索引k是要选择的权重指数的张量。最后,您不需要像在代码中那样进行全局正则化。

因为我们在pytorch中工作,所以您可以自己添加其他标量来丢失函数。所以假设你的损失是L(假设它是交叉熵损失),你有一个线性层,定义为:

l1 = nn.Linear(in,out)
现在,如果您想对每组权重进行不同的正则化,那么您所要做的就是使用(即使用索引选择)收集权重,并将其添加到最终损失中:

loss = L (crossentropy loss) + sum ( alpha * norm(l1.weight[k]))

alpha超参数和范数主要是L2范数,在pytorch中,它只是
torch.norm(l1.weight)
其中索引k是要选择的权重指数的张量。最后,您不需要像在代码中那样进行全局正则化。

OP没有要求在不同的层中进行不同的正则化。这个问题要求对单个层中的每个输出权重使用不同的正则化器。。我想我看错问题了。我编辑了我的答案。谢谢你指出@layougthanks!事实上,我们可以自己实现权重正则化,并将其作为损失函数的一部分。很好很干净的解决方案。OP没有要求在不同的层中进行不同的正则化。这个问题要求对单个层中的每个输出权重使用不同的正则化器。。我想我看错问题了。我编辑了我的答案。谢谢你指出@layougthanks!事实上,我们可以自己实现权重正则化,并将其作为损失函数的一部分。漂亮干净的解决方案。