GraphSAGE·GAT·Node2Vec로 설계하는 그래프 표현 학습

GraphSAGE, GAT, Node2Vec의 표현 학습 방식과 확장성·일반화 특성, 샘플링·서빙·검증 설계 기준을 정리한다.

2026-08-14 · 최초 발행 2025-10-14

그래프 임베딩에서 먼저 정할 문제

그래프 표현 학습은 노드·엣지·서브그래프를 연속 벡터 공간에 임베딩해 후속 태스크를 다루기 쉽게 만드는 방법론이다. 그래프 규모와 연결 관계가 복잡해질수록 전통적인 GCN만으로는 확장성과 정확도를 함께 맞추기 어려워진다.

선택 기준은 미관측 노드나 서브그래프까지 일반화해야 하는지에 있다. GraphSAGE와 GAT는 귀납적 일반화를 지원하는 반면, Node2Vec는 전이적 성격이 강하다. 이웃 집계, attention, biased random walk는 각 접근을 가르는 핵심 연산이다.

이웃을 다루는 방식이 다른 모델들

GraphSAGE는 샘플링으로 대규모 그래프를 다룬다

GraphSAGE는 K-계층 이웃을 샘플링하고 Mean, MaxPool, LSTM 집계기로 특징을 모아 임베딩을 학습한다. 미니배치 기반으로 처리할 수 있어 대규모 그래프에서 선형 확장성을 확보한다.

이웃의 특징을 함수로 일반화하는 파라미터 구조이므로 신규 노드 추론도 가능하다. 대신 샘플링 크기와 깊이는 정보 손실과 비용 사이의 트레이드오프를 만든다.

GAT는 이웃마다 다른 가중치를 학습한다

GAT는 self-attention 계수(α)를 사용해 이웃 메시지를 가중합한다. 이웃의 중요도를 동적으로 반영하며, 헤드 수를 늘리면 표현력을 높일 수 있다.

다만 헤드와 밀집 연산은 비용을 키울 수 있다. sparse attention 최적화와 헤드·채널 수 제어가 운영 조건이 된다.

Node2Vec는 랜덤워크에서 구조 신호를 찾는다

Node2Vec는 p, q 파라미터로 DFS/BFS 성향을 조절한 랜덤워크 시퀀스를 Skip-gram으로 학습한다. 구조적 동질성과 근접성의 균형을 제어할 수 있다.

노드 식별자에 의존하는 경향이 있어 신규 노드 일반화에는 한계가 있다. 그래프가 커지면 워크 병렬화와 네거티브 샘플링 성능 튜닝이 필요하다.

학습 경로와 분기 조건

데이터에서는 특징 정규화와 자기루프 추가를 수행하고, 이질 그래프에는 타입별 변환을 적용한다. 태스크에 따라 분류에는 cross-entropy, 링크 예측에는 BCE 또는 마진 손실을 선택하며 네거티브 샘플링 비율도 설정한다. 검증은 OOTV(시간 분할)와 노드·엣지 홀드아웃으로 구성하고, 배포 단계에서는 임베딩 캐싱·버전관리와 온라인 추론 경량화를 준비한다.

작음GraphSAGEGATNode2Vec아니오에러 처리입력: 그래프 G(V,E), X(특징)전처리:정규화/자기루프/형상검증그래프 규모/메모리 한계?Neighbor Sampling 설정(fanout K, 깊이 L)Full-batch/층별 샘플링모델 선택집계: Mean/MaxPool/LSTMSelf-Attention, 다중헤드Biased Random Walk (p,q)학습: 미니배치 최적화Skip-gram + NegativeSampling클래스 불균형?가중 손실/오버샘플링기본 설정출력:임베딩/예측(노드·링크·그래프)결측/단절 컴포넌트?컴포넌트 단위 학습/특징 대치

확장성, 일반화, 운영성을 함께 비교하기

