Хабрахабр

Векторные представления товаров, или еще одно применение модели Word2Vec

image

Когда видов товаров тоже много, решить задачу помогает модель Word2Vec. Каждый день полтора миллиона людей ищут на Ozon самые разные товары, и к каждому из них сервис должен подбирать похожие (если пылесос все-таки нужен помощней) или сопутствующие (если к поющему динозавру нужны батарейки). Разбираемся, как она работает и как создавать векторные представления для произвольных объектов.

Мотивация

Практически всем известным моделям требуется, чтобы данные на входе были фиксированной длины, и набор векторов — простой способ привести их к такому виду. Чтобы построить и обучить модель, мы используем стандартную для machine learning технику embedding, когда каждый объект превращается в вектор фиксированной длины, и близким объектам соответствуют близкие векторы.

Мы адаптировали этот метод для нашей задачи, в качестве слов у нас используются товары, а в качестве предложений — пользовательские сессии. Один из первых embedding-методов — word2vec. Если вам все понятно, смело пролистывайте к результатам.

Поскольку мы имеем дело с товарами, нужно научиться строить такие их описания, которые, с одной стороны, содержат достаточно информации, а с другой — понятны для алгоритма машинного обучения. Далее я расскажу об архитектуре модели и о том, как она работает.

image

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

Есть два принципиально разных способа построения векторного описания товара:

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

Мы остановимся на втором способе.

Данные для модели Prod2Vec

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

Пример реальной сессии пользователя:

image

Модель prod2vec строится на основе предположения, что похожие товары чаще всего имеют похожие контексты. Каждому товару в сессии соответствует его контекст — все товары, которые пользователь добавил в корзину в этой сессии, а также товары, которые смотрят вместе с этим.

Например:

image

Мы проверим эту гипотезу, построив векторы товаров. Таким образом, если предположение верно, то, например, чехлы для одной и той же модели телефона будут иметь похожие контексты (тот самый телефон).

Модель Prod2Vec

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

На выходе последнего слоя опять стоит число нейронов, равное числу товаров. Число нейронов на выходе первого слоя равно размерности векторов, которые мы хотим в итоге получить, например 64.

image

Такая архитектура называется Skip-gram (ее альтернатива — CBOW, где мы предсказываем товар по его контексту). Будем тренировать модель, чтобы предсказывать контекст, зная товар. Во время обучения на вход отдается товар, на выходе ожидается товар из его контекста (вектор из нулей с единицей на соответствующем месте).

Для одной пары слово — слово из контекста она записывается следующим образом: По сути это многоклассовая классификация, и для обучения модели можно использовать cross entropy loss.

$L = -p_c + \log \sum_^V exp(p_i)$

где $p_c$ — предсказание сети для товара из контекста, $V$ — общее число товаров, $p_i$ — предсказание сети для товара $i$.

Матрица весов первого слоя (размером число товаров х 64) при этом является словарем векторов товаров. После обучения модели мы можем отбросить второй слой — он не понадобится для получения векторов. Каждому товару соответствует одна строка матрицы длины 64 — это и есть вектор, соответствующий товару, который можно использовать в других алгоритмах.

А у нас их, напомним, полтора миллиона. Но эта процедура не работает для большого количества товаров.

Почему не работает Prod2Vec

— Функция потерь содержит множество операций взятия экспоненты — это долго и неустойчиво вычислительно.
— В результате градиенты считаются для всех весов сети — а их могут быть десятки миллионов.

Для этого нам нужно генерировать негативные примеры — для каждого товара подбирать те, которые не нужно для него предсказывать. Для решения этих проблем подходит метод negative sampling, используя который, мы учим сеть не только предсказывать контекста для товара, но еще и учим не предсказывать товары, которые точно в контекст не входят. При выборе для товара случайной пары, мы имеем очень маленькую вероятность того, что это окажется товар из контекста. И здесь наличие огромного количества товаров нам помогает.

