SlideShare uma empresa Scribd logo
1 de 24
Strictly ConfidentialStrictly Confidential
Контекстная реклама в
Avito: что под капотом?
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
О чём будем говорить?
• Как выглядит контекстная реклама на Авито
• Как показать объявление
• Как строить простые модели
• Можно ли сделать модель лучше
• Фиды для профессиональных пользователей
• Обучение и тестирование моделей
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Контекстная реклама на Авито
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Как показать объявление
• Отбирается множество объявлений, релевантных запросу
пользователя.
• Мы хотим, чтобы участники сами боролись за рекламные
места.
• Мы не хотим жёстко закреплять стоимость клика.
• Решение – аукцион среди рекламодателей.
• Для каждого объявления просим указать ставку (bid) –
максимальное количество денег, которое рекламодатель готов
заплатить (за клик).
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Аукцион
• GSP – обобщённый аукцион второй цены
• 𝑐𝑜𝑠𝑡1𝑠𝑡 =
𝑏𝑖𝑑2𝑛𝑑 𝐶𝑇𝑅2𝑛𝑑
𝐶𝑇𝑅1𝑠𝑡
• CTR – «кликабельность». В нашем случае – вероятность
получения клика по объявлению.
Advert_id Bid CTR Bid * CTR Place
1 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
Strictly ConfidentialStrictly Confidential
Наивная модель вычисления CTR
• Отношение кликов к показам: 𝐶𝑇𝑅 =
𝑐𝑙𝑖𝑐𝑘𝑠
𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠
• Проще не бывает. Всё считаем в реальном времени.
• Очень неточная + много открытых проблем:
• Что делать с новыми объявлениями? Что делать с
объявлениями с небольшим числом показов?
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Простая модель вычисления CTR
• Считаем вероятность клика по (похожим) обычным
объявлениям: 𝐶𝑇𝑅𝑖𝑡𝑒𝑚𝑠 =
𝑐𝑙𝑖𝑐𝑘𝑠 𝑖𝑡𝑒𝑚𝑠
𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠 𝑖𝑡𝑒𝑚𝑠
• Считаем вероятность клика по (похожим) рекламным
объявлениям: 𝐶𝑇𝑅 𝑎𝑑𝑣𝑒𝑟𝑡𝑠 =
𝑐𝑙𝑖𝑐𝑘𝑠 𝑎𝑑𝑣𝑒𝑟𝑡𝑠+𝛼
𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠 𝑎𝑑𝑣𝑒𝑟𝑡𝑠+
𝛼
𝐶𝑇𝑅 𝑖𝑡𝑒𝑚𝑠
• Считаем вероятность клика по искомому рекламному
объявлению: 𝐶𝑇𝑅 =
𝑐𝑙𝑖𝑐𝑘𝑠+𝛽
𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠+
𝛽
𝐶𝑇𝑅 𝑎𝑑𝑣𝑒𝑟𝑡𝑠
• Здесь 𝛼 и 𝛽 – положительные константы.
• Простой, понятный и надёжный механизм. Частично
обновляется в реальном времени.
• Всё ещё не очень точная. Есть проблемы, например, почему
одинаковые объявления имеют разный CTR?
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Теперь добавим немного machine learning
• Получим выборку на модели “холодного старта”
• Построим более умную модель
• Запустим в production
• Почему бы сразу не организовать конкурс?
• https://www.kaggle.com/c/avito-context-ad-clicks
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR
• Что хотим получить? Какую задачу решаем?
• Обучающая выборка, построенная на наивной модели
• Здесь x1, x2, …, xN – переменные (обозначим как x),
характеризующие контекст показа РО (время показа РО,
операционная система пользователя, IP, цена в объявлении и
т.д.); y – целевое действие (был клик или нет).
• Нужно построить такую модель f, для которой f(x) ≈ y.
# x1 x2 x3 … xN y
1
2
…
M
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR
• Как эффективно строить различные модели f при различных
условиях (характеристиках x и y) – предмет изучения machine
learning.
• Логистическая регрессия: 𝑓 𝐱 =
1
1+exp − 𝑥1 𝑤1+𝑥2 𝑤2+⋯+𝑥 𝑁 𝑤 𝑁
• Здесь w1, w2, …, wN – некоторые вещественные значения
(«веса», обозначим как w).
• Обучение такой модели будет сводиться к подбору w так,
чтобы минимизировать ошибку, например:
𝑙 𝐱 = −𝑦 log 𝑓 𝐱 − 1 − 𝑦 log 1 − 𝑓 𝐱
• Как подбирать веса? Например, итерационно, методом
стохастического градиента: 𝐰𝑡+1 = 𝐰𝑡 − 𝜂 𝑡 𝐠 𝑡, где 𝐠 𝑡 - градиент
ошибки работы модели в пространстве весов (𝐠 𝑡 = 𝐱 𝑡 𝑓 𝐱 𝑡 −
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR: как улучшить
• Добавить нелинейности – взаимодействия признаков (feature
interactions). Например, для признака x1 = категория и x2 = цена
можем ввести синтетический признак xN+1 = x1 * x2.
• C одной стороны, признаков станет много, с другой есть
опасность переобучиться и/или получить много ненужных
переменных. Решение – введение регуляризатора.
• Категориальные данные. Обычно каждый категориальный
признак, содержащий K уникальных значений,
«раскладывается» в K бинарных переменных. Т.е. размерность
данных растёт пропорционально числу уникальных значений в
таких признаках (см. куки, идентификаторы объявлений, IP-
адреса), а с добавлением взаимодействия между такими
признаками, всё станет совсем печально.
• Что делать?
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR: hashing trick
• Рассчитываем синтетический признак (на основе взаимодействия
2 и более признаков) и считаем от него хэш.
• Полученный хэш делим по модулю на 2K (максимальную
размерность признакового пространства)
• Теперь имеем разреженный вектор размерности 2K с 1 в
единственном индексе (остальные 0).
• То же самое делаем и для остальных признаков (в том числе и
для категориальных, для чего искусственно можно сделать их
категориальными).
• Таким образом, количество ненулевых значений в разреженном
обучающем векторе не будет превышать числа признаков.
• Итоговая модель описывается коэффициентами при ненулевых
«столбцах» разреженной матрицы признаков (все векторы вместе)
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR: FTRL
• В результате пришли к процедуре обучения модели:
𝐰𝑡+1 = argmin
𝐰
𝐰
𝑠=1
𝑡
𝐠 𝑠 +
1
2 𝑠=1
𝑡
𝜎𝑠 𝐰 − 𝐰𝑠 2
2
+ 𝜆 𝐰 1
где 𝑠=1
𝑡
𝜎𝑠 =
1
𝜂 𝑡
• Модель является дообучаемой (on-line learning), т.е. найденные
веса корректируются при обучении на новых данных.
• Модель возвращает вероятность клика по РО.
• Использование модели описано в работе “Ad Click Prediction: a
View from the Trenches”
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Модель вычисления CTR: используемые признаки
• Признаки, описывающие объявление, например:
• Домен
• Цена
• Текст (объявление, заголовок)
• Микрокатегория
• …
• Признаки, описывающие пользователя, например:
• IP
• Cookie
• UA
• Факт логина
• …
• Признаки, описывающие поисковое окружение, например:
• Позиция показа объявления
• Время поиска
• Категория поиска
• Поисковый запрос
• …
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Связанные задачи: обработка фидов
• Фид – файл в разметке YML (пока), в котором лежат текстовые
описания потенциальных рекламных объявлений.
• Задача: на основе данных из файла сопоставить каждому
товару микрокатегорию в дереве контекста Авито.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Связанные задачи: обработка фидов
• Текстовые данные превращаем в векторы большой
размерности путём нормализации слов и их последующего
кодирования (bag of words, tf-idf).
• Целевая переменная – микрокатегория, к которой принадлежит
это объявление.
• Как получить обучающую выборку (разметить данные из фидов
наших клиентов)? С помощью асессоров.
• Разметка включает указание микрокатегории товара, откуда мы
можем получить категорию и подкатегорию.
• Задача: построить модель, которая бы по текстовому описанию
товара возвращала для него TOP-5 вероятностей
принадлежности к микрокатегориям контекста и указывала,
насколько TOP-1 является правдоподобной.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Связанные задачи: обработка фидов
• Обучаем 3 модели (линейные классификаторы) на разных
уровнях (целевые переменные – категории, подкатегории,
микрокатегории). Без hashing trick, но с L1-регуляризацией.
• Как обучить логистическую регрессию разделять более чем 2
класса? One-vs-all схема, т.е. для разделения P классов строим
P моделей, получаем вероятности от каждого из них,
нормируем результаты.
• Алгоритм определения категории:
• Считаем прогноз на уровне микрокатегорий и отбираем 5
возможных кандидатов с максимальной вероятностью.
• У выбранных микрокатегорий, считаем прогноз на уровне
подкатегорий.
• У выбранных подкатегорий, считаем прогноз на уровне
категорий.
• Складываем 5 троек получившихся вероятностей,
выбираем тройку с максимальной суммой.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Связанные задачи: обработка фидов
• Из тестовой выборки выделяем валидационную, на которой
настраиваем пороги.
• Точность на контроле – 86%, точность работы модераторов –
88%.
• Суммарный объём товаров в фидах – более 7 миллионов
товаров.
Python Data Science Meetup, 2016-08-13
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
Strictly ConfidentialStrictly Confidential
Обучение моделей прогноза CTR
• Имеем разные места хранения данных: MongoDB и HP Vertica.
Разная ёмкость, разная скорость обработки запросов, разный
характер данных (вычислимые vs. статичные).
• Вносится задержка на очистку данных от «мусора».
• Процедура обучения (нахождение коэффициентов в модели
FTRL) занимает некоторое время.
• Результат: загрузка данных, предобработка и обучение
моделей (всё на Python!) происходит на выделенных серверах
раз в 6 часов; на выходе – коэффициенты модели,
передаваемые в сервис (Sphinx UDF).
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Тестирование моделей off-line
• Хотим улучшить модель, например, протестировать новый
признак. Как это сделать?
• Грузим (вычисляем) новый признак из данных.
• Обучаем на некоторой выборке пару моделей: с признаком и
без.
• Проверяем обе модели на тестовой выборке: снизится ли
ошибка прогноза клика (LogLoss, AUC) и на сколько?
• Всё ещё недостаточно хорошо: новая модель «в бою» будет
приводить к изменению ранжирования в аукционе,
следовательно, пользователи будут видеть что-то другое и
целевые метрики могут непредсказуемо измениться.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Тестирование моделей on-line: сплит-тестирование
• Как делить трафик: по пользователям, по показам.
• Разделение должно быть корректным и повторимым.
• Целевые метрики на группах должны быть устойчивыми (А/А-
тесты, в том числе на неравновесных распределениях).
• hash(hash(cookie) + salt) % groups
• Желательно сохранять работающую старую модель на
небольшом объёме трафика.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Вместо выводов
• Конкурсы по data science – это очень хорошо.
• Кстати, у нас есть ещё: http://dataring.ru/competitions/avito-
category/
• Применимость моделей определяется инфраструктурой
(большие ансамбли моделей, с которыми побеждают на
конкурсах, на практике не работают).
• Всё, кроме нагруженной части непосредственного расчёта
CTR, можно сделать в Python.
• Дружная команда с короткой коммуникацией – залог успеха.
Python Data Science Meetup, 2016-08-13
Strictly ConfidentialStrictly Confidential
Vadim Ayuyev
Leading Data Scientist, Avito
vayuyev@avito.ru
Andrey Ostapets
Senior Data Scientist, Avito
aostapets@avito.ru
Python Data Science Meetup, 2016-08-13

Mais conteúdo relacionado

Destaque

Golang в avito
Golang в avitoGolang в avito
Golang в avito
AvitoTech
 
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
Ontico
 
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av..."Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
AvitoTech
 

Destaque (20)

"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ..."Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
 
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
 
"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
 
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
 
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
 
Маркетинг в эпоху черных ящиков
Маркетинг в эпоху черных ящиковМаркетинг в эпоху черных ящиков
Маркетинг в эпоху черных ящиков
 
Short Infrastructure Overview ru hpe Vertica
Short Infrastructure Overview ru hpe VerticaShort Infrastructure Overview ru hpe Vertica
Short Infrastructure Overview ru hpe Vertica
 
Machine Learning в Модерации - Андрей Рыбинцев (Avito)
Machine Learning в Модерации - Андрей Рыбинцев (Avito)Machine Learning в Модерации - Андрей Рыбинцев (Avito)
Machine Learning в Модерации - Андрей Рыбинцев (Avito)
 
Описание архитектуры СУБД HP Vertica
Описание архитектуры СУБД HP VerticaОписание архитектуры СУБД HP Vertica
Описание архитектуры СУБД HP Vertica
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)
 
