Well, because they’re pretty slow and can take forever to train on large datasets. And who has time for that?!
Here’s an example of how BlockGNN works: let’s say you have a dataset with 10,000 nodes and 50,000 edges. Normally, training a GNN on this data would take hours or even days to complete. But with BlockGNN, we can break the weight matrix into smaller blocks (hence the name) and train them separately. This not only speeds up the process but also makes it more efficient because we’re only working with a subset of the weights at any given time.
Here’s an example code snippet to give you an idea:
# Import necessary libraries
import numpy as np
from scipy import linalg
# Load dataset and preprocess data (not shown here)
X, A = load_data()
# Define weight matrix W with dimensions n x n
n = 100 # number of nodes
W = np.random.rand(n, n) # create a random weight matrix with dimensions n x n
# Break the weight matrix into smaller blocks of size k x k
k = 10 # block size
blocks = []
for i in range(int((n-1)/k+1)): # loop through rows of weight matrix
for j in range(int((n-1)/k+1)): # loop through columns of weight matrix
if (i*k) < n and ((j*k)+k) < n: # check if block is within weight matrix dimensions
blocks.append(W[i*k:(i+1)*k, j*k:(j+1)*k]) # add block to list of blocks
# Train each block separately using a GNN model
for i in range(len(blocks)): # loop through blocks
for j in range(len(blocks)): # loop through blocks again
if (i != j): # avoid training the same block twice
X_block = X[np.ix_(range((j*k)+k, (j+1)*k), range(i*k, (i+1)*k))] # select corresponding rows and columns from input data
A_block = A[np.ix_(range((j*k)+k, (j+1)*k), range(i*k, (i+1)*k))] # select corresponding rows and columns from adjacency matrix
model = GNNModel() # define your favorite GNN model here
model.fit(X_block, A_block) # train the model on the selected data
So basically, we’re breaking the weight matrix into smaller blocks and training each block separately using a GNN model. This not only speeds up the process but also makes it more efficient because we’re only working with a subset of the weights at any given time. And who doesn’t love efficiency?!
Hope that helps! Let me know if you have any other questions or need further clarification.