Привет, меня зовут Коновалов Андрей, я Data Scientist персональных рекомендаций Wildberries. В этой статье разберем, как можно тюнингом TF-IDF побить BERT4Rec в ретро-тесте рекомендательной системы.

Для начала немного вводных. В рекомендательных системах принято использовать двухуровневые модели: 

  • на первом этапе мы генерируем контент с максимальным потенциальным покрытием интересов пользователя,

  • на втором — персонализируем и раскладываем по полочкам самые сочные предложения.

Моделей на этапе генерации может быть больше десятка. Они должны учитывать предпочтения пользователей и предлагать новое, для чего нужно быть с покупателем на одной волне, угадывать контекст и читать между строк. 

Модель, о которой пойдет речь дальше, как раз является примером такого «поисковика», способного находить релевантные товары на основе предпочтений пользователя.

Окунемся в историю

Перенесемся на страницы учебников по ранжированию документов и рассмотрим вероятностное пространство всех слов во всех документах, доступных для ранжирования. Оценим вероятность встречаемости слова w в N документах корпуса D

p(w)=  p_w= \frac{N_w}{N}

Предположим, что порядок слов в запросе и документах независим, сами слова одинаково популярны, а документы равны по объему слов. Тогда воспользуемся эвристической оценкой вероятности встретить совершенно случайно слово wв документе d ровно в n_{dw}раз:

p(w,d)=  p^{d}_w=(p_w)^{n_{dw}}= \left(\frac{N_w}{N}\right)^{n_{dw}}

Получим, что вероятность встретить все слова пользовательского запроса q = (w_1, w_2, …) в документе d равна:

p(q,d)=\prod_{w\in q}p(w,d)=\prod_{w\in q}\left(\frac{N_w}{N}\right)^{n_{dw}}

Теперь у нас есть простая модель поиска: чем меньше вероятность встретить столько совпадений слов запроса в документе, тем выше его релевантность.

После логарифмирования всего выражения получаем term frequency–inverse document frequency (TF-IDF), состоящий из множителей, характеризующих относительную частоту слова для документа (TF) и инвертированную частоту слова для всего корпуса (IDF):

TFIDF(q,d) = -\log(P(q,d)) = \sum_{w \in q}n_{dw}\log\left(\frac{N}{N_w}\right)\to \max_{d \in D} \tag{1}

Избавимся от предположения о равной длине сессий (документа) воспользовавшись  нормализацией значений TF-IDF по длине сессии (документа):

tf(q,d)\cdot{idf(q,D)} = \sum_{w \in q}\frac{n_{dw}}{|d|}\cdot{\log\left(\frac{|D|}{N_w}\right)} \tag{2}

TF-IDF — это удобная мера для проверки релевантности документа: чем выше значение, тем релевантнее документ d запросу q

\max_{d \in D} \text{TFIDF}(q, d) \label{eq:max_tfidf}

От теории к практике

Взаимодействуя с платформой, совершая покупки, добавляя товары в вишлист и корзину, пользователи, сами того не подозревая, создают корпус документов для ранжирования. В нем документами выступают сессии, а в качестве слов берутся артикулы товаров.

Остановимся на фидбеках и сессиях подробнее

Принято разделять фидбек пользователя на явный и неявный (implicit/explicit).

При этом неявного фидбека нууу очень много. Человек засмотрелся на картинку: он явно хочет это купить! Или нет? Может, ему картинка понравилась, или он отвлекся и на экран вообще не смотрел. Или еще лучше купил товар! Он ему нравится или это подарок другу?

Как отмечалось выше, действия пользователей генерируют события, тщательно записанные в лог. Будем работать с ним. И начнем с разделения событий на положительные, нейтральные и негативные. Покупки, Лайки, Отложенные — все это несомненно «пОзитивы». Дизлайки и Жалобы — «нЕгативы».

Сессией будет выступать цепочка позитивных событий, относящихся к конкретным товарам. Право добавлять и исключать товары из цепочки по характеру взаимодействия остается за нами.

Пример лога пользователя:

timestamp

item_id

event_type

1729235760

252306530

view

1729235761

171350921

view

1729235767

171350921

click

1729235770

