CS224W

Lecture 11 · Tue 10/27 · slides PDF · lecture notes

GNNs for Recommender Systems

Recommendation is link prediction on a user–item bipartite graph; the best models diffuse embeddings along that graph and train them with a personalised ranking loss.

26
sectionstick "got it" as you go
22
figuresredrawn from the slides
interactive figuresplay with the ideas
5
self-check questionsplus flashcards
16′
reading time3,620 words, walkthrough aside

Before you start: review of the earlier sessions

The thread so far. Session 11 is the first industrial-scale application in the course: the link-prediction machinery of sessions 2 and 5 plus the simplified GNN of session 4, on a two-type graph from session 9.

What this session takes from earlier ones

  • Lecture 5: link-prediction setup, message versus supervision edges
  • Lecture 2: the dot-product decoder: the recommender scores user–item pairs with it
  • Lecture 4: the GCN layer that LightGCN strips down
  • Lecture 9: a user–item graph is a two-type heterogeneous graph

Those sessions in one minute each

Lecture 10 · Knowledge Graph Embeddings

A KG embedding turns each relation into a geometric operation; the algebra of that operation (commutative or not, invertible or not, composable or not) decides which logical patterns of relations the model can represent.

\[ \text{TransE: } \mathbf h+\mathbf r\approx\mathbf t\qquad \text{DistMult: } \textstyle\sum_i h_ir_it_i\qquad \text{ComplEx: } \mathrm{Re}\sum_i h_ir_i\bar t_i\qquad \text{RotatE: } \mathbf h\circ e^{i\boldsymbol\theta_r}\approx\mathbf t \]

Lecture 5 · GNN Augmentation and Training

Choose the computation graph deliberately (features, virtual nodes, sampling), pick the head that matches the task level, and split so that information from validation/test can never leak into training through message passing.

\[ \hat y_v=\mathbf{W}^{(H)}\mathbf{h}_v^{(L)},\qquad \hat y_{uv}=\mathbf{h}_u^{(L)\top}\mathbf{h}_v^{(L)},\qquad \hat y_G=\text{Pool}\big(\{\mathbf{h}_v^{(L)}:v\in G\}\big) \]

Lecture 2 · Node Embeddings

Define similarity by co-occurrence on short random walks, then learn one vector per node so that dot products reproduce it — fast with negative sampling, but just a lookup table.

\[ \mathcal{L}=\sum_{u\in V}\sum_{v\in N_R(u)}\Big[-\log\sigma(\mathbf{z}_u^\top\mathbf{z}_v)-\sum_{i=1}^{k}\log\sigma(-\mathbf{z}_u^\top\mathbf{z}_{n_i})\Big] \]

\(N_R(u)\): multiset of nodes visited by walks from \(u\) under strategy \(R\) (uniform for DeepWalk, \(p,q\)-biased for node2vec); \(n_i\): negatives sampled ∝ degree; \(\sigma\): sigmoid.

Lecture 4 · A General Perspective on GNNs

A GNN layer is "message, then order-free aggregation (including yourself)"; architectures differ in how neighbours are weighted, and depth must be matched to the receptive field you need because too many layers smooth everything into one vector.

\[ \alpha_{vu}=\frac{\exp(e_{vu})}{\sum_{k\in N(v)}\exp(e_{vk})},\qquad \mathbf{h}_v^{(l)}=\sigma\Big(\sum_{u\in N(v)}\alpha_{vu}\,\mathbf{W}^{(l)}\mathbf{h}_u^{(l-1)}\Big) \]

GCN is the special case \(\alpha_{vu}=1/|N(v)|\) (fixed); GAT learns \(e_{vu}=a(\mathbf{W}\mathbf{h}_u,\mathbf{W}\mathbf{h}_v)\).

Warm-up: answer these before you read on

What does "1-to-N" mean and which models handle it? from Lecture 10

