Kipf & Welling — University of Amsterdam, ICLR 2017

Semi-Supervised Classification with Graph Convolutional Networks

A simple, scalable layer-wise propagation rule that turned spectral graph convolutions into practical message passing — the paper that made graph neural networks mainstream.

Prerequisites: Graph basics + Spectral basics (eigenvalues) + Basic neural networks
10
Chapters
4+
Simulations

Chapter 0: The Problem

You have a citation network: 2,708 machine learning papers (nodes), and 5,429 citations between them (edges). Each paper has a feature vector: a bag-of-words representation of its abstract (1,433 binary features). You want to classify each paper into one of 7 topic categories (Neural Networks, Case Based, Theory, etc.).

But here's the catch: you have labels for only 140 papers — about 5% of the graph. Standard supervised learning is useless with this few examples. You'd be overfitting to 20 labeled examples per class in a 7-class problem.

The key observation: You have more than just the 140 labels. You have the GRAPH — 5,429 edges that encode "paper A cites paper B." Two connected papers are very likely in the same field. This structural information should help classify the unlabeled papers. The question is: how do you incorporate it?

Why Standard Approaches Fall Short

Hand-crafted graph features + classifier: You could compute degree, clustering coefficient, PageRank for each node and concatenate these with the bag-of-words features. But these features were designed by humans, require domain knowledge, and might not capture what matters for this specific task.

Shallow embeddings (DeepWalk/node2vec) + classifier: Better — but the embeddings are trained without labels and without node features. The random-walk objective doesn't know you care about paper topics. And adding the 1,433-dimensional feature vectors to the embedding training is awkward.

Graph regularization: Add a penalty term to the loss that forces connected nodes to have similar predictions. This works, but it's a post-hoc fix, not a principled architecture.

Kipf & Welling's insight: build an end-to-end trainable neural network that takes features AND graph structure as direct inputs and learns to use both simultaneously. The architecture — a Graph Convolutional Network — does this through a principled layer-wise propagation rule derived from spectral graph theory.

The Semi-Supervised Setting

A citation network with 20 nodes. Only 3 have labels (colored outlines). The goal: classify all 17 unlabeled nodes by propagating information through the graph structure.

Only labeled nodes (large outlines) are known. Click Propagate to see label information spread through the graph.
In the Cora dataset used by Kipf & Welling, how many labeled nodes are used for training out of 2,708 total nodes?

Chapter 1: From Spectral to Spatial

GCN's derivation starts from spectral graph theory — but the key contribution is showing that the resulting model has a simple spatial interpretation. We'll trace the path from spectral convolutions to the final layer equation.

The Spectral Starting Point

In signal processing, filtering a signal s in the frequency domain is equivalent to multiplying by a filter g in frequency space. For graphs, the analog is: a graph convolution filters a graph signal x (one feature per node) using the graph Laplacian's eigenvectors.

The normalized graph Laplacian is L = I − D−½AD−½, where A is the adjacency matrix and D is the degree matrix. Its eigendecomposition is L = U Λ UT, where U is a matrix of eigenvectors (the "graph Fourier basis") and Λ is diagonal (the eigenvalues = "frequencies").

A graph convolution with filter g is:

g ☆ x = U · g(Λ) · UT x

where g(Λ) = diag(g(λ0), ..., g(λn−1)) applies the filter to each eigenvalue. This is exact but hopelessly expensive: O(N2) per convolution just for the UTx projection — and computing U itself is O(N3).

Chebyshev Polynomial Approximation

Hammond et al. (2011) showed you can approximate g(Λ) as a truncated polynomial in Λ:

g(Λ) ≈ ∑k=0K θk Tk(Λ̃)

where Λ̃ = 2Λ/λmax − I (rescaled to [−1,1]) and Tk are Chebyshev polynomials. The key insight: Ak applied to a graph signal gives the k-hop neighborhood contribution. So the resulting filter uses only k-hop neighbors — no eigenvector decomposition needed. Cost: O(K|E|) per layer.

The polynomial approximation is spatial: Tk(Λ̃) corresponds to applying the Laplacian k times. Applying the Laplacian once to a signal "spreads" information to immediate neighbors. Applying it k times spreads it to k-hop neighbors. So the Chebyshev approximation naturally corresponds to a K-hop neighborhood aggregation — exactly what we want.

Kipf & Welling's Key Simplification

Kipf & Welling take K = 1: only first-order Chebyshev polynomials. This is the first-order approximation. For K=1, the filter becomes:

