How to Measure and Mitigate Position Bias
Позиционное смещение (position bias) возникает, когда элементы на более высоких позициях получают непропорционально больше кликов независимо от их реальной релевантности — например, в Google Search первая позиция получает в 10 раз больше кликов, чем десятая. Обучение моделей на таких смещённых данных создаёт самоподдерживающуюся петлю обратной связи, при которой релевантные элементы на низких позициях продолжают терять вовлечённость. Для измерения смещения используют случайное перемешивание топовых результатов (RandN), эксплуатацию естественной случайности в логах, оценку через EM-алгоритм, а также попарные перестановки (FairPairs, RandPair) и добавление шума к позициям или сырым скорам (Boltzmann exploration). Для устранения смещения можно дебиасировать логи с помощью inverse propensity weighting или включить позиционные признаки в модель, обнуляя их при инференсе. Автор рекомендует измерять и устранять позиционное смещение на ранних этапах, особенно если основной поток обнаружения контента идёт через один интерфейс.
Как измерить и устранить позиционное смещение
[ recsys ] · 7 мин. чтения
Позиционное смещение возникает, когда элементы на более высоких позициях с большей вероятностью будут просмотрены и, соответственно, получат клики независимо от их фактической релевантности. Это приводит к снижению вовлечённости для элементов на более низких позициях. В Google Search пользователи кликают на первую позицию в 10 раз чаще, чем на десятую. Точно так же мы просматриваем карусели рекомендаций Netflix слева направо.
Позиционное смещение возникает, когда мы обрабатываем элементы сверху вниз или слева направо.
Позиционное смещение может возникать по нескольким причинам. Возможно, мы доверяем алгоритму и просто слепо кликаем на верхние результаты. Или, возможно, мы с меньшей вероятностью просматриваем элементы на нижних позициях (т. е. смещение представления), особенно если они находятся на второй странице результатов Google Search. Может быть, после клика на первый релевантный результат или запуска первого подходящего фильма мы просто игнорируем остальные элементы.
Из-за позиционного смещения сложно определить, взаимодействуют ли пользователи с рекомендациями потому, что они действительно релевантны, или потому, что рекомендованный элемент оказался на высокой позиции. Обучение моделей на смещённых исторических данных закрепляет это смещение через самоподдерживающуюся петлю обратной связи. Это может привести к субоптимальным результатам, когда более релевантные элементы, показанные на низких позициях, продолжают получать меньше взаимодействий и, как следствие, не улучшают свой ранг.
Далее приведены заметки о различных способах измерения позиционного смещения. Одни методы лучше изолируют эффект позиционного смещения, другие более применимы к уже собранным данным.
Измерение позиционного смещения с помощью случайности
Самый прямолинейный способ — перемешать (верхние) результаты равномерно случайным образом (RandN или RandTopN). Это позволяет контролировать релевантность элементов, поскольку один и тот же элемент появляется на разных позициях. Таким образом, любая разница во взаимодействии пользователей может быть однозначно отнесена к позиционному смещению. Недостаток в том, что это негативно влияет на пользовательский опыт и обычно слишком затратно или неприемлемо.
Равномерное случайное перемешивание четырёх верхних элементов.
Другой подход — использовать естественную случайность в позициях элементов. Мы наблюдаем её в исторических данных, когда в продакшене работают несколько ранжировщиков или когда продакшен-ранжировщик часто обновляется. Это позволяет оценить позиционное смещение без навязчивых вмешательств, таких как RandTopN. Тем не менее, если мы не работаем в крупном масштабе с несколькими ранжировщиками, которые часто обновляются, получить такие данные может быть сложно.
Более слабая форма естественной случайности возникает, когда несколько виджетов рекомендуют один и тот же элемент, но на разных позициях. В примере ниже виджет «Popular on Netflix» рекомендует Battleship на позиции 3 и Shooter на позиции 4, тогда как виджет «Trending» рекомендует Battleship на позиции 1 и Shooter на позиции 6. При таком подходе контекст (пользователь, элемент или запрос) остаётся постоянным. Тем не менее, может проникать другой шум — например, позиция виджета или способ его представления (заголовок, пояснение).
Естественная случайность в ранжировании Battleship и Shooter для двух виджетов.
Если у нас нет нескольких виджетов в продакшене, можно рассмотреть рекомендации, которые ранжируются на разных позициях в разных контекстах. Например, в рекомендациях «элемент-к-элементу» один и тот же рекомендуемый элемент может показываться на разных позициях для разных контекстных элементов. Однако, поскольку контекст непостоянен, этот подход может быть зашумлённым, так как релевантность одного и того же рекомендуемого элемента или результата поиска меняется в зависимости от контекстного элемента/запроса.
Несмотря на ограничения использования естественной случайности, большое преимущество этого подхода в том, что он не влияет на пользователей, поскольку мы измеряем позиционное смещение по уже собранным данным.
Ещё один подход — вывести позиционное смещение через EM-алгоритм (expectation maximization). Один из способов — моделировать клики с помощью модели позиционного смещения. В этой модели элемент получает клик, только если он был просмотрен и релевантен; просмотр зависит только от позиции, а релевантность — только от контекста и элемента. Google продемонстрировал эффективность этого подхода на поисковых логах из почтовых и файловых хранилищ, где для большинства запросов был только один клик. Для этого запросы и элементы представлялись через признаки, а не идентификаторы.
Компромиссный вариант — добавить немного случайности в позиции элементов. Например, FairPairs меняет местами элементы на позициях k и k+1, а RandPair — элементы на позициях 1 и k. Аналогично RandN, это сохраняет релевантность элементов постоянной, что позволяет измерить разницу во взаимодействии, обусловленную позиционным смещением. Недостаток в том, что RandPair может ухудшать пользовательский опыт, особенно при большом k.
Попарная перестановка элементов с помощью FairPair и RandPair.
Также можно вдохновиться идеей серендипности в рекомендациях и добавить случайное значение к позициям элементов. Например, можно добавить к позиции каждого элемента значение, случайно выбранное из нормального распределения (например, np.random.normal), и пересортировать элементы по сумме. В зависимости от стандартного отклонения каждый элемент получает шанс сместиться на +/− x позиций.
Однако добавление случайности к позиции элемента не учитывает исходные скоры рекомендаций. Например, элемент на позиции 1, чей сырой скор в 10 раз выше, чем у элемента на позиции 2, обрабатывается так же, как элемент на позиции 1, чей скор лишь в 1,1 раза выше, чем у элемента на позиции 2.
Чтобы решить эту проблему, можно добавлять случайность к сырым скорам. Один из способов — исследование Больцмана (Boltzmann exploration), при котором мы (i) нормализуем сырые скоры через softmax в вероятности, а затем (ii) сэмплируем рекомендации (на основе этих вероятностей), заполняя виджет начиная с позиции 1. Это даёт каждому рекомендованному элементу шанс получить более высокую позицию, взвешенный по вероятности рекомендации (которую также можно использовать в контрфактической оценке). В отличие от RandTopN, эти подходы привязывают каждый элемент к его исходной позиции перед добавлением случайности, что потенциально снижает негативное влияние на пользовательский опыт.
Устранение позиционного смещения
Если мы на ранних этапах построения рекомендательной системы или отдаём приоритет исследованию перед эксплуатацией, добавление некоторой случайности может быть неплохим способом устранить позиционное смещение при одновременном сборе данных о кликах. Поскольку несколько элементов могут оказаться на одной позиции (например, на позиции 1), мы можем логировать, какой элемент показал лучший результат, и соответствующим образом обучать модели.
Если добавление случайности невозможно, можно использовать измеренное/выученное позиционное смещение для дебиасинга собранных данных. Например, в упомянутой статье Google использовал выведенное позиционное смещение для обучения моделей, оптимизированных на точности с обратным взвешиванием по склонности (inverse propensity weighted precision).
Альтернативно можно учесть позиционное смещение, включив позиционные признаки в модель. Эти позиционные признаки помогают модели выучить, как позиция влияет на вознаграждение. Затем, при выдаче результатов, мы можем установить позиционный признак равным 1 для всех элементов, чтобы нивелировать влияние позиции. Подробнее в Rules of Machine Learning от Google.
Заключение
В зависимости от пользовательского опыта (UX), влияние позиционного смещения может варьироваться. Если мы — крупная платформа, где пользователи органически просматривают элементы через поиск, рекомендации, страницы категорий и т. д., и мы запускаем несколько алгоритмов в продакшене, позиционное смещение отдельного алгоритма размывается остальными.
С другой стороны, если мы запускаем новую платформу или имеем UX, при котором основная часть обнаружения элементов происходит через единый интерфейс (например, поиск ресторанов в приложениях доставки еды, ленты социальных сетей), на мой взгляд, стоит измерять и устранять позиционное смещение на ранних этапах.
Знаете ли вы другие способы измерения и устранения позиционного смещения? Буду рад услышать о них в комментариях!
Ссылки
Minimally Invasive Randomization for Collecting Unbiased Preferences from Clickthrough Logs An Experimental Comparison of Click Position Bias Models Unbiased Learning-to-Rank with Biased Feedback Learning to Rank with Selection Bias in Personal Search Estimating Position Bias without Intrusive Interventions Position Bias Estimation for Unbiased Learning to Rank in Personal Search Boltzmann Exploration Done Right A Survey of Serendipity in Recommender Systems
Спасибо Yang Xinyi за вычитку черновиков.
Если вы нашли это полезным, пожалуйста, цитируйте эту публикацию следующим образом:
Yan, Ziyou. (Apr 2022). How to Measure and Mitigate Position Bias. eugeneyan.com. https://eugeneyan.com/writing/position-bias/.
или
@article{yan2022position, title = {How to Measure and Mitigate Position Bias}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2022}, month = {Apr}, url = {https://eugeneyan.com/writing/position-bias/} }
Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.