Vowpal Wabbit:低秩矩阵分解?

时间:2016-08-19 13:49:06

标签: machine-learning vowpalwabbit matrix-factorization

我有一个非常基本的问题。我想进行低级矩阵分解,我正在查看关于该主题的Vowpal Wabbit documentation。我的问题是:

这两种方法之间有区别吗?(实施或其他方式)

$ vw --lrq ab5

$ vw -q ab --rank 5

此处,ab是功能名称空间,5是潜在因素维度。

可能的后续行动:

如果这些是等效的,那么--rank是否也适用于高阶互动?

1 个答案:

答案 0 :(得分:7)

简短回答:

--rank--lrq是vowpal wabbit中矩阵分解/分解的两个独立且非常不同的实现。

“矩阵分解”,有时称为“矩阵分解”是ML中的一般术语,有许多方法可以使用更简单的因子(有时会丢失信息)来近似矩阵。

虽然它们具有一些相似之处,但它们都试图捕获两个特征子集之间最强的潜在相互作用,但它们在实现中和在它们产生的模型的质量上都不相等。他们的表现在很大程度上取决于手头的问题。

更详细:

在难以概括的数据集上(例如,电影版本1M,其中用户每部电影最多有一个评级),--lrq似乎表现更好。它似乎使用更好的默认值,更快收敛,更高效并生成更小的磁盘模型。 --rank可能会在其他数据集上表现更好,其中每个用户/项目的示例数量更多。

通过运行示例,您可以告诉两个实现产生不同的结果。例如选择test目录下的数据集并在其上运行两个算法:

vw --lrq aa3       test/train-sets/0080.dat

vw --rank 3 -q aa  test/train-sets/0080.dat

随意添加:--holdout_off -c --passes 1000以使它们运行更长时间,以便您可以比较两者之间的运行时间。

你会注意到,每个例子中两个使用不同数量的特征(--lrq更简约,只会查看你明确告诉它的子集),收敛和最终平均损失更好与--lrq。如果您使用-f modelname存储模型 - 您会注意到--lrq会更小,特别是在大数据集上。

OTOH,如果你在源代码树中尝试test/train-sets/ml100k_small_train这样的数据集,在命名空间u(用户)和i(项目)之间的等级为10,那么你使用--rank比使用--lrq获得更好的损失。这表明哪一个更好取决于手头的数据集。

更高的互动(例如--cubic

关于第二个问题:--rank不允许更高的互动。如果您尝试添加--cubic,则会收到错误消息:

vw (gd_mf.cc:139): cannot use triples in matrix factorization

但它允许多个/额外的-q(二次)交互。

--lrq不那么繁琐,因此您可以为其添加更高阶的互动选项。

更多差异:

通常,--lrq更加不可知,独立于其他vw选项,而--rank使用自己的独立SGD代码,并且不接受其他选项(例如{ {1}}或--normalized)。此外,--adaptive的内存要求更高。

同样,结果将取决于数据,其他选项和特定的互动。

进一步阅读

- 等级

- LRQ