g ☆ x ≈ θ0 x + θ1 (L − I) x = θ0 x − θ1 D−½AD−½ x

Two parameters: θ0 (how much to weight the node itself) and θ1 (how much to weight the mean of neighbors). They then make another simplification: set θ = θ0 = −θ1. This gives a single-parameter filter:

g ☆ x ≈ θ ( I + D−½AD−½ ) x

Note that I + D−½AD−½ has eigenvalues in [0, 2]. This is numerically problematic — repeated applications can cause exploding or vanishing values. Enter the renormalization trick (Chapter 3).

Spectral GCN
g ★ x = U g(Λ) UT x — exact but O(N³) to compute
↓ Chebyshev polynomial approximation
K-hop Chebyshev
g ★ x ≈ Σk θk Tk(L̃) x — O(K|E|), spatially local
↓ K=1, single-parameter simplification
First-order approximation
g ★ x ≈ θ(I + DAD)x — one-hop only
↓ Renormalization trick
GCN Layer
H(l+1) = σ(D̃ÃD̃ H(l) W(l)) — the paper's final equation
What order Chebyshev polynomial approximation does the GCN paper use, and what neighborhood does this correspond to?

Chapter 2: The GCN Layer

After the spectral derivation and renormalization trick (Chapter 3), the final GCN propagation rule for a multi-feature, multi-layer network is:

H(l+1) = σ( D̃−½ Ã D̃−½ H(l) W(l) )

Where every symbol earns its place:

  • H(l): Node feature matrix at layer l. Shape: [N, dl]. Row i = embedding of node i at layer l. At layer 0, H(0) = X (raw features).
  • W(l): Learnable weight matrix at layer l. Shape: [dl, dl+1]. Only this matrix is trained. Shared across all nodes.
  • σ: Nonlinearity. ReLU between layers; softmax at the final layer for classification.
  • Ã = A + IN: Adjacency with self-loops added. The "+I" is what allows the node's own embedding to flow through the formula — every node is its own neighbor.
  • : Diagonal degree matrix of Ã. D̃ii = deg(i) + 1. The +1 accounts for the self-loop.
  • −½ÃD̃−½: Symmetric normalized adjacency. Entry (i,j) = 1/√(D̃ii·D̃jj). Pre-computed once.

What One Layer Does — Step by Step

Let's trace the computation for a tiny example: 4 nodes, 2 input features, 2 output features. Node features: H(0) ∈ R4×2. Weight matrix: W(0) ∈ R2×2.

Step 1: Multiply H(l) W(l). This is a standard linear transformation of each node's features. Shape: [4,2] × [2,2] = [4,2]. Every node's features are rotated/scaled in the same way. No graph structure yet — this is just a linear layer.

Step 2: Left-multiply by D̃−½ÃD̃−½. This is where the graph structure enters. For each node i, this operation computes a weighted average of the TRANSFORMED features of all neighbors (including i itself via the self-loop). The weights are 1/√(di·dj) for each neighbor j. Shape stays [4,2].

Step 3: Apply σ (ReLU). Element-wise nonlinearity. Result: H(1) ∈ R4×2.

Order matters: The paper multiplies H(l)W(l) first (linear transform), THEN applies the normalized adjacency (aggregation). This order means the weight matrix W applies to individual node features before aggregation. It could also be done in the opposite order (aggregate, then transform) — equivalent in theory but the paper's order is more computation-efficient since W typically reduces dimension, making the subsequent aggregation cheaper.
GCN Layer — Matrix Multiplication Step-Through

A graph with 5 nodes, each with 2 input features. Step through the three operations: linear transform (H·W), neighbor aggregation (D̃Ã D̃·), and nonlinearity (ReLU). Watch how values change at each step.

Step 0: Raw input features H⁽⁰⁾. Each node has 2 features (shown as bar chart).
python
# Complete GCN layer: exact implementation of the paper's equation
# H^(l+1) = sigma( D̃^(-½) Ã D̃^(-½) H^(l) W^(l) )
import torch
import torch.nn as nn
import torch.nn.functional as F

def precompute_adj_norm(A):
    """Pre-compute D̃^(-½) Ã D̃^(-½). Call once, cache result."""
    N = A.shape[0]
    A_tilde = A + torch.eye(N)                      # Ã = A + I
    D_tilde = A_tilde.sum(dim=1)                  # D̃ diagonal
    D_inv_sqrt = torch.diag(D_tilde.pow(-0.5))    # D̃^(-½)
    return D_inv_sqrt @ A_tilde @ D_inv_sqrt        # [N, N]

