RUTUBE - как я задизайнил холодный старт
Last updated
Last updated
Холодный старт — одна из самых сложных задач в рекомендательных системах, поскольку необходимо предоставить пользователю релевантные рекомендации, когда о нём почти ничего не известно. Сегодня я расскажу о своём опыте участия в хакатоне, где решалась проблема холодного старта для видеохостинга. Мне удалось разработать значительную часть рекомендательной системы. В этой статье я поделюсь методами, которые могут помочь улучшить пользовательский опыт на этапе холодного старта и повысить общую эффективность системы.
Когда наш сервис начал привлекать большой поток новых пользователей, это стало отличной возможностью для увеличения прибыли. Однако анализ показал, что текущая система персонализации не справляется с задачей — пользователи не ощущают, что контент адаптирован под их вкусы, и поэтому быстро теряют интерес. Мы обнаружили, что недостаток уникальности и персонализации — основная причина оттока пользователей. Таким образом, перед нами встал вызов: как можно быстрее узнать предпочтения пользователя и предложить ему что-то интересное, чтобы он остался на платформе.
Понимание проблем пользователей стало отправной точкой для разработки новой стратегии. Мы провели кастдев среди новых пользователей, чтобы понять их ожидания и запросы. Они хотели видеть что-то более подходящее их вкусам, а не стандартный популярный контент. Это дало нам четкое понимание, что необходимо усилить уровень персонализации и создать уникальный опыт для каждого пользователя.
Для того чтобы оценить успех нашей системы и понять, насколько эффективно она решает проблему холодного старта, мы определили несколько ключевых бизнес-метрик. Эти метрики помогают нам измерять вовлечённость пользователей и их удовлетворённость сервисом.
Churn rate — показатель оттока пользователей, который отражает, сколько людей покидает платформу, включая тех, кто пользовался ей меньше недели или месяца. Наша цель — свести этот показатель к минимуму, особенно среди новых пользователей.
Retention — метрика удержания, которая показывает, насколько успешно пользователи возвращаются на платформу. Увеличение retention свидетельствует о полезности платформы для пользователя.
ER (engagement rate), CTR, Time spent — это прокси-метрики, которые позволяют оценить, насколько активно пользователи взаимодействуют с контентом. Они помогают определить, насколько система рекомендаций способствует увеличению вовлечённости и времени, проведённого на платформе.
Эти метрики позволяют нам отслеживать прогресс и понимать, какие аспекты системы нуждаются в улучшении, чтобы обеспечить пользователям лучший опыт.
Проблема холодного старта в машинном обучении заключается в том, чтобы предоставить новым пользователям релевантные рекомендации, несмотря на ограниченные данные. Для этого могут использоваться различные подходы: рекомендации популярных материалов, сегментирование пользователей и использование характеристик контента. Каждый из этих подходов решает проблему с разных сторон и помогает адаптироваться к пользовательским предпочтениям на ранних этапах.
Для того чтобы обеспечить эффективные рекомендации на этапе холодного старта, мы используем несколько типов данных:
Данные после регистрации пользователя (юзерные данные) — такие как возраст, пол, регион. Эти данные помогают создать первое представление о пользователе и его возможных предпочтениях.
Айтемные данные — информация о контенте, включая названия, категории, статистику просмотров и лайков. Эти данные важны для понимания, какие элементы могут быть интересны определённой группе пользователей.
Cross-признаки — информация о взаимодействиях пользователей с товарами. Эти признаки помогают улучшить рекомендации, так как учитывают связи между пользователями и контентом, что делает рекомендации более точными и релевантными.
Эти данные являются основой для построения наших моделей, которые позволяют адаптироваться к предпочтениям пользователей даже при отсутствии полного объема информации.
Для оценки качества моделей машинного обучения используются специальные метрики, которые помогают понять, насколько хорошо система решает поставленные задачи.
Precision@k, Recall@k — метрики, которые оценивают качество ранжирования и отбора кандидатов. Они помогают понять, насколько точно и полно система предоставляет релевантные рекомендации.
Hit rate — показывает, насколько быстро пользователю показываются релевантные элементы, что важно для обеспечения хорошего первого впечатления.
Coverage, Diversity, Novelty — помогают избежать однообразия рекомендаций и способствуют исследованию новых тем. Эти метрики особенно важны для создания интересного и уникального пользовательского опыта.
NDCG, MRR, MAP — используются для оценки качества ранжирования, обеспечивая более точное понимание того, насколько хорошо система упорядочивает рекомендации в соответствии с предпочтениями пользователей.
Во-первых, что нам важно в холодном старте?
Как можно быстрее понять пользовательские предпочтения — для этого нужно собрать максимум данных о пользователе в кратчайшие сроки.
Не скатиться в одну категорию и быстро реагировать на изменения предпочтений пользователя — необходима реактивность системы.
Делать холодный старт это вам не космические корабли запускать, но даже их делают с какого-то бейзлайна. Поэтому к вашему вниманию:
Это самое простое решение, которое основано на банальной логике: давайте рекомендовать то, что подходит большинству. Так мы точно не проиграем и даже выиграем.
Но какой у этого минус? Мы и так рекомендуем популярные видео, в чем смысл? Тут нет никакой персонализации. Однако можно попробовать добавить её.
Как персонализовать популярное? На самом деле просто — выводить популярное в каждой категории. Но есть проблема с несбалансированностью категорий: условное рисование по генеральной совокупности смотрят меньше, чем политику!
Тут два варианта: создать вектор категорий, равный количеству категорий, например, [w_{политика}, w_{рисование}, …, w_{спорт}].
Каждое из w может быть равномерным, то есть равным среднему значению от общего количества видео. Изначально категории будут рекомендоваться с одинаковой вероятностью.
Каждое из w может равняться частоте относительно генеральной совокупности, где количество видео каждой категории делится на общее количество видео.
Мы можем буквально в онлайн режиме изменять веса этих категорий, добавив обычный счётчик. Также нужно добавить 5-10% случайных рекомендаций, чтобы, если категория стала слишком популярной, показывать и другие категории, обеспечивая переключение на них.
Допустим, наш юзер очень любит политику и рисование, а мы не даем ему возможность увидеть рисование. Это плохо для вовлечённости.
При регистрации можно также попросить пользователя указать любимые каналы или категории, чтобы добавить им вес с самого начала и усилить персонализацию.
Если мы не можем собрать действия пользователя, то можем анализировать объекты, которые он смотрит.
Например, можно рекомендовать видео с похожими названиями. Если пользователь смотрит сериал «Game of Thrones S1 E1», ему будет интересно «… S1 E2» или «10 Secrets That Ruined Everything in Game of Thrones».
Для этого можно использовать KNN с BERT-эмбеддингами, добавляя статистику по типу количества просмотров и лайков. Если пользователь любит менее популярные видео, определенного автора, региона и т.д., это тоже можно учитывать.
Если вы не читали мой пост про холодный старт в Deezer, обязательно сделайте это. Коротко, мы хотим с помощью мета-информации привязать холодных пользователей к сегментам более опытных, а затем быстро встроить их в нашу user-item матрицу.
Эти модели не заботятся о том, кто вы, как пользователь, — им нужна последовательность действий. Вопрос в том, откуда получить эту последовательность? Я не успел додизайнить что-то более продуманное, поэтому встраивал бы их с процентом до K действий пользователя.
Если пользователь сделал 1/K действий, то в общий пул кандидатов встраиваем с процентом 1/K.
Либо добавляем популярное, персонализированное популярное, предрегистрационные данные и т.д., из предложенных выше решений.
Одна из самых сложных вещей, на мой взгляд. Мы практически ничего не знаем о пользователе, кроме мета-информации после регистрации: пол, регион, возраст и т.д. Эта информация будет ключом для ранжирования контента, на её основе мы будем подбирать кандидатов.
101
1
0.8
102
1
0.7
101
2
0.4
Сегменты можно создать вручную, например:
сегмент 1: Мужчины, 25-34, Москва
сегмент 2: Женщины, 18-24, СПБ
Также можно создать K сегментов с помощью KNN, используя ALS-эмбеддинги горячих пользователей и прикрепляя холодных к ним. Это топовое решение.
Таргетами могут быть:
CTR — нужно нивелировать кликбейты с помощью фильтрации по длине просмотра: долгий или короткий.
Лайк/дизлайк — подходит, если есть активность пользователей.
Долгий просмотр/недосмотр — имплицитная оценка лайков и дизлайков.
Не хотите делать тяжелое ранжирование? Учитываем онлайн
Не хотим делать тяжелое ранжирование? Нам нужно учитывать онлайн фичи? Да просто ранжированием в онлайне по фичам.
Хотим учитывать при этом разнообразие? Используем фиксированные слоты, в гугле для этого правда используются бандиты.
Последней стадией нашей рекомендательной системы будут фильтрации, сюда мы заложим бизнес логику, уберем все видео, которые могут нам навредить. А так-же добавим пару интересных фильтраций для удобства пользователей.
Чего большего всего не хотят пользователи в первый день? фрустрироваться от кликбейтов — поэтому мы уберем все видосы где пользователи в его сегменте кликают, но не досматривают видосы. Далее уберем весь странный контент по стоп словам и длине видосов.
Не хотим скатиться к однообразной выдаче? Давайте фильтровать кандидатов для наших якорных товаров. Однообразие по сути это рекомендации одного и того же товара. А если быть точнее товаров одной категории. И тут уже понятно решение, просто фильтруем по K товарам каждой категории — это простое и каноничное решение.