- PVSM.RU - https://www.pvsm.ru -
В декабре 2025 года VK провёл RecSys Challenge LSVD — соревнование по машинному обучению с нестандартной постановкой задачи. Традиционные рекомендательные системы решают проблему "что показать пользователю", но здесь требовалось обратное: для каждого нового клипа определить, каким пользователям он может быть интересен. Такой подход помогает решать проблему холодного старта контента, когда новое видео только появляется в системе и не имеет истории взаимодействий.
Я принял участие в этом челлендже и хочу поделиться своим решением, архитектурой системы и практическими выводами.
Задача: Для каждого клипа из тестовой выборки предсказать упорядоченный список из 100 пользователей, которые с наибольшей вероятностью проявят к нему интерес.
Ограничения:
Каждый пользователь может встречаться в рекомендациях не более 100 раз
Основная метрика — NDCG@100, рассчитываемая по клипам
Объём данных: VK-LSVD содержит десятки миллиардов взаимодействий
Данные:
Взаимодействия пользователей с клипами за 25 недель
Метаданные пользователей и клипов
Эмбеддинги клипов размерностью 256
Поскольку полный датасет занимает сотни гигабайт, я реализовал стратегию поэтапной обработки:
# Конфигурация для разных режимов работы
class DataStrategy:
TEST_MODE = {
'sample_fraction': 0.01, # 1% данных
'num_weeks': 4, # 4 недели из 25
'embedding_dim': 16, # Урезанная размерность
'max_interactions': 1000000 # Лимит строк
}
PRODUCTION_MODE = {
'sample_fraction': 1.0,
'num_weeks': 25,
'embedding_dim': 64,
'max_interactions': None
}
Ключевой инсайт: использование подвыборки на этапе разработки позволяет быстро тестировать гипотезы без необходимости обработки терабайтов данных.
Я разработал ContentAwareRecommender, который комбинирует три подхода:
А) Коллаборативная фильтрация на основе общих взаимодействий
def get_similar_users(self, target_item_id):
"""Находит пользователей, взаимодействовавших с похожими клипами"""
similar_items = self.find_content_similar_items(target_item_id)
similar_users = set()
for item_id in similar_items:
if item_id in self.item_to_users:
similar_users.update(self.item_to_users[item_id])
return similar_users
Б) Контентная фильтрация через эмбеддинги
Использование предобученных эмбеддингов клипов позволяет оценивать семантическую схожесть даже для новых видео, с которыми ещё не было взаимодействий.
В) Статистические признаки
Частота релевантных действий пользователя
Общая активность пользователя
Популярность клипа среди похожих пользователей
Ограничение "не более 100 упоминаний на пользователя" требовало специального подхода:
class RecommendationBalancer:
def balance_recommendations(self, raw_recommendations):
"""Распределяет пользователей с учётом ограничений"""
user_mentions = Counter()
balanced = {}
# Первый проход: учитываем ограничения
for item_id, recommendations in raw_recommendations.items():
balanced_list = []
for user_id in recommendations:
if user_mentions[user_id] < self.max_mentions:
balanced_list.append(user_id)
user_mentions[user_id] += 1
if len(balanced_list) >= self.recommendations_per_item:
break
balanced[item_id] = balanced_list
return balanced
Решение: Использование контентных признаков (эмбеддингов) позволяет оценивать схожесть даже при отсутствии истории взаимодействий.
Решение:
Индексация данных в памяти через словари вида user_to_items и item_to_users
Ленивая загрузка и обработка батчами
Кэширование промежуточных результатов
Решение: Двухэтапный алгоритм балансировки с приоритизацией релевантных пользователей и дозаполнением из пула наименее используемых.
В задаче обратных рекомендаций решающую роль играют не столько сложные модели, сколько качественные признаки. Наиболее информативными оказались:
Средний эмбеддинг клипов, с которыми взаимодействовал пользователь
Частота релевантных действий (лайки, шеры, комментарии)
Активность пользователя в разных временных интервалах
Ограничения на распределение рекомендаций превращают задачу из чисто предсказательной в оптимизационную. Наивные подходы приводят к нарушению ограничений, поэтому требуется специальный алгоритм перераспределения.
Работа с терабайтными датасетами требует стратегии:
Начинать с подвыборки для отладки пайплайна
Использовать эффективные форматы хранения (Parquet)
Внедрять систему чекпоинтов для возможности продолжения после сбоев
Эмбеддинги клипов оказались мощным инструментом для оценки схожести контента. Даже простая косинусная мера близости даёт значимый прирост качества по сравнению с использованием только коллаборативных данных.
NDCG@100, рассчитываемый по клипам, а не по пользователям, требует особого подхода к ранжированию. Важно не только отобрать релевантных пользователей, но и правильно упорядочить их внутри списка.
Временные признаки: Учёт сезонности и трендов мог бы улучшить рекомендации для свежего контента.
Графовые методы: Построение графа взаимодействий и использование алгоритмов типа Node2Vec для получения эмбеддингов пользователей.
Ансамблирование: Комбинация нескольких моделей (LightFM, матричная факторизация, градиентный бустинг) могла бы дать синергетический эффект.
Оптимизация распределения: Формализация задачи балансировки как задачи оптимизации с ограничениями.
Участие в VK RecSys Challenge позволило глубоко погрузиться в задачу обратных рекомендаций — область, которая становится всё более актуальной в эпоху переизбытка контента.
Основные уроки:
Качественные признаки важнее сложности модели
Ограничения системы часто определяют архитектуру решения
Работа с промышленными объёмами данных требует продуманной инфраструктуры
Балансировка рекомендаций — нетривиальная задача, требующая отдельного внимания
Предложенное решение демонстрирует работоспособный подход, который можно развивать в сторону более сложных моделей и признаков. Код решения доступен на GitHub [1] и может служить основой для дальнейших эксперимент��в в области рекомендательных систем.
Автор: skienbear
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/kollaborativnaya-fil-tratsiya/442261
Ссылки в тексте:
[1] GitHub: https://github.com/Alexeiyaganov/vk-recsys-challenge
[2] Источник: https://habr.com/ru/articles/986440/?utm_source=habrahabr&utm_medium=rss&utm_campaign=986440
Нажмите здесь для печати.