我有一个简单的keras模型(普通的Lasso线性模型),其中输入被移动到单个神经元#39; Dense(1, kernel_regularizer=l1(fdr))(input_layer)
但此模型的权重从未精确设置为零。我发现这很有趣,因为scikit-learn的Lasso可以将系数精确地设置为零。
我使用Adam
和张量流FtrlOptimizer
进行优化,但他们遇到了同样的问题。
我已经检查了这个question但这并没有解释为什么sklearn可以将值精确设置为零,更不用说他们的模型如何在我的服务器上收敛〜当Keras中的相同模型提前终止需要2.4秒。
这是因为使用了优化器还是我遗漏了什么?
答案 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)) 基本上永远不会产生精确的系数 零。