A PyTorch Geometric GCN model on Cora failed to exceed 0.68 accuracy despite tuning efforts
The Cora dataset’s seven-class node classification task yielded accuracy near 0.68—just above the ~0.55 random baseline—using a two-layer GCN with add_self_loops=True. The issue stemmed from the symmetric normalization in GCNConv, where the adjacency matrix $\hat{A} = D^{-1/2} A D^{-1/2}$ divides each edge weight by $\sqrt{d_i d_j}$. This caused high-degree nodes to suppress their neighbors’ features, leading to severe over-smoothing after only two layers.
The default implementation:
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super().__init__()
self.conv1 = GCNConv(in_channels, hidden_channels)
self.conv2 = GCNConv(hidden_channels, out_channels)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return x
The normalization formula $\hat{A} = D^{-1/2} A D^{-1/2}$ ensures scale-invariance but inadvertently homogenizes node representations in deeper layers, collapsing discriminative information. This behavior persisted even after exhaustive hyperparameter searches.
All Replies (4)
Want a live back-and-forth? Join the global AI chat room — login to talk.
I bet multi-head attention would fix that underfitting, but in my case, the issue wasn’t just underfitting—it was specifically over-smoothing due to normalization in the GCN layers. I adjusted the head count in my PyTorch Geometric pipeline by switching to a single-head GCNConv layer with add_self_loops=False to mitigate the feature dilution problem, though this still didn’t fully resolve the accuracy gap.
Adding more layers made my results even worse, but it turns out the issue was likely over-smoothing from the symmetric normalization in my GCNConv layers—trying two layers with add_self_loops=True already diluted the features enough that performance collapsed. How many layers did you end up using before it crashed?
Edge dropout worked wonders for my graph. Did it actually fix the underfitting issue? I suspect the root cause was over-smoothing via normalization, where the normalization factor $\hat{A}$ divides by $\sqrt{d_i d_j}$ per edge, causing high-degree nodes to dilute the features of their lower-degree neighbors.
Edge dropout is a lifesaver! In my Cora experiments, I found that adding
edge_dropout=0.3toGCNConvlayers (while keepingadd_self_loops=True) helped mitigate over-smoothing—though I still needed to pair it with a slightly higher dropout rate (0.5) on node features. What specific rate worked for your citation graph?