GNNs

O que são GNNs?

Redes Neurais em Grafos (Graph Neural Networks, GNNs) são uma família de Redes Neurais (Neural Networks) projetadas para aprender a partir de dados relacionais (relational data) representados como um grafo (graph): entidades são nós (nodes), relacionamentos são arestas (edges), e ambos podem ter atributos (features). Ao contrário de imagens (grades) ou texto (sequências), grafos são irregulares: cada nó pode ter um número diferente de vizinhos, e não há uma ordenação natural dos nós. As GNNs lidam com isso aprendendo por meio de passagem de mensagens (message passing) — os nós trocam informações iterativamente com seus vizinhos para construir representações sensíveis ao contexto.

GNNs são especialmente úteis quando:

  • relacionamentos importam tanto quanto (ou mais do que) atributos individuais,
  • a estrutura é não euclidiana (por exemplo, redes sociais, moléculas, grafos de conhecimento),
  • você precisa de previsões no nível de nó, aresta ou do grafo inteiro.

Grafos e problemas de aprendizado

Um grafo (simples) é tipicamente definido como:

  • Nós (V) com atributos de nó (x_v \in \mathbb{R}^{d})
  • Arestas (E) possivelmente com atributos de aresta (e_{uv} \in \mathbb{R}^{d_e})
  • Atributos globais/do grafo opcionais (g)

Grafos podem ser:

  • Direcionados ou não direcionados
  • Ponderados ou não ponderados
  • Heterogêneos (múltiplos tipos de nós/arestas) ou homogêneos
  • Dinâmicos/temporais (arestas/nós aparecem ao longo do tempo)

Tarefas supervisionadas comuns:

  • Classificação de nós: rotular cada nó (por exemplo, categorizar usuários)
  • Predição de arestas / predição de links: prever se uma aresta existe ou seu tipo (por exemplo, recomendar conexões)
  • Classificação/regressão de grafos: prever um rótulo/valor para o grafo inteiro (por exemplo, predição de propriedade molecular)
  • Regressão/classificação em nível de aresta: prever atributos de arestas (por exemplo, velocidade do tráfego em vias)

A ideia central: passagem de mensagens (MPNNs)

A maioria das GNNs modernas pode ser descrita no arcabouço de Rede Neural de Passagem de Mensagens (Message Passing Neural Network, MPNN). O cálculo-chave é iterativo: cada nó atualiza sua representação agregando informações de seus vizinhos.

Seja (h_v^{(k)}) a representação oculta do nó (v) na camada (k), com (h_v^{(0)} = x_v).

Uma camada típica de passagem de mensagens tem:

  1. Função de mensagem [ m_{u \to v}^{(k)} = \phi^{(k)}\big(h_u^{(k-1)}, h_v^{(k-1)}, e_{uv}\big) ]

  2. Agregação de vizinhança (deve ser invariante a permutações (permutation-invariant)) [ M_v^{(k)} = \text{AGG}^{(k)}\big({m_{u \to v}^{(k)} : u \in \mathcal{N}(v)}\big) ] Escolhas comuns de AGG: soma, média, máximo, soma ponderada por atenção (attention).

  3. Atualização do nó [ h_v^{(k)} = \psi^{(k)}\big(h_v^{(k-1)}, M_v^{(k)}\big) ]

Após (K) camadas, (h_v^{(K)}) codifica informações de vizinhanças de até (K) saltos.

Por que a invariância a permutações é importante

Grafos não têm uma ordenação canônica de vizinhos. Se você listar vizinhos como ([u_1, u_2]) vs ([u_2, u_1]), o modelo deve se comportar de forma idêntica. Por isso, agregadores geralmente são funções simétricas como soma/média/máximo (ou atenção sobre um conjunto não ordenado).

Da passagem de mensagens às previsões: funções de leitura

Para tarefas no nível de nó, você pode acoplar um classificador (classifier) diretamente ao embedding de cada nó (h_v^{(K)}).

