"Контекстная реклама в avito: что под капотом?" Вадим...

24
Strictly Confidential Strictly Confidential Контекстная реклама в Avito: что под капотом? Python Data Science Meetup, 2016-08- 13

Upload: avitotech

Post on 16-Jan-2017

274 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Контекстная реклама в Avito: что под капотом?

Python Data Science Meetup, 2016-08-13

Page 2: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

О чём будем говорить?

• Как выглядит контекстная реклама на Авито

• Как показать объявление

• Как строить простые модели • Можно ли сделать модель лучше • Фиды для профессиональных пользователей • Обучение и тестирование моделей

Python Data Science Meetup, 2016-08-13

Page 3: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Контекстная реклама на Авито

Python Data Science Meetup, 2016-08-13

Page 4: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Как показать объявление• Отбирается множество объявлений, релевантных запросу

пользователя.

• Мы хотим, чтобы участники сами боролись за рекламные места.

• Мы не хотим жёстко закреплять стоимость клика.

• Решение – аукцион среди рекламодателей.

• Для каждого объявления просим указать ставку (bid) – максимальное количество денег, которое рекламодатель готов заплатить (за клик).

Python Data Science Meetup, 2016-08-13

Page 5: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Аукцион

• GSP – обобщённый аукцион второй цены

• CTR – «кликабельность». В нашем случае – вероятность получения клика по объявлению.

Advert_id Bid CTR Bid * CTR Place1 10 0.5 5 3-rd

2 8 0.8 6.4 1-st

3 8 0.7 5.6 2-nd

Python Data Science Meetup, 2016-08-13

Page 6: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Наивная модель вычисления CTR• Отношение кликов к показам:

• Проще не бывает. Всё считаем в реальном времени.

• Очень неточная + много открытых проблем: • Что делать с новыми объявлениями? Что делать с

объявлениями с небольшим числом показов?

Python Data Science Meetup, 2016-08-13

Page 7: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Простая модель вычисления CTR

• Считаем вероятность клика по (похожим) обычным объявлениям:

• Считаем вероятность клика по (похожим) рекламным объявлениям:

• Считаем вероятность клика по искомому рекламному

объявлению: • Здесь и – положительные константы.

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

• Всё ещё не очень точная. Есть проблемы, например, почему одинаковые объявления имеют разный CTR?

Python Data Science Meetup, 2016-08-13

Page 8: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Теперь добавим немного machine learning• Получим выборку на модели “холодного старта”

• Построим более умную модель

• Запустим в production

• Почему бы сразу не организовать конкурс?• https://www.kaggle.com/c/avito-context-ad-clicks

Python Data Science Meetup, 2016-08-13

Page 9: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR• Что хотим получить? Какую задачу решаем?

• Обучающая выборка, построенная на наивной модели

• Здесь x1, x2, …, xN – переменные (обозначим как x), характеризующие контекст показа РО (время показа РО, операционная система пользователя, IP, цена в объявлении и т.д.); y – целевое действие (был клик или нет).

• Нужно построить такую модель f, для которой f(x) y.

# x1 x2 x3 … xN y1

2

M

Python Data Science Meetup, 2016-08-13

Page 10: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR

• Как эффективно строить различные модели f при различных условиях (характеристиках x и y) – предмет изучения machine learning.

• Логистическая регрессия: • Здесь w1, w2, …, wN – некоторые вещественные значения

(«веса», обозначим как w).

• Обучение такой модели будет сводиться к подбору w так, чтобы минимизировать ошибку, например:

• Как подбирать веса? Например, итерационно, методом стохастического градиента: где - градиент ошибки работы модели в пространстве весов ()

Python Data Science Meetup, 2016-08-13

Page 11: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR: как улучшить• Добавить нелинейности – взаимодействия признаков (feature

interactions). Например, для признака x1 = категория и x2 = цена можем ввести синтетический признак xN+1 = x1 * x2.

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

• Категориальные данные. Обычно каждый категориальный признак, содержащий K уникальных значений, «раскладывается» в K бинарных переменных. Т.е. размерность данных растёт пропорционально числу уникальных значений в таких признаках (см. куки, идентификаторы объявлений, IP-адреса), а с добавлением взаимодействия между такими признаками, всё станет совсем печально.

• Что делать?

Python Data Science Meetup, 2016-08-13

Page 12: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR: hashing trick• Рассчитываем синтетический признак (на основе взаимодействия

2 и более признаков) и считаем от него хэш.

• Полученный хэш делим по модулю на 2K (максимальную размерность признакового пространства)

• Теперь имеем разреженный вектор размерности 2K с 1 в единственном индексе (остальные 0).

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

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

• Итоговая модель описывается коэффициентами при ненулевых «столбцах» разреженной матрицы признаков (все векторы вместе)

Python Data Science Meetup, 2016-08-13

Page 13: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR: FTRL

• В результате пришли к процедуре обучения модели:

где

• Модель является дообучаемой (on-line learning), т.е. найденные веса корректируются при обучении на новых данных.

• Модель возвращает вероятность клика по РО.

• Использование модели описано в работе “Ad Click Prediction: a View from the Trenches”

Python Data Science Meetup, 2016-08-13

Page 14: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Модель вычисления CTR: используемые признаки• Признаки, описывающие объявление, например:

• Домен• Цена• Текст (объявление, заголовок)• Микрокатегория• …

• Признаки, описывающие пользователя, например:• IP• Cookie• UA• Факт логина• …

• Признаки, описывающие поисковое окружение, например:• Позиция показа объявления• Время поиска• Категория поиска• Поисковый запрос• …

Python Data Science Meetup, 2016-08-13

Page 15: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Связанные задачи: обработка фидов• Фид – файл в разметке YML (пока), в котором лежат текстовые

описания потенциальных рекламных объявлений.

• Задача: на основе данных из файла сопоставить каждому товару микрокатегорию в дереве контекста Авито.

Python Data Science Meetup, 2016-08-13

Page 16: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Связанные задачи: обработка фидов• Текстовые данные превращаем в векторы большой

размерности путём нормализации слов и их последующего кодирования (bag of words, tf-idf).

• Целевая переменная – микрокатегория, к которой принадлежит это объявление.

• Как получить обучающую выборку (разметить данные из фидов наших клиентов)? С помощью асессоров.

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

• Задача: построить модель, которая бы по текстовому описанию товара возвращала для него TOP-5 вероятностей принадлежности к микрокатегориям контекста и указывала, насколько TOP-1 является правдоподобной.

Python Data Science Meetup, 2016-08-13

Page 17: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Связанные задачи: обработка фидов

• Обучаем 3 модели (линейные классификаторы) на разных уровнях (целевые переменные – категории, подкатегории, микрокатегории). Без hashing trick, но с L1-регуляризацией.

• Как обучить логистическую регрессию разделять более чем 2 класса? One-vs-all схема, т.е. для разделения P классов строим P моделей, получаем вероятности от каждого из них, нормируем результаты.

• Алгоритм определения категории:• Считаем прогноз на уровне микрокатегорий и отбираем 5

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

подкатегорий.• У выбранных подкатегорий, считаем прогноз на уровне

категорий.• Складываем 5 троек получившихся вероятностей,

выбираем тройку с максимальной суммой.

Python Data Science Meetup, 2016-08-13

Page 18: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Связанные задачи: обработка фидов• Из тестовой выборки выделяем валидационную, на которой

настраиваем пороги.

• Точность на контроле – 86%, точность работы модераторов – 88%.

• Суммарный объём товаров в фидах – более 7 миллионов товаров.

Python Data Science Meetup, 2016-08-13

Page 19: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Инфраструктура

• Более подробно про инфраструктуру рассказали на РИТе 2016:• http://backendconf.ru/2016/abstracts/2097.html («Успеть за

100 миллисекунд: контекстная реклама на Sphinx» / Дмитрий Хасанов)

Рисунок из ”Hidden Technical Debt in Machine Learning Systems”, 2014

Python Data Science Meetup, 2016-08-13

Page 20: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Обучение моделей прогноза CTR

• Имеем разные места хранения данных: MongoDB и HP Vertica. Разная ёмкость, разная скорость обработки запросов, разный характер данных (вычислимые vs. статичные).

• Вносится задержка на очистку данных от «мусора».

• Процедура обучения (нахождение коэффициентов в модели FTRL) занимает некоторое время.

• Результат: загрузка данных, предобработка и обучение моделей (всё на Python!) происходит на выделенных серверах раз в 6 часов; на выходе – коэффициенты модели, передаваемые в сервис (Sphinx UDF).

Python Data Science Meetup, 2016-08-13

Page 21: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Тестирование моделей off-line • Хотим улучшить модель, например, протестировать новый

признак. Как это сделать?

• Грузим (вычисляем) новый признак из данных.

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

• Проверяем обе модели на тестовой выборке: снизится ли ошибка прогноза клика (LogLoss, AUC) и на сколько?

• Всё ещё недостаточно хорошо: новая модель «в бою» будет приводить к изменению ранжирования в аукционе, следовательно, пользователи будут видеть что-то другое и целевые метрики могут непредсказуемо измениться.

Python Data Science Meetup, 2016-08-13

Page 22: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Тестирование моделей on-line: сплит-тестирование• Как делить трафик: по пользователям, по показам.

• Разделение должно быть корректным и повторимым.

• Целевые метрики на группах должны быть устойчивыми (А/А-тесты, в том числе на неравновесных распределениях).

• hash(hash(cookie) + salt) % groups

• Желательно сохранять работающую старую модель на небольшом объёме трафика.

Python Data Science Meetup, 2016-08-13

Page 23: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Вместо выводов• Конкурсы по data science – это очень хорошо.

• Кстати, у нас есть ещё: http://dataring.ru/competitions/avito-category/

• Применимость моделей определяется инфраструктурой (большие ансамбли моделей, с которыми побеждают на конкурсах, на практике не работают).

• Всё, кроме нагруженной части непосредственного расчёта CTR, можно сделать в Python.

• Дружная команда с короткой коммуникацией – залог успеха.

Python Data Science Meetup, 2016-08-13

Page 24: "Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (Avito)

Strictly ConfidentialStrictly Confidential

Vadim AyuyevLeading Data Scientist, [email protected]

Andrey OstapetsSenior Data Scientist, [email protected]

Python Data Science Meetup, 2016-08-13