One head and relation with many true tails (a person's students); TransE collapses all tails to one point, TransR and DistMult can keep them apart.

What is the difference between a transductive and an inductive split? from Lecture 5

Transductive: one graph, all nodes visible, only labels are split. Inductive: separate graphs (or subgraphs) for training and test, so test nodes are never seen.

Give the three limits of shallow embeddings. from Lecture 2

No parameter sharing (one vector per node), no use of node features, and no embedding for nodes unseen at training time (transductive).

Why add MLP layers before and after message passing? from Lecture 4

Pre-processing encodes rich input features (text, images); post-processing lets the model reason over the embedding, e.g. for graph classification, without adding more hops.

More questions from every session you have reached, with spaced repetition: the cumulative review.

In short

Netflix has 10K+ movies, Amazon hundreds of millions of products, Pinterest 200B+ pins. A recommender suggests a small number \(K\) of items per user. Model it as a bipartite graph (users, items, interaction edges with timestamps) and the task becomes link prediction: score \(f(u,v)\) for every user–item pair and recommend the top-\(K\) not yet interacted.

The metric is Recall@K, which isn't differentiable, so we train with a surrogate loss. The binary loss compares all positives against all negatives across users — too strict. BPR (Bayesian Personalized Ranking) only asks that, for each user, positives outrank negatives — matching the personalised metric.

Why embeddings work: collaborative filtering — similar users like similar items, and low-dimensional embeddings are forced to capture that similarity. NGCF runs a GNN over learnable embeddings to capture high-order paths; LightGCN discovers that the GNN's weights and non-linearities are unnecessary: just diffuse embeddings with the normalised adjacency and average the layers — simpler and better. PinSage shows how to do this with rich features at billion scale, using shared and curriculum-hardened negative samples.

The picture: LightGCN in one diagram

LightGCN: diffuse, average, dot product bipartite graph usersitems A = [[0, R], [Rᵀ, 0]] 1 E⁽⁰⁾E⁽¹⁾E⁽ᴷ⁾… ÷ E⁽ᵏ⁺¹⁾ = à E⁽ᵏ⁾ (no W, no ReLU) à = D^(-1/2) A D^(-1/2) 2 E_final mean over k 3 score = z_uᵀ z_v train with BPR 4

How to read it (hover a step)

  1. Users and items form a bipartite graph; its adjacency has the interaction matrix \(R\) in the off-diagonal blocks.
  2. Start from learnable shallow embeddings \(E^{(0)}\) (all the parameters are here). Diffuse: \(E^{(k+1)}=\tilde A E^{(k)}\) — each multiplication spreads embeddings one hop.
  3. Average the layers: \(E_{\text{final}}=\frac{1}{K+1}\sum_k E^{(k)}\) (multi-scale; \(E^{(0)}\) acts as a self-connection).
  4. Score with a dot product; train the shallow embeddings end-to-end with the BPR loss.

1 · The recommendation task and Recall@K

Given past user–item interactions, predict new items each user will interact with — link prediction on the bipartite graph. We need a real-valued score \(f(u,v)\) for \(u\in U, v\in V\).

Scoring every pair is impossible at scale, so production systems use a 2-stage process: candidate generation (cheap: nearest-neighbour search over item embeddings with the user embedding, e.g. \(f(u,v)=z_u\cdot z_v\) → ~1000 candidates) then ranking (slow, accurate model → top-10).

Two-stage recommender: candidates then ranking. slide 8 ↗

Recall@K for user \(u\): \(P_u\) = items the user will interact with in the future (positives), \(R_u\) = the \(K\) recommended items (excluding already-interacted ones). Recall@K \(=|P_u\cap R_u|/|P_u|\), averaged over users. \(K\) is typically 10–100, tiny compared with billions of items.

Recall@K = |P_u ∩ R_u| / |P_u|. slide 11 ↗

The slides also show H&M fashion recommendation: a GNN beats an LLM-based recommender by 2–40× on several metrics (slide 12) — structure matters even in the LLM era.

2 · Embedding models and surrogate losses

An embedding-based model has three kinds of parameters: a user encoder, an item encoder, and a score function \(f_\theta(\mathbf u,\mathbf v)\). Recall@K isn't differentiable, so train on a surrogate.

Binary loss

\[ -\frac{1}{|E|}\sum_{(u,v)\in E}\log\sigma(f_\theta(\mathbf u,\mathbf v))-\frac{1}{|E_{neg}|}\sum_{(u,v)\in E_{neg}}\log\big(1-\sigma(f_\theta(\mathbf u,\mathbf v))\big) \]

It pushes all positive edges above all negative edges — across users. That's non-personalised, while recall is per user: the loss penalises models that already have perfect recall.

Two users, two items. Scores: \((u_0,v_0)=1.0\) ✓, \((u_0,v_1)=-1.0\), \((u_1,v_0)=2.0\), \((u_1,v_1)=4.0\) ✓. Recall@1? Does the binary loss complain?

Recall@1 = 1.0: \(u_0\)'s top item is \(v_0\) and \(u_1\)'s is \(v_1\), both positives. But the binary loss still penalises the model, because the negative \((u_1,v_0)\) with score 2.0 beats the positive \((u_0,v_0)\) with score 1.0. Cross-user comparisons are irrelevant for recommendation — which is why we need a personalised loss.

BPR loss (Rendle et al., 2009)

For each user \(u^*\), compare only that user's positives \(E(u^*)\) with that user's negatives \(E_{neg}(u^*)\):

BPR loss: per-user ranking of positives over negatives. slide 26 ↗
\[ \text{Loss}(u^*)=\frac{1}{|E(u^*)|\,|E_{neg}(u^*)|}\sum_{v_{pos}}\sum_{v_{neg}}-\log\sigma\big(f_\theta(\mathbf u^*,\mathbf v_{pos})-f_\theta(\mathbf u^*,\mathbf v_{neg})\big),\qquad \text{BPR}=\frac{1}{|U|}\sum_{u^*}\text{Loss}(u^*) \]

Mini-batch: sample users; for each, one positive and a set of negatives; average. ("Bayesian" refers to a prior on parameters in the original paper — essentially regularisation — and isn't essential.)

Why embeddings work: collaborative filtering

Recommend items to a user by collecting preferences of similar users; similar users prefer similar items. Low-dimensional embeddings cannot memorise all interactions, so they are forced to capture similarity — which generalises to unseen interactions.

3 · NGCF: make embeddings explicitly graph-aware

Conventional collaborative filtering (matrix factorisation): shallow embeddings, score \(\mathbf z_u^\top\mathbf z_v\). The graph appears only implicitly, through the training objective, and only first-order structure (edges) is used — no multi-hop paths.

NGCF (Wang et al., 2019): use the shallow embeddings as initial features \(\mathbf h^{(0)}\), then a multi-layer GNN along the bipartite graph: \(\mathbf h_v^{(k+1)}=\text{COMBINE}(\mathbf h_v^{(k)},\text{AGGR}(\{\mathbf h_u^{(k)}\}_{u\in N(v)}))\) (e.g. AGGR = mean, COMBINE = ReLU(Linear(Concat))). After \(K\) rounds, score \(\mathbf u^\top\mathbf v\) with the final embeddings. Two parameter sets are learned jointly: shallow embeddings and GNN weights.

NGCF: propagate shallow embeddings with a GNN. slide 36 ↗

4 · LightGCN: simpler and better

Observation: with \(N\gg D\), almost all parameters are in the shallow embeddings (\(O(ND)\)) versus the GNN (\(O(D^2)\)). Maybe the GNN weights aren't essential. Simplify:

  1. Bipartite adjacency \(A=\begin{pmatrix}0&R\\R^\top&0\end{pmatrix}\); normalised \(\tilde A=D^{-1/2}AD^{-1/2}\) (no self-loop, unlike GCN).
  2. A GCN layer is \(E^{(k+1)}=\text{ReLU}(\tilde AE^{(k)}W^{(k)})\). Remove ReLU (idea from SGC, Wu et al. 2019): \(E^{(K)}=\tilde A^K E\,W^{(0)}\cdots W^{(K-1)}=\tilde A^KEW\).
  3. Removing ReLU collapses the GCN to Ãᴷ E W. slide 47 ↗
  4. The \(W\) can be absorbed into the learnable \(E\) — drop it. Algorithm: apply \(E\leftarrow\tilde AE\) \(K\) times (never materialise the dense \(\tilde A^K\)).
  5. Multi-scale: \(E_{\text{final}}=\sum_k\alpha_kE^{(k)}\) with \(\alpha_k=\frac{1}{K+1}\).
  6. Average embeddings across scales. slide 52 ↗

Why does plain diffusion work? It directly makes similar users/items similar: users who share many items get averaged with the same neighbours. Compared with GCN, LightGCN uses the same \(1/\sqrt{d_ud_v}\) weights but no self-loop and averages layers. Compared with matrix factorisation, both learn one embedding per node, but LightGCN scores with diffused embeddings — better accuracy, more compute.

5 · PinSage: GNN recommendations at Pinterest scale

PinSage (Ying et al., 2018): the largest industrial GCN deployment at the time. It unifies visual, textual and graph information and embeds fresh pins seconds after creation. Graph: pins and boards, at the scale of billions of nodes and tens of billions of edges (the paper reports 3 billion nodes and 18 billion edges). Key idea: borrow information from nearby nodes — a bed rail pin may look like a garden fence, but gates and beds are rarely adjacent in the graph.

Task: related-pin recommendation — learn \(z_i\) with \(d(z_{cake1},z_{cake2})<d(z_{cake1},z_{sweater})\). Training data: 1+ billion repin pairs. Scaling tricks:

  • Shared negative samples across all users in a mini-batch: only \(|V_{neg}|\) negative embeddings instead of \(|U_{mini}|\cdot|V_{neg}|\) — a \(|U_{mini}|\)-fold saving with similar accuracy.
  • Hard negatives: random negatives are too easy when choosing 10 out of billions. Hard negatives = items close but not connected to the user: run random walk with restart from \(u\), rank by visit count, sample from ranks ~2000–5000.
  • Easy vs hard negatives; hard negatives from random walk with restart. slide 70 ↗
  • Curriculum learning: at epoch \(n\), add \(n-1\) hard negatives — negatives get gradually harder.
  • Mini-batch training of GNNs on huge graphs (neighbour sampling, producer–consumer pipelines).

The mathematics, step by step

A recommender is link prediction on a bipartite graph of users and items, judged per user by what appears in the top \(K\). The formulas answer three questions in turn: what is measured, what is optimised instead (because the measure has no gradient), and how the graph enters the embeddings.

Symbols used in this session

symbolmeaningwhat kind of object
\(u,\ v\)a user; an itemnodes of the two sides of the bipartite graph
\(P_u\)the items user \(u\) will actually interact with (held-out positives)set of items
\(R_u\)the \(K\) items recommended to \(u\)set of \(K\) items
\(f_\theta(\mathbf u,\mathbf v)\)score of the pair; in this lecture the dot product \(\mathbf z_u^\top\mathbf z_v\)real number
\(E,\ E_{neg}\)observed user–item edges; sampled non-edgessets of pairs
\(\mathbf e_u^{(k)},\ \mathbf e_i^{(k)}\)embedding of user \(u\) / item \(i\) after \(k\) propagation steps; \(k=0\) is the learned tablevectors
\(d_u,\ d_i\)degree: number of items of the user, number of users of the itemwhole numbers
\(\tilde A\)normalised adjacency matrix \(D^{-1/2}AD^{-1/2}\) of the user–item graphsymmetric matrix
\(\sigma\)sigmoid, \(\sigma(x)=1/(1+e^{-x})\)function

1Recall@K

\[ \text{Recall@}K=\frac{1}{|U|}\sum_{u\in U}\frac{|P_u\cap R_u|}{|P_u|} \]

In words. For each user: of the items they really went on to interact with, what share is in the list of \(K\) recommendations? Average over users.

Why it has this form. Only the top \(K\) is shown to a user, so only membership in that list matters, not the exact scores. Dividing by \(|P_u|\) makes a user with 3 future items and one with 300 count equally. The quantity changes only when an item crosses the boundary of the top \(K\): it is piecewise constant in the model's parameters, its gradient is zero almost everywhere, and it cannot be trained on directly.

With numbers. A user has 4 held-out items. The top-10 list contains 3 of them: Recall@10 \(=3/4=0.75\). A second user has 2 held-out items and none is in the list: \(0\). Average over the two users: \(0.375\).

Watch out. Recall@K rises with \(K\) by construction, and it ignores the order inside the top \(K\); NDCG@K is the companion metric that rewards putting hits near the top.

2Two surrogate losses: binary and BPR

\[ \mathcal L_{\text{bin}}=-\frac{1}{|E|}\sum_{(u,v)\in E}\log\sigma(f_\theta(\mathbf u,\mathbf v))-\frac{1}{|E_{neg}|}\sum_{(u,v)\in E_{neg}}\log\big(1-\sigma(f_\theta(\mathbf u,\mathbf v))\big),\qquad \mathcal L_{\text{BPR}}=-\log\sigma\big(f_\theta(\mathbf u,\mathbf v_{pos})-f_\theta(\mathbf u,\mathbf v_{neg})\big) \]

In words. Binary loss: push the scores of all observed pairs up and of all sampled non-pairs down, on one common scale. BPR: for one user, the score of an item they chose should exceed the score of an item they did not, and only the difference matters.

Why it has this form. The binary loss compares scores across users: it penalises user A's positive for scoring below user B's negative, although the two never appear in the same list. Recall@K is computed per user, so that effort is wasted. BPR looks at one user at a time. \(\sigma\) of the difference is the model's probability that the positive is ranked above the negative; minus its logarithm is small when the order is right by a wide margin. Averaging over a user's positive–negative pairs and then over users gives the full BPR loss.

With numbers. User scores: positive item \(2.0\), negative item \(0.5\). Difference \(1.5\), \(\sigma(1.5)=0.818\), loss \(-\log0.818=0.20\). If the scores were the other way round: \(\sigma(-1.5)=0.182\), loss \(1.70\). Adding 100 to all of this user's scores changes nothing in BPR; in the binary loss it would make the negative look terrible.

Watch out. A 'negative' is only an item the user has not interacted with yet. Some of them are exactly the items a good recommender should suggest.

3LightGCN: propagation without weights

\[ \mathbf e_u^{(k+1)}=\sum_{i\in N(u)}\frac{1}{\sqrt{d_u}\sqrt{d_i}}\,\mathbf e_i^{(k)},\qquad E^{(k+1)}=\tilde AE^{(k)},\qquad E_{\text{final}}=\frac{1}{K+1}\sum_{k=0}^{K}\tilde A^kE^{(0)} \]

In words. A user's next embedding is the sum of its items' embeddings, each divided by the square roots of the two degrees; items are updated from their users in the same way. The final embedding is the average over all propagation depths, including depth 0.

Why it has this form. There is no weight matrix and no non-linearity: the only parameters are the starting table \(E^{(0)}\). The reason is that users and items have no input features, only identities, so transforming the embeddings adds nothing a different table could not provide, and it was found to hurt. The normalisation \(1/\sqrt{d_ud_i}\) keeps the scale stable and discounts very popular items. Averaging over depths is a fixed skip connection: depth 0 keeps the node's own identity, depth 1 its direct interactions, depth 2 users with similar taste, and the average resists over-smoothing.

With numbers. Scalar embeddings. User \(u\) has 2 items: item \(a\) (degree 1, \(e_a=2\)) and item \(b\) (degree 4, \(e_b=4\)). \(e_u^{(1)}=\frac{2}{\sqrt2\sqrt1}+\frac{4}{\sqrt2\sqrt4}=1.41+1.41=2.83\). The popular item \(b\) has twice the embedding of \(a\) but contributes the same, because of its degree. If \(e_u^{(0)}=1\) and \(K=1\), \(e_u^{\text{final}}=(1+2.83)/2=1.91\).

Watch out. The score \(\mathbf z_u^\top\mathbf z_v\) uses the final, averaged embeddings; gradients flow through the fixed matrix powers back to \(E^{(0)}\), so the table is trained with the graph already built in.

4What NGCF had, and what LightGCN removed

\[ \text{NGCF: }\ \mathbf e_u^{(k+1)}=\text{LeakyReLU}\Big(W_1\mathbf e_u^{(k)}+\sum_{i\in N(u)}\frac{W_1\mathbf e_i^{(k)}+W_2\big(\mathbf e_i^{(k)}\odot\mathbf e_u^{(k)}\big)}{\sqrt{d_ud_i}}\Big) \]

In words. NGCF's layer is LightGCN's sum with three additions: a weight matrix on every message, an extra term that multiplies the item's and the user's embeddings coordinate by coordinate, and a non-linearity.

Why it has this form. Set \(W_1=I\), \(W_2=0\), drop the self term and the LeakyReLU, and the formula becomes card 3. LightGCN's authors removed these parts one at a time and the recommendation quality went up each time. With free embeddings as the only input, the matrices and the non-linearity mostly make optimisation harder. This is a statement about recommendation with ID embeddings, not about GNNs with real node features.

With numbers. Count parameters for 10,000 users, 5,000 items, dimension 64, three layers. Embedding table: \(15{,}000\cdot64=960{,}000\) in both models. NGCF adds \(3\cdot2\cdot64^2=24{,}576\) weights; LightGCN adds none.

Watch out. The simplification is not free in every setting: when items have rich features (text, images), as in PinSage, transformations of those features are needed again.

Check yourself

Questions from the lecture, in order. Answer each one in your head (or on paper) before you open it. If one stumps you, follow the link to the walkthrough block it comes from.

Check yourself: a user will buy items \(\{a,b,c,d\}\) and you recommend \(\{a,x,c\}\) with \(K=3\). Recall@3 = 2/4 = 0.5. Why is recall, not precision, the natural choice here? show answer

Because \(K\) is fixed and small, while \(|P_u|\) varies; recall asks "how much of what the user wants did we catch?"

from Top-K recommendation and Recall@K

Check yourself: in matrix factorisation, two users who never share an item can still get similar embeddings. How? show answer

Through a chain: \(u_1\) shares items with \(u_2\), \(u_2\) shares items with \(u_3\). The loss sees only edges, so this multi-hop effect emerges slowly and indirectly through optimisation; a GNN builds it into the forward pass.

from Limits of shallow collaborative filtering

Check yourself: with \(K=0\), what is LightGCN? show answer

Plain matrix factorisation. With \(K=1\), the user embedding is \(\frac12(\mathbf e_u+\sum_{v\in N(u)}\mathbf e_v/\sqrt{d_ud_v})\): the user's own vector blended with a degree-normalised sum of its items.

from LightGCN: the model, intuition and comparisons

Lecture walkthrough reference · slide by slide · opens on demand

The whole lecture in order, grouped by topic. Every drawing on the slides is redrawn here as a clean figure (click the step buttons where a figure has them), the heading of each block links to the matching pages of the official PDF, and the Review section after the walkthrough ties this session to the earlier ones. Read this and you do not need the deck.

  1. Recommendation as link prediction on a bipartite graph
  2. Top-K recommendation and Recall@K
  3. Embedding-based models: notation, score, parameters
  4. Surrogate losses and the binary loss
  5. Why the binary loss is too strict
  6. Bayesian Personalized Ranking (BPR) loss
  7. Why embeddings work: collaborative filtering
  8. Limits of shallow collaborative filtering
  9. Neural Graph Collaborative Filtering (NGCF)
  10. LightGCN: from GCN to linear diffusion
  11. LightGCN: the model, intuition and comparisons
  12. PinSAGE: graph embeddings at Pinterest
  13. PinSAGE training: task, data and shared negatives
  14. Hard negatives and curriculum learning
  15. PinSAGE results and summary

Recommendation as link prediction on a bipartite graph slides 5-8 ↗

Slides 6–8: recommendation is link prediction on a user–item bipartite graph, served in two stages because scoring every pair is impossible. slides 6-8 ↗

Slide 5 motivates the topic with the information explosion of the Internet era: 10K+ movies on Netflix, 12M products on Amazon (350M on Marketplace), 70M+ music tracks on Spotify, 10B+ videos on YouTube, 200B+ pins (images) on Pinterest. No user can browse this. Personalized recommendation, which means suggesting a small number of interesting items to each user, is what lets users find the content they care about.

Slide 6: a recommender system is naturally a bipartite graph.

  • Two node types: users and items.
  • Edges connect users and items only. An edge means a user–item interaction (click, purchase, review, …).
  • Edges often carry a timestamp (when the interaction happened).

Slide 7 states the task. Given the past user–item interactions, predict the new items each user will interact with in the future. This is a link prediction problem: predict new user–item edges from the past edges (the figure shows a bipartite graph with dashed "?" edges from one user). Concretely, for \(u\in U\) and \(v\in V\) we need a real-valued score \(f(u,v)\).

Slide 8 raises a practical problem: we cannot evaluate \(f(u,v)\) for every user–item pair (millions of users times millions of items). The solution is a 2-stage process:

  1. Candidate generation (cheap, fast). The user embedding is sent to a nearest-neighbour (NN) search engine over the embeddings of millions of items, which returns about 1000 candidate items. An example score here is \(f(u,v)=z_u\cdot z_v\).
  2. Ranking (slow, accurate). Score and rank only the candidates with \(f(u,v)\) and return the top-10 items as recommendations.

The diagram on slide 8 shows exactly this pipeline: user embedding → NN engine → candidate items → scoring box → top-10.

Why the dot product is useful in stage 1: maximum inner-product search can be done approximately in sub-linear time with index structures, so the dot product is chosen for its speed as much as for its accuracy. This lecture focuses on how to learn good embeddings.

Top-K recommendation and Recall@K slides 9-12 ↗

Slides 9–12: the top-K list and Recall@K, the metric the whole lecture optimises for. slides 9-12 ↗

Slide 9: for each user we recommend \(K\) items. To be useful, \(K\) must be much smaller than the total number of items (up to billions); typically \(K\) is 10–100. The goal is to include as many positive items as possible in the top-\(K\) list, where positive items are the items the user will interact with in the future. The evaluation metric is Recall@K.

Slide 10 sets the notation for one user \(u\):

  • \(P_u\): the set of positive items (future interactions).
  • \(R_u\): the set of items recommended by the model. In top-\(K\) recommendation, \(|R_u|=K\).
  • Items the user has already interacted with are excluded from \(R_u\).

Slide 11 defines the metric (the Venn diagram shows \(P_u\), \(R_u\) and their overlap):

\[ \text{Recall@}K(u)=\frac{|P_u\cap R_u|}{|P_u|}. \]

A higher value means more of the user's future items made it into the top \(K\). The final Recall@K is the average over all users.

Check yourself: a user will buy items \(\{a,b,c,d\}\) and you recommend \(\{a,x,c\}\) with \(K=3\). Recall@3 = 2/4 = 0.5. Why is recall, not precision, the natural choice here? show answer

Because \(K\) is fixed and small, while \(|P_u|\) varies; recall asks "how much of what the user wants did we catch?"

Slide 12, "Recommendations with LLMs?", compares two ways to build the embeddings in the same NN-engine pipeline:

  • GNN: embed users and products with a GNN on the interaction graph.
  • LLM: turn each product into text ("textify") and embed it with an LLM; the user embedding is the average of the embeddings of the purchased products.

The table is for H&M fashion recommendation:

  • MAP@12: LLM 0.00190, GNN 0.02856 (about 15× better).
  • Precision@12: LLM 0.00329, GNN 0.01023 (about 3×).
  • Recall@12: LLM 0.00119, GNN 0.05234 (about 40×).
  • F1@12: LLM 0.0071, GNN 0.01564 (about 2×).

The lesson: knowing what a product is (text) is much weaker than knowing who bought it together with what (graph). The link points to the article "Do Large Language Models make accurate personalized recommendations?".

Embedding-based models: notation, score, parameters slides 14-17 ↗

Slides 15–17: every user–item pair gets a scalar score, the top K unseen items are recommended, and an embedding model has three kinds of parameters. slides 15-17 ↗

Slide 14 fixes notation: \(U\) is the set of all users, \(V\) the set of all items, and \(E=\{(u,v)\mid u\in U, v\in V, u \text{ interacted with } v\}\) the set of observed interactions.

Slide 15: to get the top-\(K\) items we need a real-valued scalar score(u, v) for every user–item pair. The \(K\) items with the largest scores for user \(u\), excluding already-interacted items, are recommended. The figure shows user \(u\) with scores to items \(v_0,\dots,v_5\): \(\text{score}(u,v_0)=2.0\), \(v_1\): 3.0, \(v_2\): −2.3, \(v_3\): 4.0, \(v_4\): 0.7, and \(v_5\) is an already-interacted item (no score needed). For \(K=2\) the recommended items are the two highest, \(\{v_1,v_3\}\). The rule: rank by score, skip already-interacted items, take the top \(K\).

Slide 16 introduces embedding-based models:

  • Each user \(u\in U\) has a \(D\)-dimensional embedding \(\mathbf u\in\mathbb R^D\).
  • Each item \(v\in V\) has a \(D\)-dimensional embedding \(\mathbf v\in\mathbb R^D\).
  • A parametrized function \(f_\theta(\cdot,\cdot):\mathbb R^D\times\mathbb R^D\to\mathbb R\) scores a pair: \(\text{score}(u,v)\equiv f_\theta(\mathbf u,\mathbf v)\).

Slide 17: so an embedding-based model has three kinds of parameters:

  1. an encoder that produces user embeddings \(\{\mathbf u\}_{u\in U}\);
  2. an encoder that produces item embeddings \(\{\mathbf v\}_{v\in V}\);
  3. the score function \(f_\theta(\cdot,\cdot)\).

Training objective: optimise the parameters to achieve high Recall@K on seen (training) interactions, hoping that this gives high Recall@K on unseen (test) interactions. This is the usual generalisation bet of machine learning.

Surrogate losses and the binary loss slides 18-20 ↗

Slides 19–22: the binary loss and the two-user example where training recall is perfect yet the loss is not satisfied. slides 19-22 ↗

Slide 18: Recall@K is not differentiable (it depends on a sorted top-\(K\) list, which changes in jumps as the scores move). So we cannot use efficient gradient-based optimisation on it directly. Two surrogate loss functions are widely used instead:

  • the binary loss;
  • the Bayesian Personalized Ranking (BPR) loss.

A good surrogate must be differentiable and align well with the original objective.

Slide 19 defines the ingredients. Positive edges are the observed training interactions \(E\). Negative edges are all other user–item pairs:

\[ E_{\text{neg}}=\{(u,v)\mid (u,v)\notin E,\ u\in U,\ v\in V\}. \]

The sigmoid \(\sigma(x)=\frac{1}{1+\exp(-x)}\) maps a real score to a likelihood in \([0,1]\) (the small plot shows the S-shaped curve).

Slide 20, the binary loss: binary classification of positive vs negative edges using \(\sigma(f_\theta(\mathbf u,\mathbf v))\):

\[ -\frac{1}{|E|}\sum_{(u,v)\in E}\log\sigma\big(f_\theta(\mathbf u,\mathbf v)\big)\;-\;\frac{1}{|E_{\text{neg}}|}\sum_{(u,v)\in E_{\text{neg}}}\log\Big(1-\sigma\big(f_\theta(\mathbf u,\mathbf v)\big)\Big). \]

During training, both sums are approximated with mini-batches of positive and negative edges (\(E_{\text{neg}}\) is far too large to enumerate). The binary loss pushes scores of positive edges up and scores of negative edges down. This matches the recall metric in spirit: positive edges must be recalled.

Why the binary loss is too strict slides 21-24 ↗

Slide 22: no single threshold separates all positives from all negatives, although each user is ranked correctly. slide 22 ↗

Slide 21 states the issue: in the binary loss, the scores of ALL positive edges are pushed higher than those of ALL negative edges. This can penalise the model even when the training recall is already perfect.

Slide 22 gives the smallest example: two users \(u_0,u_1\), two items \(v_0,v_1\), metric Recall@1. The model's scores (figure):

  • \((u_0,v_0)=1.0\), positive edge; \((u_0,v_1)=-1.0\), negative.
  • \((u_1,v_0)=2.0\), negative; \((u_1,v_1)=4.0\), positive edge.

Training Recall@1 is 1.0: \(v_0\) is correctly recommended to \(u_0\) and \(v_1\) to \(u_1\). But the binary loss still penalises the model, because the negative edge \((u_1,v_0)\) (score 2.0) has a higher score than the positive edge \((u_0,v_0)\) (score 1.0). The binary loss wants a single global threshold separating all positives from all negatives; no such threshold exists here, even though each user's ranking is perfect.

Slide 23, key insight: the binary loss is non-personalized: it considers positive and negative edges across all users at once. The recall metric is personalized: it is defined per user. So the binary loss is overly stringent for the metric we care about.

Slide 24, lesson learned: the surrogate loss should be personalized. For each user, positive items should score higher than that user's negative items; we do not care about the order of scores across users. The figure redraws the example with "observed" and "unobserved" interactions. The BPR loss does exactly this.

Check yourself: compute the binary-loss term of the negative edge \((u_1,v_0)\): \(-\log(1-\sigma(2))\approx 2.13\). It is the largest term in the loss, and it concerns a comparison that never affects any user's top-1 list.

Bayesian Personalized Ranking (BPR) loss slides 25-27 ↗

Slides 25–27: Bayesian Personalized Ranking compares positives and negatives rooted at the same user, matching the per-user nature of recall. slides 25-27 ↗

Slide 25: BPR is a personalized surrogate loss that aligns better with Recall@K. For each user \(u^*\in U\), define the rooted positive and negative edges:

\[ E(u^*)\equiv\{(u^*,v)\mid (u^*,v)\in E\},\qquad E_{\text{neg}}(u^*)\equiv\{(u^*,v)\mid (u^*,v)\in E_{\text{neg}}\}. \]

The figure shows one user \(u^*\) with a few positive (solid) and many negative (dashed) edges to items. A note on the slide: the word "Bayesian" is not essential. The original paper [Rendle et al. 2009] puts a Bayesian prior on the parameters, which acts as parameter regularisation; the lecture omits it.

Slide 26: for each user \(u^*\), we want the scores of rooted positive edges to be higher than those of rooted negative edges. The loss for one user is

\[ \text{Loss}(u^*)=\frac{1}{|E(u^*)|\cdot|E_{\text{neg}}(u^*)|}\sum_{(u^*,v_{\text{pos}})\in E(u^*)}\ \sum_{(u^*,v_{\text{neg}})\in E_{\text{neg}}(u^*)} -\log\sigma\Big(f_\theta(\mathbf u^*,\mathbf v_{\text{pos}})-f_\theta(\mathbf u^*,\mathbf v_{\text{neg}})\Big). \]

The difference inside \(\sigma\) is "encouraged to be positive", i.e. the positive edge score should exceed the negative edge score for the same user. The final BPR loss averages over users: \(\frac{1}{|U|}\sum_{u^*\in U}\text{Loss}(u^*)\). It can be approximated with a mini-batch.

Slide 27, mini-batch training:

  1. Sample a subset of users \(U_{\text{mini}}\subset U\).
  2. For each \(u^*\in U_{\text{mini}}\), sample one positive item \(v_{\text{pos}}\) and a set of sampled negative items \(V_{\text{neg}}=\{v_{\text{neg}}\}\).
  3. Compute
\[ \frac{1}{|U_{\text{mini}}|}\sum_{u^*\in U_{\text{mini}}}\frac{1}{|V_{\text{neg}}|}\sum_{v_{\text{neg}}\in V_{\text{neg}}}-\log\sigma\Big(f_\theta(\mathbf u^*,\mathbf v_{\text{pos}})-f_\theta(\mathbf u^*,\mathbf v_{\text{neg}})\Big). \]

Intuition: \(-\log\sigma(x)\) is a smooth version of "penalise if \(x\lt 0\)". Each term is a small pairwise ranking problem inside one user's list. Back to the slide-22 example: for \(u_0\), \(-\log\sigma(1-(-1))=-\log\sigma(2)\approx0.13\); for \(u_1\), \(-\log\sigma(4-2)\approx0.13\). Both small, and the cross-user pair \((u_1,v_0)\) vs \((u_0,v_0)\) never appears.

Why embeddings work: collaborative filtering slides 28-31 ↗

Slides 29–31: collaborative filtering, and why a bottleneck in the embedding dimension makes it work. slides 29-31 ↗

Slide 28 summarises so far: Recall@K as the metric; embedding-based models with three kinds of parameters (user encoder, item encoder, score function); surrogate losses to reach high recall. Embedding-based models are state of the art in recommender systems. Why do they work so well?

Slide 29: the underlying idea is collaborative filtering. Recommend items to a user by collecting the preferences of many other similar users; similar users tend to prefer similar items. The figure: users \(u\) and \(u'\) share several items (they are "similar users"); an item that \(u'\) interacted with but \(u\) did not becomes a "likely edge" for \(u\). The key question is how to capture similarity between users and items.

Slide 30: embedding-based models capture this similarity automatically.

  • Low-dimensional embeddings cannot simply memorize all user–item interaction data.
  • So, to fit the data, the embeddings are forced to capture similarity between users and items.
  • This lets the model predict unseen interactions well.

Think of the interaction matrix \(R\in\{0,1\}^{|U|\times|V|}\). A score \(\mathbf u^\top\mathbf v\) with \(D\)-dimensional vectors is a rank-\(D\) approximation of \(R\). Low rank is a compression; compression forces sharing; sharing is similarity.

Slide 31 lays out the rest of the lecture:

  • (1) Neural Graph Collaborative Filtering (NGCF) [Wang et al. 2019] and (2) LightGCN [He et al. 2020]: improve conventional collaborative filtering (shallow encoders) by explicitly modelling graph structure with GNNs. They assume no user/item features.
  • PinSAGE [Ying et al. 2018]: uses GNNs to produce high-quality embeddings that capture both rich node attributes (e.g., images) and graph structure.

Limits of shallow collaborative filtering slides 33-35 ↗

Slides 33–35: conventional collaborative filtering is a shallow encoder with the graph only implicit. slides 33-35 ↗

Slide 33: conventional collaborative filtering uses shallow encoders.

  • No user or item features.
  • For every \(u\in U\) and \(v\in V\), a shallow learnable embedding \(\mathbf u,\mathbf v\in\mathbb R^D\) (one free vector per node, as in Lecture 3).
  • Score function \(f_\theta(\mathbf u,\mathbf v)\equiv\mathbf z_u^\top\mathbf z_v\).

This is classic matrix factorization.

Slide 34, its limitations:

  • The model itself does not explicitly capture graph structure. The graph appears only implicitly, through which pairs are positives in the training objective.
  • Only first-order structure (the edges themselves) enters the objective. High-order structure, such as \(K\)-hop paths between two nodes, is not explicitly captured.

Slide 35: we want a model that (a) captures graph structure explicitly, not only through the loss, and (b) captures high-order structure beyond single edges. GNNs do both. Two models follow: NGCF [Wang et al. 2019] and LightGCN [He et al. 2020], a simplified and improved version of NGCF.

Check yourself: in matrix factorisation, two users who never share an item can still get similar embeddings. How? show answer

Through a chain: \(u_1\) shares items with \(u_2\), \(u_2\) shares items with \(u_3\). The loss sees only edges, so this multi-hop effect emerges slowly and indirectly through optimisation; a GNN builds it into the forward pass.

Neural Graph Collaborative Filtering (NGCF) slides 36-41 ↗

Slides 36–41, Neural Graph Collaborative Filtering: shallow embeddings become input features of a GNN on the bipartite graph. slides 36-41 ↗

Slide 36: NGCF explicitly uses high-order graph structure when it produces user and item embeddings. Key idea: use a GNN to produce graph-aware embeddings. The three-panel figure: initial shallow embeddings on the bipartite graph → a GNN propagates embeddings along the edges → NGCF's graph-aware embeddings.

Slide 37, the framework. Given the user–item bipartite graph:

  1. Prepare a shallow learnable embedding for each node.
  2. Use a multi-layer GNN to propagate embeddings along the bipartite graph. This captures high-order structure.
  3. The final embeddings are explicitly graph-aware.

Two kinds of parameters are learned jointly: the shallow user/item embeddings, and the GNN's parameters.

Slide 38, initial node embeddings: for every user \(u\), set \(\mathbf h_u^{(0)}\) to the user's shallow embedding; for every item \(v\), set \(\mathbf h_v^{(0)}\) to the item's shallow embedding. The learnable embeddings play the role of node features (there are no real features).

Slide 39, neighbor aggregation, done iteratively:

\[ \mathbf h_v^{(k+1)}=\text{COMBINE}\Big(\mathbf h_v^{(k)},\ \text{AGGR}\big(\{\mathbf h_u^{(k)}\}_{u\in N(v)}\big)\Big),\qquad \mathbf h_u^{(k+1)}=\text{COMBINE}\Big(\mathbf h_u^{(k)},\ \text{AGGR}\big(\{\mathbf h_v^{(k)}\}_{v\in N(u)}\big)\Big). \]

Items aggregate from their users and users from their items. Iterating captures high-order structure. Many architecture choices are possible; for example \(\text{AGGR}(\cdot)=\text{MEAN}(\cdot)\) and \(\text{COMBINE}(\mathbf x,\mathbf y)=\text{ReLU}(\text{Linear}(\text{Concat}(\mathbf x,\mathbf y)))\). The figure highlights the edges used to update one user (green) and one item (blue).

Slide 40: after \(K\) rounds we have the final embeddings \(\mathbf h_u^{(K)},\mathbf h_v^{(K)}\). Set \(\mathbf u\leftarrow\mathbf h_u^{(K)}\), \(\mathbf v\leftarrow\mathbf h_v^{(K)}\), and score with the inner product \(\text{score}(u,v)=\mathbf u^\top\mathbf v\). Training uses the BPR loss from before.

Slide 41, summary: conventional CF uses shallow embeddings that do not explicitly model graph structure, and its objective does not model high-order structure. NGCF propagates the shallow embeddings with a GNN, so the embeddings are explicitly aware of high-order structure.

Intuition: after 2 layers, a user's embedding contains the items it bought; after 3 layers it also contains the users who bought those items. That 3-hop path user → item → user → item is exactly the collaborative-filtering signal "people like you also bought".

LightGCN: from GCN to linear diffusion slides 43-49 ↗

Slides 43–49: write GCN on the bipartite adjacency in matrix form, remove the non-linearity, and the learnable layers collapse into pure diffusion of the shallow embeddings. slides 43-49 ↗

Slide 43, motivation. NGCF learns shallow embeddings and GNN parameters. Observation: shallow embeddings are already very expressive. They are learned per node, and when \(N\) (number of nodes) \(\gg D\) (embedding dimension), almost all parameters are in them: shallow embeddings are \(O(ND)\), the GNN is \(O(D^2)\). So the GNN parameters may not matter much.

Slide 44: can we simplify NGCF's GNN, for example remove its learnable parameters? Yes, and as a bonus, the simplification improves performance. The plan: adjacency matrix of a bipartite graph → matrix form of GCN → remove the non-linearity (related: SGC for scalable GNNs [Wu et al. 2019]).

Slide 45, the matrices. With interaction matrix \(R\) (\(R_{uv}=1\) if user \(u\) interacts with item \(v\), else 0), the adjacency matrix of the undirected bipartite graph and the shallow embedding matrix are

\[ A=\begin{pmatrix}0 & R\\ R^\top & 0\end{pmatrix},\qquad E=\begin{pmatrix}E_U\\ E_V\end{pmatrix}\ \ (\text{user rows, then item rows}). \]

Slide 46, matrix form of GCN. Let \(D\) be the degree matrix of \(A\) and define the normalised adjacency (the diffusion matrix) \(\tilde A\equiv D^{-1/2}AD^{-1/2}\). Note: unlike the original GCN, the self-connection is omitted. With \(E^{(k)}\) the embedding matrix at layer \(k\) (each row is a node embedding), one GCN layer is

\[ E^{(k+1)}=\text{ReLU}\big(\tilde A E^{(k)}W^{(k)}\big), \]

where \(\tilde AE^{(k)}\) is neighbour aggregation and \(W^{(k)}\) is a learnable linear transformation.

Slide 47, simplify by removing ReLU (idea from SGC): \(E^{(k+1)}=\tilde AE^{(k)}W^{(k)}\). Unrolling,

\[ E^{(K)}=\tilde A E^{(K-1)}W^{(K-1)}=\tilde A\big(\tilde AE^{(K-2)}W^{(K-2)}\big)W^{(K-1)}=\cdots=\tilde A^K E\,W^{(0)}\cdots W^{(K-1)}, \]

with \(E^{(0)}=E\), the input embeddings.

Slide 48: so \(E^{(K)}=\tilde A^K E W\) with \(W\equiv W^{(0)}\cdots W^{(K-1)}\). The \(\tilde A^KE\) part is "diffusing node embeddings along the graph". The algorithm is just: apply \(E\leftarrow\tilde AE\) \(K\) times. Each multiplication spreads the current embeddings to one-hop neighbours. Note: \(\tilde A^K\) is dense and never materialised; we use repeated sparse matrix–matrix products instead.

Slide 49, multi-scale diffusion: \(\alpha_0E^{(0)}+\alpha_1E^{(1)}+\dots+\alpha_KE^{(K)}\) mixes embeddings diffused over different numbers of hops. The term \(\alpha_0E^{(0)}=\alpha_0\tilde A^0E^{(0)}\) acts as the self-connection that was dropped from \(\tilde A\). The \(\alpha_k\) are hyperparameters; LightGCN uses uniform weights \(\alpha_k=\frac{1}{K+1}\) for \(k=0,\dots,K\).

Why can \(W\) be dropped? \(E\) is itself a free learnable matrix, so \(EW\) is just another free matrix of the same shape: the product \(W\) adds no expressive power. LightGCN therefore keeps only \(E\).

LightGCN: the model, intuition and comparisons slides 50-57 ↗

Slides 50–57: LightGCN diffuses the embedding matrix K times and averages the scales; all learnable parameters are in the input embeddings. slides 50-57 ↗

Slides 50–53 show LightGCN as a picture of matrices.

  1. Slide 50, given: the adjacency matrix \(A\) (blocks \(0,R;R^\top,0\)) and the initial learnable embedding matrix \(E\) (user rows on top, item rows below). Normalise \(A\) to \(\tilde A\), with self-loops omitted.
  2. Slide 51, diffuse: for \(k=0,\dots,K-1\), \(E^{(k+1)}\leftarrow\tilde A\cdot E^{(k)}\), with \(E^{(0)}=E\). Because \(\tilde A\) has zero diagonal blocks, one step sends user embeddings to items and item embeddings to users.
  3. Slide 52, average across scales: \(E_{\text{final}}\leftarrow\frac{1}{K+1}\big(E^{(0)}+E^{(1)}+\dots+E^{(K)}\big)\).
  4. Slide 53, score: take user row \(\mathbf z_u\) and item row \(\mathbf z_v\) of \(E_{\text{final}}\) as the embeddings \(\mathbf u,\mathbf v\), and score with \(\mathbf z_u^\top\mathbf z_v\).

Slide 54, intuition. Why does simple diffusion work so well? Diffusion directly makes the embeddings of similar users (or items) similar. Similar users share many common neighbours (items), so after diffusion they are averages of largely the same vectors, and they are expected to have similar future preferences.

Slide 55, relation to GCN. GCN's aggregation is

\[ \mathbf h_v^{(k+1)}=\sum_{u\in N(v)}\frac{1}{\sqrt{d_u}\sqrt{d_v}}\,\mathbf h_u^{(k)}, \]

with \(d_u,d_v\) the node degrees and a self-loop added to the neighbourhood. LightGCN uses the same equation except: (1) no self-loop in the neighbourhood; (2) the final embedding is the average over all layers, \(\mathbf h_v=\frac{1}{K+1}\sum_{k=0}^{K}\mathbf h_v^{(k)}\).

Slide 56, LightGCN vs matrix factorisation (shallow encoders). Both learn a unique embedding per user and item. The difference is that LightGCN scores with the diffused embeddings. LightGCN performs better but costs more compute, because of the diffusion step: the final embedding of a node aggregates the embeddings of its multi-hop neighbours.

Slide 57, summary: LightGCN simplifies NGCF by removing the GNN's learnable parameters. All learnable parameters are in the shallow input embeddings. Diffusion uses only matrix–vector multiplication. And the simplification gives better empirical performance than NGCF.

Check yourself: with \(K=0\), what is LightGCN? show answer

Plain matrix factorisation. With \(K=1\), the user embedding is \(\frac12(\mathbf e_u+\sum_{v\in N(u)}\mathbf e_v/\sqrt{d_ud_v})\): the user's own vector blended with a degree-normalised sum of its items.

Why "simpler is better" here: with no real input features, the GNN weights and ReLUs in NGCF have nothing meaningful to transform, and they make optimisation harder. The useful part of the GNN was the propagation, not the learned transformation.

PinSAGE: graph embeddings at Pinterest slides 59-63 ↗

Slides 59–63: Pinterest's pin–board graph; a bed rail pin and a garden fence look alike but are rarely adjacent, so the graph corrects the visual signal. slides 59-63 ↗

Slide 59, the use case: P2P (pin-to-pin) recommendation. The picture shows a fashion pin on the left and, after the arrow, a grid of related pins that should be recommended next to it.

Slide 60, PinSAGE pin embeddings:

  • They unify visual, textual and graph information.
  • PinSAGE was the largest industry deployment of a graph convolutional network.
  • Huge adoption across Pinterest.
  • It works for fresh content: an embedding is available a few seconds after a pin is created (inductive, unlike shallow embeddings).

Reference: "Graph Convolutional Neural Networks for Web-Scale Recommender Systems", Ying et al., 2018.

Slide 61, application at Pinterest. Goal: produce embeddings for nodes in a Pinterest graph with billions of objects. Key idea: borrow information from nearby nodes. Example: a bed rail pin may look like a garden fence (the two photos look alike: dark wrought-iron bars), but gates and beds are rarely adjacent in the graph. So the graph neighbourhood disambiguates what images alone confuse. Pin embeddings feed many tasks: recommendation, classification, ranking; services like "Related Pins", "Search", "Shopping", "Ads".

Slide 62, "Harnessing pins and boards": three pins on top (a jacket, a Hans Wegner chair, a plant photo) are connected by lines to the boards below that contain them ("mid century modern", "Men Style", "Plants", …). Users save pins to boards, and this pin–board membership is the graph.

Slide 63: the graph has tens of billions of nodes and edges. The figure shows the bipartite pins–boards graph and, on the right, the GNN computation graph for one pin: it aggregates from its boards, which aggregate from their pins. Doing this "further resolves" the embeddings across the Pinterest graph.

PinSAGE training: task, data and shared negatives slides 64-68 ↗

Slides 64–68: the PinSAGE task (related pins), its training pairs, and the shared-negative trick that cuts embedding computation by a factor of the batch size. slides 64-68 ↗

Slide 64: beyond the GNN model, PinSAGE introduces methods to scale GNN training to a billion-scale recommender:

  • shared negative samples across users in a mini-batch;
  • hard negative samples;
  • curriculum learning;
  • mini-batch training of GNNs on a large graph (covered in a later lecture).

Slide 65, the task: recommend related pins. Learn node embeddings \(z_i\) such that

\[ d(z_{\text{cake1}},z_{\text{cake2}})\lt d(z_{\text{cake1}},z_{\text{sweater}}). \]

The figure: from a cake source pin, another cake is a successful recommendation and a sweater is a bad one. On the right, two GNN computation trees produce \(z_1\) and \(z_2\), and the loss looks at their distance \(d(z_1,z_2)\).

Slide 66, training data: 1+B (over one billion) repin pairs from the Related Pins surface. They capture semantic relatedness. Goal: embed such pairs as "neighbours" (close). The example positive pairs \((Q,X)\) are pictures that belong together (two dog photos, two decorative items, and so on).

Slide 67 recalls BPR mini-batches: for each user \(u^*\in U_{\text{mini}}\), one positive item and a set of sampled negatives \(V_{\text{neg}}\). More negatives per user improve performance but are expensive:

  • we must generate \(|U_{\text{mini}}|\cdot|V_{\text{neg}}|\) embeddings for negative nodes;
  • we must run \(|U_{\text{mini}}|\cdot|V_{\text{neg}}|\) GNN computation graphs (the figure shows these trees), which is expensive.

Slide 68, key idea: share the same negative set \(V_{\text{neg}}\) across all users in the mini-batch. Then only \(|V_{\text{neg}}|\) negative embeddings are needed, a saving by a factor of \(|U_{\text{mini}}|\). Empirically, performance stays similar to the non-shared scheme.

Intuition: a random negative is "a random item"; it does not need to be specific to a user. Sharing them is like the in-batch negatives used in contrastive learning.

Hard negatives and curriculum learning slides 69-73 ↗

Slides 69–73: hard negatives from random walks with restart, introduced gradually with a curriculum. slides 69-73 ↗

Slide 69, the challenge: industrial recommenders must make extremely fine-grained predictions. There are up to billions of items, and only 10–100 are recommended per user. Shared negatives are sampled at random from all items, so most of them are easy negatives: the model can tell them apart from positives without being fine-grained. We need hard negatives to force fine-grained distinctions.

Slide 70, the idea: use harder and harder negatives, including more hard negatives each epoch. The pictures: a source pin (a card with a leaf design), a positive (a similar leaf card), an easy negative (a photo of a rural house, obviously unrelated), and a hard negative (another greeting card, similar in style but not truly related).

Slide 71, curriculum learning: make the negatives gradually harder during training. At epoch \(n\), add \(n-1\) hard negative items. The number of hard negatives grows over training, and the model gradually learns finer-grained predictions. (Starting with hard negatives would make the problem too difficult early, when the embeddings are still random.)

Slide 72, how to find hard negatives. For each user node, hard negatives are item nodes that are close but not connected to the user in the graph. For user \(u\):

  1. Run random walk with restart from \(u\) and record visit counts for other items/nodes.
  2. Sort items in descending order of visit count.
  3. Randomly sample items ranked high but not too high, e.g., ranks 2000th–5000th.

These items are close to the user, but not so close that they are likely true positives. Hard negatives are used in addition to the shared negatives.

Slide 73, another way to pick negatives. Positive pairs \((q,p)\) are given; various methods sample a negative \(n\) to form a triple \((q,p,n)\). Distance Weighted Sampling (Wu et al., 2017): sample negatives so that the query–negative distance distribution is approximately uniform on \([0.5,1.4]\). The left diagram: \((q,p)\) and the negatives in the batch go into a sampling block that outputs \((q,p,n)\). The right plot (from the Wu et al. paper) shows where different strategies sample along "distance between examples": hard negative mining concentrates at small distances, semi-hard mining around 0.5, uniform sampling at large distances (around 1.4–1.8), and distance-weighted sampling spreads across the whole range.

PinSAGE results and summary slides 74-76 ↗

Slides 74–76: the qualitative results and the lecture summary. slides 74-76 ↗

Slide 74, fine-grained object similarity. The query is a porcelain lace figurine. A visual-only model returns some figurines but also lamps and lampshades (similar colours and shapes). PinSAGE returns a row of porcelain figurines only: the graph tells it that people save these pins to the same boards.

Slide 75, compare against production. The query is a photo of a cat wearing a knitted lamb hat. The top row (the text extraction labels the systems Pixie, Pinterest's earlier random-walk recommender, and GraphSAGE) returns Shih Tzu posters, dog prints and a T-shirt: related words, wrong concept. The boxed row returns cats wearing knitted animal hats, which is what the user wants.

Slide 76, summary:

  • PinSAGE uses GNNs to produce high-quality user/item embeddings that capture both rich node attributes and graph structure.
  • It is trained effectively with sophisticated negative sampling strategies (shared, hard, curriculum).
  • It is deployed at Pinterest, a billion-scale image recommendation service.

Contrast with LightGCN: LightGCN has no features and a free vector per node (transductive), so it cannot embed a brand-new pin. PinSAGE computes embeddings from features plus neighbourhood (inductive, GraphSAGE-style), which is why fresh pins get an embedding seconds after creation.

Not shown (no new content): slides 1,2,3,4,13,32,42,58 — title page, announcements and exam logistics, and section-divider title pages.

Review: what to keep from this session

Carried forward. Lecture 17 notices that the reward-model loss of RLHF has exactly the BPR form; Lecture 12 moves from a single user–item table to whole databases.

Quick self-check

Why is the binary cross-entropy loss a poor fit for Recall@K?

It compares every positive against every negative across all users, while the metric is per user; a user with easy positives can dominate the loss.

What does LightGCN keep from GCN and what does it drop?

It keeps neighbour averaging with symmetric degree normalisation and drops the weight matrices and non-linearities, then averages the per-layer embeddings.

Why does PinSage sample neighbours by random walks rather than uniformly?

Random walks rank neighbours by importance, so a fixed budget of neighbours captures the most relevant ones for a hub pin.

Key idea

Collaborative filtering is diffusion on the user–item graph: LightGCN keeps only learnable embeddings and parameter-free normalised propagation, and a personalised ranking loss (BPR) aligns training with per-user Recall@K.

\[ E_{\text{final}}=\frac{1}{K+1}\sum_{k=0}^{K}\tilde A^kE,\qquad \text{score}(u,v)=\mathbf z_u^\top\mathbf z_v,\qquad \mathcal L_{BPR}=-\log\sigma(s_{u,v^+}-s_{u,v^-}) \]

Worked example: BPR fixes the binary loss

Same scores as the think-first box: \(s(u_0,v_0)=1\) (pos), \(s(u_0,v_1)=-1\), \(s(u_1,v_0)=2\), \(s(u_1,v_1)=4\) (pos).

  1. BPR for \(u_0\): \(-\log\sigma(1-(-1))=-\log\sigma(2)=0.127\).
  2. BPR for \(u_1\): \(-\log\sigma(4-2)=0.127\). Both users are already ranked correctly; the loss is small and only asks for larger within-user margins.
  3. Binary loss includes \(-\log(1-\sigma(2))=2.127\) for the negative \((u_1,v_0)\) — a big penalty for something irrelevant to recall.
  4. Recall@2 example: user's future positives \(P_u=\{a,b,c\}\); recommended \(R_u=\{a,d\}\) → Recall@2 = 1/3.

Strictly speaking: BPR is still a surrogate — it optimises AUC-like pairwise ordering, not top-K recall. Losses that focus on the top of the ranking (softmax/sampled-softmax, LambdaRank) are often better in practice.

In code (PyG)

from torch_geometric.nn import LightGCN
model = LightGCN(num_nodes=n_users + n_items, embedding_dim=64, num_layers=3)
# edge_index: user-item edges with items offset by n_users, made undirected
pos_rank = model(edge_index, edge_label_index=pos_pairs)    # z_u . z_v for positives
neg_rank = model(edge_index, edge_label_index=neg_pairs)    # sampled negatives (same users)
loss = model.recommendation_loss(pos_rank, neg_rank, lambda_reg=1e-4)   # BPR + L2
topk = model.recommend(edge_index, src_index=users, dst_index=items, k=20)

Proof workshop: BPR upper-bounds the number of mis-ranked pairs

One problem in olympiad style. Give it fifteen minutes on paper before you open the first hint; the hints are graded, so open them one at a time.

Problem. For a user \(u\), let \(\mathcal P\) be pairs \((i,j)\) with \(i\) a positive and \(j\) a negative item, and \(x_{ij}=s_{ui}-s_{uj}\). Prove that \(\frac1{\log2}\sum_{(i,j)\in\mathcal P}-\log\sigma(x_{ij})\ \ge\ \#\{(i,j):x_{ij}\le0\}\). Deduce that minimising BPR minimises an upper bound on \(1-\mathrm{AUC}_u\).

Hint 1
\(-\log\sigma(x)=\log(1+e^{-x})\). Compare it with \(\log2\cdot\mathbf 1[x\le0]\) separately for \(x\le0\) and \(x>0\).
Hint 2
Recall from Lecture 5 that \(1-\mathrm{AUC}_u\) is the fraction of positive–negative pairs ranked the wrong way.
Solution
If \(x\le0\) then \(e^{-x}\ge1\), so \(\log(1+e^{-x})\ge\log2\). If \(x>0\) then \(\log(1+e^{-x})>0=\log2\cdot\mathbf 1[x\le0]\). So \(-\log\sigma(x)\ge\log2\cdot\mathbf 1[x\le0]\) for every \(x\); sum over pairs and divide by \(\log2\). Dividing by \(|\mathcal P|\), the right-hand side is \(1-\mathrm{AUC}_u\) (ties counted as errors). \(\square\)

Why it matters. Recall@K is a step function of the scores and has no useful gradient; BPR is a smooth, convex surrogate for the per-user ranking error. The bound also shows what BPR does not optimise: the top of the list. That is why hard negatives (PinSage) and top-heavy losses matter in practice.

Sharper lens: how little a recommender needs, and what bounds it

Not on the slides. Three or four points where the lecture rounds something off: the exact statement, a second way to see it, and where it stops being true. Each is short and has a pointer for going further.

second viewpoint

LightGCN is a fixed low-pass filter; the end of that road has no training at all

\(E_{\text{final}}=\frac1{K+1}\sum_k\tilde A^kE=g(\tilde A)E\) for a fixed polynomial \(g\) that keeps the eigen-directions of \(\tilde A\) near eigenvalue 1 and damps the rest: the same low-pass filter as DeepWalk's window (Lecture 2) and SGC (Lecture 20). If the filter is doing the work, why learn anything?

  • GF-CF (Shen et al., CIKM 2021) applies a normalised item–item filter plus an ideal low-pass filter built from the top singular vectors of the interaction matrix, with no training, and beats LightGCN on LightGCN's own benchmarks.
  • EASE (Steck, WWW 2019) learns one item–item matrix \(B\) by ridge regression of the interaction matrix \(X\) on itself with \(\mathrm{diag}(B)=0\). It has a closed form: with \(P=(X^\top X+\lambda I)^{-1}\), \(B_{ij}=-P_{ij}/P_{jj}\) for \(i\ne j\). One matrix inversion, competitive with deep models on the standard datasets.

On pure interaction data the signal sits in the low-frequency spectrum of co-occurrence, and the loss and the filter matter more than the architecture. Learned weights earn their place when nodes have content (PinSage: images and text, new pins with no history).

precise statement

A dot product of dimension d cannot produce every top-K list

Retrieval by \(\mathbf z_u^\top\mathbf z_v\) is fast because it is geometric, and for the same reason it is limited: with \(n\) items in \(d\) dimensions only some of the \(\binom nK\) possible top-\(K\) sets can be the nearest neighbours of any user vector, and the number of realisable ones grows polynomially in \(n\) with an exponent set by \(d\). Weller et al. (2025) turned this into a test: a dataset of trivially simple queries on which strong embedding models fail because the required combinations of relevant items exceed what their dimension can encode.

This is the structural reason for the two-stage design in section 1. Stage one accepts the rank limit in exchange for sub-linear search and is tuned for recall; stage two scores each candidate with a model that sees user and item together and has no such limit. It is also why "increase the embedding dimension" keeps helping longer than expected.

where it breaks

Two evaluation traps the leaderboards fell into

Sampled metrics. Ranking the true item against 100 random negatives instead of the whole catalogue is not a cheaper estimate of the same thing. Krichene and Rendle (KDD 2020) show it is inconsistent: it can reverse the order of two models, and as the sample shrinks every metric degenerates into AUC, which Lecture 5's Sharper lens showed is blind to the top of the list. Rank against all items; LightGCN's code does.

Learned similarity. Neural Collaborative Filtering replaced the dot product by an MLP on the concatenated embeddings and reported gains. With equal tuning the dot product wins, and an MLP needs a surprising amount of data even to imitate a dot product (Rendle et al., RecSys 2020). Together with Dacrema et al. (in Go deeper), this is why the lecture's "simpler and better" is the rule for collaborative filtering and not a curiosity.

since the slides

From graph diffusion to sequence transformers, and a primary source for X

Industrial ranking has moved from "embed the graph, then score" towards sequence models over each user's action history. Generative retrieval (TIGER, Rajput et al., NeurIPS 2023) gives every item a short "semantic ID", a few codes from a residual quantiser, and a transformer generates the next item's codes token by token. In January 2026 X open-sourced the system behind its For You feed (xai-org/x-algorithm): the hand-engineered features of the 2023 release are replaced by a transformer that reads the user's engagement sequence and predicts the probabilities of many actions (like, reply, repost, block, …), with candidates drawn from followed accounts and from an embedding-similarity retrieval stage, the two-tower pattern of section 1. For work on amplification this repository, which is still being updated, is the document to read: it states what is predicted and how the predictions are combined. The graph has not left; it supplies the candidates and the engagement edges. What changed is which model does the scoring.

Lab: hands-on and practical tips

Try it live. In the Graph Explorer: train LightGCN on MovieLens and compare it with matrix factorisation, item k-NN and popularity. Each lesson has predict-then-check questions.

notebook · L11 recommender systems turns MovieLens into a bipartite graph, compares the binary and BPR losses, trains matrix factorisation vs LightGCN, and mines hard negatives PinSage-style.

Split by time per userThe notebook holds out the latest 20% of each user's positive interactions. A random split predicts "random holes" in the history; the time split predicts the future, which is the product question.
Filter what the user already hasRecommending items the user already interacted with inflates Recall@K and is useless in production. Mask training positives before taking the top-K.
BPR needs negatives per userSample one unobserved item per (user, positive) pair each epoch; after a warm-up, mix in hard negatives (high-scoring unobserved items), with curriculum: PinSage adds them gradually or training collapses.
LightGCN depth is a popularity dialNormalised propagation favours high-degree items as depth grows and homogenises users within a community (the recommender version of over-smoothing). Report the popularity bias of your top-K as well as recall; see the atlas thread on topology bias.

Readings & lookup guide

lecture notes CS224W course notes (Leni Aniva, Autumn 2024 — in your course folder)

Concise written version of the lectures; the walkthrough above cites it page by page.

Order: LightGCN first (short, clear, and it subsumes NGCF), then NGCF for the history, PinSage for engineering.

read first He et al. — LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation (SIGIR 2020)

arXiv:2002.02126 · 10 pages · ~1.5 h
  • Read: §2 (ablation of NGCF: removing feature transformation and non-linearity improves results — Table 1, Fig. 1), §3.1 (model), §3.2 (relation to SGC & APPNP; layer combination as a self-connection).
  • Lesson to keep: in ID-only collaborative filtering, the parameters belong in the embeddings, not in the propagation.

context Wang et al. — Neural Graph Collaborative Filtering (SIGIR 2019)

  • Read: §2.2 (embedding propagation with the \(\mathbf e_i\odot\mathbf e_u\) affinity term) and Fig. 2 (high-order connectivity). Skim experiments.

engineering classic Ying et al. — Graph Convolutional Neural Networks for Web-Scale Recommender Systems (PinSage, KDD 2018)

  • Read: §3.2 (importance-based neighbourhoods from random walks; importance pooling), §3.3 (max-margin loss, hard negatives, curriculum), §3.4 (MapReduce inference).
  • Key numbers: 3B nodes, 18B edges, 7.5B training examples; A/B tests with large engagement gains.

origin Rendle et al. — BPR: Bayesian Personalized Ranking from Implicit Feedback (UAI 2009)

arXiv:1205.2618 · ~45 min
  • §4 derivation of the BPR criterion and its link to AUC optimisation.

Homework & deadlines

Homework 2 due Thu 10/29 · Homework 3 out Thu 10/29 · due Thu 11/12

HW3 comes out with Lecture 12; it will likely cover Lectures 9–13 (heterogeneous graphs, KGs, recommender systems, relational deep learning). Download into the course folder when released.

Colab 3 due Thu 11/5 · Project milestone due Tue 11/10

Exam note from the slides: the exam (Wed 11/18) covers Lectures 1–16 with focus on 1–13; a practice exam and recitation are provided.

Self-check

Why is the binary loss a poor surrogate for Recall@K?

  1. It isn't differentiable
  2. It compares positives and negatives across different users
  3. It ignores negatives
  4. It requires item features

Recall is per user; cross-user score comparisons are irrelevant.

LightGCN differs from NGCF mainly by …

  1. adding attention
  2. using item features
  3. using a binary loss
  4. removing feature transformations and non-linearities in propagation

All learnable parameters are in the shallow input embeddings.

In LightGCN, the self-loop's role is played by …

  1. including \(E^{(0)}\) in the layer average
  2. adding I to A
  3. a separate weight matrix
  4. dropout

\(\alpha_0E^{(0)}=\alpha_0\tilde A^0E^{(0)}\).

PinSage's hard negatives are …

  1. random items
  2. items the user interacted with
  3. items close to the user in random-walk visit counts but not connected (ranks ~2000–5000)
  4. the most popular items

Close enough to be confusing, not so close to be actual positives.

Sharing negative samples across a mini-batch of users saves …

  1. nothing
  2. a factor of |U_mini| in negative-embedding computation
  3. memory for user embeddings
  4. the need for positives

Compute |V_neg| embeddings once instead of per user.

Flashcards (click to flip)

Recall@K
\(|P_u\cap R_u|/|P_u|\), averaged over users.
BPR loss (one user)
\(-\log\sigma(f(u,v^+)-f(u,v^-))\)
Collaborative filtering
Similar users prefer similar items; embeddings must capture similarity.
LightGCN propagation
\(E\leftarrow\tilde AE\) K times; average layers; \(\tilde A=D^{-1/2}AD^{-1/2}\).
Two-stage recsys
Candidate generation (NN search) → ranking (accurate model).
PinSage tricks
Shared negatives · hard negatives · curriculum · large-scale minibatching.

History & the bigger picture

  • 1992 — Tapestry (Xerox PARC) coins "collaborative filtering"; 1994 — GroupLens; 2003 — Amazon item-to-item CF.
  • 2006–2009 — the Netflix Prize: matrix factorisation (Koren, Bell, Volinsky) wins; 2009 — BPR for implicit feedback.
  • 2016–2018 — deep recommenders (YouTube DNN two-tower, Wide&Deep); 2018 — PinSage; 2019–2020 — NGCF → LightGCN.
  • 2023– — generative and LLM-based recommenders; GNNs remain strong on structure-heavy, ID-based data.
Society · the recommender as an institution

Recommenders are arguably the most socially consequential ML systems: they shape what billions read, watch and buy. Optimising Recall@K on past behaviour is a choice of values — engagement over diversity, exploitation over exploration. Debates on filter bubbles, polarisation and algorithmic amplification (and regulation like the EU Digital Services Act) are about exactly these objective functions. From an ethical standpoint rooted in care for the common good, "what should the system recommend?" is not a purely technical question.

Classic SNA bridge

In this lectureClassic SNA counterpartWhat carried over, what changed
User–item bipartite graphAffiliation networks (Breiger 1974); Galois lattices of people × events (Freeman & White 1993)The Southern Women dataset (Davis, Gardner & Gardner 1941: 18 women × 14 events) is the original user–item matrix. Collaborative filtering is affiliation-network analysis with a prediction objective.
Collaborative filtering: similar users like similar itemsStructural equivalence in two-mode data; "duality of persons and groups"Two users are similar if they attend the same events; two events if they draw the same users. Breiger's duality is exactly the alternating propagation of NGCF/LightGCN.
Who-to-follow as user–user recommendationTriadic closure (Simmel; Rapoport 1953); "friend of a friend" in the p* familyTwitter's WTF used random-walk SALSA; LightGCN on the follow graph is its modern form. Both are machines for triadic closure, which is why they homogenise.
Recall@K and surrogate lossesNetwork interventions and their evaluation (Valente 2012)SNA evaluated interventions by outcomes in the population; recommender metrics evaluate per-user ranking. The gap between them is where the PNAS/Science results above live.
Hard negativesNon-ties that "should" exist: structural holes (Burt 1992)A high-scoring non-tie is a structural hole candidate. Burt saw brokerage opportunity; a recommender sees a hard negative or a recommendation. Same object, opposite valuation.
Bridge idea

Train LightGCN on engagement data from X and measure, as \(K\) grows, (a) Recall@K, (b) the Gini coefficient of item exposure and (c) embedding-space homophily by political camp. Then compute Musco et al.'s \(P+D\) on the implied user–user graph before and after applying the recommendations as edge reweighting. That is an amplification audit with a theory behind it, and a publishable intersection of GNNs and computational social science.

Go deeper in the SNA course. The twelve-unit course on social network analysis in this repository gives the classic side of this lecture in full, with labs and real-data analyses: Unit 5 · Heavy tails & the scale-free debate (popularity bias: preferential attachment inside a recommender); Unit 7 · Cascades, contagion & influence (recommenders: the feed that decides which cascades get a chance); Unit 11 · Polarization, algorithms & misinformation (recommender systems: where exposure is decided).

Connecting to your research

Running project. Section L11 · who-to-retweet of notebooks/project/retweet_thread.py applies this lecture to one synthetic X world with coordinated rings, the same graph across the whole course.

Research extension. experiments/recsys-amplification (hypotheses written before running): a popularity recommender gives ring targets 1.2–1.4× the exposure (2–3× for obscure targets); LightGCN-style normalisation does not amplify; Recall@20 cannot see the difference.

For SNA on X/Twitter
  • Who-to-follow is user–user recommendation (Twitter's WTF system, 2013, used random-walk SALSA). LightGCN on the follow graph is a strong modern baseline.
  • Amplification audits: train a LightGCN on engagement data and measure whether diffusion amplifies partisan content (embedding-space homophily). That's a publishable intersection of GNNs and computational social science.
  • Echo chambers ↔ over-smoothing: deeper diffusion makes users within a community more similar — the model's inductive bias itself encodes homophily. Worth testing whether \(K\) controls recommendation diversity.

From the experiments: results and datasets

Generated by scripts/sync_guides.py from the experiments' committed results and the dataset catalogue; rerun it (make sync-guides) after an experiment changes.

recsys-amplification

Question. Does the recommender amplify coordinated rings, and which recommender? experiment folder ↗

Ring targets' share of recommendation slots with the bots' retweets ÷ without them (1 = no amplification). Popularity reaches 3.17×; propagation stays within 0.85–1.11×.

Frontier 2025–26: what changed since the slides

NeurIPS 2025 spotlightPath-enhanced contrastive learning for recommendation — The methodological line of the 15-paper recommender cluster: contrastive graph collaborative filtering and the study of topology bias (popularity concentration) in graph recommenders.
PNAS 2022 · Science/Nature 2023Recommenders have the strongest causal evidence in social-systems research — Twitter's long-running 1% holdout (~2M accounts on chronological feeds) found the mainstream political right amplified more than the left in 6 of 7 countries; the Meta 2020 election studies found three months of chronological feed did not significantly change polarisation. Compatible, not contradictory: one measures exposure, the other short-run attitudes.
WWW 2018 → 2020A recommender is an edge-rewiring operator — Musco, Musco & Tsourakakis: polarisation plus disagreement equals s̄ᵀ(I+L)⁻¹s̄ at the Friedkin–Johnsen equilibrium, convex in the network. Chitra & Musco (2020): a recommender that slightly reweights edges to reduce users' disagreement sharply increases polarisation, a filter bubble derived from first principles. LightGCN's diffusion is such an operator on the user–item graph.sources: arXiv:1712.09948
Atlas · societySteering exposure toward credible content — The societal half of the recommender cluster studies exposure concentration and credibility steering, and asks how to regulate what the top-K optimises. X open-sourced its ranking code in 2023, a primary source for which signals a platform optimises.
Open question to carryRecommenders shape the social graph they learn from. Can the feedback loop be modelled, and does \(K\) (LightGCN depth) control recommendation diversity the way the over-smoothing argument predicts?
Frontiers · a recommender is an edge-rewiring operator · polarisation plus disagreement is convex

Words & phrases

TermSimple meaningPersianIn context
surrogate lossn.an easier, differentiable objective used in place of the real metricتابع زیان جانشین"we train with a surrogate loss"
curriculum learningn.training on easy examples first and harder ones laterیادگیری برنامه‌درسی (تدریجی)"Curriculum learning: at epoch n, add n − 1 hard negatives"
implicit feedbackn.behaviour (clicks, views) rather than explicit ratingsبازخورد ضمنی"a rating ≥ 4 counts as implicit feedback"
cold startn.the problem of new users or items with no historyشروع سرد"PinSage uses content features against cold start"
collaborative filteringn.recommending from the behaviour of similar users rather than from item contentپالایش مشارکتی"LightGCN is graph collaborative filtering"
popularity biasn.a recommender's drift toward already popular itemsسوگیری محبوبیت"check Recall@K against a popularity baseline"

Go deeper

  • Next: Lecture 12 — Relational Deep Learning: the user–item graph generalises to an entire relational database.
  • Evaluation: Dacrema et al. (RecSys 2019), "Are we really making much progress?" — many neural recommenders lose to tuned simple baselines.
  • Open question: LightGCN removes parameters and improves. When do learnable propagation weights help? (Hint: when nodes have rich features, as in PinSage.)