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

Команда Универсального каталога Criteo ежедневно взаимодействует с миллиардами продуктов, создавая один из крупнейших каталогов электронной коммерции в мире: более 25 миллиардов продуктов . Эти продукты, предоставляемые нашими партнерами по электронной торговле, содержат разные поля данных, которые мы используем для создания обогащения: новые поля продуктов, которые стандартизируют данные и повторно используются командами Criteo по всему миру. Важным дополнением является классификация продуктов по категориям.

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

В Criteo у нас есть несколько десятков тысяч партнеров по электронной коммерции, которые предоставляют нам свои каталоги для более чем 25 миллиардов продуктов. Эти продукты рекомендуются пользователям Интернета через нашу онлайн-рекламу с учетом их актуальности для пользователей Интернета и для рекламных кампаний наших партнеров по электронной торговле. Чтобы гарантировать качество этой рекомендации, нам необходимо стандартизировать этот набор разнородных каталогов. В частности, каждый продукт должен быть отнесен к своей категории электронной коммерции. И этот набор категорий электронной торговли должен быть одинаковым для всех этих товаров, независимо от исходного каталога. Однако каждый партнер по электронной торговле предоставляет нам категории для каждого продукта, но не в общих ссылках. В Criteo мы используем классификацию, широко используемую в экосистеме электронной коммерции, предоставленную Google: Таксономия продуктов Google. Он используется только для розничных товаров, так как для разных типов товаров используются другие методы. Затем мы переклассифицируем розничные продукты в этой таксономии. Все возможные розничные продукты можно классифицировать в древовидной структуре.

Выше приведен образец вышеупомянутой Таксономии продуктов Google. Это древовидная структура, которую мы усекли до конечных категорий на 4-м уровне или меньше. Мы создали модель машинного обучения, чтобы прогнозировать для каждого продукта все категории до его конечной категории. Но мы используем только прогнозируемую конечную категорию, остальные прогнозируемые родительские категории предназначены для отладки. Знание прогнозируемой категории листьев позволяет получить путь к корневой категории.

Пересчитанная конечная категория называется «универсальной категорией». Если каталог уже использует эту таксономию, мы все равно пересчитаем ее. После повторного расчета все эти каталоги составляют уникальный большой каталог электронной коммерции (более 25 миллиардов товаров) под названием «Универсальный каталог», который используется во всей экосистеме Criteo.

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

В настоящее время в процессе производства, чтобы пересчитать универсальную категорию каждого продукта, мы построили модель машинного обучения, основанную на текстовых характеристиках этих продуктов. Но мы не используем имидж продукта. Можем ли мы предсказать «универсальную категорию», используя только изображение продукта с хорошими характеристиками? Для этой проблемы машинного обучения функцией является уникальное основное изображение, а прогнозируемая метка - это категория, к которой принадлежит продукт.

Здесь я опишу, как мы решили эту проблему классификации продуктов электронной коммерции по этим категориям, используя их основное изображение. Это контролируемая проблема машинного обучения, ориентированная на классы K, где K - +3000 к количеству конечных категорий в усеченной Таксономии продуктов Google. Для создания этого классификатора я решил использовать глубокое обучение, подход, который хорошо работает, если вы можете создавать большие наборы обучающих данных, как это было возможно здесь.

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

  1. Создание больших помеченных наборов данных для обучения / проверки и тестирования: (функция = изображение продукта, метка = категория продукта) с миллионами продуктов электронной коммерции, категоризированных с помощью распределенных вычислений с помощью Spark
  2. Выбирайте глубокие модели, основанные на новейших технологиях глубокого обучения на основе изображений.
  3. Создайте общую архитектуру глубокого обучения, чтобы решить эту проблему классификации машинного обучения.
  4. Обучите каждую модель в наборе данных для обучения / проверки с помощью TensorFlow 1.15, затем TensorFlow 2+ на нескольких графических процессорах.
  5. Оцените каждую модель в наборе данных тестирования с точки зрения точности и бизнес-ценности Criteo, затем проанализируйте их оценки с помощью сетки сравнения и многомерных матриц путаницы.

Давайте прыгнем в это!

Создание набора данных с использованием распределенных вычислений

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

Чтобы проверить, какая часть изображений недоступна или слишком медленно отвечать, и используя уже имеющиеся аннотированные данные, я сначала загрузил небольшую выборку из 10'000 продуктов за 2 часа. Я заметил 1% недействительных или отсутствующих ссылок на изображения, и около 12% изображений не могут быть загружены (изображения больше не существуют, ссылки существуют, но перенаправляют на домашнюю страницу и т. Д.)

Наивный последовательный подход, используемый для загрузки 10'000 продуктов, был хорош, но при масштабировании до более чем 36 миллионов продуктов с аннотациями он был слишком медленным (примерно 300+ часов). Чтобы исправить это, я применил полностью распределенный подход, максимально используя возможности Spark, запустив код в кластере из сотен 64-ядерных контейнеров. Хотя в результате возникли некоторые проблемы (необходимость создания настраиваемого исполняемого файла Python для сеанса Spark, чтобы иметь доступ ко всем необходимым пакетам, добавление условий в наши контейнеры на случай, если партнеры занесут их в черный список из-за спама запросов на загрузку и других проблем), после их решения загрузка может быть запущена в одно и то же время для набора данных, который более чем в 3'000 раз больше.

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

После того, как все загружено и сохранено, мы можем разделить данные, используя соотношение 70–15–15 для обучения (~ 25 миллионов продуктов), проверки (~ 5 миллионов) и тестирования (~ 5 миллионов) соответственно. Теперь, когда наш набор данных построен, пришло время погрузиться в саму проблему глубокого обучения, выбрав, какие модели использовать.

Изучение новейших методов

