我在Keras中使用keras.regularizers.l1(0.01)
对我的神经网络参数进行L1正则化以获得稀疏模型。我发现,虽然我的许多系数接近为零,但实际上很少有系数为零。
在查看the source code for the regularization时,它表明Keras只是将参数的L1范数添加到损失函数中。
这是不正确的,因为参数几乎肯定不会像L1正则化那样变为零(在浮点误差内)。当参数为零时,L1范数不可微分,因此如果参数设置为零(如果在优化例程中足够接近零),则需要使用次梯度方法。请参阅软阈值运算符max(0, ..)
here。
Tensorflow / Keras是否会这样做,或者这对随机梯度下降是否不切实际?
编辑:here也是一篇精湛的博客文章,解释了L1正则化的软阈值算子。
答案 0 :(得分:4)
所以尽管@Joshua回答,还有其他三件事值得一提:
0
中的渐变没有问题。与keras
案例类似,1
会自动将其设置为relu
。 1e-6
的值实际上等于0
,因为这是float32
精度。由于基于梯度下降算法的性质(以及设置高0
值的计算原因,可能会出现大多数值设置为l1
的问题)由于梯度不连续可能发生的振荡。要理解,对于给定的权重w = 0.005
,您的学习率等于0.01
,主要损失的梯度等于0
w.r.t.到w
。因此,您的体重将按以下方式更新:
w = 0.005 - 1 * 0.01 = -0.05 (because gradient is equal to 1 as w > 0),
并在第二次更新后:
w = -0.005 + 1 * 0.01 = 0.05 (because gradient is equal to -1 as w < 0).
正如您所看到的,即使您应用w
正则化,l1
的绝对值也没有减少,这是由于基于梯度的算法的性质而发生的。当然,这是简化的情况,但在使用l1
规范正则化器时,您经常会遇到这种振荡行为。
答案 1 :(得分:2)
Keras正确实现L1正则化。在神经网络的背景下,L1正则化只是将参数的L1范数添加到损失函数中(参见CS231)。
虽然L1正则化确实鼓励了稀疏性,但它并不能保证输出稀疏。随机梯度下降的参数更新本质上是有噪声的。因此,任何给定参数恰好为0的概率都很小。
然而,L1正则化网络的许多参数通常接近于0.一个基本的方法是将小值阈值设置为0.已经有研究探索更先进的生成稀疏神经网络的方法。在this paper中,作者同时修剪和训练神经网络,以在许多众所周知的网络架构上实现90-95%的稀疏性。
答案 2 :(得分:0)
Keras正确实现L1正则化,但这不是LASSO。对于LASSO,需要一个软阈值函数,如原始帖子中正确指出的那样。对于类似于keras.layers.ThresholdedReLU(theta = 1.0)的函数,它将非常有用,但对于x&gt;而f(x)= x。 θ或f(x)= x,x
答案 3 :(得分:0)
TL; DR: 深度学习框架中的公式是正确的,但是目前我们没有强大的求解器/优化器来精确地使用SGD或其变体进行求解。但是,如果使用近端优化器,则可以获得稀疏解。
您的观察是正确的。
次梯度下降具有非常差的收敛性 非平滑函数,例如套索目标,因为它忽略了 问题结构完全(没有区别 平方拟合和正则项) 整个目标的次梯度。直观地,采取小步骤 在(次)梯度方向上通常不会导致 坐标正好等于零。
tf.train.ProximalAdagradOptimizer
)是否会导致解决方案稀疏,但您可以尝试一下。另一种简单的解决方法是在训练后或在每个梯度下降步骤后强制稀疏将小权重(即绝对值<1e-4)归零。这只是一种方便的启发式方法,从理论上讲并不严格。