Как работает алгоритм LightFM
Что проверяют
Знаете ли вы, как устроена модель внутри, а не только то, что она «гибридная». Следом обычно спрашивают, какую функцию потерь вы бы выбрали для неявного фидбэка и как модель ведёт себя на холодном старте.
Как отвечать
LightFM это матричная факторизация, в которой пользователь и объект представлены не собственным вектором, а суммой эмбеддингов своих признаков:
- представление: вектор пользователя равен сумме эмбеддингов его признаков (город, сегмент), вектор объекта аналогично (категория, бренд, теги). Если признаков нет, остаются признаки-идентификаторы, и модель сводится к обычной факторизации;
- скор: скалярное произведение двух векторов плюс смещения пользователя и объекта;
- функции потерь:
logisticдля явных положительных и отрицательных примеров,bprоптимизирует попарный порядок и близок к AUC,warpсэмплирует негативы, пока не найдёт нарушающий порядок, и лучше всего подходит для top-k на неявных данных; - обучение: SGD с Adagrad или Adadelta, асинхронно в несколько потоков через
num_threads; - гиперпараметры:
no_components,learning_rate, L2-регуляризацияitem_alphaиuser_alpha,max_sampledдля WARP, число эпох.
Главный плюс это холодный старт: новый товар с известными признаками сразу получает осмысленный вектор. Данные готовят через класс Dataset (fit, build_interactions, build_item_features), метрики берут из lightfm.evaluation: precision_at_k, recall_at_k, auc_score.
Ограничения: модель линейная, а сама библиотека давно почти не развивается, поэтому в новых проектах её часто заменяют двухбашенными нейросетями.
Где спотыкаются
Путают LightFM с факторизационными машинами. Здесь нет попарных взаимодействий всех признаков, только связь стороны пользователя со стороной объекта.
Передают свою матрицу признаков без столбцов-идентификаторов. Тогда объекты с одинаковыми признаками становятся неразличимы, и качество на тёплых данных падает.
При оценке не передают train_interactions в precision_at_k. Уже известные модели товары занимают верх списка, и метрика занижается. А холодный старт проверяют разбиением по объектам, а не случайным.