tgoop.com/dsinsights/339
Last Update:
Предсказываем клики по данным Criteo
10 лет назад на Каггле проводилось соревнование по предсказанию кликов на рекламные слоты на сайтах пользователей на мобилках, организованное Criteo. С того момента прошло много времени, но датасет не утратил своей актуальности в среде адтеха и до сих пор служит бенчмарком для сравнения ML моделей, пресказывающих клики. Актуальный лидерборд архитектур можно найти на PapersWithCode
И сегодня мы разбирем одну из таких SOTA архитектур предсказания кликов FinalMLP
Что с данными?
Для начала разберемся, какие данные доступны для обучения. Criteo опубликовала данные с 7 дней трафика своих пользователей mobile web. Это примерно 340Gb данных. Все фичи поделены на 2 категории: пользовательские (user) и контекстные (publisher, инфа о сайте). Значения всех фичей анонимизированы. И собственно бинарный таргет о наличии/ отсутствии клика на рекламный слот.
Как работает?
Как заявлено в статье на Arxiv, архитектура FinalMLP состоит из следующих основных компонент
➡️ Feature Embedding Layer
Преобразуем разреженные признаки в плотный (dense) вектора. Категориальные признаки one-hot encod'им и перемножаем на обучаемую матрицу весов эмбеддингов. Числовые фичи бакетизируем и дальше обрабатываем, как категориальные. Multi-valued фичи (или те же списки, типа adomain
) обрабатываем следующим образом: обрезаем списки длиной до средней длины k. Далее заводим эти фичи в one-hot вектора длины k и снова перемножаем на веса эмбеддинга.
➡️ Feature Selection Layer
Слой отбора признаков: оценивает важность признаков, понижает влияние зашумленных, усиливает значимые. Здесь используется т.н. gating-based feature selection, который выдает веса важности каждого признака, пропустив их через сигмоиду и умножив на 2. В итоге эти веса лежат в диапазоне 0..2. Далее они перемножаются с эмбеддингами фичей. Разбиваем фичи на 2 ветки на пользовательские и контекстные и прогоняем весь процесс отдельно на каждую ветку. Так мы получаем входы в MLP (персептрон) два потока.
➡️ Stream-Level Fusion Layer
Теперь нам нужно объединить эти 2 потока (пользовательский и контекстный). Вместо простого сложения или конкатенации в FinalMLP предлагают т.н. bilinear fusion. Если в двух слова, как это работает, то вектора с 2х веток пользовательских и контекстиных эмбеддингов разбиваются на k частей (голов). В каждой части применяется билинейное преоблазование. Далее результаты пропускаются через сигмоиду, чтобы получить вероятности.
Билинейное преобразование для одной головы записывается следующим образом
BF(o1, o2) = b + w1 * o1 + w2 * o + o1 * W3 * o2
Здесь
- w1, w2 - это веса модели для ветки o1, o2 соответственно
- W3 - это матрица билинейного преобразования (тоже обучаемая)
- b - intersect
Для k голов выходная вероятность запишется
proba_pred = sigma(sum_k(BF(o1i, o2i)))
Такой подход обработки признаков на два потока дает следующие преимущества по сравнению с классической табличной моделью, например тем же CatBoost'ом:
- Взаимодействие фичей задается с помощью отдельной матрицы W3, что дает возможность обучать более сложные зависимости
- В FinalMLP мы конвертируем все фичи в эмбеддинги, что особенно помогает в случае разреженных фичей
Далее мы разберем имплементацию FinalMLP на PyTorch и запустим ее с помощью либы FuxiCTR
BY ML Advertising

Share with your friend now:
tgoop.com/dsinsights/339