Как стать автором
Обновить
246.11
AvitoTech
У нас живут ваши объявления

Как мы в Авито предсказываем категории объявлений по описанию

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров837

Привет! Меня зовут Руслан Гилязев, я работаю в подразделении DS SWAT в Авито, руковожу командой платформы Item2param. Одна из моих задач — развивать модели, которые предсказывают параметры объявлений. В этой статье расскажу, с помощью каких технологий мы решаем задачу классификации объявлений и почему это важно для бизнеса. Материал будет полезен DS-инженерам любого грейда и backend-инженерам, которые интересуются темой Data Science. 

Что внутри статьи:

Как обстояли дела, когда в Авито не было подсказок категорий

Использовали два подхода, чтобы все объявления лежали по полочкам

Задача: обучить модель классифицировать категории объявлений

Решение: создали платформу определения параметров

Сделали иерархическую систему из 250 отдельных моделей для классификации объявлений

Спроектировали систему так, чтобы расширение категорий не затрагивало существующие

Как мы понимаем, что система работает хорошо и когда принимаем решение, что модель нужно переобучить

Основные тезисы статьи кратко

Как обстояли дела, когда в Авито не было подсказок категорий

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

  • чтобы избежать платного размещения. Например, продавали транспорт в категории «Запчасти и аксессуары»;

  • чтобы получить более выгодные условия на платные услуги. Бизнесы по ремонту квартир могли маскироваться под частных мастеров, чтобы снизить цену на платное продвижение;

  • пользователи просто путались среди множества категорий и размещали объявление не там, где нужно.

К тому же, чем больше становилось товаров и категорий, тем сильнее усложнялась навигация.

На Авито продаются тысячи разных позиций товаров — автомобили, мебель, недвижимость. Из-за этого пользователи не всегда понимают, где разместить объявление и какую категорию выбрать. 

Например, чтобы выставить на продажу молоток, нужно было пройти целый путь: нажать «Для ремонта и строительства» → Далее найти «Инструменты» → После попасть в «Ручные инструменты» → В конце найти «Ударно-рычажные инструменты».

Такая иерархия — сложно и неудобно: 

Так выглядит иерархия категорий товара
Так выглядит иерархия категорий товара

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

  • через поиск по категориям происходит 40% контактов между покупателем и продавцом. Без фильтра поиска пользователю сложнее найти подходящее объявление и начать диалог;

  • от категории зависит стоимость размещения и услуг продвижения на Авито;

  • объявление в неверной категории будет работать некорректно.

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

Крупногабаритные и слишком тяжёлые запчасти, например, двигатель в сборе, Авито Доставкой отправить не получится. Ещё не примут опасные для перевозки детали вроде аккумулятора.

Подробнее про особенности доставки в статье: «Как продавать запчасти для грузовиков и спецтехники с помощью Авито Доставки».

Использовали два подхода, чтобы все объявления лежали по полочкам

Первый — подсказка на подаче. Перед публикацией пользователь вводит название товара. Ему не нужно прожимать дерево категорий, достаточно воспользоваться подсказкой. Например, пишет слово «молоток», и мы показываем, категории, куда можно разместить товар. 

Подсказываем два варианта возможных категорий для заголовка "молоток"
Подсказываем два варианта возможных категорий для заголовка "молоток"

Если подсказка не сработает, пользователь может нажать на кнопку «Другая категория» и выбрать её самостоятельно

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

В 2021 году мы сделали подсказки на подаче и внедрили ручную модерацию, это помогло снизить количество ошибок при размещении на 20%. Подсказки помогают пользователям быстро выбрать правильную категорию, а модерация защищает от намеренных или случайных ошибок. 

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

Задача: обучить модель классифицировать категории объявлений

К примеру, пользователь разместил новое объявление о продаже молотка: есть описание, картинка, заголовок. По этим критериям нужно автоматически определить подходящую категорию. 

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

Пример классификации объявления
Пример классификации объявления

Проблемы начинаются в момент, когда список категорий меняется — добавляются новые разделы, текущие углубляются или переносятся между ветками. Например, молоток может переместиться из раздела «Ударно-рычажные инструменты», и пользователю будет сложнее найти его.

Категории образуют дерево. Жёлтым помечены новые узлы, а серым - те, которые будут удалены или перенесены.
Категории образуют дерево. Жёлтым помечены новые узлы, а серым - те, которые будут удалены или перенесены.

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

Решение: создали МЛ платформу определения параметров

Платформа работает с Инфомоделью, которая уже была в Авито.

Инфомодель Авито — база знаний обо всех параметрах, категориях и значениях товаров, которые пользователи публикуют на площадке. Например, все существующие бренды, цвета, размеры, составы. Эти параметры мы ещё называем атрибутами. 

Для каждой категории товаров у нас прописаны свои атрибуты. Для примера покажу Инфомодель для товаров в категории: «Ремонт и строительство».

Так выглядит Инфомодель одной из категорий товаров на Авито
Так выглядит Инфомодель одной из категорий товаров на Авито

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

Так выглядит дерево классификации микрокатегорий товаров
Так выглядит дерево классификации микрокатегорий товаров

Про нашу Инфомодель рассказывали в статье: «Версионирование данных в Инфомодели Авито»

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

Бренд коляски можно найти в инфомодели по ID атрибута
Бренд коляски можно найти в инфомодели по ID атрибута

Под капотом платформа использует единый feature extractor на базе языковой модели BERT (Bidirectional Encoder Representations from Transformers), обученный на объявлениях Авито. Для каждого параметра обучается отдельная модель. 

Так выглядит архитектура модели верхнеуровнево
Так выглядит архитектура модели верхнеуровнево

Теперь посмотрим, как Инфомодель и платформа помогают определять категории товаров. 