Para tarefas no nível de grafo (por exemplo, moléculas), você precisa de uma função de leitura (readout) para agregar embeddings de nós em um embedding do grafo: [ h_G = \text{READOUT}({h_v^{(K)} : v \in V}) ] Leituras comuns: agrupamento (pooling) por soma/média, agrupamento por atenção, Set2Set, agrupamento hierárquico.

Principais arquiteturas de GNN (e o que elas mudam)

A maioria das GNNs “nomeadas” difere em como agregam, como normalizam e como incorporam atributos de aresta.

Redes Convolucionais em Grafos (Graph Convolutional Networks, GCN)

GCNs popularizaram um esquema simples de média na vizinhança com normalização por grau. Uma forma comum é: [ H^{(k)} = \sigma\big(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2} H^{(k-1)} W^{(k)}\big) ] onde (\tilde{A} = A + I) adiciona auto-laços (self-loops) e (\tilde{D}) é a matriz de graus.

Intuição: fazer uma média normalizada dos atributos dos vizinhos e, em seguida, aplicar uma camada linear e uma não linearidade.

Pontos fortes:

  • Simples, uma linha de base (baseline) forte para classificação de nós semissupervisionada (por exemplo, redes de citações)

Limitações:

  • Mais difícil incorporar atributos de aresta ricos
  • Pode sofrer de suavização excessiva (over-smoothing) com muitas camadas (embeddings de nós ficam similares demais)

GraphSAGE (amostragem e aprendizado indutivo)

GraphSAGE aprende uma função de agregação (média/LSTM/max-pool) e é projetado para cenários indutivos (inductive): generaliza para nós/grafos não vistos ao agregar atributos de vizinhos.

Ideia prática central: amostragem de vizinhos (neighbor sampling) para escalabilidade (usar um número fixo de vizinhos por nó, por camada).

Casos de uso:

  • Grafos grandes (redes sociais, sistemas de recomendação)

Redes de Atenção em Grafos (Graph Attention Networks, GAT)

GAT usa pesos de atenção para aprender quais vizinhos importam mais: [ \alpha_{uv} \propto \text{softmax}u(a(h_u, h_v)) ] [ h_v^{(k)} = \sigma\left(\sum{u \in \mathcal{N}(v)\cup{v}} \alpha_{uv} W h_u^{(k-1)}\right) ]

Pontos fortes:

  • Ponderação adaptativa de vizinhos
  • Frequentemente forte para heterofilia (heterophily) ou vizinhanças ruidosas

Custos:

  • Atenção pode ser cara em grafos muito grandes

Rede de Isomorfismo de Grafos (Graph Isomorphism Network, GIN) e expressividade

GIN usa agregação por soma e uma atualização por MLP: [ h_v^{(k)} = \text{MLP}^{(k)}\left((1+\epsilon)h_v^{(k-1)} + \sum_{u \in \mathcal{N}(v)} h_u^{(k-1)}\right) ]

GIN é motivada por teoria: ela iguala o poder discriminativo do teste de isomorfismo de grafos de Weisfeiler–Lehman 1-dimensional (1-dimensional Weisfeiler–Lehman, 1-WL) sob certas condições. Isso a torna uma arquitetura forte para classificação de grafos (por exemplo, moléculas).

Visões espectral vs espacial (duas formas de justificar GNNs)

Existem duas perspectivas clássicas:

  • Métodos espectrais (spectral methods): definem convoluções usando a base de autovetores do Laplaciano do grafo (transformada de Fourier em grafos). Isso é matematicamente elegante, mas frequentemente computacionalmente pesado e menos flexível entre grafos diferentes.
  • Métodos espaciais/de passagem de mensagens: definem convoluções agregando diretamente informações dos vizinhos. Esta é a abordagem prática dominante hoje.

Muitas GCNs “espectrais” podem ser mostradas como aproximações de filtros localizados que, no fim, se parecem com passagem de mensagens.

Exemplo prático: classificação de nós com PyTorch Geometric

