Описание задачи
Автоматическое управление ставками — достаточно распространённая задача в индустрии. Статьи об этом можно найти по ключевым словам auto bidding и budget pacing.
Делюсь рассказом бывших коллег о реализации алгоритма ВКонтакте (привет, Дима и Даша!) и докладом команды Яндекс Директа.
Об этой и других задачах в области Computational Advertising также можно почитать в монографии: Display Advertising with Real-Time Bidding (RTB) and Behavioural Targeting.
Математически это можно сформулировать как задачу оптимизации с ограничениями: максимизировать число показов товаров рекламной кампании с учётом ограничения на дневной бюджет. Давайте подойдём к ней как к задаче комбинаторной оптимизации, а именно как к некой вариации задачи рюкзака (Multiple-Choice Knapsack Problem). Есть N предметов, у каждого есть стоимость и вес, и каждый принадлежит к одному из M классов. Требуется выбрать по одному предмету из каждого класса таким образом, чтобы их стоимость была максимальна, а суммарный вес не превышал объём рюкзака. Проводя аналогии: объём рюкзака — дневной бюджет; предметы — рекламные ставки для участия в аукционах; класс предмета — пара «товар — запрос», по которой проводится аукцион; ценности предметов — количество показов, которое мы ожидаем получить с такими ставками.
Отличия классической задачи рюкзака и задачи рюкзака с мультивыбором
Один из основных вызовов заключается в том, что рекламные аукционы очень динамичны и даже оптимальные решения надо регулярно обновлять.
Почему именно кресло?
Клиент хотел выйти на маркетплейсы, чтобы увеличить онлайн-продажи. Мы разместили товары на Ozon, а дальше нужно было:
-
Оптимизировать карточки.
-
Выбрать, какие товары мы будем продвигать.
-
Запустить рекламу.
Основа ассортимента нашего клиента, магазина «Все для активного отдыха на природе», — товары для рыбалки: удочки, спиннинги, надувные лодки, а также пляжные шезлонги. До выхода на маркетплейс они продавались не очень активно — по 3–4 штуки в месяц. Когда мы начали работать с клиентом, на его складе было по 20 штук кресел каждого цвета — всего 60. Такие запасы обеспечили бы продажи по существующим каналам магазина на год и больше.
Метрики продукта
Общие метрики:
-
Доля в CPM выручке в поиске: 75%
-
Доля в числе активных CPM кампаний: 20%
Но есть ли качественные улучшения для рекламодателей? В автобиддерных кампаниях в сравнении с кампаниями с ставками, выставленными вручную:
-
Cредняя доля рекламных расходов кампаний на 36% ниже (затраты на рекламу, делённые на прибыль с рекламы ⇒ ключевая метрика для рекламодателей)
-
Средняя ставка за показ кампаний на 27% выше
-
Средняя утилизация бюджета на 30% выше (Рекламодатели тратят на рекламу запланированную сумму)
График изменения долей числа автобиддерных и ручных кампаний в CPM формате оплатыГрафик изменения долей CPM выручки автобиддерных и ручных кампаний в поиске
Что дальше
Хоть мы и проделали большую работу, впереди ещё долгий путь:
-
отказ от реалтайм-сервиса в пользу Spark Structured Streaming подхода
-
замена эвристик для оценки факторов прогноза ML-моделями;
-
рост масштабируемости за счёт использования логов показов вместо полного лога аукционов со всеми кандидатами на выдачу;
-
развитие культуры А/Б-экспериментов с разными версиями биддера;
-
мониторинг, метрики, разбор корнер-кейсов и фидбэка от пользователей.
P.S: Мы активно растём и ищем:
-
ML-инженеров для улучшения релевантности рекламы и разработки автобиддеров
-
Go-разработчиков для сервисов эффективности рекламы.
По какому плану работали
Что мы сделали после того, как разместили ассортимент:
-
Проанализировали категории, в которых продаются наши товары. Посмотрели, сколько в них продавцов, насколько наше предложение конкурентно по цене и условиям доставки.
-
Посмотрели на карточки конкурентов — как они оформляют фотографии, заполняют характеристики, есть ли у них рич-контент.
-
Проанализировали семантику пользовательских запросов — что люди вводят в строку, чтобы найти товар.
-
Доработали карточку товара, опираясь на выводы проведенного анализа. Объединили артикулы со схожими характеристиками в одну карточку.
-
Собирали отзывы на товар. Подключили услугу Ozon «Отзывы за баллы» по стимулированию покупателей оставлять отзывы. Это помогает для запуска продаж новых товаров.
-
Сформировали комплекты, чтобы товар можно было купить пачкой.
Может показаться, что для продвижения товаров нужно сразу запустить рекламную кампанию. Но это не совсем так — если знать, как работает поисковый алгоритм на Ozon, можно на него повлиять. Тогда рекламный бюджет будет расходоваться более рационально, а иногда можно будет и вовсе обойтись без него.
Анализируем категорию
В категории «кресло-шезлонг» продавалось более 2000 товаров. Среди них были полные аналоги нашего и товары, похожие на наш. От похожих предложений мы выделялись акцентом на преимуществах товара, а от аналогов — ценой и отзывами
Причем важно, чтобы потенциальный покупатель заметил это еще на этапе просмотра выдачи и перешел именно в вашу в карточку. Для этого мы:
помогаем покупателю найти товар: заполняем характеристики, оптимизируем название под поиск;
привлекаем внимание к карточке заметным фото.
Цена нашего клиента была такой же или чуть ниже, чем у большинства аналогичных предложений.
Страница категории
Анализируем карточки конкурентов
Наша цель — переходы посетителей в карточку товара. У этого параметра самый большой вес в работе поискового алгоритма на Ozon — чем чаще люди переходят в карточку, тем выше товар поднимается в поиске и в выборке по категории.
В категории большинство изображений были фотографиями на светлом или нейтральном фоне или в естественной среде и несколько инфографик. Нельзя сказать, что эти карточки были плохо заполнены — наоборот, продавцы составляли названия с учетом семантики и заполняли все характеристики. Но рич-контента в карточках конкурентов было очень мало.
Анализируем семантику
Хоть наше кресло и продается в магазине для рыбаков, в основном его покупают дачники, любители туризма и пикников. Это преимущество мы указали в названии и характеристиках товара:
Делаем карточку заметной
Когда мы заполняли карточку, ориентировались на контент-рейтинг товара. Это новый инструмент Ozon, который советует, что добавить в карточку, чтобы она стала привлекательнее для покупателей.
Чтобы выделить товар в общем списке, мы придумали интересный дизайн. На главном изображении товар располагался на черном фоне, а рядом мы добавили контрастные надписи и инфографику для двух цветовых вариантов кресла:
Внутри карточки создали рич-контент, который увеличивает контент-рейтинг на 10 пунктов и акцентирует внимание покупателя на важных и уникальных свойствах товара:
Дальше мы заполнили все характеристики товара — это влияет на поиск, потому что алгоритм берет слова из запросов пользователя и сопоставляет их с атрибутами товара.
Объединили товары с разными вариантами цвета в одну карточку. Объединение карточек помогает покупателю выбрать товар, при этом в выдаче будут показаны все варианты, в нашем случае в выдаче были зеленое и синее кресла, хоть они были и объединены.
Отзывы под товарами сильно влияют на конверсию в покупку — покупатели их очень внимательно читают. Чтобы собрать первые отзывы о товаре, мы подключили инструмент «Отзывы за баллы»: тем, кто совершил покупку, предлагалось оставить отзыв и получить вознаграждение баллами Ozon. Оплата происходит только за оставленные отзывы, причем никто не гарантирует, что они будут хорошими. Если покупателю что-то не понравится, и он скажет об этом, то магазин все равно оплатит этот отзыв.
Предлагаем купить комплект
Так как шезлонги часто покупают парой или по несколько штук, мы подключили инструмент «Комплекты» — предложение купить сразу два кресла со скидкой, которое отображалось под описанием товара. Инструмент продвижения помогает увеличить средний чек.
Архитектура системы
Один из ключевых вызовов для предложенного алгоритма — обеспечение баланса между гибкостью, качеством и стабильностью работы. Несмотря на то что логи аукционов — это сотни терабайт данных, а их обработка занимает много времени, хочется уметь достаточно быстро формировать прогнозы для новых кампаний, не проседая в качестве, и оперативно реагировать на резкие изменения в аукционах. Например, в аукционы пришёл крупный рекламодатель, который выкупил большую часть трафика; в этом случае при фиксированном таргетинге и наборе ставок для кампании алгоритм не сможет оперативно поднять ставки или перераспределить трафик, что может привести к полной остановке кампании.
Для ускорения расчёта оптимальных ставок для новых и отредактированных (изменение набора товаров или лимита дневного бюджета) кампаний мы решили разделить систему доставки оптимальных ставок до прода на две части:
-
Реалтайм-сервис, который аппроксимирует оптимальные ставки для быстрого старта новой или отредактированной кампании.
-
ETL-пайплайн, ежедневно пересчитывающий оптимальные ставки по недельным логам аукционов.
Рекламный движок обрабатывает активные кампании, проводит аукционы и хранит логику дополнительных ограничений на открутку, таких как превышение дневного бюджета, количества показов на пользователя и скорости трат.
При запуске новой кампании или изменении параметров активной рекламный движок отправляет запрос в реалтайм-сервис с ID кампании, набором товаров и актуальными ограничениями бюджета и ставки. В течение нескольких минут сервис доставляет актуальные оптимальные ставки в key-value хранилище данных.
Для быстрой реакции на резкие изменения в аукционах мы добавили риалтайм корректировку ставок, сравнивающую ожидаемые траты кампании с реальными. Сервис корректирует ставки так, чтобы плавно потратить бюджет к концу дня: если к текущему моменту траты по кампании меньше плановых, то ставки будут повышены, если больше — понижены пропорционально величине отклонения реальных трат от ожидаемых.
Логи показов товаров со всеми параметрами автобиддера отправляются в ClickHouse через топик Kafka и используются для анализа качества работы системы.
Текущая архитектура автобиддера
Пара слов о том, как мы выкатывали проект в прод
Первая версия для презентации гипотезы команде продукта рекламы и руководству поехала в эксперимент в виде активной рекламной кампании с выставленными вручную оптимальными ставками, рассчитанными аналитически. Эффективность работы алгоритма сравнивали с исторической эффективностью открутки этой же кампании: оценивали метрики средней цены показа и их общего числа, утилизации бюджета.
После фаз активного ресёрча, аналитики и разработки появились важные вопросы: как оценить качество нового продукта и как выкатывать его на реальных пользователей?
Вариант протестировать эффективность нового инструмента в сравнении с ручными ставками с помощью А/Б-теста мы быстро отвергли. Внутренняя инфраструктура для А/Б-тестирования нам не подошла из-за отсутствия возможности разбиения экспериментальных групп по рекламным кампаниям и нужных разрезов по метрикам. Но даже разбиение по кампаниям не гарантировало бы полного отсутствия сетевого эффекта: похожие кампании в разных тестовых группах конкурировали бы за единый трафик. Да и в целом возникает вопрос: как корректно разбить кампании по группам, чтобы протестировать гипотезу о том, что автоматическое управление ставками увеличивает число показов за доступный бюджет для той же кампании с ручными ставками?
Хорошей идеей выглядит вариант с использованием дополнительной реплики каждой кампании из контрольной группы с тем же набором товаров и тем же бюджетом и распределением трафика равномерно между ними на стороне сервиса. Но в тот момент мы технически не были готовы быстро поддержать такую функциональность из-за сжатых сроков.
Другие варианты, которые мы отвергли:
разбиение экспериментальных группы по кампаниям с товарами одной категории: в теории это должно помочь изолировать группы в рамках аукционов;
использование метода тройной разности: тут важно отметить, что долгоживущих кампаний не так много и в них присутствует систематический баес (если кампанию долго не отключают, возможно, её результаты слишком хороши и при ручном управлении).
Итог: проводить А/Б-эксперименты для автобиддеров тяжело по нескольким причинам:
-
нужно следить за корректностью разбиения кампаний по группам;
-
срок жизни рекламных кампаний слишком короткий;
-
сложно изолировать аукционы для контрольной и тестовой групп.
В итоге мы решили провести оценку эффективности нового продукта по схеме, похожей на выкатку MVP-версии: со значительно большим числом кампаний и автоматизированным управлением экспериментом.
Доступ к продукту открывали итерациями по N кампаний: следили за метриками суммарного бюджета, роста кампаний и оттока рекламодателей. Путь от MVP на коленке до поддержки продукта для 100% рекламодателей на проде занял примерно шесть месяцев.
После релиза мы продолжаем итеративно улучшать продукт, и сейчас в процессе разработки находится часть сервиса, которая позволить запускать А/Б-эксперименты на основе аналога метода тройной разности. Есть надежда, что это позволит нам ускорить выкатку новых фич.
Пара слов о том, как устроено поисковое продвижение в Ozon
В поисковой выдаче есть слоты, которые зарезервированы под показ рекламных товаров. Инструмент, который отвечает за это в Ozon, называется «Трафареты». Поэтому, если быть точнее, после ввода текстового запроса параллельно происходит запрос кандидатов на показ как в общий поисковый индекс, так и к отдельный рекламный. Кандидаты из органической выдачи ранжируются ML-моделью по релевантности запросу, а для ранжирования кандидатов рекламной выдачи проводится аукцион среди рекламодателей.
Трафареты в поисковой выдаче по запросу «чай»
Рекламодателю для запуска рекламы товара sku нужно определить ставку в рублях за получение целевого действия. На площадке доступны несколько форматов оплаты рекламы: CPM (cost per mille: за показ), CPC (cost per click: за клик), CPO (cost per order: за заказ). Замечу, что просто по размеру ставки товары из разных форматов ранжировать не получится, ведь ценность у целевых действий разная. Поэтому для каждого пользовательского запроса проводится аукцион. Скор товара для участия в нём определяется по следующей формуле: , где — вероятность целевого действия после показа рекламы, которая оценивается моделями машинного обучения с использованием информации о товаре и контекста пользовательского запроса (информация о пользователе, запросе, категории товара, времени и т. д.). Ранжирование происходит по значению полученных скоров , то есть математическому ожиданию рекламной прибыли с показа товара пользователю. При выигрыше аукциона и получении товаром необходимого целевого действия площадка списывает с рекламодателя плату .
Для простоты будем в дальнейшем считать, что рекламный аукцион состоит только из CPM-товаров, — тогда ранжирование в аукционе происходит по размеру ставки за показ, ведь в случае показа. Выше будет стоять товар того рекламодателя, который готов заплатить больше за его показ по тому или иному запросу.
Наши результаты
По самой приоритетной группе запросов для нашего товара, например «кресло-шезлонг», карточка поднялась в выдаче с пятой страницы на 1–2 место первой страницы. Первый товар — реклама, второй — наш товар в органическом поиске:
Кроме этого, товар получил отметку «Бестселлер»:
Как получить статус «Бестселлер»? В справке Ozon нет четкой инструкции — так маркетплейс исключает вероятность манипуляций продавцов. Указано только то, что товар должен хорошо продаваться на протяжении последних 28 дней. Если продажи снижаются, то отметка пропадает. То есть нужно продавать популярные товары, устанавливать хорошую цену, заполнять карточку и использовать рекламу.
В итоге наши продажи меньше, чем за два месяца, составили 228 единиц. Рекламные инструменты мы не подключали:
Да, мы рассчитывали на прирост продаж, но не ожидали, что это случится так быстро, и клиент не сможет пополнить склад. Магазин продал все кресла со склада магазина (60 штук) и выкупил остаток со складов поставщиков в Екатеринбурге (еще 168 штук). После этого посчитал расходы на доставку новой партии с других городов и отказался, решив сделать упор на продажу другого ассортимента. К тому же из-за отсутствия товара мы потеряли позиции и восстановить их под новый закуп было бы проблематично из-за конкуренции, которая к пику сезона возросла.
Теперь, на своем опыте, советуем вам перед началом сезона и тем более перед запуском платного продвижения пополнить склад и оценить возможности и стоимость новых поставок. И, если маржинальность товара не позволяет использовать платные инструменты продвижения, то отличный результат может дать SEO-продвижение и продающее оформление карточки. А если позволяет, то перед запуском кампаний оптимизация под органику поможет в продвижении — в совокупности эти инструменты дают заметный прирост трафика и продаж.