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正则化的软阈值运算符.
因此,尽管@Joshua 给出了答案,但还有其他三件事值得一提:
0
。keras
自动将其设置为1
与relu
case类似。1e-6
实际上等于的值,0
因为这是float32
精度。0
由于基于梯度下降的算法的性质(并设置高l1
值)的计算原因,可能会出现由于梯度不连续而可能发生的振荡,因此没有将大多数值设置为的问题。理解想象一下,对于给定的权重,w = 0.005
您的学习率等于0.01
并且主要损失的梯度等于0
wrt 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
规范正则化器时,您可能会经常遇到这种振荡行为。
归档时间: |
|
查看次数: |
3806 次 |
最近记录: |