Two parts. An anchor holds your long-term taste. A notepad holds short-term corrections from your last 20 events. The final “you” is the anchor after the notepad has adjusted it, and every candidate is scored against it.
83,330Trainable numbers: four small write networks
20Recent events written into the notepad
2 × 64×64Notepads: likes M⁺ and dislikes M⁻
1 · Split the history
Everything before the last 20 events feeds the anchor, and only the likes count there. The last 20 events are written into the notepad, oldest first. Any click is either anchor or notepad, never both.
2 · The anchor
The anchor is the average of the older liked items, each one a frozen 64-number Qwen vector, scaled to length 1. Nothing in it is trained. If there are no older likes, it uses the likes among the last 20. If there are no likes at all, it is zero.
3 · What each event writes: k, c, β
For every event in the window, three small trained networks read the same input: (anchor, item, feedback). Each produces one piece of the write.
4 · One write: fade, check, correct
Both notepads start blank (all zeros) on every request. Each of the 20 events then updates them in three moves: M ← ρ·M + β·(c − M·k)·kᵀ.
5 · Read and score
After the last write, both notepads are applied to the anchor. The likes pad pulls “you” toward recent likes, and the dislikes pad pushes “you” away from recent dislikes. α (0.3 to 1.0) sets how hard dislikes push. Each candidate’s score is its dot product with the final you.
6 · Walk-through: one user, 20 events
A toy user who has been a sport fan (the anchor) and lately keeps liking politics and skipping sport. These charts use the model’s exact update and read equations. The three trained networks are replaced by fixed stand-ins (k = Norm(anchor + 0.9·item), c = item, β = 0.8), so the numbers are illustrative, not measured.
Surprises write big, repeats write small. The first politics like writes 0.80, while later politics likes write about 0.3, because the notepad already knows them. A first film like (C+) is new again, so it writes 0.91.
The ranking moves. With the anchor alone, the sport article leads by 0.62. As politics likes and sport skips are written, politics climbs (0.26 → 0.61) and sport sinks (0.88 → 0.65), and politics leads for much of the window. The single sport like at event 15 swings it back, which is why they finish nearly level.
Hover a bar or point for its value. Toy settings: 16-number vectors, ρ = 0.95, α = 0.5. Generated by experiments/isolated/site_figures/how_it_works_charts.py.
7 · How far back the notepad remembers
Fade alone decides how much of an event’s note survives until read time: ρ raised to the number of later events. This chart is exact, not a toy. The screens picked ρ = 0.9 on Amazon, ML-1M and KuaiRec, so the oldest of the 20 events keeps only about 14%. They picked ρ = 1.0 on MIND-large, EB-NeRD and KuaiRand, so nothing fades and only later corrections overwrite old notes.
Pieces
Piece
What it is
Trained?
Item vectors
Frozen 64-number Qwen3 embeddings
No
Anchor u₀
Average of older liked items
No
Notepads M⁺, M⁻
Two 64×64 matrices, rebuilt from blank on every request
No (working state)
Key, value, two strength networks
Turn (anchor, item, feedback) into k, c, β⁺, β⁻
Yes: 83,330 numbers
ρ, α
Fade rate and dislike push, chosen per dataset on validation
No (screened)
This page describes the locked paper-literal model (experiments/isolated/fwprec_paper_literal/paper_model.py) that produced the FWPRec row of Table 2. The notepad keeps nothing between requests: on the next request the window slides by one, the anchor is recomputed and the notepad is rebuilt. An earlier variant that kept the notepad across visits is a separate run: keep the pad. How the anchor and the notepad move over time is on The idea.