При этом товары сэмплируются не равномерным распределением, а пропорционально частоте их встречаемости. В результате для каждого товара в контексте мы случайно генерируем 5-10 товаров, которые в контекст не входят.

Для одной пары слово — слово из контекста она выглядит так: Функция потерь теперь похожа на ту, что используется при бинарной классификации.

$L = - \log \sigma(u_{w_O}^T v_{w_I}) - \sum_{w_n} \log \sigma(-u_{w_n}^T v_{w_I})$

Функция $\sigma(x)=\frac{1}{1 + exp(-x)}$. В этих обозначениях $u_{w_O}$ обозначает столбец матрицы весов второго слоя, соответствующий товару из контекста, $u_{w_n}$ — то же самое для случайно выбранного товара, $v_{w_I}$ — строка матрицы весов первого слоя, соответствующая основному товару (это именно тот вектор, который мы строим для него).

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

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

Результаты

Похожие товары

Итак, мы научились получать векторы для товаров, теперь нужно проверить адекватность и применимость нашей модели.

На следующей картинке представлен товар и его ближайшие соседи по косинусной мере близости.

image

Для этого мы применили ее для задачи товарных рекомендаций. Результат выглядит хорошо, но необходимо численно проверить, насколько хороша наша модель. Модель prod2vec мы сравнивали с куда более простой, основанной на статистике совместных просмотров и добавлений товаров в корзину. Для каждого товара мы рекомендовали ближайшие в построенном векторном пространстве. Объединение всех рекомендованных товаров в сессии сравнивалось с тем, что человек реально добавил в корзину. Для каждого товара в сессии был взят список из 7 рекомендаций к нему. Для сравнения, более простой алгоритм показывает качество 34%. Используя prod2vec, более чем в 40% сессий мы рекомендовали хотя бы один товар, который потом был добавлен в корзину.

Мы можем рассмотреть какие интересные побочные результаты можно показать, используя нашу модель. Полученное векторное описание позволяет не только искать для товаров ближайшие (что может делать и более простая модель, пусть и с худшим качеством).

Векторная арифметика

Как и в хрестоматийном примере о word2vec (king — man + woman = queen), мы можем например задаться вопросом о том, какой товар находится на примерно таком же расстоянии от принтера, как пылесборник — от пылесоса. Для иллюстрации того, что вектора несут в себе реальный смысл о товарах, мы можем попробовать применить для них векторную арифметику. Наша модель способна уловить такие закономерности: Здравый смысл подсказывает что это должен быть какой-то расходник, а именно картридж.

image

Визуализация пространства товаров

Чтобы еще лучше понять результаты, мы можем визуализировать векторное пространство товаров на плоскости, снизив размерность до двух (в данном примере мы использовали t-SNE).

image

Например, хорошо видны кластера с текстилем для спальни, мужской и женской одеждой, обувью. Хорошо видно, что близкие товары образуют кластеры. Еще раз отметим, что данная модель построена только на основе истории взаимодействия пользователей с товарами, мы не использовали при обучении сходство изображений или текстовых описаний.

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

Планы

Также полученные векторы можно использовать как признаки для других алгоритмов машинного обучения, которыми занимается наша команда (предсказание спроса на товары, ранжирование в поиске и каталогах, персональные рекомендации). Сейчас мы внедряем модель prod2vec в продакшн для расчета товарных рекомендаций.

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

Если вы знаете, как лучше это сделать (или переделать) — приходите в гости (а еще лучше работать).

Ссылки:

  1. Mikolov, Tomas, et al. "Distributed representations of words and phrases and their compositionality." Advances in neural information processing systems. 2013.
  2. Grbovic, Mihajlo, et al. "E-commerce in your inbox: Product recommendations at scale." Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 2015.
  3. Grbovic, Mihajlo, and Haibin Cheng. "Real-time Personalization using Embeddings for Search Ranking at Airbnb." Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. ACM, 2018.
Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть