我有一个非常基本的问题。我想做低秩矩阵分解,我正在查看有关该主题的Vowpal Wabbit 文档。我的问题是:
这两种方法有区别吗?(实施或其他)
$ vw --lrq ab5
或者
$ vw -q ab --rank 5
在这里,a
和b
是特征命名空间,5
是潜在因素维度。
可能的后续行动:
如果这些是等价的,是否--rank
也适用于高阶交互?
我有一个非常基本的问题。我想做低秩矩阵分解,我正在查看有关该主题的Vowpal Wabbit 文档。我的问题是:
这两种方法有区别吗?(实施或其他)
$ vw --lrq ab5
或者
$ vw -q ab --rank 5
在这里,a
和b
是特征命名空间,5
是潜在因素维度。
可能的后续行动:
如果这些是等价的,是否--rank
也适用于高阶交互?
--rank
并且--lrq
是 vowpal wabbit 中矩阵分解/分解的两个独立且非常不同的实现。
“矩阵分解”,有时也称为“矩阵分解”,是 ML 中的一个通用术语,有很多方法可以使用更简单的因子来近似矩阵(有时会丢失信息)。
尽管它们有一些相似之处,因为它们都试图捕捉两个特征子集之间最强的潜在交互,但它们在实现和所产生模型的质量上并不等同。他们的表现很大程度上取决于手头的问题。
--rank
vw
是Jake Hofman首次实现 MF 。它的灵感来自SVD(奇异值分解)--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
之间的排名为 10 ,那么使用 会比使用获得更好的损失。这表明哪个更好取决于手头的数据集。u
i
--rank
--lrq
--cubic
)对于你的第二个问题:--rank
不会允许更高的交互。如果你尝试添加--cubic
,你会得到一个错误:
vw (gd_mf.cc:139): cannot use triples in matrix factorization
但它将允许多个/附加-q
(二次)交互。
--lrq
不太挑剔,因此您可以为其添加更高阶的交互选项。
通常,在使用自己的独立SGD代码并且不接受其他选项(如、 或)时,--lrq
它更加不可知并且独立于其他vw
选项。此外,对内存的要求更高。--rank
--normalized
--adaptive
--rank
同样,结果将取决于数据、附加选项和特定交互。
--lrq
源代码树中的演示libfm
(Steffen Rendle),之后--lrq
设计了许多进一步的参考资料。