适合Keras L1型号

时间:2018-03-16 22:20:12

标签: python tensorflow keras

我有一个简单的keras模型(普通的Lasso线性模型),其中输入被移动到单个神经元#39; Dense(1, kernel_regularizer=l1(fdr))(input_layer)但此模型的权重从未精确设置为零。我发现这很有趣,因为scikit-learn的Lasso可以将系数精确地设置为零。

我使用Adam和张量流FtrlOptimizer进行优化,但他们遇到了同样的问题。

我已经检查了这个question但这并没有解释为什么sklearn可以将值精确设置为零,更不用说他们的模型如何在我的服务器上收敛〜当Keras中的相同模型提前终止需要2.4秒。

这是因为使用了优化器还是我遗漏了什么?

1 个答案:

答案 0 :(得分:1)

  

这是因为使用了优化器还是我遗漏了   什么?

事实上。如果您从scikit-learn(从Lasso类调用)调整ElasticNet时查看实际的function that gets called,您会发现它使用了不同的优化算法。

在scikit-learn ElasticNet starts with coefficient vector equal to zero中协调下降,然后考虑一次添加一个非零项(这与线性回归的逐步特征选择有关)。

用于优化L1正则化回归的其他方法也是以这种方式工作的:例如,LARS(最小角度回归)也可以用于scikit-learn。

与此相反,paper on FTRL算法说

  

不幸的是,OGD在生产方面并不是特别有效   稀疏模型。实际上,只需添加一个subgradient   L1损失对损失梯度的影响(Ow`t(w))   基本上永远不会产生精确的系数   零。