Keras/Tensorflow*中的L1正则化真的是*L1正则化吗?

Cok*_*kes 12 machine-learning neural-network deep-learning keras tensorflow

我在Keras的神经网络参数上使用L1正则化keras.regularizers.l1(0.01)来获得稀疏模型.我发现,虽然我的许多系数接近于零,但实际上很少有系数为零.

在查看正则化的源代码时,它表明Keras只是将参数的L1范数添加到损失函数中.

这将是不正确的,因为参数几乎肯定永远不会像L1正则化那样变为零(在浮点误差内).当参数为零时,L1范数不可微分,因此如果参数设置为零(如果在优化例程中足够接近零),则需要使用次梯度方法.请在max(0, ..) 此处查看软阈值运算符.

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

编辑:这里还有一篇精湛的博客文章,解释了L1正则化的软阈值运算符.

Mar*_*jko 5

因此,尽管@Joshua 给出了答案,但还有其他三件事值得一提:

  1. 中的梯度没有问题0keras自动将其设置为1relucase类似。
  2. 请记住,小于1e-6实际上等于的值,0因为这是float32精度。
  3. 0由于基于梯度下降的算法的性质(并设置高l1值)的计算原因,可能会出现由于梯度不连续而可能发生的振荡,因此没有将大多数值设置为的问题。理解想象一下,对于给定的权重,w = 0.005您的学习率等于0.01并且主要损失的梯度等于0wrt w。因此,您的体重将按以下方式更新:

    w = 0.005 - 1 * 0.01 = -0.05 (because gradient is equal to 1 as w > 0),
    
    Run Code Online (Sandbox Code Playgroud)

    第二次更新后:

    w = -0.005 + 1 * 0.01 = 0.05 (because gradient is equal to -1 as w < 0).
    
    Run Code Online (Sandbox Code Playgroud)

    正如您可能看到的,w即使您应用了l1正则化,的绝对值也没有减少,这是由于基于梯度的算法的性质而发生的。当然,这是简化的情况,但在使用l1规范正则化器时,您可能会经常遇到这种振荡行为。


Jos*_*hua 2

Keras 正确实现了 L1 正则化。在神经网络的背景下,L1 正则化只是将参数的 L1 范数添加到损失函数中(参见CS231)。

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

然而,L1 正则化网络的许多参数通常接近 0。一种基本方法是将小值阈值设置为 0。已经有研究探索生成稀疏神经网络的更高级方法。在本文中,作者同时修剪和训练神经网络,以在许多众所周知的网络架构上实现 90-95% 的稀疏性。


归档时间:

查看次数:

3806 次

最近记录:

6 年,4 月 前