ML Systems Lab Open interactive version →
Advanced 24 min read RecSysposition biaspopularity biasIPSfeedback loop

Feedback Loops & Bias

Position bias, popularity bias, the closed-loop causal trap, IPS/debiasing

A recommender trains on logs it generated itself. That single sentence is the source of the field's hardest correctness problem: the data is not a neutral sample of user preference — it's a sample of *what the previous model chose to show*, filtered through *where it chose to show it*. Train naively on that data and you don't learn relevance; you learn to imitate your own past behavior.


Position bias: rank determines clicks, so raw clicks aren't relevance. Users click the top slot far more than the bottom slot *regardless of item quality* — attention drops with position. If you train the next ranker on raw click labels, it learns "items that were at position 1 get clicked" and dutifully re-ranks whatever was already on top. The model reproduces position effects, not relevance — a self-reinforcing loop where good-but-low-ranked items can never climb.


Popularity bias: the flywheel amplifies whatever is already popular. Popular items get shown more → get more interactions → look even more relevant to the model → get shown more still. Niche and new items are starved of exposure, so the model has little data on them and under-ranks them, deepening the imbalance. Left uncorrected, the catalog collapses toward a shrinking head, coverage falls, and the long tail dies — even as short-term clicks look healthy.


The closed-loop causal trap and how debiasing breaks it. The core issue is causal: you observe clicks *conditional on* being shown at a position, but you want P(relevant), which requires reasoning about what *would* have happened under a different exposure. Inverse Propensity Scoring (IPS) is the standard tool: weight each observed interaction by 1/P(shown | position) so items shown in low-attention slots count *more* when they still got clicked, recovering an unbiased relevance estimate. Propensities are estimated from a position-bias model or from deliberate randomization (occasionally shuffling positions to gather unbiased data). The naming to know: IPS / doubly-robust estimators / counterfactual learning-to-rank — all attack the same "learn from logs you generated" trap. And randomization/exploration isn't just for cold start; it's how you keep collecting the unbiased signal debiasing needs — and that same controlled randomization budget is what lets you validate that an IPS or doubly-robust correction actually recovered true relevance, rather than just swapping in a differently-biased estimate.

Key points

Takeaway

A recommender trains on logs it generated, so raw clicks encode position bias (rank drives clicks) and popularity bias (the flywheel amplifies the head) rather than relevance — a closed-loop causal trap where the model imitates its own past. Inverse Propensity Scoring (weight by 1/P(shown|position)), fed by deliberate randomization, recovers an unbiased relevance estimate; doubly-robust and counterfactual LTR are the same idea.

Recap

Check your understanding

Q1. Your LTR model shows *higher* precision@1 for items that were historically displayed at low positions than for items displayed at high positions. What does this reveal, and what's the principled fix?

Q2. Why does inverse propensity scoring weight a click from a low-attention slot *more* than a click from the top slot?

Q3. A team wants to remove position bias but refuses to ever randomize the ranking ("it would hurt engagement"). Select the *two* correct reasons this is self-defeating for debiasing.

Try it interactively

ML Systems Lab is a free interview-prep platform for ML engineers — work through the full interactive module, quizzes, and drills.

Open ML Systems Lab →