Andrei Kirilenkov. Vertica
Andrei Kirilenkov. VerticaAndrei Kirilenkov. Vertica
Andrei Kirilenkov. Vertica
 
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
От больших к очень большим данным — зачем нужна нормализация в Big Data / Гол...
 
Обзор HP Vertica
Обзор HP VerticaОбзор HP Vertica
Обзор HP Vertica
 
Как мы считали трафик на Вертике, Николай Голов (Avito)
Как мы считали трафик на Вертике, Николай Голов (Avito)Как мы считали трафик на Вертике, Николай Голов (Avito)
Как мы считали трафик на Вертике, Николай Голов (Avito)
 
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
 
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
 
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av..."Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
 

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

Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
Sergey Xek
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
Vladislav Morgun
 
Работа с автоматическими стратегиями в Google Ads
Работа с автоматическими стратегиями в Google AdsРабота с автоматическими стратегиями в Google Ads
Работа с автоматическими стратегиями в Google Ads
Академия интернет-маркетинга «WebPromoExperts»
 
Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​
Маркетинг-аналитика с OWOX BI
 
Сравнение инструментов для построения отчетов
Сравнение инструментов для построения отчетовСравнение инструментов для построения отчетов
Сравнение инструментов для построения отчетов
Маркетинг-аналитика с OWOX BI
 
Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)
Michail Гаркунов
 

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

Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
 