В Criteo мы работаем с TensorFlow 1.15. Хотя сначала TensorFlow1.15 был очень удобен, эта версия вскоре оказалась проблемой: плохая совместимость с настраиваемыми TFRecords (без пакетного обучения), недоступность последних моделей, тусклая документация…

На рисунке выше, обведенном красным, мы видим, что Inception V3 [1] и Xception [2], хотя и хороши, но уступают более новым моделям, недоступным в TensorFlow 1.15.

Затем я настоял на смене версии с TensorFlow 1.15 на TensorFlow 2+, чтобы протестировать более свежие модели, находящиеся на переднем крае передовых технологий. Хотя это означало полный перенос проекта, в конечном итоге оно того стоило.

В этом проекте мы впервые использовали:

  • InceptionV3 за впечатляющие результаты в ILSVRC’15
  • Xception за дизайн (сделан для классификации по большому количеству классов)

Эти модели были особенно полезны, когда мы были связаны с TensorFlow1.15 (как было замечено ранее, тогда они были самыми современными), но, когда мы перешли на TensorFlow2, мы также добавили EfficientNet [3] в нашу базу для сравнения. Эти модели, конечно, не все доступные модели, и это все еще точка улучшения работы, которую мы представляем здесь.

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

Создание общей архитектуры

Чтобы иметь возможность быстро изменить нейронную сеть, с которой мы хотим поэкспериментировать, было важно разработать общую архитектуру.

Мы создаем шаблон, который добавляет завершающие слои к выбранной модели глубокого обучения, чтобы предсказать все 4 уровня Таксономии Google. Эти уровни взвешиваются в соответствии с глубиной, чтобы учесть тот факт, что наши клиенты хотят, чтобы категория уровня 4 превыше всего.

Обучение моделей

После того, как модель выбрана, мы обучаем ее по следующему конвейеру:

  1. Подключайтесь к контейнерам Criteo ML.
  2. Обучите модель:
    a) Получите наборы данных для обучения и проверки, хранящиеся в HDFS, как TFRecords.
    b) Запишите метрики машинного обучения (точность, потери, top_k_accuracy и т. Д.) В MLFlow.
  3. Сохраните обученные модели в HDFS.

Имея эти модели, доступные в HDFS, мы можем сравнивать результаты на другом наборе данных: на тестовом наборе.

Анализ результатов

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

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

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

В таблице выше мы видим, как не все показатели коррелированы. Время обучения, которое обычно является компромиссом (более длительное время обучения часто коррелирует с большей точностью, но также и с более крупными моделями, чего не всегда стоит ожидать), здесь не всегда полезно. Сравнивая взвешенные оценки наших различных моделей, мы замечаем, что EfficientNetB3, хотя и лучше на ImageNet, чем все другие модели, показанные здесь, уступает в наших тестовых наборах: точность высока, но взвешенная оценка низка. Xception, разработанный для классификации по большому количеству классов [2], дает наилучшие результаты, хотя и находится в том же диапазоне, что и другие модели.

В матрицах путаницы мы регистрируем предсказанные классы по вертикали, а истинные классы по горизонтали. Когда модель предсказывает правильный класс, она регистрируется по диагонали. На рисунке выше мы видим, как наша модель предсказывала «Шампунь и кондиционер» примерно в 15% случаев, когда правильным классом был «Уход за кожей» (или «Топы для малышей» примерно в 10% случаев для «Детские и Одежда для малышей »), товары, которые действительно похожи друг на друга визуально.

Заключение и дальнейшие шаги

Учитывая точность более 90% на тестовом наборе из более чем 5 миллионов изображений, очевидно, что одним из следующих шагов будет интеграция этого проекта с методами НЛП, уже используемыми в производственной среде для создания универсального каталога. Это может быть сделано, например, с использованием мультимодального обучения [4] или сочетанием обоих методов, например, с использованием ансамблевого обучения [5].

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

Поскольку модели достигают уровней точности, подобных или превышающих современную точность, указанную ранее для ImageNet, ожидается, что каждый дополнительный процент точности будет трудно получить. Хотя использование последних моделей 2021 года (NFNets [6] или EfficientNetv2 [7]) определенно является вариантом, создание наших собственных моделей также становится привлекательным путем!

Спасибо за прочтение!

Я хотел бы поблагодарить Ромена Бомона за его опыт в машинном обучении, Жиля Легу за его помощь в распределенных вычислениях и за его руководство на протяжении всего проекта. Наконец, я также хотел бы поблагодарить остальную часть команды Универсального каталога (Алехандру Паредес, Насреддина Фергани, Хадриена Хамеля и Агнес Массон-Сибут ) за прекрасную рабочую среду, которую они позволили мне испытать.

Хотите работать с командой? Ознакомьтесь с нашими открытыми возможностями:



Библиография

[1] Переосмысление начальной архитектуры компьютерного зрения, Кристиан Сегеди, Винсент Ванхаук, Сергей Иоффе, Джонатон Шленс, Збигнев Война

[2] Xception: глубокое обучение с разделенными по глубине свертками, Франсуа Шоле

[3] EfficientNet: переосмысление масштабирования модели для сверточных нейронных сетей, Mingxing Tan, Quoc V. Le

[4] Мультимодальное машинное обучение: обзор и таксономия, Тадас Балтрушайтис, Чайтанья Ахуджа, Луи-Филипп Моренси

[5] Ансамблевое обучение: обзор, Омер Саги, Лиор Рокач

[6] Высокопроизводительное распознавание крупномасштабных изображений без нормализации, Эндрю Брок, Сохам Де, Сэмюэл Л. Смит, Карен Симонян

[7] EfficientNetV2: модели меньшего размера и более быстрое обучение, Mingxing Tan, Quoc V. Le