Vowpal Wabbit: факторизация матрицы низкого ранга?
у меня есть очень простой вопрос. Я хотел бы сделать факторизацию матрицы низкого ранга, и я смотрел на машинного обучения Vowpal Кволик документации по теме. Мой вопрос:
есть ли разница между этими двумя подходами? (реализация или иное)
$ vw --lrq ab5
или
$ vw -q ab --rank 5
здесь a
и b
характеристика имен и 5
-размерность латентного фактора.
возможно последующие действия:
если они эквивалентны, будет --rank
также работают для взаимодействий более высокого порядка?
1 ответов
короткий ответ:
--rank
и --lrq
являются двумя отдельными и очень разными реализациями матричного факторизации / декомпозиции в Vowpal wabbit.
"матричная факторизация", иногда называемая" матричная декомпозиция", является общим термином в ML, существует много способов аппроксимации матрицы с использованием более простых факторов (иногда с потерей информации).
хотя они имеют некоторое сходство в том, что они оба пытаются захватить самый сильный скрытый взаимодействия между двумя подмножествами признаков, они не эквивалентны ни по реализации, ни по качеству создаваемой ими модели. Их эффективность сильно зависит от конкретной проблемы.
подробнее:
-
--rank
была первая реализация MF вvw
Джейк Хофман. Он был вдохновлен SVD (разложение сингулярных значений) -
--lrq
был реализован несколько лет спустя Павел Минейро. Это было вдохновленный libfm
на наборах данных, которые трудно обобщить (например, movielens 1M, где пользователь имеет не более одного рейтинга на фильм),--lrq
кажется, работают лучше. Кажется, что он использует лучшие значения по умолчанию, быстрее сходится, более эффективен и генерирует гораздо меньшие модели на диске. --rank
может работать лучше на других наборах данных, где есть больше примеров для каждого пользователя/элемента для обобщения.
вы можете сказать, что две реализации создайте различные результаты, запустив пример. например, выберите набор данных под test
каталог и запустите два algos на нем:
vw --lrq aa3 test/train-sets/0080.dat
versus:
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
менее суетливый, поэтому вы можете добавить к нему параметры взаимодействия более высокого порядка.
больше различий:
как правило, --lrq
является более агностическим и независимым от других vw
вариантов пока --rank
использует свой собственный автономный SGD код и не принимает другие параметры (например,--normalized
или --adaptive
). Кроме того, требования к памяти --rank
выше.
опять же, результаты будут зависеть от данных, дополнительных опций и конкретных взаимодействий.
более дальнеишее чтение
--ранг
--lrq
--lrq
демо в дереве источника-
libfm
(Штеффен Рендл) после чего--lrq
разработан со многими дополнительными ссылками.