Сделали иерархическую систему из 250 отдельных моделей для классификации объявлений

Каждая работает с конкретным параметром из дерева категорий. Модели дополняются, так как структура категорий Авито регулярно обновляется.

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

На каждой итерации работает функция сравнения, которая ранжирует варианты по вероятности:

  1. Идём по дереву. На каждом шаге у нас N~5 кандидатов.

  2. Смотрим предсказания нужного атрибута для текущего кандидата.

  3. Новых кандидатов ранжируем функцией сравнения:

cmp(Cand1(p_node11, p_node12, …), Cand2(p_node21, p_node22, …))

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

Например, для молотка сначала определяется категория «Ремонт и строительство», затем «Инструменты», потом «Ручные инструменты». Неподходящие варианты отсеиваются на каждом этапе, пока не будет достигнута листовая категория — «Ударно-рычажные инструменты».

Пример классификации молотка
Пример классификации молотка

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

К примеру, для модели, определяющей тип инструментов, в первую очередь добавляем данные из соседней ветки — строительные материалы. А также добавляем примеры из более далёких категорий, например, Недвижимости и Услуг, но уже в меньшем объёме.  

При поступлении объявления текст токенизируется и обрабатывается единым BERT-экстрактором признаков для всех 250 моделей. Каждая модель — это классификатор, обученный на выходе BERT. 

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

Так выглядит процесс работы классификатора — инференс
Так выглядит процесс работы классификатора — инференс

Подробнее про библиотеку Aqueduct мы писали в статьях:

«Aqueduct: Как мы экономим железо для МЛ-вычислений»

«Как мы используем разделяемую память в Aqueduct»

Теперь расскажу, как мы добавляем новые категории. 

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

Система состоит из трёх компонентов: разметки данных, инфраструктуры автообучения и валидации качества.

Контент-менеджер готовит и настраивает датасет для новой подкатегории. Он размечает данные во внутреннем инструменте разметки и добавляет новые категории в дерево.

Так выглядит процесс добавления категорий в дерево
Так выглядит процесс добавления категорий в дерево

Механизм обучения модели автоматизируется с помощью Airflow. Система периодически проверяет появление новых узлов в дереве категорий. При появлении запускается шаг с обучением модели. Результаты сохраняются в MLflow вместе с детальной аналитикой качества полученного классификатора.

Так выглядит процесс обучения модели в Airflow
Так выглядит процесс обучения модели в Airflow

Документация по Airflow на airflow.apache

Документация по MLFow на mlflow.org 

DS-инженер анализирует качество обученной модели. При необходимости он может вручную переобучить модель и запросить доразметку датасета. После одобрения модель автоматически интегрируется в существующий пайплайн классификации категорий.

Так выглядит отчёт с качеством работы модели
Так выглядит отчёт с качеством работы модели

Резюмирую, как выглядит процесс добавления новых категорий на Авито:

  1. Контент-менеджер размечает датасет и добавляет новые категории в дерево.

  2. Пайплайн в Airflow обнаруживает изменения в дереве и запускает обучение модели.

  3. Результаты сохраняются в MLFlow.

  4. DS-инженер проверяет качество модели и принимает решение о запуске в продакшен.

  5. Новая модель начинает работать в иерархическом классификаторе, и система может предсказывать новые классы.

Пошаговый процесс добавления новых категорий в модель
Пошаговый процесс добавления новых категорий в модель

Как мы понимаем, что система работает хорошо и когда принимаем решение, что модель нужно переобучить

Оценку качества пайплайна мы проводим несколькими способами:

Размечаем случайный семпл данных раз в неделю. Определяем случайную выборку объявлений по категориям и отдаём на разметку модераторам.

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

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

Пример, как отслеживается конверсия
Пример, как отслеживается конверсия

Предлагаем пользователю до пяти подсказок, первая из которых — самая вероятная по нашей оценке, и смотрим, на какую из них кликнет продавец.

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

Пример того, как отслеживается модерация
Пример того, как отслеживается модерация

Зелёный цвет означает, что модератор согласился с категорией, красный, что отказался, а оранжевый означает, что модератор поменял категорию.

Основные тезисы статьи кратко:

Раньше пользователи Авито выбирали неверные категории объявлений по разным причинам. Это засоряло выдачу и мешало продавцам продвигать объявления.

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

Дальше создали платформу для определения параметров. На ней специалист по data science может обучить свою модель определять параметры объявления по описанию или картинке объявления. Она построена на основе инфомодели Авито и использует единый feature extractor на базе языковой модели BERT. 

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

  • движемся и на каждом шаге формируем список веток дерева, которые будут запускаться на следующем шаге;

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

  • когда пользователь размещает объявление, текст токенизируется и обрабатывается единым BERT-экстрактором признаков для всех двухсот пятидесяти моделей; 

  • агрегируем результаты всех моделей в итоговую категорию.

Авито постоянно обновляется, поэтому мы добавляем новые категории. Процесс такой: 

  1. Контент-менеджер размечает датасет и добавляет новые категории в дерево. 

  2. Пайплайн обнаруживает изменения в дереве и запускает обучение модели. 

  3. Результаты сохраняются в MLFlow.

  4. DS-инженер проверяет качество модели и принимает решение о запуске в продакшен.

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

Спасибо вам за уделенное статье время! На вопросы готов ответить в комментариях.

Подробнее о том, какие задачи решают инженеры Авито, — на нашем сайте и в телеграм-канале AvitoTech. А вот здесь — свежие вакансии в нашу команду.

Теги:
Хабы:
+8
Комментарии5

Публикации

Информация

Сайт
avito.tech
Дата регистрации
Дата основания
2007
Численность
5 001–10 000 человек
Местоположение
Россия
Представитель
vvroschin