A seguir está um exemplo mínimo de treinamento de uma GCN de 2 camadas em um grafo de citações (por exemplo, Cora). Ele ilustra o fluxo de trabalho típico: carregar dados, definir um modelo com camadas de passagem de mensagens e treinar com Retropropagação (Backpropagation) usando Descida do Gradiente (Gradient Descent).

import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv

dataset = Planetoid(root="/tmp/Cora", name="Cora")
data = dataset[0]

class GCN(torch.nn.Module):
    def __init__(self, in_dim, hid_dim, out_dim, dropout=0.5):
        super().__init__()
        self.conv1 = GCNConv(in_dim, hid_dim)
        self.conv2 = GCNConv(hid_dim, out_dim)
        self.dropout = dropout

    def forward(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = F.dropout(x, p=self.dropout, training=self.training)
        x = self.conv2(x, edge_index)
        return x

model = GCN(dataset.num_features, 16, dataset.num_classes)
opt = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

for epoch in range(1, 201):
    model.train()
    opt.zero_grad()
    logits = model(data.x, data.edge_index)
    loss = F.cross_entropy(logits[data.train_mask], data.y[data.train_mask])
    loss.backward()
    opt.step()

    model.eval()
    pred = logits.argmax(dim=-1)
    acc = (pred[data.test_mask] == data.y[data.test_mask]).float().mean().item()
    if epoch % 20 == 0:
        print(epoch, "loss", float(loss), "test acc", acc)

Principais pontos:

  • A estrutura do grafo é codificada por edge_index (adjacência esparsa).
  • Não é necessária nenhuma ordenação dos nós.
  • Cada camada GCNConv realiza uma rodada de passagem de mensagens.

Exemplo prático: predição de propriedades moleculares (nível de grafo)

Uma molécula é naturalmente um grafo: átomos são nós; ligações são arestas com tipos (simples/dupla/aromática). Um pipeline típico:

  1. Construir atributos de nós (tipo de átomo, valência, aromaticidade etc.)
  2. Construir atributos de arestas (tipo de ligação, conjugação)
  3. Aplicar várias camadas de passagem de mensagens
  4. Agregar embeddings de nós em um embedding do grafo
  5. Predizer uma propriedade (solubilidade, toxicidade, afinidade de ligação)

Em química, usar atributos de aresta é crucial. Muitas implementações usam MPNNs em que (\phi) depende de atributos de ligação, ou camadas especializadas como NNConv, filtros contínuos no estilo SchNet, ou métodos equivariantes (ver direções de “aprendizado profundo geométrico” abaixo).

Onde GNNs se destacam: aplicações

Sistemas de recomendação e personalização

Interações usuário–item formam um grafo bipartido. GNNs podem propagar preferências por vizinhanças de múltiplos saltos (usuário → item → usuário) para melhorar recomendações, especialmente em regimes esparsos.

Exemplos:

  • Sistemas no estilo PinSAGE para recomendação de itens
  • Recomendação baseada em sessão com arestas temporais

Grafos de conhecimento e raciocínio

Grafos de conhecimento contêm arestas tipadas (por exemplo, born_in, works_at). Variantes de GNN podem modelar estrutura relacional, embora muitos métodos para grafos de conhecimento também usem modelos de embedding como TransE/RotatE. Para grafos multirrelacionais, a GCN Relacional (Relational GCN, R-GCN) e arquiteturas relacionadas incorporam explicitamente tipos de aresta.

Tópico relacionado: Grafos de Conhecimento (Knowledge Graphs)

Detecção de fraudes e detecção de anomalias

Transações formam grafos (contas, dispositivos, IPs, comerciantes). Passagem de mensagens pode identificar padrões suspeitos como subgrafos densos, conectividade incomum ou fluxos por intermediários.

Biologia computacional

Redes de interação proteína–proteína, redes regulatórias gênicas e grafos de células a partir de microscopia se beneficiam de modelagem relacional e generalização indutiva.

Visão computacional além de grades

Alguns problemas de visão formam grafos naturalmente:

  • Grafos de cena (objetos como nós, relações como arestas)
  • Grafos de superpixels
  • Malhas 3D e nuvens de pontos (frequentemente usando GNNs geométricas)

Tópico relacionado: Redes Neurais Convolucionais (CNNs)

Linguagens de programação e análise de código

Árvores de sintaxe abstrata (Abstract Syntax Trees, ASTs) e grafos de fluxo de controle (control-flow graphs) podem ser processados com GNNs para tarefas como detecção de vulnerabilidades, autocompletar código e classificação de programas.

Treinamento e escalonamento de GNNs

Lote completo vs mini-lote

Grafos pequenos de benchmark frequentemente usam treinamento em lote completo (full-batch) (todos os nós/arestas de uma vez). Grafos reais (milhões/bilhões de nós) exigem mini-lotes (mini-batch).

Estratégias comuns de escalonamento:

  • Amostragem de vizinhos (estilo GraphSAGE): amostrar um número fixo de vizinhos em cada camada
  • Amostragem de subgrafos: treinar em subgrafos induzidos (abordagens tipo Cluster-GCN)
  • Amostragem por camada: amostrar nós por camada para controlar a explosão
  • Pré-computar atributos (para modelos rasos): por exemplo, simplificar a propagação para eficiência

Suavização excessiva

Conforme a profundidade aumenta, médias repetidas podem fazer embeddings de nós convergirem — nós se tornam indistinguíveis.

Mitigações:

  • Conexões residuais/de salto (skip connections)
  • Métodos de normalização (BatchNorm/LayerNorm)
  • Conexões de Jumping Knowledge (Jumping Knowledge connections) (combinar múltiplas profundidades)
  • Usar arquiteturas que preservem informação de identidade

Compressão excessiva

Informação de um número exponencial de nós distantes é comprimida em vetores de tamanho fixo, prejudicando o raciocínio de longo alcance mesmo quando a profundidade aumenta.

Mitigações e direções de pesquisa:

  • Reconexão/adição de arestas (esparsificação de grafos ou expansores)
  • Codificações posicionais/estruturais
  • Atenção ou roteamento adaptativo de mensagens
  • Modelos híbridos com comunicação global (ver “Transformers de Grafos” abaixo)

Heterofilia (vizinhos podem ser diferentes)

Alguns grafos violam a suposição de homofilia (homophily) (vizinhos compartilham rótulos). Suavização no estilo GCN clássico pode prejudicar.

Mitigações:

  • Usar atenção (GAT) ou métodos assinados/direcionados
  • Usar filtros de ordem superior ou adaptativos
  • Usar modelos projetados para heterofilia (por exemplo, misturar cuidadosamente atributos do ego e dos vizinhos)

Fundamentos teóricos e expressividade

Relação com o teste de Weisfeiler–Lehman

Muitas GNNs de passagem de mensagens são, no máximo, tão expressivas quanto o teste 1-WL em distinguir grafos não isomorfos. Isso significa que existem grafos diferentes que uma GNN não consegue distinguir se o refinamento de cores de WL for idêntico.

GIN foi projetada para ser maximamente expressiva dentro desta família 1-WL sob certas condições (agregação injetiva e MLPs suficientemente poderosas).

Além de 1-WL:

  • GNNs de ordem superior (inspiradas em k-WL)
  • GNNs baseadas em subgrafos
  • Codificações posicionais e atributos estruturais podem ajudar na prática, embora nem sempre mudem garantias de expressividade no pior caso.

Vieses indutivos: por que GNNs generalizam bem em dados relacionais

GNNs embutem suposições úteis:

  • Localidade: nós próximos influenciam uns aos outros
  • Compartilhamento de parâmetros: a mesma agregação/atualização é usada ao longo do grafo
  • Invariância/equivariança a permutações: previsões são consistentes sob reordenação de nós

Isso é análogo a como Redes Neurais Convolucionais (CNNs) usam equivariância a translações em imagens.

GNNs vs Transformers (e direções híbridas)

Modelos Transformer (Transformers) (ver Arquitetura Transformer (Transformer Architecture)) dependem de autoatenção (self-attention) sobre conjuntos/sequências; aplicar autoatenção completa sobre todos os pares de nós de forma ingênua é (O(n^2)), caro para grafos grandes. GNNs escalam melhor em grafos esparsos porque a passagem de mensagens é (O(|E|)) por camada.

A prática atual frequentemente combina ideias:

  • Transformers de Grafos (Graph Transformers): incorporam atenção global com vieses estruturais (distâncias de caminho mínimo, autovetores do Laplaciano, codificações de aresta).
  • Híbridos local+global: algumas camadas de passagem de mensagens mais blocos ocasionais de atenção global.

Esses híbridos buscam melhorar raciocínio de longo alcance e superar compressão excessiva.

Abordagens auto-supervisionadas e de pré-treinamento para grafos

Escassez de rótulos é comum em grafos. Pipelines modernos de GNN frequentemente usam Aprendizado Auto-Supervisionado (Self-Supervised Learning), incluindo:

  • Aprendizado contrastivo (Contrastive Learning) (Aprendizado Contrastivo): maximizar concordância entre embeddings de visões aumentadas do mesmo nó/grafo (atenção: aumentos em grafos podem ser complicados).
  • Predição de atributos mascarados: mascarar atributos de nós/arestas e predizê-los.
  • Predição de contexto: predizer contexto de subgrafo ou papéis estruturais.

O pré-treinamento em grafos (graph pretraining) é uma área ativa, especialmente em química e biologia.

Dicas de implementação e armadilhas comuns

  • Use representações esparsas: listas de arestas (edge_index) são mais eficientes do que adjacência densa para grafos esparsos grandes.
  • Atenção à normalização: normalização por grau (GCN), normalização da atenção (GAT) e normalização de atributos podem afetar significativamente a estabilidade.
  • Inclua auto-laços quando apropriado: muitas camadas assumem que nós passam mensagens para si mesmos para preservar identidade.
  • Cuidado com vazamento: para classificação de nós, garanta que os particionamentos de treino/val/teste evitem usar rótulos de teste durante o treinamento; a estrutura do grafo geralmente é compartilhada, mas os rótulos não podem vazar.
  • Avalie corretamente: alguns benchmarks são sensíveis à estratégia de particionamento (partições aleatórias vs partições fixas).

Quando não usar uma GNN

GNNs nem sempre são a melhor escolha. Considere alternativas se:

  • O grafo for extremamente denso (atenção ou linhas de base de MLP podem ser competitivas).
  • A estrutura for pouco informativa em relação aos atributos (modelos tabulares podem vencer).
  • Você precisar de dependências de muito longo alcance e a profundidade de passagem de mensagens se tornar problemática (considere transformers de grafos ou adicionar atributos globais).
  • O grafo mudar rapidamente e você não puder arcar com re-treinamento frequente (procure métodos de streaming/temporais).

Resumo

GNNs estendem o aprendizado profundo (deep learning) a grafos usando passagem de mensagens: agregam iterativamente informações de vizinhos para aprender representações de nós, arestas e grafos. Arquiteturas como GCN, GraphSAGE, GAT e GIN diferem principalmente em como agregam e normalizam mensagens, e em quão expressivas são. Na prática, o sucesso de GNNs depende de estratégias de escalonamento (amostragem), do tratamento cuidadoso de questões relacionadas à profundidade (suavização excessiva/compressão excessiva) e do alinhamento do modelo às propriedades do grafo (homofilia vs heterofilia, atributos de aresta, heterogeneidade).

Elas são uma família central de arquiteturas, ao lado de MLPs, Redes Neurais Convolucionais (CNNs), RNNs/LSTMs e Arquitetura Transformer (Transformer Architecture), fornecendo uma forma poderosa e fundamentada de aprender com dados relacionais.