08 · Monitoring and improvement
Feedback loops and exposure bias
9 min read
A feedback loop is what happens when a model’s decisions change the data it will be trained on next. A recommender only learns about clicks on items it chose to show, so the next version learns what the last version liked, and an item that was never shown looks exactly like an item nobody wanted. The design decision is what to log about each decision so that the loop can be seen and partly corrected, and how much deliberate variety to add so that the model keeps learning about the items it is not showing.
An everyday example
A radio station plays the top 40 chart, and the chart is built from how often songs were played on the radio. A song at number three gets played every hour, so it stays at number three, and a new song that no station has played yet has no plays to its name and no way to earn them. From the chart alone nobody can tell whether the new song is unpopular or merely unheard, and a station that trusts the chart completely plays the same 40 songs forever.
A recommender trained on its own clicks is that station. The chart differs from the recommender in a useful way, because the chart the station uses also counts sales and streams the station does not control, which lets a new song climb from outside, while the recommender’s training log contains only what the recommender itself chose to show. Everything the model knows about its users came through its own choices, which is why the log has to record those choices alongside the clicks.
Predictions change future observations
A music recommender that promotes already popular artists gives them more plays, and those plays go into the next training set, where they look like proof that the promotion was right. Other artists who would have pleased the same listeners never got the slot, so they have no plays, and the next model ranks them lower still. The outcome in the log is partly what listeners liked and partly where the previous model put things, and the two cannot be separated after the fact unless the position was recorded.
The same selection effect appears wherever the model decides which cases get a label. A moderation system that sends only flagged posts to human review learns the truth about flagged posts and nothing about the rest, and a fraud model that blocks a payment never finds out whether it would have been disputed. In each case some part of the task gets reliable labels and another part gets none, and training on that log as if it were a fair sample keeps the model’s blind spots exactly where they are.
Record the policy that produced the data
The fix starts at logging time, because the information needed to correct the loop later cannot be reconstructed. For every page the service records which items were shown, in which position, from which candidate source, and under which model and experiment version, alongside what the user did. A click on the item in slot one and a click on the item in slot nine are different evidence, and a log that keeps only the clicks has thrown that difference away.
When the service deliberately shows some items it would not otherwise have shown, which is called exploration, it also records the probability with which each item was chosen, because that number is what every correction method below needs. A predicted click score is not that probability. Exploration is kept small and safe, perhaps one slot in 20 given to a less certain item, and it respects the same eligibility and safety rules as the rest of the page. In domains such as medicine or harmful content a human audit replaces it, since no design is obliged to expose people to harm to collect a label.
Counterfactual estimates require assumptions
A propensity is the probability that the serving policy showed a given item in a given situation, and inverse propensity weighting is the correction that counts each observed outcome more heavily when the item was unlikely to be shown. An item shown with probability 0.5 that got a click counts as two clicks, and one shown with probability 0.02 that got a click counts as 50, which lets rarely shown items be compared fairly with popular ones. The method needs two things, the true probabilities, which is why they are logged, and some chance of every item being shown, because an item with probability zero has no outcome to reweight.
The worked numbers also show the method’s weakness. One click on an item shown with probability 0.01 counts as 100 clicks, so a single lucky click can swing an estimate. In practice the weights are capped at a value such as 20, and the small unfairness the cap introduces is accepted as the price of stability. Position adds a second complication, since users tend to click the first acceptable result rather than compare all ten. A click in slot one is therefore weaker evidence about the item than a click in slot eight, and position has to be modelled or balanced separately.
Before any correction is chosen, the team establishes what was logged and which items had any chance of being shown. Where the probabilities were never recorded, which is the usual case in a system that did not plan for this, the honest options are a controlled experiment or a human audit of a random sample. A statistical correction built on guessed probabilities is worse than admitting the gap.
Click on an item shown with probability 0.5 counts as 1 / 0.5 = 2 clicks
Click on an item shown with probability 0.02 counts as 1 / 0.02 = 50 clicks
Click on an item shown with probability 0.01 counts as 100 clicks, so weights are capped, for example at 20Measure what the loop narrows or amplifies
The slow damage of a feedback loop shows in numbers no click metric reports. Catalog coverage is the share of items shown to anyone in a week, and a recommender can raise click rate while coverage falls from 30 percent to 8 percent, because it has learned to show the safe hits. New-item exposure, how often the same item is recommended to the same person, and the experience of small user groups are tracked beside engagement, and the product decides how much click rate it will trade for variety rather than letting engagement decide alone.
A longer experiment or a small group of users held on the old policy for months shows whether a change improved the experience or only shifted exposure for a while. The record of how the policy changed over time keeps those findings tied to the training data they came from. With the loop from decisions to data to the next model in view, the interview preparation section turns to how these decisions are presented and defended in a design conversation.
Where people get confused
No clicks gets read as a negative label. An item with no clicks and no impressions has never been judged, and treating it as rejected is the mechanism that keeps it hidden. The impression count is checked before the click count.
More data is believed to fix the loop. Ten times as many logged clicks from the same policy are ten times as much evidence about the same narrow set of items, and the correction needs information about what was not shown, which only logging the policy and a little exploration can provide.
The subtlest mistake is using the model’s predicted click probability as the propensity. The propensity is the chance the serving policy gave the item a slot, which depends on the ranking rule and any randomness in it, and the two numbers are only equal by accident.
In the interview
Feedback loops usually arrive as a follow-up, such as how new items get seen or whether an offline gain on logged data will hold, and the answer takes two to four minutes. Say that the training data came from the model’s own choices, that you would log position and the chance of being shown for every item, and that a small exploration quota keeps the model learning about the rest of the catalog. The weighting method is worth a sentence, and the longer-term coverage metrics are the thing to mention if the interviewer asks what could go wrong in a year.
Interview questions
A new creator has no clicks, so the ranker gives their content a low score every time. What is the design issue?
The issue is that no clicks is being read as rejection when it is more likely to be no exposure. I would check impressions first, meaning how often their items were shown at all, and if the creator’s items were never shown then the model has never been told anything about them.
I would give new items an embedding, a list of numbers that stands for the item, built from their content so the retrieval stage can find them, reserve perhaps one slot in 20 for items with little history, and log the probability each item was shown so later training can weight the resulting clicks fairly. The trade-off is a slightly worse page for the user today in exchange for evidence about new creators tomorrow, and I would measure new-creator coverage as its own number rather than letting the overall click rate decide.
A new ranking model scores higher on the logged clicks than the current one. Do you ship it?
Not on that evidence alone, because the logged clicks only exist for items the current model chose to show. A new model that agrees with the old one on those items looks good, and a new model that would show different items has no clicks to be judged on, so the offline comparison favors models that behave like the incumbent.
If the log recorded the probability each item was shown, I would reweight the comparison with inverse propensity weighting, capping the weights, and treat the result as a hint. The decision would come from a canary and then an experiment on live traffic, where the new model’s own choices get judged. The trade-off is a slower decision in exchange for not rejecting every model that differs from the current one.
Why would you deliberately show a user something the model thinks is worse?
The model can only be confident about items it has shown, and a small amount of exploration is how it learns about everything else. I would give about one slot in 20 to an item the model is uncertain about, drawn from items that pass the same eligibility and safety rules as the rest, and record the probability it was chosen with.
The cost is a measurable dip in click rate on that slot, and the return is a training set that keeps learning about the catalog instead of narrowing to the same hits. In a domain where showing the wrong thing causes harm, I would replace exploration with a human audit of a random sample.
What to practice next
Design these systems on the canvas and get your design graded.
These problems let you compute how much of the catalog a recommender shows, score how novel its suggestions are, and build the popularity baseline that a feedback loop collapses toward, which are the measurements this topic says to watch.