class GCNLayer(nn.Module):
    def __init__(self, in_feats, out_feats):
        super().__init__()
        self.W = nn.Linear(in_feats, out_feats, bias=False)
        # No bias needed: the normalized adj already acts like centering

    def forward(self, H, A_norm):
        # H: [N, in_feats]   A_norm: [N, N] (pre-computed, cached)
        step1 = self.W(H)        # [N, out_feats] — linear transform first
        step2 = A_norm @ step1   # [N, out_feats] — neighborhood aggregation
        return F.relu(step2)     # element-wise ReLU

# Two-layer GCN (the paper's model for Cora):
# Input dim: 1433 (bag-of-words) → hidden: 16 → output: 7 (classes)
# Softmax at output, not ReLU
class TwoLayerGCN(nn.Module):
    def __init__(self, in_feats=1433, hidden=16, num_classes=7):
        super().__init__()
        self.layer1 = GCNLayer(in_feats, hidden)
        self.layer2 = nn.Linear(hidden, num_classes, bias=False)

    def forward(self, X, A_norm):
        H = self.layer1(X, A_norm)              # [N, 16]
        logits = A_norm @ self.layer2(H)        # [N, 7] — aggregation at last layer too
        return F.log_softmax(logits, dim=-1)    # [N, 7]
In the GCN layer equation H(l+1) = σ(D̃Ã D̃ H(l) W(l)), which part is pre-computed before training and which part contains learnable parameters?

Chapter 3: The Renormalization Trick

After the K=1 simplification from Chapter 1, the filter was: θ(I + D−½AD−½)x. The matrix (I + D−½AD−½) has eigenvalues in [0, 2]. This is the problem: when you stack multiple layers (multiply by this matrix multiple times), eigenvalues larger than 1 explode and eigenvalues near 0 vanish. Training becomes unstable.

The Fix: Add Self-Loops, Re-Normalize

Instead of starting from (I + D−½AD−½), which causes instability, Kipf & Welling propose the renormalization trick:

I + D−½AD−½   →   D̃−½ÃD̃−½
where   Ã = A + IN   and   D̃ii = ∑j Ãij

The key difference: instead of adding I to the NORMALIZED adjacency (I + D−½AD−½), you add I to the RAW adjacency FIRST (à = A + I), THEN normalize (D̃−½Ã D̃−½). This keeps all eigenvalues in [0, 1], preventing both explosion and vanishing.

Why Does This Help Numerically?

