Baseline and Incremental: User, Item, and Request Debiasing in Instagram Feed Ranking
Organizations: Meta USA
Abstract
A feed ranker scores candidates with a value model, a weighted sum of engagement predictions. Each prediction conflates a baseline, what this viewer, item or request would produce anyway, with the incremental amount by which this candidate exceeds it. The literature mostly removes the baseline. We argue that a multi-signal value model should keep the raw prediction and add the incremental part as a separately weighted term. On Instagram Feed, three debiasing families deployed independently, for viewer habit, item popularity and request context, are one parameterised operator, and a design procedure picks a point in it. Media-type (format) bias goes instead to a debiased label chosen by the same procedure. In a controlled four-arm ablation of deployed Feed terms (neither term, each alone, both), the two-term arm beats both single-term arms at production weights on point estimates in 11 of 13 judged (term, metric) pairs. Of the 26 direct contrasts, 17 are significantly for it and only 1 against it, on impressions. The ablation also suggests that the offline diagnostic should screen signals, not rank them. Such terms have served Instagram Feed production for most of a year. Beyond Feed, Meta, whose apps serve billions of people, has adopted the operator across surfaces, apps and both ranking stages. Its launches there drive sessions and daily active users, the core visitation and retention metrics.
Figures & tables
| Method | baseline | scale | raw at serving |
|---|---|---|---|
| Logit adj. ( Menon et al., 2021 ) | class prior | logit log prior | yes, |
| PDA ( Zhang et al., 2021 ) | item popularity | mult. (power) | re-injected |
| MACR ( Wei et al., 2021 ) | viewer, item branch | raw gap | yes, |
| PPAC ( Ning et al., 2024 ) | pers./global pop. | additive | yes, |
| PAL ( Guo et al., 2019 ) | position | mult. factor | dropped |
| Shallow tower ( Zhao et al., 2019 ) | position | additive logit | dropped |
| signal | quantile | zero % | Var% | |
|---|---|---|---|---|
| like | 6 | 22.0 | 2.90M | |
| comment_tap | 15 | 17.3 | 2.89M | |
| reshare_select_recipient | 40 | 45.4 | 2.67M | |
| reshare_button_tap | 21 | 16.6 | 2.89M | |
| profile_tap | 8 | 9.3 | 2.90M | |
| save | 43 | 17.4 | 2.67M |
| popularity | duration | ||
|---|---|---|---|
| profile_tap | vc_ratio_80 | ||
| reshare_button_tap | log_time | ||
| like | comment_ts | ||
| follow | ts_p75_carousel_v2 | ||
| feed_time_spent | reelsiv_chain_view_time | ||
| save | ts_p75_video_v2 |
| term | axis | form | approved on |
|---|---|---|---|
| bucketTS-p75 † | item | photo: \Delta={\color[rgb]{0.1211,0.3047,0.6133}\hat{P}}\big(t{\color[rgb]{0.1328,0.5469,0.5}\,>\,}{\color[rgb]{0.7031,0.3242,0}b_{\text{words}}}\big) ; carousel: \Delta={\color[rgb]{0.1211,0.3047,0.6133}\hat{P}}\big(t{\color[rgb]{0.1328,0.5469,0.5}\,>\,}{\color[rgb]{0.7031,0.3242,0}b_{\text{cards}}}\big) ; video: \Delta={\color[rgb]{0.1211,0.3047,0.6133}\hat{P}}\big(t{\color[rgb]{0.1328,0.5469,0.5}\,>\,}{\color[rgb]{0.7031,0.3242,0}b_{\text{duration}}}\big) : predicted probability; : time spent; : p75 of in the post’s bucket of OCR word count, number of cards or duration. | feed time spent |
| logTS-MR | item | \Delta={\color[rgb]{0.1211,0.3047,0.6133}p}\;\mathopen{{\color[rgb]{0.1328,0.5469,0.5}\sigma\bigl(}}{\color[rgb]{0.1211,0.3047,0.6133}\hat{t}}-{\color[rgb]{0.7031,0.3242,0}b}\mathclose{{\color[rgb]{0.1328,0.5469,0.5}\bigr)}} : predicted log time spent; : predicted time spent; : the post’s mean time spent per view. | impressions |
| seeMore | request | \Delta=\mathopen{{\color[rgb]{0.1328,0.5469,0.5}\max\bigl(0,}}\;{\color[rgb]{0.1211,0.3047,0.6133}p}-{\color[rgb]{0.7031,0.3242,0}b}\mathclose{{\color[rgb]{0.1328,0.5469,0.5}\bigr)}} : P(viewer taps “See more”); : mean of over the request’s candidates; and for unconnected candidates only. | unconnected post interested ratio |
| logTS-TR | item | \Delta={\color[rgb]{0.1211,0.3047,0.6133}\hat{t}}\;\mathopen{{\color[rgb]{0.1328,0.5469,0.5}\sigma\bigl(}}{\color[rgb]{0.1211,0.3047,0.6133}\hat{t}}-{\color[rgb]{0.7031,0.3242,0}b}\mathclose{{\color[rgb]{0.1328,0.5469,0.5}\bigr)}} : predicted time spent; : the post’s mean time spent per view. | sessions |
| p10s † | request | \Delta=\mathopen{{\color[rgb]{0.1328,0.5469,0.5}\max\bigl(0,}}\;{\color[rgb]{0.1211,0.3047,0.6133}p}-{\color[rgb]{0.7031,0.3242,0}b}\mathclose{{\color[rgb]{0.1328,0.5469,0.5}\bigr)}} : P(time spent on the post 10 s); : p75 of over the request’s candidates. | sessions |
| extShare † | viewer | \Delta={\color[rgb]{0.1211,0.3047,0.6133}p}\;\mathopen{{\color[rgb]{0.1328,0.5469,0.5}\sigma\bigl(}}\operatorname{logit}{\color[rgb]{0.1211,0.3047,0.6133}p}-\operatorname{logit}{\color[rgb]{0.7031,0.3242,0}b}\mathclose{{\color[rgb]{0.1328,0.5469,0.5}\bigr)}} : P(viewer shares the post outside Instagram); : the viewer’s own external-share rate. | sessions |
| vs. none | both | |||||
|---|---|---|---|---|---|---|
| metric | raw | incr | both | raw | incr | JD |
| p10s req | ||||||
| sessions | ✓ | |||||
| feed time spent | ✓ | |||||
| logTS-MR item | ||||||
| sessions | ✓ | |||||
| stage | term | axis | approved on |
|---|---|---|---|
| LSR | debiased | viewer | sessions, DAU |
| LSR | watch-time gating | item | sessions, DAU |
| ESR | watch-time gating | item | sessions |
| ESR | batch champion boost | request | sessions, DAU |
| ESR | log-time gating | item | sessions |
| ESR | against viewer like rate | viewer | sessions, DAU |
Recommender Systems
Recommender systems predict and rank items for people using interaction histories, content, context, and feedback.
See all 521 papers