Автор Дженк Бирканоглу, специалист по анализу данных

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

Мы хотели упростить и ускорить создание рекламы пользователями на одной из наших торговых площадок, поэтому мы решили создать модель машинного обучения. Мы создали, протестировали и внедрили модель всего за несколько месяцев, и теперь точность наших основных этикеток составляет 90–95%. Самое главное, что теперь наши пользователи могут создавать объявления и автоматически заполнять необходимые поля, просто загружая изображение.

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

В настоящее время он находится в разработке, и вы можете попробовать его сами, разместив объявление на coches.net!

Продолжайте читать, чтобы узнать, как мы это сделали.

Наша мотивация

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

Рынок хотел было ясно: улучшить взаимодействие с пользователем и упростить и ускорить загрузку изображений своего автомобиля. Звучит просто! Но как этого добиться, оставалось загадкой… Мы знали, что нам нужно уменьшить количество параметров, которые мы задаем пользователю, и сосредоточиться на тех, которые были бы полезны при прогнозировании остальных. Мы начали спрашивать себя: какие данные, предоставляемые пользователем при загрузке объявления, содержат достаточно информации, чтобы предсказать остальные параметры?

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

  • Категориальный, т. Е. Категория или тип предложения.
  • Числовой, т. Е. Цена или количество километров.
  • Текстовые, т.е. описание или заголовок объявления.
  • На основе изображения

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

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

Имея это в виду, мы запустили проект Car Classifier, который может извлекать из одного изображения поля Марка, Модель, Тип кузова, Цвет и Год и автоматически заполнять эти значения для пользователя. Эта функция ускорит процесс создания объявления и сделает его интересным для конечных пользователей, поскольку они с меньшей вероятностью будут ошибаться при заполнении полей.

Определение проблемы

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

Мы должны были помнить, что наша модель должна обрабатывать эти отношения, по крайней мере, самые сильные. Например, было неприемлемо прогнозировать марку как BMW и модель как A3 для одного и того же изображения, поскольку для марки BMW не существует модели A3. Чтобы быть более точным, есть список пар, которые имеют / могут иметь какие-то отношения:

  • Бренд - Модель
  • Модель - Тип кузова
  • Год выпуска
  • Бренд - Тип телосложения (не имеет прямого отношения)
  • Бренд - Год

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

О наборе данных

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

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

Чтобы лучше понять проблему, нам пришлось исследовать наборы этикеток. Ярлыки «Бренд», «Модель», «Тип тела» и «Цвет» являются дискретными, другими словами, с ними можно обращаться как с категориальной переменной. Когда дело доходит до года, это становится немного сложнее, поскольку его можно рассматривать как категориальный или числовой, и оба они действительны и возможны для реализации. Однако у этих двух подходов есть свои плюсы и минусы, поэтому нам пришлось их перечислить и тщательно обдумать, прежде чем делать что-либо еще.

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

Возможные реализации модели

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

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

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

Реализация блока маскирующего кода также приведена ниже.

Год может быть категориальным или числовым.

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

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

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

  • Придерживаясь классификации лейблов бренда, модели, цвета и типа бренда и задачи регрессии для года, которая казалась наиболее естественной
  • Рассмотрение каждой метки как примера проблемы классификации

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

  • Использование одного оптимизатора для всех этикеток
  • Использование отдельных оптимизаторов для каждой метки

Вот плюсы и минусы использования одного или нескольких оптимизаторов для нашей модели:

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

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

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

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

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

Окончательная модель и производительность

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

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

Заключение

Когда мы достигли отличных результатов, мы начали использовать эту функцию на coches.net, одной из наших торговых площадок в Испании. На сегодняшний день он находится в разработке более шести месяцев, и, согласно опросам рынка, очевидно, что пользователям эта функция нравится. Это помогло ускорить и автоматизировать процесс, поскольку пользователям больше не нужно вручную заполнять форму при публикации объявления.