我在神经网络的 pytorch 实现中测试平方根正则化(前面解释过)。平方根正则化,此后称为 l1/2,就像l2正则化一样,但我没有对权重进行平方,而是取其绝对值的平方根。为了实现它,我在 pytorch 中对损失进行了惩罚:
for p in model.parameters():
loss += lambda * torch.sqrt(p.abs()).sum()
p.abs()是 的绝对值p,即权重,torch.sqrt()是平方根,.sum()是各个权重结果的总和。lambda是惩罚因子。
如果没有正则化,损失会解决0.4。有了,如果我使用 l2 或 l1 正则化lambda=100,损失就会解决。有趣的是,损失的最终值是. 现在,如果我使用具有相同 lambda 的l1/2它会解决0.45lambda=0.0010.445000!这对我来说没有意义。如果正则化是损失中如此重要的因素,那么 SGD 必须降低权重的(绝对值),直到正则化的惩罚与我正在使用的交叉熵损失的实际分类相平衡 -我知道情况并非如此,因为训练和验证的准确性在训练结束时与原始网络(没有正则化)大致相同。我也知道正则化确实发生在所有三种情况下,因为早期时期的损失差异很大)。
这是可以预料的,还是我的代码或 pytorch 的 SGD 中的一些错误?
还有一点注意如果使用l1/2和一个小的lambdalike 0.001,损失会下降到大约0.5,然后变成nan大约 epoch 70。因为lambda=0.01,它变成了~ 1.0,然后nan在同一时期左右。对于,对于这个或任何更高的值(总共 120 个时期)lambda=0.1,损失变为5 但nanlambda不再存在。对于lambda=1.0,损失稳定在 ~ 50- 正如预期的那样:显然权重稳定在它们的平方根之和等于 ~ 的点上50,不管lambda......
