Scikit-learn - 具有自定义成本和梯度函数的随机梯度下降

Posted

技术标签:

【中文标题】Scikit-learn - 具有自定义成本和梯度函数的随机梯度下降【英文标题】:Scikit-learn - Stochastic Gradient Descent with custom cost and gradient functions 【发布时间】:2015-07-15 23:04:42 【问题描述】:

我正在实施矩阵分解来预测评论者对电影的评分。数据集取自 MovieLen (http://grouplens.org/datasets/movielens/)。这是一个经过充分研究的推荐问题,所以我只是为了学习目的实现了这种矩阵分解方法。

我将成本函数建模为训练数据集中预测评分和实际评分之间的均方根误差。我使用 scipy.optimize.minimize 函数(我使用共轭梯度下降)来分解电影评分矩阵,但是即使对于只有 100K 个项目的数据集,这个优化工具也太慢了。我计划为包含 2000 万个项目的数据集扩展我的算法。

我一直在寻找基于 Python 的随机梯度下降解决方案,但我在 scikit-learn 上找到的随机梯度下降不允许我使用自定义成本和梯度函数。

我可以实现我自己的随机梯度下降,但我正在与你们核实是否已经存在执行此操作的工具。

基本上,我想知道是否有类似这样的API:

optimize.minimize(my_cost_function,
                  my_input_param,
                  jac=my_gradient_function,
                  ...)

谢谢! 不

【问题讨论】:

您应该看两件事:(1) 矩阵库是否是矢量化/并行化的;(2) 梯度步长的收敛性。绘制成本函数与迭代的关系图,看看步长是否可以让它更快。您可能采取了太多的小步骤来收敛到一个解决方案。 感谢您的回复。关于步长的要点。 【参考方案1】:

我一直在尝试在 R 中做类似的事情,但使用不同的自定义成本函数。

据我了解,关键是找到梯度,看看哪条路能带你到达局部最小值。

使用线性回归 (y = mx + c) 和最小二乘函数,我们的成本函数为 (mx + c - y)^2 this 对 m 的偏导数是 2m(mX + c - y) 使用更传统的机器学习符号m = theta 给我们theta <- theta - learning_rate * t(X) %*% (X %*% theta - y) / length(y)

我不确定这一点,但我会假设对于线性回归和sqrt(mx + c - y) 的成本函数,梯度步长是与 m 相关的偏导数,我相信这是 m/(2*sqrt(mX + c - y))

如果任何/所有这些不正确,请(任何人)纠正我。这是我正在尝试自己学习的东西,如果我知道我的方向是否完全错误,我将不胜感激。

【讨论】:

【参考方案2】:

这实现起来非常简单(至少是普通方法),我认为它周围没有“框架”。 只是

my_input_param += alpha * my_gradient_function

也许你想看看 theano,不过它会为你做区分。不过,这取决于您想要做什么,这可能有点矫枉过正。

【讨论】:

以上是关于Scikit-learn - 具有自定义成本和梯度函数的随机梯度下降的主要内容,如果未能解决你的问题,请参考以下文章

用随机梯度下降法(SGD)做线性拟合

Python 中用 XGBoost 和 scikit-learn 进行随机梯度增强

机器学习:梯度下降

04-07 scikit-learn库之梯度提升树

机器学习包Scikit-learn

Scikit-learn——LogisticRegression与SGDClassifier