How to Measure and Mitigate Position Bias
Позиционное смещение (position bias) возникает, когда элементы на более высоких позициях получают непропорционально больше кликов независимо от их реальной релевантности — например, в Google Search первая позиция получает в 10 раз больше кликов, чем десятая. Обучение моделей на таких смещённых данных создаёт самоподдерживающуюся петлю обратной связи, при которой релевантные элементы на низких позициях продолжают терять вовлечённость. Для измерения смещения используют случайное перемешивание топовых результатов (RandN), эксплуатацию естественной случайности в логах, оценку через EM-алгоритм, а также попарные перестановки (FairPairs, RandPair) и добавление шума к позициям или сырым скорам (Boltzmann exploration). Для устранения смещения можно дебиасировать логи с помощью inverse propensity weighting или включить позиционные признаки в модель, обнуляя их при инференсе. Автор рекомендует измерять и устранять позиционное смещение на ранних этапах, особенно если основной поток обнаружения контента идёт через один интерфейс.
How to Measure and Mitigate Position Bias
Как измерить и устранить позиционное смещение
Position bias happens when higher positioned items are more likely to be seen and thus clicked regardless of their actual relevance. This leads to lesser engagement on lower ranked items. On Google Search, users click on the first position 10x more than the tenth position. Similarly, we scan through Netflix’s recommendation carousels from left to right.
Позиционное смещение возникает, когда элементы на более высоких позициях с большей вероятностью будут просмотрены и, соответственно, получат клики независимо от их фактической релевантности. Это приводит к снижению вовлечённости для элементов на более низких позициях. В Google Search пользователи кликают на первую позицию в 10 раз чаще, чем на десятую. Точно так же мы просматриваем карусели рекомендаций Netflix слева направо.
Position bias happens when we process items from top-to-bottom or left-to-right.
Позиционное смещение возникает, когда мы обрабатываем элементы сверху вниз или слева направо.
Position bias can happen for several reasons. Perhaps we trust the algorithm and just blindly click on top results. Or perhaps we’re less likely to view lower-ranked items (i.e., presentation bias), especially if they’re on the second page of Google Search’s results. Maybe after we click the first relevant result or play the first relevant movie, we ignore the rest of the items.
Позиционное смещение может возникать по нескольким причинам. Возможно, мы доверяем алгоритму и просто слепо кликаем на верхние результаты. Или, возможно, мы с меньшей вероятностью просматриваем элементы на нижних позициях (т. е. смещение представления), особенно если они находятся на второй странице результатов Google Search. Может быть, после клика на первый релевантный результат или запуска первого подходящего фильма мы просто игнорируем остальные элементы.
Because of position bias, it’s difficult to tell if users are engaging on recommendations because they’re truly relevant, or because the recommended item happens to rank highly. Training our models on biased historical data perpetuates the bias via a self-reinforcing feedback loop. This can lead to suboptimal outcomes where items that are more relevant but are shown in lower positions continue to get lower engagement and thus don’t improve their rank.
Из-за позиционного смещения сложно определить, взаимодействуют ли пользователи с рекомендациями потому, что они действительно релевантны, или потому, что рекомендованный элемент оказался на высокой позиции. Обучение моделей на смещённых исторических данных закрепляет это смещение через самоподдерживающуюся петлю обратной связи. Это может привести к субоптимальным результатам, когда более релевантные элементы, показанные на низких позициях, продолжают получать меньше взаимодействий и, как следствие, не улучшают свой ранг.
Here are some notes on various ways to measure position bias. Some isolate the effect of position bias better while others are more feasible on logged data.
Далее приведены заметки о различных способах измерения позиционного смещения. Одни методы лучше изолируют эффект позиционного смещения, другие более применимы к уже собранным данным.
Measuring position bias via randomness
Измерение позиционного смещения с помощью случайности
The straightforward way is to shuffle (top) results uniformly at random (RandN or RandTopN). This controls for item relevance by having the same item appear in multiple positions. Thus, any difference in customer engagement can be cleanly attributed to position bias. The downside is that this adversely impacts the customer experience and is usually too costly or out of the question.
Самый прямолинейный способ — перемешать (верхние) результаты равномерно случайным образом (RandN или RandTopN). Это позволяет контролировать релевантность элементов, поскольку один и тот же элемент появляется на разных позициях. Таким образом, любая разница во взаимодействии пользователей может быть однозначно отнесена к позиционному смещению. Недостаток в том, что это негативно влияет на пользовательский опыт и обычно слишком затратно или неприемлемо.
Shuffling the top 4 items uniformly at random.
Равномерное случайное перемешивание четырёх верхних элементов.
Another approach is to exploit the inherent randomness in item positions. We see this in historical data when we have multiple rankers in production or when the production ranker is updated frequently. This lets us to estimate position bias without intrusive interventions like RandTopN. Nonetheless, unless we’re operating on a large scale with multiple rankers updating frequently, it can be hard to get such data.
Другой подход — использовать естественную случайность в позициях элементов. Мы наблюдаем её в исторических данных, когда в продакшене работают несколько ранжировщиков или когда продакшен-ранжировщик часто обновляется. Это позволяет оценить позиционное смещение без навязчивых вмешательств, таких как RandTopN. Тем не менее, если мы не работаем в крупном масштабе с несколькими ранжировщиками, которые часто обновляются, получить такие данные может быть сложно.
A weaker form of inherent randomness occurs when multiple widgets recommend the same item but in different positions. In the example below, the Popular on Netflix widget recommends Battleship in position 3 and Shooter in position 4 while the Trending widget recommends Battleship in position 1 and Shooter in position 6. In this approach, the context (i.e., user, item, or query) is constant. Nonetheless, other noise may seep in such as widget position or how the widget is presented (e.g., title, explanation).
Более слабая форма естественной случайности возникает, когда несколько виджетов рекомендуют один и тот же элемент, но на разных позициях. В примере ниже виджет «Popular on Netflix» рекомендует Battleship на позиции 3 и Shooter на позиции 4, тогда как виджет «Trending» рекомендует Battleship на позиции 1 и Shooter на позиции 6. При таком подходе контекст (пользователь, элемент или запрос) остаётся постоянным. Тем не менее, может проникать другой шум — например, позиция виджета или способ его представления (заголовок, пояснение).
Inherent randomness in how Battleship and Shooter are ranked for two widgets.
Естественная случайность в ранжировании Battleship и Shooter для двух виджетов.
If we don’t have multiple widgets in production, we can consider recommendations that are ranked in different positions across different contexts. For example, in item-to-item recommendations, the same recommended item may be shown in different positions for different context items. However, as the context isn’t constant, this approach can be noisy because the same recommended item or search result has different relevance based on the context item/query.
Если у нас нет нескольких виджетов в продакшене, можно рассмотреть рекомендации, которые ранжируются на разных позициях в разных контекстах. Например, в рекомендациях «элемент-к-элементу» один и тот же рекомендуемый элемент может показываться на разных позициях для разных контекстных элементов. Однако, поскольку контекст непостоянен, этот подход может быть зашумлённым, так как релевантность одного и того же рекомендуемого элемента или результата поиска меняется в зависимости от контекстного элемента/запроса.
Despite the limitations of exploiting inherent randomness, the big advantage is that there’s no customer impact as we are measuring position bias via logged data.
Несмотря на ограничения использования естественной случайности, большое преимущество этого подхода в том, что он не влияет на пользователей, поскольку мы измеряем позиционное смещение по уже собранным данным.
Another approach is to infer position bias via expectation maximization. One way is to model clicks via a position bias model. In the model, an item is clicked only if it is examined and relevant; examination depends only on the position while relevance depends only on the context and item. Google demonstrated this approach’s effectiveness on search logs from email and file storage services where there was only a single click for most queries. To do this, they represented queries and items via features instead of IDs.
Ещё один подход — вывести позиционное смещение через EM-алгоритм (expectation maximization). Один из способов — моделировать клики с помощью модели позиционного смещения. В этой модели элемент получает клик, только если он был просмотрен и релевантен; просмотр зависит только от позиции, а релевантность — только от контекста и элемента. Google продемонстрировал эффективность этого подхода на поисковых логах из почтовых и файловых хранилищ, где для большинства запросов был только один клик. Для этого запросы и элементы представлялись через признаки, а не идентификаторы.
A middle ground is to add a bit of randomness into item positions. For example, FairPairs swaps items at positions k and k+1 while RandPair swaps items at positions 1 and k. Similar to RandN, this keeps item relevance constant so we can measure the difference in customer engagement due to position bias. One downside is that RandPair can degrade customer experience especially if k is large.
Компромиссный вариант — добавить немного случайности в позиции элементов. Например, FairPairs меняет местами элементы на позициях k и k+1, а RandPair — элементы на позициях 1 и k. Аналогично RandN, это сохраняет релевантность элементов постоянной, что позволяет измерить разницу во взаимодействии, обусловленную позиционным смещением. Недостаток в том, что RandPair может ухудшать пользовательский опыт, особенно при большом k.
Swapping pairs of items via FairPair and RandPair.
Попарная перестановка элементов с помощью FairPair и RandPair.
We can also draw inspiration from serendipity in recommendations and add a random value to item positions. For example, we can add values randomly sampled from a normal distribution (e.g., np.random.normal) to each item’s position and re-sort them on the sum. Depending on the standard deviation, each item has the chance to gain +/- x positions.
Также можно вдохновиться идеей серендипности в рекомендациях и добавить случайное значение к позициям элементов. Например, можно добавить к позиции каждого элемента значение, случайно выбранное из нормального распределения (например, np.random.normal), и пересортировать элементы по сумме. В зависимости от стандартного отклонения каждый элемент получает шанс сместиться на +/− x позиций.
However, adding randomness to an item’s position doesn’t account for the underlying scores of the item recommendations. For example, a position 1 item that has 10x the raw score of a position 2 item is treated the same as a position 1 item that has 1.1x the score of a position 2 item.
Однако добавление случайности к позиции элемента не учитывает исходные скоры рекомендаций. Например, элемент на позиции 1, чей сырой скор в 10 раз выше, чем у элемента на позиции 2, обрабатывается так же, как элемент на позиции 1, чей скор лишь в 1,1 раза выше, чем у элемента на позиции 2.
To address this, we can add randomness to the raw scores instead. One way is Boltzmann exploration where we (i) normalize/softmax the raw scores into probabilities and then (ii) sample the recommendations (based on these probabilities) as we populate our widget starting from position 1. This gives each recommended item a chance to gain a higher position weighted by recommendation probability (which we can also use in counterfactual evaluation). Unlike RandTopN, these approaches anchor each item to its original position before adding randomness, possibly reducing the negative customer impact.
Чтобы решить эту проблему, можно добавлять случайность к сырым скорам. Один из способов — исследование Больцмана (Boltzmann exploration), при котором мы (i) нормализуем сырые скоры через softmax в вероятности, а затем (ii) сэмплируем рекомендации (на основе этих вероятностей), заполняя виджет начиная с позиции 1. Это даёт каждому рекомендованному элементу шанс получить более высокую позицию, взвешенный по вероятности рекомендации (которую также можно использовать в контрфактической оценке). В отличие от RandTopN, эти подходы привязывают каждый элемент к его исходной позиции перед добавлением случайности, что потенциально снижает негативное влияние на пользовательский опыт.
Mitigating position bias
Устранение позиционного смещения
If we’re in the early days of building our recommender system or prioritize exploration over exploitation, adding some randomness can be a decent way to mitigate position bias while collecting click data. Because multiple items can appear in the same position (e.g., position 1), we can log which item performed better and train our models accordingly.
Если мы на ранних этапах построения рекомендательной системы или отдаём приоритет исследованию перед эксплуатацией, добавление некоторой случайности может быть неплохим способом устранить позиционное смещение при одновременном сборе данных о кликах. Поскольку несколько элементов могут оказаться на одной позиции (например, на позиции 1), мы можем логировать, какой элемент показал лучший результат, и соответствующим образом обучать модели.
If adding randomness is not an option, we can use the measured/learned position bias to debias logged data. For example, the previous Google paper used inferred position bias to train models optimized on inverse propensity weighted precision.
Если добавление случайности невозможно, можно использовать измеренное/выученное позиционное смещение для дебиасинга собранных данных. Например, в упомянутой статье Google использовал выведенное позиционное смещение для обучения моделей, оптимизированных на точности с обратным взвешиванием по склонности (inverse propensity weighted precision).
Alternatively, we can account for position bias by including positional features in our models. These positional features help the model learn how position affects reward. Then, during serving, we can set all items to have positional feature = 1 to negate the impact of position. More in Google’s Rules of Machine Learning.
Альтернативно можно учесть позиционное смещение, включив позиционные признаки в модель. Эти позиционные признаки помогают модели выучить, как позиция влияет на вознаграждение. Затем, при выдаче результатов, мы можем установить позиционный признак равным 1 для всех элементов, чтобы нивелировать влияние позиции. Подробнее в Rules of Machine Learning от Google.
Conclusion
Заключение
Depending on the user experience (UX), the impact of position bias can vary. If we’re a large platform where customers organically view items via search, recommendations, category pages, etc. and we run several algorithms in production, the position bias from an individual algorithm gets washed out by other algorithms.
В зависимости от пользовательского опыта (UX), влияние позиционного смещения может варьироваться. Если мы — крупная платформа, где пользователи органически просматривают элементы через поиск, рекомендации, страницы категорий и т. д., и мы запускаем несколько алгоритмов в продакшене, позиционное смещение отдельного алгоритма размывается остальными.
On the other hand, if we’re launching a new platform or have a UX where the bulk of item discovery comes from a single interface (e.g., restaurant search on food delivery apps, social media feeds), IMHO it’s a good idea to measure and mitigate position bias early.
С другой стороны, если мы запускаем новую платформу или имеем UX, при котором основная часть обнаружения элементов происходит через единый интерфейс (например, поиск ресторанов в приложениях доставки еды, ленты социальных сетей), на мой взгляд, стоит измерять и устранять позиционное смещение на ранних этапах.
Do you know of other ways to measure and mitigate position bias? Would love to hear them in the comments below!
Знаете ли вы другие способы измерения и устранения позиционного смещения? Буду рад услышать о них в комментариях!
References
Ссылки
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
Thanks to Yang Xinyi for reading drafts of this.
Спасибо Yang Xinyi за вычитку черновиков.
If you found this useful, please cite this write-up as:
Если вы нашли это полезным, пожалуйста, цитируйте эту публикацию следующим образом:
Yan, Ziyou. (Apr 2022). How to Measure and Mitigate Position Bias. eugeneyan.com. https://eugeneyan.com/writing/position-bias/.
Yan, Ziyou. (Apr 2022). How to Measure and Mitigate Position Bias. eugeneyan.com. https://eugeneyan.com/writing/position-bias/.
or
или
@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/}
}
@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/} }
Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.
Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.