171350921

add_to_cart

1729235780

111232192

view

1729235785

111232192

click

1729235800

111232192

longview

1729235990

162802784

view

1729235992

162802784

add_to_wish

1729235992

148455972

view

1729235998

148455972

add_to_cart

1729235989

229796745

view

1729236156

171350921

order

Варианты цепочек позитивов:

[171350921, 111232192, 162802784, 148455972, 171350921 ]
[111232192, 162802784, 148455972, 171350921 ]
[171350921, 162802784, 148455972, 171350921 ]
[162802784, 148455972, 171350921 ]

Инженерный гений Дата Саентиста может разыграться не на шутку, впадая в размышления о том, какие события приведут чисто статистически к «пОзитиву» пожирнее и что действительно здесь считать сигналом, а что шумом.

Что мы хотим от кандидатогенератора?

  • Сделать этап генерации простым [ГОТОВО]

  • 90% предложений должны быть похожи на историю пользователя  [ГОТОВО]

С задачей генерации на первом этапе рекомендаций TF-IDF замечательно справляется даже из коробки. Модель обладает интерпретируемостью, простотой, и возможностью распараллеливания, что ускоряет расчет рекомендаций и тюнинг модели.

Побежали дальше!

Peek OR Filtering Pre-processing

Отметим, что не все сессии и товары стоит использовать для обучения: для вас мы отбираем лучшее. 

Рекомендуется обучать модель на свежих сессиях продвинутых пользователей. Часто  пользователей делят на CORE, HOT, WARM и СOLD по частоте посещения платформы, объему покупок и лояльности. Такие градации удобны для бизнес-менеджмента и аналитиков, они же и определяют критерии для этих статусов.

Такая же бизнес-логика применима и к товарам. Самые горячие пирожки рекомендовать не стоит, как и неликвид. Общие рекомендации такие:

  • Соберите статистику продаж внутри категорий (н.р. по каталогу: джинсы, фены в т.д.)

  • Подберите процентили и длину временного периода за который будут рассматриваться сессии.

    Особенность распределений величин, связанных с деньгами и/или продажами, такова, что мы всегда увидим асимметричное распределение скошенное вправо, то есть с длинным хвостом справа:

  • Обратите внимание на мощность получившегося словаря, это может быть важно для оптимальной работы поисковых индексов

  • Стоит позаботиться о моделях матчинга в вашей рекомендательной системе — это позволит подгрузить словарь синонимов в вашу идеальную модель TF-IDF

  • Обратите внимание на IDF! (Благо, вы его уже рассчитали!)

Вместо того, чтобы самостоятельно собирать статистику продаж N_w воспользуемся TF-IDF: нужная величина представлена множителем IDF:

IDF(w, D) = \log \left( \frac{\left| D \right|}{N_w} \right) = log(\left| D \right|) - log(N_w) = const -  log(N_w)

Определите, что вы хотите достичь с помощью модели TF-IDF. Если ваша цель — выделить уникальные товары, то выбирайте те, что имеют высокий IDF. Если же вы хотите выделить товары общего потребления, которые встречаются во многих сессиях, то вам нужны товары с низким значение IDF. 

За счет того, что товары FMCG имеют низкий IDF, наша модель может избавиться от смещения в ТОП продаж и купировать проблему Popularity Bias, с которой так отчаянно борются другие кандидатогенераторы.

Таким образом TF-IDF учитывает как популярность товара, так и его общую редкость по всему корпусу, помогает выделять ключевые товары (сигнал для рекомендаций) и устраняет шум.

Борьба метрик

Чтобы не просто получить качественную рекомендацию, но и расширить разнообразие групп товаров предстояло ответить на вопросы:

  • Какие события считать сессией?

  • Будем ли приводить сессии к одной длине?

  • Какой размер словаря нам получится залить в поисковый индекс?  

  • Каково минимальное количество позитивов для отбора в корпус?

В серии экспериментов определялись критерии и подбирались параметры.

В итоге мы пришли устойчивым и воспроизводимым результатам, сравнимыми с продовыми статистическими моделями, как по техническим, так и бизнес-метрикам.

Второй сезон: Якорные события