The normalized adjacency D̃−½Ã D̃−½ is a stochastic matrix — each row sums to at most 1 (it's row-stochastic under the symmetric normalization). Its spectral radius is at most 1. Multiplying by it repeatedly (stacking GCN layers) will not cause the signal to explode. Values can only stay the same or decrease.

The self-loop effect: Adding I to A means every node is its own neighbor in Ã. This has two effects: (1) when computing the normalized adjacency, the node's own features are included in the weighted average — no separate "self" term is needed. (2) It prevents information from "washing out" — a node retains some fraction of its own signal at each layer, rather than being completely replaced by its neighbors' aggregate.

Worked Example: Renormalization on a Small Graph

Triangle graph: 3 nodes (A, B, C), all connected. Adjacency matrix:

A = [[0, 1, 1], [1, 0, 1], [1, 1, 0]]

Degree matrix: D = diag(2, 2, 2). Without renormalization: I + D−½AD−½ = I + (1/2)·ones_minus_identity = eigenvalue max = 1 + 1 = 2. Repeated application explodes.

With renormalization: à = A + I = [[1,1,1],[1,1,1],[1,1,1]]. D̃ = diag(3,3,3). D̃−½Ã D̃−½ = (1/3)·[[1,1,1],[1,1,1],[1,1,1]]. Each node gets 1/3 of each node's features (including its own). Eigenvalues: {1, 0, 0}. Maximum eigenvalue = 1. Stable.

Eigenvalue Stability: With vs. Without Renormalization

Simulate 10 layers of propagation on a random graph signal. Without renormalization, the signal explodes. With renormalization, it stays bounded. Drag the slider to see different numbers of layers.

Layers 5
What is the "renormalization trick" in the GCN paper, and why does it improve numerical stability?

Chapter 4: Multi-Layer GCN

The paper uses a two-layer GCN for Cora, Citeseer, and Pubmed. Two layers because: (1) one layer only captures 1-hop neighbors, (2) more than 2 layers for citation graphs empirically hurts performance (over-smoothing begins).

The Two-Layer Model

Let  = D̃−½Ã D̃−½ (pre-computed, cached). The full two-layer GCN is:

Z = f(X, A) = softmax( Â · ReLU( Â X W(0) ) W(1) )

Every piece of this equation is important:

Parameter Count

For Cora (1433 input features, 16 hidden, 7 classes): W(0) has 1433 × 16 = 22,928 parameters. W(1) has 16 × 7 = 112 parameters. Total: 23,040 parameters. This is tiny — fewer than most fully connected networks on tabular data. The graph structure does the heavy lifting; the learned parameters are compact.

Why two layers is (often) optimal for citation graphs: One layer lets each node see only direct neighbors. Two layers let each node see its 2-hop neighborhood — which for citation graphs means "papers cited by papers I cite." This captures the community structure well. Three layers expose a node to its 3-hop neighborhood — in a densely connected citation network, this is nearly the entire graph, causing all embeddings to converge (over-smoothing).

Dropout for Regularization

With only 140 labeled nodes, overfitting is a severe risk. The paper uses dropout on both X (before the first layer) and H(1) (between layers) with a rate of 0.5. L2 regularization (λ = 5×10−4) is also applied to W(0) and W(1). Together, these allow training to convergence without overfitting the 140 labels.

python
# Full two-layer GCN — the paper's actual model for Cora
import torch
import torch.nn as nn
import torch.nn.functional as F

class GCN(nn.Module):
    def __init__(self, nfeat=1433, nhid=16, nclass=7, dropout=0.5):
        super().__init__()
        self.W0 = nn.Linear(nfeat, nhid, bias=False)   # [1433, 16]
        self.W1 = nn.Linear(nhid, nclass, bias=False)   # [16, 7]
        self.dropout = dropout

    def forward(self, X, A_hat):
        # A_hat = D̃^(-½) Ã D̃^(-½), pre-computed [N, N]
        X = F.dropout(X, self.dropout, training=self.training)
        H = F.relu(A_hat @ self.W0(X))        # [N, 16] — first layer
        H = F.dropout(H, self.dropout, training=self.training)
        Z = A_hat @ self.W1(H)                # [N, 7] — second layer (no ReLU)
        return F.log_softmax(Z, dim=-1)       # [N, 7] log-probabilities

# Training with L2 regularization on weights
model = GCN()
optimizer = torch.optim.Adam(
    model.parameters(), lr=0.01, weight_decay=5e-4
)

# Loss: cross-entropy only on labeled nodes
def train(model, X, A_hat, labels, train_mask):
    model.train()
    optimizer.zero_grad()
    out = model(X, A_hat)
    loss = F.nll_loss(out[train_mask], labels[train_mask])  # only labeled!
    loss.backward()
    optimizer.step()
    return loss.item()
The paper uses a two-layer GCN on Cora. Why does adding a third layer typically HURT performance?

Chapter 5: Semi-Supervised Training

The word "semi-supervised" in the title is doing real work. Let's be precise about what it means here and why it enables learning from 140 labels.

The Loss Function

Cross-entropy, computed only over the labeled nodes:

L = − ∑l ∈ VLf=1F Ylf · ln Zlf

Where VL is the set of labeled nodes (140 for Cora), Y ∈ RN×F is the label indicator matrix (one-hot), and Z is the GCN's output (softmax probabilities). The sum runs over ONLY the 140 labeled rows of Z. Unlabeled nodes (2,568 of them) contribute NO loss term.

This seems strange: how can 2,568 unlabeled nodes possibly be useful if they never contribute to the loss?

The Mechanism: Indirect Supervision

Even though unlabeled nodes don't appear in the loss, they DO appear in the forward pass. The GCN's message passing means:

  1. Labeled node A's embedding is computed from A's features + A's neighbors' features. Some neighbors of A are unlabeled nodes B, C, D.
  2. When the loss backpropagates through A's embedding, it implicitly sends gradients to W(0) and W(1) that encode "what features predict A's label."
  3. The SAME weights W(0), W(1) are applied when computing the embedding of unlabeled node E (which might share features with A).
  4. At inference time, E's embedding is computed using weights trained on A and other labeled nodes — so E benefits from the label signal even though it was never in the loss.
Graph structure as a regularizer: The GCN architecture enforces a constraint: nodes that are connected must compute their embeddings from shared neighborhood statistics. This means the model cannot perfectly fit the 140 labeled nodes without also producing reasonable embeddings for their neighbors — because the neighbors' features literally flow into the labeled nodes' embeddings through message passing.

Training Details

The model is trained for up to 200 epochs with early stopping based on validation loss (500 validation nodes). Adam optimizer, learning rate 0.01, L2 regularization 5×10−4 on weights, dropout 0.5 on inputs and hidden layer. All training runs in a single forward pass through the ENTIRE graph — no mini-batches, since the full graph fits in memory.

Transductive vs. Inductive setting: The paper operates in the transductive setting — all nodes (including test nodes) are visible during training, just without labels. The GCN can see the test nodes' features and their positions in the graph during the forward pass. This is why it can achieve such high accuracy with so few labels. A truly inductive setting (test nodes not seen at all during training) would be harder — and was addressed by GraphSAGE (Hamilton et al., 2017).
In the GCN semi-supervised setting, unlabeled nodes contribute no loss terms. How do they still influence the trained model?

Chapter 6: Results

The paper evaluates on three citation network benchmarks. The results were striking: a simple 2-layer GCN with 23,040 parameters outperforms complex graph-based methods that use hand-crafted features, spectral methods, and graph regularization.

Benchmark Datasets

DatasetNodesEdgesFeaturesClassesLabels Used
Cora2,7085,4291,4337140 (5.2%)
Citeseer3,3274,7323,7036120 (3.6%)
Pubmed19,71744,338500360 (0.3%)

Classification Accuracy (Test Set)

MethodCoraCiteseerPubmed
ManiReg (graph reg.)59.5%60.1%70.7%
SemiEmb (deep + graph reg.)59.0%59.6%71.7%
Label Propagation68.0%45.3%63.0%
DeepWalk67.2%43.2%65.3%
Planetoid (Transductive)75.7%64.7%77.2%
GCN (this paper)81.5%70.3%79.0%

GCN improves over the second-best method (Planetoid) by 5.8% on Cora, 5.6% on Citeseer, and 1.8% on Pubmed. These are large margins — especially given that GCN uses far fewer parameters and is simpler to train.

Why GCN Wins

The key advantage over DeepWalk: GCN uses node features (1,433-dim bag-of-words on Cora), while DeepWalk ignores them entirely. The features are highly informative for topic classification — a paper about "reinforcement learning" likely contains the word "reward." DeepWalk must infer class from graph structure alone.

The key advantage over Planetoid (which also uses features): GCN's end-to-end training optimizes the features and graph structure jointly, while Planetoid uses them in separate stages. Joint optimization is almost always better.

Classification Accuracy Comparison

GCN (orange) vs. prior methods on three citation network benchmarks. All methods use 20 labels per class.

Why does GCN substantially outperform DeepWalk on citation network classification, despite both methods using the graph structure?

Chapter 7: Why It Works

GCN achieves high accuracy with 140 labels. The question is: why? What is the model actually doing, and what prior assumptions make it work?

Connection to Label Propagation

Label propagation (LP) is a classic semi-supervised method: assume connected nodes likely have the same label, then iteratively propagate known labels to unknown nodes. The GCN is a learnable version of this. The propagation rule  = D̃−½Ã D̃−½ is exactly the "influence matrix" used in LP. What GCN adds: a learned feature transformation W that tells the model WHAT features to look for when propagating.

GCN = LP + feature learning: Label Propagation propagates labels using fixed graph weights. GCN jointly learns: (1) which features are predictive of labels, and (2) how to aggregate those features across neighbors to maximize classification accuracy. The graph structure provides the "connectivity prior" (connected nodes are similar); the neural network provides the "feature learning" that LP lacks.

The Homophily Assumption

GCN implicitly assumes homophily: connected nodes tend to belong to the same class. In citation networks, this is true — papers cite papers in their field. If you cite a reinforcement learning paper, you're probably also an RL paper.

When does this fail? In social networks, "haters" might connect to people they hate (heterophily). A GCN applied naively would try to make their embeddings similar, which is wrong. This is a genuine limitation — not a flaw in the math, but a mismatch between the model's implicit assumption and the data's actual structure.

What the Embeddings Learn

The paper shows a 2D t-SNE visualization of the GCN embeddings on Cora. The 7 classes are cleanly separated in the embedding space, with only 140 labels used for training. The model has correctly placed unlabeled papers in the same cluster as labeled papers on the same topic — purely from the combination of citation structure and word content.

One way to think about it: the GCN computes a "smoothed" version of each node's features, where the smoothing operator is the graph structure. A paper's embedding is not just its own bag-of-words, but a weighted average of the bag-of-words of all papers it cites and is cited by. This average is a much better representation of the paper's field than its raw word content, because it captures community membership.

GCN is described as "label propagation with feature learning." What does this analogy mean?

Chapter 8: Limitations

GCN's success sparked years of follow-up work precisely because its limitations were clear and well-defined. Understanding them tells you when to use GCN and when to reach for something else.

1. Over-Smoothing with Depth

As established in Chapter 4, adding more GCN layers causes all node embeddings to converge to the same vector. After K layers, each node's embedding is the weighted average of its K-hop neighborhood. For most real graphs, the K-hop neighborhood covers nearly all nodes when K ≥ 5. All embeddings become identical — useless for classification.

Consequence: GCN is limited to shallow networks (2-3 layers). This is in stark contrast to CNNs on images, which benefit from 50+ layers. Deep GNNs require specialized techniques (skip connections, JK-networks, DropEdge).

2. Fixed Graph — Transductive Setting

The normalized adjacency  is pre-computed from the FULL graph structure. If a new node arrives,  must be recomputed. The model cannot efficiently embed a new node without re-running the forward pass with the updated graph.

Consequence: GCN as described is transductive — it cannot generalize to unseen nodes. GraphSAGE (Hamilton et al., 2017) fixes this by sampling a fixed-size neighborhood at each layer, allowing truly inductive inference.

3. Mean Aggregation Loses Information

−½Ã D̃−½ computes a MEAN of neighbor features. Two different neighborhood distributions can have the same mean. A node with neighbors [1, 3] and a node with neighbors [2, 2] would produce identical aggregate signals if the mean is the same value.

Consequence: GCN cannot distinguish some structurally different neighborhoods — it fails on certain graph structure tasks. GIN (Graph Isomorphism Network, Xu et al., 2019) showed that SUM aggregation is more expressive than mean, achieving maximal expressivity (as powerful as the 1-Weisfeiler-Lehman graph isomorphism test).

4. Fixed Edge Weights

In GCN, the aggregation weights 1/√(di·dj) are determined by the graph structure alone. They don't adapt based on the CONTENT of the nodes. An edge between two very similar nodes should perhaps carry more weight than an edge between very different nodes.

Consequence: Graph Attention Networks (GAT, Veličković et al., 2018) replace fixed structural weights with learned content-based attention weights — an important step forward for heterogeneous graphs.

5. Homophily Requirement

GCN's message passing assumes connected nodes are similar. On heterophilic graphs (nodes connect to dissimilar nodes), GCN can perform WORSE than an MLP that ignores graph structure entirely.

LimitationSeverityFix
Over-smoothingCritical for deep netsSkip connections, DropEdge, JK-networks
TransductiveHigh for dynamic graphsGraphSAGE (neighbor sampling)
Mean agg. lossMedium (task-dependent)GIN (sum), concatenation (GraphSAGE)
Fixed weightsMedium (task-dependent)GAT (attention weights)
Homophily neededHigh on heterophilic dataH2GCN, GPRGNN (signed messages)
Why does GCN suffer from "over-smoothing" when using many layers, and which aggregation strategy does GIN use to be more expressive?

Chapter 9: Connections

GCN is the first node in a graph of ideas. Understanding where it sits helps you navigate the broader GNN literature.

The Paper

Kipf, T.N. & Welling, M. (2017). "Semi-Supervised Classification with Graph Convolutional Networks." ICLR 2017. arXiv:1609.02907. Over 20,000 citations as of 2024 — one of the most cited papers in all of machine learning.

Papers That GCN Builds On

Papers That Build on GCN

Related Gleams

Start with CS224W Lecture 1 for graph basics. Then Lecture 2 for shallow embeddings (DeepWalk). Then Lecture 3 for the GNN framework this paper instantiates. The CS224W series continues with GraphSAGE and GAT.

"The simplicity of the GCN model is perhaps its most striking feature. A two-layer model with a first-order spectral approximation, a renormalization trick, and 23,040 parameters beats methods with far more complexity. This is the signal that the idea is fundamentally right."
— Paraphrase of the CS224W interpretation

arXiv:1609.02907 →    Original Code (tkipf/gcn) →