기법 성능(정확도) 확장성 일관성/일반화 안정성(훈련 수렴) 운영 편의
GraphSAGE 중~상, 구조정보 반영 매우 높음, 미니배치 샘플링 귀납적 일반화 우수 샘플링 분산 관리 필요 프로덕션 친화, 온라인 추론 적합
GAT 상, 이질 이웃 가중 효과 중, 헤드·밀집 연산 비용 귀납적, 소수 클래스에 강점 하이퍼파라미터 민감 최적화 필요, 서빙 비용 중
Node2Vec 중, 구조적 유사성 포착 높음, 워크 병렬화 유리 전이적, 신규 노드 한계 안정, SGNS 성숙 오프라인 파이프라인 용이

데이터·태스크·자원에 따라 편차가 발생한다.

추천, 탐지, 연결 보강에서의 선택

추천·랭킹에서는 대규모 사용자·아이템 그래프에 GraphSAGE를 적용해 온라인 유사 아이템 추론을 서빙하고, Node2Vec를 오프라인 초기 임베딩 구축에 사용할 수 있다. CTR·전환 예측에서는 GAT로 희소 연결 중 중요한 이웃을 강조한다.

다중 계정이나 자금 흐름 그래프의 사기 탐지·위험 관리에서는 GAT로 지역적 이상치 감지를 강화하고, 클래스 불균형에는 가중 손실을 적용한다. 링크 예측과 지식 그래프 보강에는 GraphSAGE와 Node2Vec를 혼합해 후보 링크를 재랭킹하며, 시간 분할 검증으로 누수를 막는다.

단백질-단백질 상호작용 네트워크에서는 GAT로 상호작용 점수를 예측할 수 있다. 공급망 의존 그래프에서는 GraphSAGE로 리스크 전파 점수를 산출한다.

샘플링 GNN을 도입하면 대규모 그래프에서 학습 스루풋을 310배 개선하고 메모리 사용량을 4070% 절감할 수 있다. 하드웨어와 설정에 따라 차이가 난다. Node2Vec 기반 후보 확장으로 추천의 cold-start를 완화해 Recall@50이 5~15%p 개선된 사례도 보고됐다. 도메인 의존성이 있다.

배치와 온라인을 분리해 설계하기 쉬워지고, GAT의 Attention 시각화는 중요 이웃을 확인하는 설명 가능성에도 도움이 된다.

샘플링과 검증을 먼저 고정한다

Neighbor Sampling은 L=2~3, fanout=[15,10]부터 탐색한다. L을 과도하게 키우면 over-smoothing이 발생할 수 있다. 링크 예측은 학습과 검증을 시간 축으로 나눠 누수 방지 절차를 둔다.

GraphSAGE 집계기는 Mean→MaxPool→LSTM 순으로 복잡도가 높아진다. 드롭아웃과 LayerNorm은 안정성 확보에 사용한다. GAT는 헤드 수 48과 hidden 채널 축소로 FLOPs를 제어하고, Sparse matmul 또는 커스텀 커널을 적용한다. Node2Vec는 walk_length 4080, walks_per_node 1020, window_size 510, negative 5~10 범위에서 p/q 그리드 탐색을 수행한다.

데이터로더 병목은 PyG NeighborLoader 또는 DGL NodeDataLoader로 줄이고 CSC/CSR 희소 포맷을 사용한다. 더 큰 그래프에는 Cluster-GCN, GraphSAINT 같은 파티셔닝과 체크포인트, 혼합정밀(AMP)을 적용한다.

서빙에서는 임베딩 캐시와 FAISS 근접검색을 조합한다. GraphSAGE와 GAT는 신규 노드를 특징 기반으로 즉시 추론할 수 있지만, Node2Vec는 주기적 재학습 배치 운영이 필요하다.

노드 분류는 F1, AUROC로, 링크 예측은 Hits@K, MRR로 평가한다. OOTV는 현실적인 성능 추정에 사용한다. 엣지 분포와 차수 분포, 임베딩 코사인 분산을 추적해 드리프트를 감지한다. 개인정보를 포함한 특징은 익명화·집계화하고, 멤버십 추론 같은 공격 표면을 고려해 노이즈 주입의 트레이드오프를 검토한다.

