Оффтоп Epoch 8
3 838

Как ускорить работу редакции интернет-магазина в 10 раз с помощью машинного обучения

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

В закладки

У любого крупного интернет-магазина есть редакция.

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

Таким образом, от скорости и качества работы редакции напрямую зависят продажи.

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

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

Мы в Эпохе8 последний год занимаемся проектами в области машинного обучения и решили поделиться своими наработками в этой теме.

Типовая задача #1: Категоризация товаров

Допустим у вас маркетплейс (китайских) товаров. У вас продаются миллионы товаров от тысяч поставщиков. Каждый день поступают десятки тысяч новых товаров. Для того, чтобы товар появился на сайте, ему нужно присвоить правильную товарную категорию.

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

Редактор смотрит на товар и присваивает ему категорию с помощью встроенной нейросети.

На публикацию одного товара уходит 15-30 секунд, то есть в день один редактор может опубликовать около 1000 товаров, если очень постарается.

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

Этап 1: подготовка данных

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

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

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

Также нам понадобится случайная выборка товаров с сайта. Объем этой выборки должен быть таким, чтобы на каждую категорию в среднем приходилось от 10 до 100 товаров.

Если категорий на сайте мало, то примеров для каждой категории понадобится больше. А если дерево категорий обширное, то хватит десятка примеров на каждую.

Выбранные случайным образом товары мы отдаем на разметку редакции.

Это скриншот из админки редакции. Слева – трехуровневое дерево категорий, а справа – описания и картинки товаров. Редактор смотрит на картинку и описание и присваивает товару категорию.

Этап 2: обучение модели

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

Цикл обучения модели похож на цикл обучения школьника.

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

Точно так же мы поступаем и с нашей моделью.

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

Переносим знания из головы редактора в модель машинного обучения.

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

Первое "домашнее задание", которое мы даём модели.

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

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

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

Таким образом, мы получаем оценку качества работы первой модели по каждой категории.

Мы видим, что, например, в категориях Hair Accessories, Gloves & Mittens, Hats & Caps качество работы модели достаточное, категория предсказана правильно в >95% случаев. То есть, модель хорошо научилась отличать такие товары.А вот в категориях Cage Harness, Hang Fans, Jeans, Shorts модель часто ошибается. Это означает, что ей нужно больше обучающих примеров по этим категориям.

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

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

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

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

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

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

Промежуточный результат работы: руками редакции размечено 227,673 товара, а автоматически – почти в 5 раз больше.

Типовая задача #2: присвоение товарам характеристик

Вторая типовая задача – это присвоение товарам характеристик, например: “мужское/женское”, “с длинным рукавом/с коротким рукавом”, “синий/зеленый/красный” итп.

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

Для разметки нам понадобится около 100 примеров товаров для каждого значения характеристики.

Частые вопросы

Можно ли отказаться от людей в редакции совсем?

Мы не рекомендуем.

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

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

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

Сколько времени проходит прежде чем нейросеть начнет выдавать предсказания приемлемого качества?

Всё зависит от скорости, с которой редактора размечают товары.

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

Какую архитектуру нейросети вы используете?

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

Итого

  • Типовые задачи редакции интернет-магазина можно ускорить в 5-50 раз, если усилить редакцию с помощью машинного обучения.

  • Категоризация товаров и присвоение товарам характеристик – это хорошо решаемая с помощью нейросетей задача. Первые хорошие результаты можно получить уже через неделю работы.

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

Над проектом работала команда Эпохи8: Андрей Татаринов, Игорь Галицкий, Алексей Соловьев, Евгения Заворина, Игорь Борщевский

Текст и картинки: Ольга Дёмкина

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

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Epoch 8", "author_type": "self", "tags": ["2","1"], "comments": 18, "likes": 38, "favorites": 69, "is_advertisement": false, "subsite_label": "flood", "id": 43786, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15395' + '50799') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 43786, "author_id": 194003, "diff_limit": 1000, "urls": {"diff":"\/comments\/43786\/get","add":"\/comments\/43786\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/43786"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

18 комментариев 18 комм.

Популярные

По порядку

Написать комментарий...
1

TensorFlow, Keras, PyTorch, Caffe ?

Ответить
5

Keras на TF. Самое хорошее инструментирование у такой конструкции

Ответить
–3

Или не заморачивайтесь, разгоните ничего не успевающую контентную группу, да закажите карточки у нормальных ребят https://contenthub.ru/

Ответить
4

"Или не заморачивайтесь спамом на vc.ru, разгоните непонятно-скучный и депрессивный сайт, да закажите дизайн и верстку у нормальных ребят"

Ответить
0

Давайте контакт)

Ответить

Комментарий удален

0

Андрей, напишите, пожалуйста, на hello@epoch8.co с деталями вашей задачи (объем базы, предполагаемый размер категорийного дерева, есть ли у вас модераторы), и мы вам обязательно ответим!

Ответить
1

Очень интересная тема. Может быть попозже подробнее сделаете статью?

Ответить
0

С большим удовольствием, можем подробнее рассказать :) А какие подробности интересуют: скорее технические или бизнесовые?

Ответить
0

Мы делаем сортировку по анализу фотографий. Ручной труд практически исключён

Ответить
1

Очень интересно. А можно подробности, пожалуйста?

Ответить
1

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

Ответить
0

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

об это все и разбивается

Ответить
1

Илья, так в этом и смысл, что описанный процесс - это Active Learning, процесс настроен на сбор большего количества данных именно в тех категориях, где данные неоднозначны и модель ошибается.

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

Ответить
0

а есть какая то демка где можно попробовать как это все ботает на своих данных?

Ответить
1

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

У нас есть в планах выставить в интернет демо-версию категоризации, но решили начать со статьи :)

Если вдруг интересует проверить применимость подхода к вашей задаче, напишите, пожалуйста, на hello@epoch8.co

Ответить
0

жалко, лучше один раз увидеть. Ну, идея норм, че, молодцы

Ответить
0

Инструкция как сделать качество описаний товаров как у алиэкспресс.
Называется несем людям дополнительную "ценность".

Ответить
0

На Aliexpress товары описывают люди, а не роботы, и это действительно забавно: продавец старается оптимизировать описание так, чтобы оно попало во все поисковые запросы на свете. Поэтому нагромождает ключевики: “best man woman unisex sport watches red green blue black” итп.

А наша задача как раз обратная – продраться сквозь это описание и, несмотря на нагромождение слов, понять:
* что этот товар относится к категории “Спортивные часы”
* что этот товар есть красного, зеленого, синего и черного цветов.

Когда мы это делаем, покупатель заходит на сайт, заходит в категорию “Спортивные часы”, выставляет, например, фильтр “черный” и получает аккуратный список подходящих ему черных спортивных часов (и ничего кроме них).

Ответить

Комментарий удален

0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Приложение-плацебо скачали
больше миллиона раз
Подписаться на push-уведомления