Positional Bias: Что это такое и как с ним жить? Учимся правильно предсказывать CTR

в 11:16, , рубрики: bias, CTR, data science, ml, recommendation systems, search engine, system design

Привет! Сегодня поговорим про такого зверя, как positional bias. Если вы работаете с поисковыми системами или рекомендательными сервисами, то наверняка сталкивались с этой проблемой. Разберёмся на примере задачи по ml system design — предсказание вероятности клика по товару (известной как CTR — Click-Through Rate) в поисковой выдаче.

Описание задачи.
Вы владелец товарной платформы. На платформе продавцы могут продвигать товары за фиксированную ставку. Ставка взимается только в том случае, если был совершен клик по товару. У вас есть определенное количество свободных слотов для продвижения товаров. Как следует отранжировать товары для продвижения?

Давайте порассуждаем. Как владельцу платформы, вам выгодно максимизировать свою прибыль, следовательно максимизировать математическое ожидание прибыли за продвижение товаров. Интуитивно, понятно, что если математическое ожидание прибыли за продвижение одного товара выше, чем другого, то мы должны поднять первый товар выше. Следовательно, нужно отранжировать товары по математическому ожиданию прибыли. Математическое ожидание прибыли за продвижение товара есть P(click)*s, где s - ставка товара и P(click) вероятность клика. Так как ставка товара нам известна, то остается оценить вероятность клика по товару.

Вы владелец товарной платформы...

Вы владелец товарной платформы...

Оценим вероятность клика используя градиентный бустинг. В качестве целевой переменной возьмем факт клика (1 если клик был, 0 - в противном случае) и будем оптимизировать с помощью функции потерь cross entropy. Для упрощения будет считать, что у нас есть готовое признаковое пространство. Звучит хорошо, но в решение не учтен positional bias, о котором мы и поговорим.

Что такое Positional Bias?

Когда пользователи ищут товары или информацию, они чаще кликают на верхние результаты выдачи, даже если они не всегда самые релевантные. Это называется позиционным смещением (positional bias) — эффект, при котором документы на более высоких позициях получают больше кликов просто из-за своего места в списке, а не из-за реальной полезности.

Теперь представьте: вы обучаете модель ранжирования предсказывать, используя пользовательские логи. Но если клики зависят от позиции документа (в мире ранжирования исторически принято объекты на выдаче называть документами), модель может начать подтверждать существующее смещение, а не учиться понимать реальную вероятность клика документа. Получается замкнутый круг: мы учим модель на данных, в которых уже заложен positional bias, и она воспроизводит этот же эффект.

В рамках нашей задачи, если мы не учитываем positional bias, то значит недополучаем часть денег с продвижения товаров. Как с этим бороться? Давайте разберем несколько подходов.

1. Рандомизация выдачи

Суть метода: перемешивать топ результатов для разных пользователей. Это позволяет собрать данные, где клик не зависит от позиции. Чтобы собрать такие данные запускают "ухудшающий" эксперемент. Из названия ясно, что данный эксп ухудшает пользовательский опыт, что является минусом этого метода (после рандомизации нерелевантный документ может попасть в топ).

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

2. Штрафование таргета за позицию в выдаче

В этом подходе мы дисконтируем таргет в зависимости от позиции. Логика следующая: давайте вычислим вероятность увидеть документ в зависимости от позиции. Тогда пользуясь равенством p(click=1|x, pos)=p(seen |pos)p(click=1|x, seen)  , получим чтобы вычислить CTR достаточно разделить целевую переменную на вероятность "быть увиденным" при текущей позиции. Этот метод называется inverse propensity weighting. Но как вычислить эту вероятность. Если мы попытаемся оценить ее по пользовательским логам, то нужно будет учесть следующие нюансы. Во-первых, "быть увиденным" зависит от релевантности документа (если у вас нерелевантная выдача, то пользователь просто уйдет), поэтому справедливо оценивать вероятность "быть увиденным" от позиции только для релевантных документов. Во-вторых у вас могут быть разные типы устройств - соответственно разный дизайн выдачи, а значит и распределение кликов будет другим. В-третьих, в зависимости от категории товара наблюдается разное пользовательское поведение (так товары с одеждой пользователи готовы дольше просматривать).

Давайте запомним текущий подход и вернемся к нему чуть позже.

3. Обучение с фичей позиция документа + инференс с фиксированной позицией

Идея: добавляем позицию документа в качестве признака при обучении, но при предсказании (инференсе) ставим всем документам фиксированную позицию (например, первую). Этот подход опубликован в статье "PAL: a position-bias aware learning framework for CTR prediction in live recommender systems" и широко используется в рекомендательных системах. Логика следующая: мы заставляем обучиться модели со знанием позиции и как следствие она должна научиться понимать, что топовые позиции получают больший скор. А вот на инференсе модели мы уравниваем все документы, ставя их на одну позицию.

А какую позицию выбрать для инференса, тут уже можно провести A/B тест и выбрать понравившейся эксперимент. Принято выбирать 3-5 позиции. Можно проинтерпретировать это так, если клик был по 3-5 позиции, то он был с большей вероятностью сделан осознано пользователем и документ скорее всего релевантный (по сравнению с нулевой или 10 позицией).

фича позиция документа + инференс с фиксированной позицией
фича позиция документа + инференс с фиксированной позицией

Кажется все круто! Но есть свои подводные камни. В продакшене нужно придерживаться своих лимитов по RPS и если вы обучаете бустинг, то вы ограничены в количестве деревьев решений. И если вы добавляете фичу, то часть сплитов в деревьях уходит на эту фичу (а у нас фича имеет константное значение). Как следствие, если вы обучите бустинг на таком же количестве деревьев, то эксперимент скорее всего покажет деградацию качества.

4. Обучение с фичей позиция документа + дистилляция

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

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

Авторы статьи предлагают еще один подход. Обучить модель, которая бы предсказывала вероятность быть уведенным товару. Мне это чем-то напоминает второй подход, только мы обучаем еще одну модель "дисконтировать таргет". Финально обе модели обучаются совместно. Авторы интерпретируют подход следующим образом: p(click=1|x, pos)=p(seen |pos)p(click=1|x, seen). Таким образом первая модель будет вычислять p(seen |pos), а вторая CTR.

обучение модели, которая предсказывала вероятность "быть увиденным"

обучение модели, которая предсказывала вероятность "быть увиденным"

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

Мы с вами рассмотрели пример решения позиционного смещения для опередления CTR и как следствие ранжирования товаров для продвижения. Замечу, что positional bias существует и в самом ранжировании товаров. Так на практике для ранжирования используют две модели.

  • Первая отвечает за релевантность и обучается на оффлайн-сигналы (например, разметку экспертов или другие независимые метрики качества).

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

Сумма двух моделей и есть финальная модель, которую используют для выдачи.

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

Автор: jesusian

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js