최소 실행 예시 코드

사전 조건:

  • Python 3.10+, PyTorch 2.x, torch-geometric 2.5+ 또는 DGL 1.1+ (최신 정보 확인 필요)
  • GPU 권장, CUDA 가능 환경

GraphSAGE (PyTorch Geometric)

# pip install torch torch-geometric torch-scatter torch-sparse
import torch
from torch_geometric.nn import SAGEConv
from torch_geometric.loader import NeighborLoader
from torch_geometric.datasets import Planetoid

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

class SAGE(torch.nn.Module):
    def __init__(self, in_ch, hid, out_ch):
        super().__init__()
        self.conv1 = SAGEConv(in_ch, hid)
        self.conv2 = SAGEConv(hid, out_ch)
    def forward(self, x, edge_index):
        x = torch.relu(self.conv1(x, edge_index))
        x = torch.dropout(x, p=0.5, train=self.training)
        x = self.conv2(x, edge_index)
        return x

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

loader = NeighborLoader(data, input_nodes=data.train_mask, num_neighbors=[15, 10], batch_size=1024)

for epoch in range(50):
    model.train()
    for batch in loader:
        opt.zero_grad()
        out = model(batch.x, batch.edge_index)[batch.input_id]
        loss = torch.nn.functional.cross_entropy(out, batch.y[batch.input_id])
        loss.backward()
        opt.step()

GAT (PyTorch Geometric)

from torch_geometric.nn import GATConv

class GAT(torch.nn.Module):
    def __init__(self, in_ch, hid, out_ch, heads=8):
        super().__init__()
        self.gat1 = GATConv(in_ch, hid, heads=heads, dropout=0.6)
        self.gat2 = GATConv(hid*heads, out_ch, heads=1, concat=False, dropout=0.6)
    def forward(self, x, edge_index):
        x = torch.relu(self.gat1(x, edge_index))
        x = torch.dropout(x, p=0.6, train=self.training)
        return self.gat2(x, edge_index)

Node2Vec (PyTorch Geometric 내장)

from torch_geometric.nn.models import Node2Vec

device = "cuda" if torch.cuda.is_available() else "cpu"
n2v = Node2Vec(data.edge_index, embedding_dim=128, walk_length=40, context_size=10,
               walks_per_node=10, num_negative_samples=5, p=1.0, q=0.5, sparse=True).to(device)
loader = n2v.loader(batch_size=128, shuffle=True)
optimizer = torch.optim.SparseAdam(list(n2v.parameters()), lr=0.01)

for epoch in range(5):
    n2v.train()
    total_loss = 0
    for pos_rw, neg_rw in loader:
        optimizer.zero_grad()
        loss = n2v.loss(pos_rw.to(device), neg_rw.to(device))
        loss.backward()
        optimizer.step()
        total_loss += loss.item()

대규모 데이터에서는 NeighborLoader, GraphSAINT, Cluster-GCN 등의 샘플링이 필요하다. GAT는 헤드 수를 조정해 메모리 제약에 대응한다. 링크 예측에는 edge split과 negative sampling 모듈을 활용하고, 임베딩 서빙을 위해 정규화와 인덱싱 체계를 마련한다.

운영 목적에 맞춘 도입 순서

온라인 서빙과 귀납적 추론이 중심이면 GraphSAGE가 적합하다. 중요 이웃의 가중을 반영해 정확도를 높여야 하는 구간에는 GAT를 적용하되 비용과 최적화 난이도를 감안한다. 단순하고 빠른 오프라인 임베딩이 목적이면 Node2Vec가 출발점이 될 수 있다.

구조 신호는 Node2Vec로 탐색하고, GraphSAGE로 프로덕션화를 진행한 뒤 고정밀 구간에 GAT를 부분 적용하는 순서를 고려할 수 있다. 시간 분할 평가, 샘플링 전략, 서빙 캐시 체계는 모델 선택과 동시에 설계한다.

그래프 임베딩GraphSAGEGATNode2Vec그래프 신경망