2017-03-31 42 views
7

我在Keras的神经网络参数上使用L1正则化与keras.regularizers.l1(0.01)来获得稀疏模型。我发现,虽然我的许多系数是关闭归零,但其中很少是实际为零。Keras/Tensorflow中的L1正则化*真正* L1正则化吗?

看着the source code for the regularization,它表明Keras只是将参数的L1范数添加到损失函数中。

这将是不正确的,因为这些参数几乎可以肯定不会像L1正则化那样变为零(在浮点错误之内)。当一个参数为零时,L1范数是不可微分的,所以如果在优化程序中接近零的地方将参数设置为零,则需要使用次梯度方法。请参阅软阈值运算符max(0, ..)here

Tensorflow/Keras是否这样做,或者这对于随机梯度下降不切实际?

编辑:另外here是一个很好的博客文章,解释L1正则化的软阈值运算符。

+0

'L1'正则化很好。 L1鼓励稀疏性超过L2,但肯定不能保证。 theano和tensorflow都经过了很好的测试,当然在非微分点附近处理梯度也很好。 – y300

+0

我认为你是正确的,它的实施方式并没有使权重实际上达到零。这很不幸。 – Aaron

+0

您如何在“您的”代码中使用正规化器? –

回答

0

Keras正确实现L1正则化。在神经网络的情况下,L1正则化简单地将参数的L1范数与损失函数相加(见CS231)。

虽然L1正则化确实鼓励稀疏性,但它并不能保证输出将是稀疏的。来自随机梯度下降的参数更新本质上是有噪声的。因此,任何给定参数恰好为0的概率是微乎其微的。

然而,L1正则化网络的许多参数通常接近于0.一个基本的方法是将小值设为0。已经有研究探索更先进的生成稀疏神经网络的方法。在this paper中,作者同时修剪并训练了一个神经网络,以在众多众所周知的网络体系结构上实现90-95%的稀疏性。

2

所以尽管@Joshua答案,还有其他的三件事情是值得一提:

  1. 没有在0用渐变连接问题。 keras自动将其设置为1类似于relu的情况。
  2. 请记住,小于1e-6的值实际上等于0,因为这是float32的精度。
  3. 由于计算原因,由于基于梯度下降的算法的性质(并且设置高值,由于可能由于梯度而可能发生的振荡),可能会出现不将大部分值设置为0的问题间断。要理解想象,对于给定的体重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标准正则化转换器时,您可能经常会遇到这种振荡行为。