0x00 한

Research / Daily reports

  • Sources read: 4
  • Canon files updated: 5
  • Radar entries: 2
In one lineThe Instagram Feed scoring formula was published for the first time. It does not use predictions as they are; it weights separately the increment beyond viewer-habit and popularity baselines, and it has run in production for nearly a year.

Other changes reviewed today:

  • X added a filter, off by default, that shrinks candidates by the same ratio per source when they exceed the Phoenix scoring budget of 2800.
  • X built a path that sends value model weights with the retrieval request, but the default is empty, so it currently sends none.
  • Kuaishou reported +0.613% in app usage time from a ranking that shrinks a 100,000-length user history with a distillation selector.

1Instagram Feed weights prediction baselines and increments separately — Instagram

Source Baseline and Incremental: User, Item, and Request Debiasing in Instagram Feed Ranking (arXiv 2610.27423) — Meta, 2026-10-20 v1, paper. All 26 authors have an email domain of @meta.com (2 wrote that they did the work while employed at Meta).

Background Feed rankers order candidates with a value model (a formula that combines per-action predictions into one score), which sums per-action predictions such as like, share, and dwell time multiplied by weights. However, prediction values contain a share unrelated to the candidate. A viewer who likes often has a high like prediction for any post, and popular posts and long videos structurally get high predictions. This paper discloses Instagram Feed's production design, which keeps this share (the baseline) rather than erasing it and adds the increment beyond the baseline as a term with a separate weight.

What we learnedA. The Feed score adds the original prediction term and the increment term, weighted separately per signal

  • The score of Instagram Feed late-stage ranking (the final stage, which scores hundreds of candidates per request) is a weighted sum of engagement predictions verified — HTML version §1.

    • The target VMs are MainRank, which orders most of the feed, and TopRank, which fills the top of the session.
    • Weights are tuned to a few north-star metrics with online Bayesian optimization (an optimization that picks weight combinations one after another while watching experiment results).
    • Deployed VMs sometimes multiply some groups of terms, but the paper does not cover that structure.
  • The paper leaves the original prediction term as it is and adds the increment Δ beyond the baseline as a term with a separate weight verified — same paper §1.

    • The original formula and the modified one are as follows (the original MathML was transcribed as text):
    s(c) = Σ_j w_j p_j(c)
    s(c) = Σ_j [ w_j^r p_j(c) + w_j^i Δ_j(c) ]
    
  • There are three kinds of baselines verified — same paper §3.

    • The viewer baseline is that viewer's past action rate. The Feed like prediction has a rank correlation of 0.69 with the viewer's own past like rate.
    • The item baseline is item popularity (popularity bias) or structural attributes such as format and size.
    • The request baseline is the prediction statistics of the candidates in the same request.
  • All three baselines are expressed by one operator, and the deployed forms are three verified — same paper §3.

    • The general form is Δ = m(p,b)[σ(k·d(p,b)) − shift], and for probabilities it uses d = logit(p) − logit(b).
    • The deployed forms are p σ(logit p − logit b), m σ(ŷ − b), and max(0, p − b), all with shift 0.
    • For the demotion term, it states that using m=p makes the penalty vanish when the prediction is at the floor, so it uses a form with a constant magnitude and the comparison direction flipped.

"The baseline is not a defect but a second signal that needs its own weight (§3). A habitual liker's likes are real engagement, and a broadly loved post deserves reach. But one coefficient w_j cannot trade the two components off, and the right trade-off is unknown a priori and differs by signal." — arXiv 2610.27423 (HTML), 2026-10-20

What we learnedB. Only format bias is removed from the training label, not from the score term

  • Format bias such as video length is handled not by a VM term but by a label that counts as positive only when the item is in the top within the same format-and-size bucket verified — same paper §4.4.
    • Buckets are split by length for videos, by card count for carousels, and by OCR word count for photos. Exceeding the p75 of dwell time within the bucket makes the label positive.
    • It explains that popularity bias is a single item statistic of the same signal, so a VM term suffices, whereas format bias distorts the label itself, so it is fixed in the label.
    • The correlation between the video label and video length is r≈−0.017, smaller than the +0.216 of the original log dwell time prediction verified. It states that photo and carousel labels were not audited.

