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

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

$ vw --lrq ab5

或者
$ vw -q ab --rank 5

在这里,ab是要素 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
  • SVD on wikipedia

  • --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/

    10-12 22:49