我有一个非常基本的问题。我想进行低阶矩阵分解,并且正在查看有关该主题的Vowpal Wabbit documentation。我的问题是:
这两种方法之间有区别吗? (实现或其他)
$ vw --lrq ab5
或者
$ vw -q ab --rank 5
在这里,
a
和b
是要素 namespace ,而5
是潜在因子维数。可能的后续行动:
如果这些等效,
--rank
也可以用于更高阶的交互吗? 最佳答案
简短答案:--rank
和--lrq
是两个独立且非常不同的格式,它们在vowpal wabbit中实现矩阵分解/分解。
“矩阵分解”(有时称为“矩阵分解”)是ML中的通用术语,有许多方法可以使用更简单的因子(有时会丢失信息)来近似矩阵。
尽管它们有一些相似之处,因为它们都试图捕获两个特征子集之间最强的潜在交互作用,但是它们在实现上或所生成模型的质量上均不等效。它们的性能在很大程度上取决于眼前的问题。
更详细地:
--rank
是Jake Hofman在vw
中对MF的第一个实现。它的灵感来自SVD (Singular Value Decomposition) --lrq
在几年后由Paul Mineiro实现。它的灵感来自libfm 在难以一概而论的数据集上(例如,movielens 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
的数据集,并且在 namespace 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代码并且不接受其他选项(例如--normalized
或--adaptive
)。此外,--rank
的内存要求也更高。同样,结果将取决于数据,其他选项和特定的交互。
进一步阅读
- 秩
--rank
example in the wiki --lrq
--lrq
demo in the source tree libfm
(by Steffen Rendle) after which --lrq
was designed还有许多其他引用。 关于machine-learning - Vowpal Wabbit : Low-rank matrix factorization?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39040721/