平方根正则化和高损失

数据挖掘 神经网络 损失函数 火炬 正则化
2022-02-24 04:14:13

我在神经网络的 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......

1个回答

使用问题Lp规范与p<1正则化是梯度

正则化项用于强制参数接近零。为此,当一个参数接近零时,正则化项的梯度,即它在更新参数中的贡献,也应该减小或至少保持不变。

然而,通过接近零,梯度无限增加p<1,这会导致参数发生根本变化,从而导致您的观察。这是根的可视化图r, 绝对a, 并平方s一维正则化项(在此处绘制):

在此处输入图像描述

正如你所看到的,对于根正则化,当我们接近零时,梯度会爆炸到无穷大,这与我们将参数接近零的意图相冲突。

为了完整起见,下面是带有根正则化的一维参数更新的样子:

θn+1=θn+αdL(θ)dθ|θ=θn=θn+α(dl(θ)dθ|θ=θn±λ1|θn|)
在哪里L(θ)=l(θ)+λ|θ|.

你可以发现问题!我们越接近零,我们就越接近零!