我有一个非常基本的问题。我想做低级别的矩阵因式分解,我正在研究关于这个主题的Vowpal Wabbit文档。我的问题是:
这两种方法之间有什么区别吗?(实现与否)
$ vw --lrq ab5或
$ vw -q ab --rank 5在这里,a和b是特征命名空间,5是潜在因素维度.
可能的后续行动:
如果这些是等价的,--rank 也适用于高阶交互吗?
发布于 2017-06-24 00:44:37
简短答覆:
--rank和--lrq是在元音块中实现矩阵分解/分解的两个独立的、非常不同的实现。
“矩阵分解”,有时被称为“矩阵分解”,是ML中的一个通用术语,有许多方法可以用更简单的因素(有时是信息的丢失)来逼近矩阵。
虽然它们有一些相似之处,因为它们都试图捕捉两个特征子集之间最强的潜在交互,但它们在实现上和它们所产生的模型的质量上都不是等价的。他们的表现在很大程度上取决于眼前的问题。
更详细的是:
--rank是Jake首次在vw中实现MF。它的灵感来源于奇异值分解--lrq在几年后由Paul实现。它的灵感来源于利布夫姆在难以概括的数据集(例如,每部电影的用户最多只有一个评分的电影100万)上,--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 (item)之间排名为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的内存需求也更高。
同样,结果将取决于数据、附加选项和特定交互。
再读
-职级
--lrq
https://stackoverflow.com/questions/39040721
复制相似问题