Vowpal Wabbit:低秩矩阵分解?
Vowpal Wabbit: Low-rank matrix factorization?
我有一个非常基本的问题。我想做低阶矩阵分解,我正在查看关于该主题的 Vowpal Wabbit documentation。我的问题是:
这两种方法有区别吗?(实现或其他)
$ vw --lrq ab5
或
$ vw -q ab --rank 5
这里,a
和 b
是特征命名空间,5
是潜在因子维度。
可能的后续行动:
如果这些是等效的,--rank
是否也适用于高阶交互?
简答:
--rank
和 --lrq
是两个独立且非常不同的矩阵 factorization/decomposition 在 vowpal wabbit 中的实现。
"Matrix factorization",有时也称为 "Matrix decomposition" 是 ML 中的通用术语,有许多方法可以使用更简单的因子(有时会丢失信息)来逼近矩阵。
虽然它们有一些相似之处,因为它们都试图捕捉两个特征子集之间最强的潜在相互作用,但它们在实现和生成的模型质量方面都不相同。他们的表现在很大程度上取决于手头的问题。
更详细:
--rank
是 Jake Hofman 在 vw
中首次实现 MF。它的灵感来自 SVD (Singular Value Decomposition)
--lrq
几年后由 Paul Mineiro 实施。它的灵感来自 libfm
在难以概括的数据集上(例如 movielens 1M,用户每部电影最多有一个评分),--lrq
似乎表现更好。它似乎使用了更好的默认值,收敛速度更快,效率更高,并生成了更小的磁盘模型。 --rank
可能在其他数据集上表现更好,其中每个 user/item 有更多示例可以概括。
您可以通过 运行 一个示例来判断这两个实现产生不同的结果。例如在 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 ,与 --lrq
相比,--rank
会带来更好的损失。这表明哪个更好取决于手头的数据集。
更高的互动(例如 --cubic
)
关于你的第二个问题:--rank
不允许更高的交互。如果你尝试添加 --cubic
你会得到一个错误:
vw (gd_mf.cc:139): cannot use triples in matrix factorization
但它将允许 multiple/additional -q
(二次)交互。
--lrq
没那么挑剔,所以你可以给它添加更高阶的交互选项。
更多差异:
一般来说,--lrq
更不可知并且独立于其他 vw
选项,而 --rank
使用它自己的独立 SGD 代码并且不接受其他选项(例如 --normalized
,或 --adaptive
)。此外,--rank
的内存要求更高。
同样,结果将取决于数据、其他选项和特定交互。
进一步阅读
--排名
--lrq
我有一个非常基本的问题。我想做低阶矩阵分解,我正在查看关于该主题的 Vowpal Wabbit documentation。我的问题是:
这两种方法有区别吗?(实现或其他)
$ vw --lrq ab5
或
$ vw -q ab --rank 5
这里,a
和 b
是特征命名空间,5
是潜在因子维度。
可能的后续行动:
如果这些是等效的,--rank
是否也适用于高阶交互?
简答:
--rank
和 --lrq
是两个独立且非常不同的矩阵 factorization/decomposition 在 vowpal wabbit 中的实现。
"Matrix factorization",有时也称为 "Matrix decomposition" 是 ML 中的通用术语,有许多方法可以使用更简单的因子(有时会丢失信息)来逼近矩阵。
虽然它们有一些相似之处,因为它们都试图捕捉两个特征子集之间最强的潜在相互作用,但它们在实现和生成的模型质量方面都不相同。他们的表现在很大程度上取决于手头的问题。
更详细:
--rank
是 Jake Hofman 在vw
中首次实现 MF。它的灵感来自 SVD (Singular Value Decomposition)--lrq
几年后由 Paul Mineiro 实施。它的灵感来自 libfm
在难以概括的数据集上(例如 movielens 1M,用户每部电影最多有一个评分),--lrq
似乎表现更好。它似乎使用了更好的默认值,收敛速度更快,效率更高,并生成了更小的磁盘模型。 --rank
可能在其他数据集上表现更好,其中每个 user/item 有更多示例可以概括。
您可以通过 运行 一个示例来判断这两个实现产生不同的结果。例如在 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 ,与 --lrq
相比,--rank
会带来更好的损失。这表明哪个更好取决于手头的数据集。
更高的互动(例如 --cubic
)
关于你的第二个问题:--rank
不允许更高的交互。如果你尝试添加 --cubic
你会得到一个错误:
vw (gd_mf.cc:139): cannot use triples in matrix factorization
但它将允许 multiple/additional -q
(二次)交互。
--lrq
没那么挑剔,所以你可以给它添加更高阶的交互选项。
更多差异:
一般来说,--lrq
更不可知并且独立于其他 vw
选项,而 --rank
使用它自己的独立 SGD 代码并且不接受其他选项(例如 --normalized
,或 --adaptive
)。此外,--rank
的内存要求更高。
同样,结果将取决于数据、其他选项和特定交互。