Proposition 3I.14.P0350 of 100 in the corpus
Repeated averaging forgets where it started, at a rate the graph's spectrum sets.
Stacked graph convolutions drive every node towards one direction fixed by the degrees. The distance to that limit shrinks by the second eigenvalue at every layer, which is why graph networks are shallow.
Averaging has a fixed direction
Strip a graph convolution of its weights and nonlinearity and stack it times: the result is . This is the part of a deep graph network that the graph contributes, and it has a limit.
Let hold the square roots of the degrees with self-loops, . Each row of sums to that node’s degree, so
and is an eigenvector with eigenvalue . The matrix is similar to , a random walk that may stay put. For a connected graph that walk can reach every node and is not periodic, so by the Perron–Frobenius theorem the eigenvalue is simple and every other eigenvalue lies strictly between and . Expanding in the orthonormal eigenvectors of the symmetric , each component is multiplied by its eigenvalue at every step:
Repeated averaging forgets everything but one direction.
Here is the largest absolute value among the other eigenvalues. The limit gives every node the value for one number : once divided by , all nodes agree, and the features that distinguished them are gone. That is over-smoothing, and (I.14.6) is I.14.T3. The geometry is that of I.9: a product of the same matrix, with the eigenvalues deciding what survives. There the problem was a vanishing gradient; here it is a vanishing difference between nodes.
On the paw graph
The paw’s has eigenvalues , , and , so . Starting from , the limit is
which is at every node. The distance to it is at the start and
| layers | distance to the limit |
|---|---|
each within the bound . The figure plots the four node values divided by : after ten rounds they differ by less than one per cent.
The eigenvalue explains what proposition 2 found. Its eigenvector is , the difference between nodes and , and one application of removes that component entirely. That is why the two nodes merged after one layer. I.14.B02 derives every number.
What a trained network keeps
Weights and nonlinearities change the rate, not the tendency. Oono and Suzuki (2020) showed that for graph convolutions with ReLU, when the largest singular value of each weight matrix times is below one, the node states approach a subspace that carries no information beyond degrees, exponentially fast in the depth. Li, Han and Wu (2018) read the graph convolution as Laplacian smoothing. A few rounds help, because a node borrows evidence from labelled neighbours; many rounds hurt, because every node borrows the same evidence. Graph networks with two or three layers are common for this reason. Residual connections, which I.11 used to make deep convolutional networks trainable, keep part of each node’s own state and slow the collapse.
Depth fails in a second way that is not smoothing. A node hops from many others must pass all their information through one fixed-width vector. Alon and Yahav (2021) called this over-squashing: the number of nodes within hops can grow exponentially while the width does not.
Without self-loops
The self-loop is what keeps the eigenvalues above . Without it, a bipartite graph’s normalised adjacency has the eigenvalue , whose eigenvector alternates in sign between the two sides. On a hexagon the signal flips sign at every layer and never converges. With self-loops the hexagon’s eigenvalues are , the largest after is , and differences fall below one per cent after layers (I.14.X05).
Watch it converge
from math import sqrt
A = [[0, 1, 1, 0], [1, 0, 1, 0], [1, 1, 0, 1], [0, 0, 1, 0]]
d = [sum(r) + 1 for r in A] # degrees with self-loops
Ahat = [[(A[i][j] + (i == j))/sqrt(d[i]*d[j]) for j in range(4)] for i in range(4)]
h = [1.0, 2.0, 3.0, 4.0]
u = [sqrt(di/sum(d)) for di in d] # the fixed direction
limit = [ui*sum(uj*hj for uj, hj in zip(u, h)) for ui in u]
for k in range(1, 17):
h = [sum(a*b for a, b in zip(row, h)) for row in Ahat]
if k in (1, 2, 4, 8, 16):
print(k, round(sqrt(sum((a - b)**2 for a, b in zip(h, limit))), 6))
It prints the distances in the table: , , , and . From to the distance falls by a factor of , which is to within a third of one per cent: the second eigenvalue, applied once per layer.