Cергей Aверин, Badoo
Cергей Aверин, BadooCергей Aверин, Badoo
Cергей Aверин, Badoo
 
Маркетинг мобильных приложений: чек-лист по запуску первой кампании
Маркетинг мобильных приложений: чек-лист по запуску первой кампанииМаркетинг мобильных приложений: чек-лист по запуску первой кампании
Маркетинг мобильных приложений: чек-лист по запуску первой кампании
 
Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)
Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)
Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
 
Работа с автоматическими стратегиями в Google Ads
Работа с автоматическими стратегиями в Google AdsРабота с автоматическими стратегиями в Google Ads
Работа с автоматическими стратегиями в Google Ads
 
Что такое контекстная реклама и как она работает?
Что такое контекстная реклама и как она работает?Что такое контекстная реклама и как она работает?
Что такое контекстная реклама и как она работает?
 
Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​
 
Мультиканальная атрибуция. Кто виноват и что делать. Выступление на RIW 2013,...
Мультиканальная атрибуция. Кто виноват и что делать. Выступление на RIW 2013,...Мультиканальная атрибуция. Кто виноват и что делать. Выступление на RIW 2013,...
Мультиканальная атрибуция. Кто виноват и что делать. Выступление на RIW 2013,...
 
Сравнение инструментов для построения отчетов
Сравнение инструментов для построения отчетовСравнение инструментов для построения отчетов
Сравнение инструментов для построения отчетов
 
Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)
 
