Куда движется рекомендательная система?
После некоторого времени работы с рекомендательными системами проблемы и подходы к их решению начинают встречаться повторно. Например, если есть проблема холодного старта, то есть и N докладов на эту тему, и M научных статей об этом. Иногда, однако, хочется подумать о великом, о чем, кажется, нет хороших и известных материалов на сегодняшний день. Об одной из таких дум пишу первый пост в 2025 году.
Начнем с такого примера. Есть одна рек. система, которая регулярно обучается на свежих данных и показывается пользователям. Под системой буду иметь ввиду весь программный код, всех юзеров и айтемов, которые участвуют в системе. Посмотрим на нее сегодня (система "Н" = новая) и неделю назад (система "С" = старая). Дальше хочется сказать, что это две разные системы и подумать, правда ли что "Н" лучше, чем "С"?
Что общего между системами "С" и "Н"?
- Весь программный код, он не менялся.
Какие есть интересные отличия между системами "С" и "Н"?
- Пользовательский опыт взаимодействия с системой. Пользователь Вася неделю назад не делал клики вообще ни на что из каталога айтемов, а вчера сделал три клика где-либо. Система "С" не знала об этих трех кликах Васи, а система "Н" уже знает.
- Статистики по айтемам. Скорее всего, для системы "С" и "Н" есть айтемы с высокими конверсиями, но списки отличаются между двумя системами.
- Модели. Будь это нейронка или градиентный бустинг, их чекпоинты/веса будут отличны между собой. Причина: они обучались на разных датасетах, хоть и собраны одинаковым способом (кодом), но в разное время.
Теперь представим, что есть система с плюс-минус стандартным пайплайном и фичами в модели, и она в целом работает неплохо. Если вернуть этот код во время начала проекта, когда люди кликали только на популярные товары из небольшого набора, то, вероятно, вся персонализация исчезнет. В обратную сторону, если проект только стартует, а данные не разнообразны, то даже если код достаточно хороший, он все равно не поможет сделать персонализацию. Однако через время именно этот код позволит получить достойные результаты. Поэтому на большом временном промежутке я точно уверен, что "С" и "Н" сильно отличаются, а значит, есть и малые промежуточные изменения.
Осознав это, я стал думать, что система находится в постоянном движении. Дальше несколько вопросов, на которые я пока не нашел ответа:
1. Как распознать, стала ли система "Н" лучше "С", если мы с ней ничего и не делали? Может быть, следует изучить метрики ранжирования оффлайн/онлайн? Я с этим не согласен, так как на них влияют разные факторы. Может тогда провести АБ тест между "Н" и "С"? Тоже не считаю данный способ эффективным, ведь честный АБ дизайн
почти не реализуем.
2. Что сделать, чтобы "Н" была лучше чем "С" при идентичности их кода? Забудем про то, что без ответа на вопрос №1 мы не сможем это оценить. Напихать околорандомные айтемы в ленты рекомендаций, чтобы случайно угадать интерес пользователя и за него зацепиться - это, кажется, единственный ответ, который приходит в голову. Но это эвристика, а значит может оказаться не самым хорошим решением. Да и вряд ли масштабно решает проблему.
3. Как описать движение системы на понятном для людей языке? Все оффлайн/онлайн метрики описывают системы "С" и "Н", но не описывают разницу между ними. Хотелось бы человеческого описания. Например, система "Н" заступила на прод в час ночи 13.03.25. Пользователи стали более разнообразно кликать на q%, что позволило вырастить количество обнаруженных интересов на w%. Это повысило значимость признаков X, Y, Z, что улучшило персонализацию на сегментах R и T. Система "Н" стала лучше персонализировать, потому что случились события а) ..., б) .... Для последующего улучшения предприняты действия A, S, D. Подобное описание, думаю, здорово бы помогло осознать, что вообще происходит.
Еще один наброс: если система "Н" лучше чем "С" и принесет еще +x% метрик, то вы об этом не узнаете, ведь на это скорее всего нет АБ теста. В обратную сторону данная логика тоже работает 🙂