Scikit-learn - 自定义代价和梯度函数的随机梯度下降法

3
我正在实现矩阵分解来预测评论者对电影的评分。数据集取自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,
                  ...)

感谢!Un


有两件事情你应该关注: (1) 矩阵库是否向量化/并行化,(2) 梯度步长的收敛性。绘制损失函数随迭代次数变化的图表,以查看步长是否能使其更快地收敛。你可能在收敛到解决方案时采取了太多小步骤。 - duffymo
谢谢回复。步长方面的观点很好。 - unki
2个回答

1

这个实现非常简单(至少是原始方法),我觉得不需要一个“框架”来支持它。它只是

my_input_param += alpha * my_gradient_function

也许你想看看theano,它可以为你执行微分。不过,根据你想要做什么,它可能有点过头了。

1

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

据我理解,关键是找到梯度并确定哪个方向将使您朝着局部最小值前进。

对于线性回归(y = mx + c)和最小二乘函数,我们的成本函数为(mx + c - y)^2。与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))

如果任何/所有这些都不正确,请(任何人)纠正我。这是我正在努力学习的东西,如果我完全朝错误的方向发展,我会感激知道的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接