Возможно, вы уже читали в прошлом сезоне наших заметок о рекомендациях про якорные события. Коротко о сути: мы рассматриваем историю взаимодействий юзера не целиком, а отбираем определенный набор товаров. Например, двигаемся с конца и берем только N товаров определенной категории, а остальные, той же категории, дальше по истории, выкидываем. Итоговая цепочка будет опорной для поиска похожих (близких) на них товаров.

Воспользуемся описанным подходом и найдем ближайших соседей для всех айтемов «словаря». Благо, по формуле (2) векторные представления уже посчитаны. Запускаем faiss, тут ничего сложного)

Добавив схему рекомендаций с якорными событиями, мы улучшили качество рекомендаций на 20–30% для первых 200 рекомендаций. И на этом развитие модели не остановилось.

В ПРОД? 

А фильтровать кто будет? Бизнес-требования просты, как и все гениальное: не нужно рекомендовать ту же группу товаров, особенно если она статистически не располагает к повторной покупке и дешевле исторических покупок. Здесь не менее важны давность и регулярность событий, связанных с якорными товарами.

Отметим, что важно обратить внимание на состав отбираемых рекомендаций: лучше разбить товары на кластеры и уже после сбалансировать выдачу квотами с учетом распределения интересов пользователя к каждому из кластеров. 

Новый виток истории

Окей, кластеры, квоты и интересы, мы сделали. Но что будет, если…

...закрутить пожестче квоты с фильтрацией и применить те же самые списочные рекомендации уже к отобранным кандидатам?

Фотка фрактального подобия
Фотка фрактального подобия

Слишком далеко уходить не будем: перемножая близости якоря и кандидата, кандидата и его соседа с адаптивными коэффициентами, получаем новую меру близости и новый сезон экспериментов.

Результаты экспериментов

Заглядывать в будущее модель пока не научились, но метрики со второго сезона снова выросли. На этот раз модель начала выдавать качество сопоставимое с BERT4rec! HitRate / Precision / NDCG выросли на 40–50%.Полученная модель обладает высокими показателями разнообразия и низким пересечением с топом продаж. 

Все перечисленные характеристики позволяют использовать модель как для прогрева пользователя с малым количеством позитивов, так и для CORE аудитории Wildberries.

Проблема холодного старта

Для решения этой задачи некоторые компании даже создают целые команды. А что может предложить TF-IDF? Во втором сезоне вышел item2item подход, который принесет немало рекомендаций для пользователя с небольшим числом позитивов, даже если это будет просто долгий просмотр.

Минусы о которых можно заявить

Метод TF-IDF имеет определенные ограничения: он не распознает семантические связи между словами (товарами) и плохо справляется с неструктурированными данными (например, с мультимедийным контентом или информацией о поведении пользователей). Поэтому для повышения точности рекомендаций его часто комбинируют с другими подходами, такими как коллаборативная фильтрация или методы глубокого обучения, которые лучше учитывают контекст и предпочтения пользователей. 

Заключение 

Одними из основных преимуществ использования Term Frequency-Inverse Document Frequency (TF-IDF) в рекомендациях являются его простота и эффективность. Метод обеспечивает высокую степень релевантности при ранжировании контента, особенно когда система работает с большими коллекциями. TF-IDF позволяет учитывать не только частотность товаров, но и их уникальность, что особенно важно при работе с разнообразными коллекциями данных. 

В будущем в добавлении к частотной модели TF-IDF будут разработаны гибридные подходы кандидатогенерации, основанные на семантическом анализе пользовательских данных. Это позволит повысить точность и персонализацию рекомендаций, что является ключевым фактором успешности современных рекомендательных систем.

Спасибо за прочтение статьи. Надеюсь, материал был полезен и помог лучше понять этот метод и его роль в современных технологиях рекомендаций!


Эта и другие статьи про рекомендации в Wildberries выходят в Telegram-канале @wildrecsys. Подписывайтесь, чтобы не пропустить новые публикации!

А больше о том, как при помощи ML мы делаем маркетплейс лучше для продавцов и покупателей, рассказываем в Telegram-канале @wb_space. Там же делимся анонсами и полезными материалами от экспертов.

Комментарии (0)