What we learnedC. In an experiment splitting the 6 deployed terms into four arms, the arm keeping both terms mostly won

  • Each term has four arms (both terms off, original term only, incremental term only, both), compared with 3% of traffic per arm verified — same paper §6.
    • Measurement covers the same 7-day window in which all 6 experiments were on, and each experiment ran 12–17 days.
    • Of the 13 (term, metric) pairs judged, in 11 the both-terms arm beat both single-term arms on point estimates. Seven pairs have both contrasts significant.
    • Of 26 direct contrasts, 17 were significantly favorable and 1 (impressions) was significantly unfavorable.
  • The paper itself states the limitation that the single-term arms were not re-tuned verified — same section.

"Neither single-term arm was re-tuned. This favours both over incremental, whose weight was set beside the raw term. The design thus tests whether either term is redundant at the deployed point, not whether a re-tuned single-term VM could match it." — arXiv 2610.27423 (HTML), 2026-10-20

  • The 6 deployed terms and the launch-decision metrics are listed below verified — same paper §5 Table 4.
    • The format bucket label launched with feed dwell time +0.447%, and the item-axis dwell gate (MainRank) with impressions +0.665%.
    • The see-more request term launched with an unconnected-post interest ratio of +0.63% (feed dwell time −0.118%), and the external-share viewer term with sessions +0.030%.
  • The conclusion is that offline diagnostics (the correlation between prediction and baseline) should be used only to filter candidates, not to rank them verified — same paper §7. One tested term ranked 9th offline among 10 on the same axis.

What we learnedD. The same operator also launched in Reels and Threads, and Facebook is testing it

  • This structure ran in Instagram Feed production for nearly 1 year, and all 6 terms are on as of paper submission verified — same paper §5.
  • Reels launched all three axes in both early-stage and late-stage, Threads launched in late-stage, and Facebook is testing it in ongoing experiments verified — same paper §8.
    • Reels launch examples include the late-stage viewer-axis like calibration (sessions +0.083%, DAU +0.042%) and content-calibrated skip demotion.

"Furthermore, Threads has launched debiased signals in late-stage ranking, and Facebook is testing debiased terms in ongoing experiments." — arXiv 2610.27423 (HTML), 2026-10-20

Canon update In services/instagram.md, rewrote ## Summary to include the Feed scoring formula sentence, and added a Feed VM sentence to the ## Ranking intro. In the same section, added a new ### Feed value model — weight the original prediction and the increment separately, a bullet in ### Three combination forms saying Feed extends the additive form, a 2026 Bayesian optimization sentence in the ### How weights are set intro, sub-bullets under items 1 and 2 of ## Open questions, and a source under ### Papers. Added launch statements to the ## Ranking intro and the "0 information on weights and combination method" bullet of services/threads.md, and an in-experiment statement to ### The only published formula of services/facebook.md. Added an Instagram Feed row to the Meta table of topics/multi-task-ranking.md, an Instagram sub-bullet under ## Who uses this, and a source.

Why it matters The combination form of Instagram Feed itself was published for the first time, and it adds an "increment beyond the baseline" term to the additive weighted sum verified. Until now, the Instagram combination forms came only from the Suggested Posts, Explore, and notifications posts. The existing statement that the Threads card has 0 information on the combination method was also partly filled in by primary material outside the card verified.

↑ Contents

2A filter that shrinks every source by the same ratio when candidates overflow — X

Source xai-org/x-algorithm@7f2ca2b — xAI public repository, commit of 2026-10-21 00:52 UTC, code. In these notes' numbering, this is Gen4+46. Gen4+N is the number these notes assign in order to X commits after the Gen4 release (2026-08-13). The cron mirror (a file that syncs and publishes production config defaults daily) has a sync time of 2026-10-20T16:00:34Z, and none of the existing mirror values changed.