Performance-маркетинг мобильных приложений
Performance-маркетинг мобильных приложенийPerformance-маркетинг мобильных приложений
Performance-маркетинг мобильных приложений
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
Предсказание вероятности конверсии на данных систем аналитики
Предсказание вероятности конверсии на данных систем аналитикиПредсказание вероятности конверсии на данных систем аналитики
Предсказание вероятности конверсии на данных систем аналитики
 
Хитрые емейлы. ExpertSender. Елена Рыбина
Хитрые емейлы. ExpertSender. Елена РыбинаХитрые емейлы. ExpertSender. Елена Рыбина
Хитрые емейлы. ExpertSender. Елена Рыбина
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
доклад на вмк 15.10.2015
доклад на вмк 15.10.2015доклад на вмк 15.10.2015
доклад на вмк 15.10.2015
 
Стратегия развития рекламных кампаний на основе воронки продаж
Стратегия развития рекламных кампаний на основе воронки продажСтратегия развития рекламных кампаний на основе воронки продаж
Стратегия развития рекламных кампаний на основе воронки продаж
 
Presty
PrestyPresty
Presty
 
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
 

Mais de AvitoTech

Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
AvitoTech
 

Mais de AvitoTech (20)

Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
 
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
 
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
 
Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
 
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb..."ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
 

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

  • 1. Strictly ConfidentialStrictly Confidential Контекстная реклама в Avito: что под капотом? Python Data Science Meetup, 2016-08-13
  • 2. Strictly ConfidentialStrictly Confidential О чём будем говорить? • Как выглядит контекстная реклама на Авито • Как показать объявление • Как строить простые модели • Можно ли сделать модель лучше • Фиды для профессиональных пользователей • Обучение и тестирование моделей Python Data Science Meetup, 2016-08-13
  • 3. Strictly ConfidentialStrictly Confidential Контекстная реклама на Авито Python Data Science Meetup, 2016-08-13
  • 4. Strictly ConfidentialStrictly Confidential Как показать объявление • Отбирается множество объявлений, релевантных запросу пользователя. • Мы хотим, чтобы участники сами боролись за рекламные места. • Мы не хотим жёстко закреплять стоимость клика. • Решение – аукцион среди рекламодателей. • Для каждого объявления просим указать ставку (bid) – максимальное количество денег, которое рекламодатель готов заплатить (за клик). Python Data Science Meetup, 2016-08-13
  • 5. Strictly ConfidentialStrictly Confidential Аукцион • GSP – обобщённый аукцион второй цены • 𝑐𝑜𝑠𝑡1𝑠𝑡 = 𝑏𝑖𝑑2𝑛𝑑 𝐶𝑇𝑅2𝑛𝑑 𝐶𝑇𝑅1𝑠𝑡 • CTR – «кликабельность». В нашем случае – вероятность получения клика по объявлению. Advert_id Bid CTR Bid * CTR Place 1 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
  • 6. Strictly ConfidentialStrictly Confidential Наивная модель вычисления CTR • Отношение кликов к показам: 𝐶𝑇𝑅 = 𝑐𝑙𝑖𝑐𝑘𝑠 𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠 • Проще не бывает. Всё считаем в реальном времени. • Очень неточная + много открытых проблем: • Что делать с новыми объявлениями? Что делать с объявлениями с небольшим числом показов? Python Data Science Meetup, 2016-08-13
  • 7. Strictly ConfidentialStrictly Confidential Простая модель вычисления CTR • Считаем вероятность клика по (похожим) обычным объявлениям: 𝐶𝑇𝑅𝑖𝑡𝑒𝑚𝑠 = 𝑐𝑙𝑖𝑐𝑘𝑠 𝑖𝑡𝑒𝑚𝑠 𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠 𝑖𝑡𝑒𝑚𝑠 • Считаем вероятность клика по (похожим) рекламным объявлениям: 𝐶𝑇𝑅 𝑎𝑑𝑣𝑒𝑟𝑡𝑠 = 𝑐𝑙𝑖𝑐𝑘𝑠 𝑎𝑑𝑣𝑒𝑟𝑡𝑠+𝛼 𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠 𝑎𝑑𝑣𝑒𝑟𝑡𝑠+ 𝛼 𝐶𝑇𝑅 𝑖𝑡𝑒𝑚𝑠 • Считаем вероятность клика по искомому рекламному объявлению: 𝐶𝑇𝑅 = 𝑐𝑙𝑖𝑐𝑘𝑠+𝛽 𝑖𝑚𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑠+ 𝛽 𝐶𝑇𝑅 𝑎𝑑𝑣𝑒𝑟𝑡𝑠 • Здесь 𝛼 и 𝛽 – положительные константы. • Простой, понятный и надёжный механизм. Частично обновляется в реальном времени. • Всё ещё не очень точная. Есть проблемы, например, почему одинаковые объявления имеют разный CTR? Python Data Science Meetup, 2016-08-13
  • 8. Strictly ConfidentialStrictly Confidential Теперь добавим немного machine learning • Получим выборку на модели “холодного старта” • Построим более умную модель • Запустим в production • Почему бы сразу не организовать конкурс? • https://www.kaggle.com/c/avito-context-ad-clicks Python Data Science Meetup, 2016-08-13
  • 9. Strictly ConfidentialStrictly Confidential Модель вычисления CTR • Что хотим получить? Какую задачу решаем? • Обучающая выборка, построенная на наивной модели • Здесь x1, x2, …, xN – переменные (обозначим как x), характеризующие контекст показа РО (время показа РО, операционная система пользователя, IP, цена в объявлении и т.д.); y – целевое действие (был клик или нет). • Нужно построить такую модель f, для которой f(x) ≈ y. # x1 x2 x3 … xN y 1 2 … M Python Data Science Meetup, 2016-08-13
  • 10. Strictly ConfidentialStrictly Confidential Модель вычисления CTR • Как эффективно строить различные модели f при различных условиях (характеристиках x и y) – предмет изучения machine learning. • Логистическая регрессия: 𝑓 𝐱 = 1 1+exp − 𝑥1 𝑤1+𝑥2 𝑤2+⋯+𝑥 𝑁 𝑤 𝑁 • Здесь w1, w2, …, wN – некоторые вещественные значения («веса», обозначим как w). • Обучение такой модели будет сводиться к подбору w так, чтобы минимизировать ошибку, например: 𝑙 𝐱 = −𝑦 log 𝑓 𝐱 − 1 − 𝑦 log 1 − 𝑓 𝐱 • Как подбирать веса? Например, итерационно, методом стохастического градиента: 𝐰𝑡+1 = 𝐰𝑡 − 𝜂 𝑡 𝐠 𝑡, где 𝐠 𝑡 - градиент ошибки работы модели в пространстве весов (𝐠 𝑡 = 𝐱 𝑡 𝑓 𝐱 𝑡 − Python Data Science Meetup, 2016-08-13
  • 11. Strictly ConfidentialStrictly Confidential Модель вычисления CTR: как улучшить • Добавить нелинейности – взаимодействия признаков (feature interactions). Например, для признака x1 = категория и x2 = цена можем ввести синтетический признак xN+1 = x1 * x2. • C одной стороны, признаков станет много, с другой есть опасность переобучиться и/или получить много ненужных переменных. Решение – введение регуляризатора. • Категориальные данные. Обычно каждый категориальный признак, содержащий K уникальных значений, «раскладывается» в K бинарных переменных. Т.е. размерность данных растёт пропорционально числу уникальных значений в таких признаках (см. куки, идентификаторы объявлений, IP- адреса), а с добавлением взаимодействия между такими признаками, всё станет совсем печально. • Что делать? Python Data Science Meetup, 2016-08-13
  • 12. Strictly ConfidentialStrictly Confidential Модель вычисления CTR: hashing trick • Рассчитываем синтетический признак (на основе взаимодействия 2 и более признаков) и считаем от него хэш. • Полученный хэш делим по модулю на 2K (максимальную размерность признакового пространства) • Теперь имеем разреженный вектор размерности 2K с 1 в единственном индексе (остальные 0). • То же самое делаем и для остальных признаков (в том числе и для категориальных, для чего искусственно можно сделать их категориальными). • Таким образом, количество ненулевых значений в разреженном обучающем векторе не будет превышать числа признаков. • Итоговая модель описывается коэффициентами при ненулевых «столбцах» разреженной матрицы признаков (все векторы вместе) Python Data Science Meetup, 2016-08-13
  • 13. Strictly ConfidentialStrictly Confidential Модель вычисления CTR: FTRL • В результате пришли к процедуре обучения модели: 𝐰𝑡+1 = argmin 𝐰 𝐰 𝑠=1 𝑡 𝐠 𝑠 + 1 2 𝑠=1 𝑡 𝜎𝑠 𝐰 − 𝐰𝑠 2 2 + 𝜆 𝐰 1 где 𝑠=1 𝑡 𝜎𝑠 = 1 𝜂 𝑡 • Модель является дообучаемой (on-line learning), т.е. найденные веса корректируются при обучении на новых данных. • Модель возвращает вероятность клика по РО. • Использование модели описано в работе “Ad Click Prediction: a View from the Trenches” Python Data Science Meetup, 2016-08-13
  • 14. Strictly ConfidentialStrictly Confidential Модель вычисления CTR: используемые признаки • Признаки, описывающие объявление, например: • Домен • Цена • Текст (объявление, заголовок) • Микрокатегория • … • Признаки, описывающие пользователя, например: • IP • Cookie • UA • Факт логина • … • Признаки, описывающие поисковое окружение, например: • Позиция показа объявления • Время поиска • Категория поиска • Поисковый запрос • … Python Data Science Meetup, 2016-08-13
  • 15. Strictly ConfidentialStrictly Confidential Связанные задачи: обработка фидов • Фид – файл в разметке YML (пока), в котором лежат текстовые описания потенциальных рекламных объявлений. • Задача: на основе данных из файла сопоставить каждому товару микрокатегорию в дереве контекста Авито. Python Data Science Meetup, 2016-08-13
  • 16. Strictly ConfidentialStrictly Confidential Связанные задачи: обработка фидов • Текстовые данные превращаем в векторы большой размерности путём нормализации слов и их последующего кодирования (bag of words, tf-idf). • Целевая переменная – микрокатегория, к которой принадлежит это объявление. • Как получить обучающую выборку (разметить данные из фидов наших клиентов)? С помощью асессоров. • Разметка включает указание микрокатегории товара, откуда мы можем получить категорию и подкатегорию. • Задача: построить модель, которая бы по текстовому описанию товара возвращала для него TOP-5 вероятностей принадлежности к микрокатегориям контекста и указывала, насколько TOP-1 является правдоподобной. Python Data Science Meetup, 2016-08-13
  • 17. Strictly ConfidentialStrictly Confidential Связанные задачи: обработка фидов • Обучаем 3 модели (линейные классификаторы) на разных уровнях (целевые переменные – категории, подкатегории, микрокатегории). Без hashing trick, но с L1-регуляризацией. • Как обучить логистическую регрессию разделять более чем 2 класса? One-vs-all схема, т.е. для разделения P классов строим P моделей, получаем вероятности от каждого из них, нормируем результаты. • Алгоритм определения категории: • Считаем прогноз на уровне микрокатегорий и отбираем 5 возможных кандидатов с максимальной вероятностью. • У выбранных микрокатегорий, считаем прогноз на уровне подкатегорий. • У выбранных подкатегорий, считаем прогноз на уровне категорий. • Складываем 5 троек получившихся вероятностей, выбираем тройку с максимальной суммой. Python Data Science Meetup, 2016-08-13
  • 18. Strictly ConfidentialStrictly Confidential Связанные задачи: обработка фидов • Из тестовой выборки выделяем валидационную, на которой настраиваем пороги. • Точность на контроле – 86%, точность работы модераторов – 88%. • Суммарный объём товаров в фидах – более 7 миллионов товаров. Python Data Science Meetup, 2016-08-13
  • 19. 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
  • 20. Strictly ConfidentialStrictly Confidential Обучение моделей прогноза CTR • Имеем разные места хранения данных: MongoDB и HP Vertica. Разная ёмкость, разная скорость обработки запросов, разный характер данных (вычислимые vs. статичные). • Вносится задержка на очистку данных от «мусора». • Процедура обучения (нахождение коэффициентов в модели FTRL) занимает некоторое время. • Результат: загрузка данных, предобработка и обучение моделей (всё на Python!) происходит на выделенных серверах раз в 6 часов; на выходе – коэффициенты модели, передаваемые в сервис (Sphinx UDF). Python Data Science Meetup, 2016-08-13
  • 21. Strictly ConfidentialStrictly Confidential Тестирование моделей off-line • Хотим улучшить модель, например, протестировать новый признак. Как это сделать? • Грузим (вычисляем) новый признак из данных. • Обучаем на некоторой выборке пару моделей: с признаком и без. • Проверяем обе модели на тестовой выборке: снизится ли ошибка прогноза клика (LogLoss, AUC) и на сколько? • Всё ещё недостаточно хорошо: новая модель «в бою» будет приводить к изменению ранжирования в аукционе, следовательно, пользователи будут видеть что-то другое и целевые метрики могут непредсказуемо измениться. Python Data Science Meetup, 2016-08-13
  • 22. Strictly ConfidentialStrictly Confidential Тестирование моделей on-line: сплит-тестирование • Как делить трафик: по пользователям, по показам. • Разделение должно быть корректным и повторимым. • Целевые метрики на группах должны быть устойчивыми (А/А- тесты, в том числе на неравновесных распределениях). • hash(hash(cookie) + salt) % groups • Желательно сохранять работающую старую модель на небольшом объёме трафика. Python Data Science Meetup, 2016-08-13
  • 23. Strictly ConfidentialStrictly Confidential Вместо выводов • Конкурсы по data science – это очень хорошо. • Кстати, у нас есть ещё: http://dataring.ru/competitions/avito- category/ • Применимость моделей определяется инфраструктурой (большие ансамбли моделей, с которыми побеждают на конкурсах, на практике не работают). • Всё, кроме нагруженной части непосредственного расчёта CTR, можно сделать в Python. • Дружная команда с короткой коммуникацией – залог успеха. Python Data Science Meetup, 2016-08-13
  • 24. Strictly ConfidentialStrictly Confidential Vadim Ayuyev Leading Data Scientist, Avito vayuyev@avito.ru Andrey Ostapets Senior Data Scientist, Avito aostapets@avito.ru Python Data Science Meetup, 2016-08-13