Background X For You concatenates candidates from several sources such as Thunder (the in-network latest-post index), Phoenix retrieval (X's Transformer-based candidate search), and SimClusters, then scores them with the Phoenix ranker. The scoring request sends at most 2800 candidates, so when the concatenated list is longer, candidates from later sources are cut first. This commit adds a filter that changes this cutting to per-source proportional allocation, and a path that passes weights to retrieval, both off by default.

What we learnedA. The proportional-allocation filter keeps the same fraction of candidates per source and is off by default

  • The new filter groups candidates by served type (the source path a candidate came in through) and, when the total exceeds the budget, sets the number to keep in proportion to group size verified — home-mixer/filters/fair_share_ranking_filter.rs.
    • Division remainders are given out one at a time in descending order (largest remainder). Within a group, the first N in the current order are kept.
    • The budget is PhoenixScoresResultSize=2800 — params/param.rs:1189-1193.
    • A test pins that reducing in-network 440, SimClusters 220, and Phoenix retrieval 440 candidates (total 1100) to a budget of 1000 leaves (400, 200, 400).
  • The switch EnableFairShareRanking is off by default (false) verified — params/param.rs:1194-1199.
    • Even when on, it does not act if the request is for cached posts or the Phoenix ranker kill switch is on.
    • It was placed at the very end of the pre-scoring filter list, right after FavHoldoutFilter — phoenix_candidate_pipeline.rs:437. It was also added to the score-only pipeline.
  • While it is off, the Phoenix request currently sends only the first 2800 of the list verified — util/phoenix_request.rs:20, 192. With the filter on, the later sources in the list are likely no longer all cut; instead each source is cut by the same ratio inferred. The evidence is that the budget equals this 2800 and a test is named "drops_the_same_fraction_of_each_served_type".
let product = count as u128 * budget_u;
let keep = (product / total) as usize;
remainders.sort_by(|left, right| right.0.cmp(&left.0).then(left.1.cmp(&right.1)));

What we learnedB. The retrieval request can now carry value model weights, but none are sent currently

  • The Phoenix retrieval request proto gained a per-name weight map field, and home-mixer parses a parameter value to fill it verified — sources/phoenix_source.rs:137-138.
    • The field is RetrieveTopKCandidatesRequest.value_model_weights = 17 — recsys.proto:298.
    • The parameter RetrievalValueModelWeights is a JSON object string whose default is an empty string — params/param.rs:281-286. If it is empty or malformed, nothing is sent.
  • This commit has no code where the retrieval server reads this field verified. Because two-tower (a retrieval model that embeds user and post separately) has had multiple heads since the 2026-10-13 commit (Gen4+40), we infer this is preparation for varying head weights per request inferred. The evidence is that the field name matches the ranker's value model.

What we learnedOther changes

  • Added a side effect (a stage that leaves only logs without changing the response) that records the position and score of carousel videos to Kafka in responses where the carousel was actually served. The switch is off by default verified — video_carousel_candidates_kafka_side_effect.rs.
    • The switch is EnableVideoCarouselCandidatesLogging=false (param.rs:1150-1155), and the carousel itself is off by default.
  • The topic novelty measurement introduced in the 2026-10-20 commit now also measures the share of posts in languages the viewer does not use. It is still off because the history topic switch is false by default verified — serendipity_stats_side_effect.rs:19, 145-176.
    • The viewer's languages are those that make up at least 5% of engagement history (MIN_USER_LANGUAGE_SHARE = 0.05) plus the app language. The new metrics are CrossLanguageShare, CrossLanguageShareTop10, and others.
  • The candidate-packing option name in Phoenix training was renamed and is turned on only in the H100 preset, and the candidate-region attention kernel also supports SM100 (the GB200/GB300 GPU generation). The model structure and loss are unchanged verified — configs/xrecsys.py:463-474.
  • VF (visibility-filtering, a service that decides whether each post can be shown) verdicts now carry the rule ID directly, and an account-level verdict path was added as code not yet in use verified — models/verdict.rs:37.
    • If the author-relationship lookup of a quoted post fails, both user rules and post rules now read that value as "unknown" — rules/engine.rs:427-440, 628. We infer the visible result is the same because the default is false inferred.
  • The backfill limit of abuse-enforcement-service moved from GrowthBook to a stored config record, and the rate is 0 until someone sets it verified — service-lib/src/backfill.rs:112-117. It is unrelated to feed ranking.

Canon update In services/x.md, changed the reference commit in ## Summary to 7f2ca2b and the pre-scoring filter count to 21. Updated the filter counts (26, 21) in the ## Re-ranking, diversity, and filters intro and added FairShareRankingFilter to the reference commit and list of the filter section, with an explanatory bullet. Added a logging bullet and the off-by-default reference commit to the carousel item in the feed surface section, a retrieval weight bullet to the candidate generation section, a language measurement bullet to ### Diversity, and served type and side effect rows to the ## Glossary table. Added a Gen4+46 row to the two commit tables in ## Sources and to the change log summary table; also fixed the filter counts (21 pre-scoring, 5 post-selection) in assets/x-pipeline.svg.

Why it matters This commit also did not change default behavior verified. The evidence is that the existing mirror values are unchanged and all three new switches are off. We read the proportional-allocation filter as a sign that X recognized the problem that cutting to the first 2800 disadvantages later sources as sources grow inferred.

↑ Contents

3A distillation selector shrinks a 100,000-length history and raises app usage time — Kuaishou

Background A user's lifetime behavior history can exceed 100,000 entries, and applying attention over the whole history for every candidate is too costly. Existing solutions either retrieve only the records related to the candidate (the TWIN family) or compress the history into latent vectors. The paper reports deploying to production a midpoint between the two, distilling a per-user selector that keeps part of the raw records into a full-history teacher.

What we learnedA. App usage time rose further on top of a production system that already uses long-sequence retrieval

  • A 7-day A/B (5% of traffic) on Kuaishou's largest short-video surface recorded total app usage time +0.613% and per-user app usage time +0.640% verified — HTML version §4.6.
    • It states that this surface has more than 400 million DAU and more than 50 billion interaction logs per day.
  • The baseline system being compared already uses TWIN-family retrieval and sequence compression verified — same section.
  • It states that it cut online sequence-branch FLOPs by about 160× relative to a representative end-to-end model at L=100K verified — abstract.

"Notably, the existing production system already incorporates advanced long-sequence modeling techniques, including TWIN-based behavior retrieval and sequence compression mechanisms similar to C-Former and SequenceO1." — arXiv 2610.28569 (HTML), 2026-10-20

Canon update Not folded into the canon because it is not a tracked service. Added an ECHO entry to ## New this month in radar.md.

Why it matters Competition in long-sequence ranking appears to be shifting from "how long" to "what to re-fetch for each candidate" inferred. The evidence is that this paper's increment came on top of a baseline that already uses long-sequence retrieval.

↑ Contents

Radar

  • ECHO (arXiv 2610.28569): Added Kuaishou's 100,000-length history ranking to ## New this month.
  • SPAR (arXiv 2610.27898): Youku retrieves long-term history matching the prefix at each SID (an ID that represents an item as a sequence of semantic tokens) decoding step and reduces branch skew, gaining watch time +3.95% in a 10% traffic A/B. Attached as additional evidence to the generative retrieval thread (only the abstract was read).

↑ Contents

What to check next

↑ Contents

Lookup status

  • X: There was 1 new commit (7f2ca2b) in xai-org/x-algorithm. Releases were not checked.
  • Meta: The latest post in the engineering.fb.com RSS is dated 2026-10-19 and was already checked in the 2026-10-21 batch. ai.meta.com/blog and transparency.meta.com were not checked this time.
  • Netflix: The latest post in the RSS is dated 2026-10-16 and was already checked. research.netflix.com/publications was not checked.
  • arXiv cs.IR: Parsed 30 entries. The latest submission is 2026-10-20, and 3 passed: the Instagram paper (canon update), ECHO, and SPAR. A paper designing generative retrieval SIDs with LLM evolutionary search was dropped because it has only public benchmarks.
  • WebSearch cross-checking was not done this time.

↑ Contents