# Pytorch Geometric
PyG : agregate() in MessagePassing & _collect()
aggregation() 에서 사용하는 index 는 MessagePassing 의 _collect() 가 만든 dictionary 리턴 값

PyG : propagate() in MessagePassing
https://github.com/pyg-team/pytorchgeometric/blob/master/torchgeometric/nn/conv/message_passing.py

PyG : MessagePassing,
https://github.com/pyg-team/pytorch_geometric https://github.com/pyg-team/pytorchgeometric/blob/master/torchgeometric/nn/conv/message_passing.py
Pytorch Geometric - Message Passing Network
0. Graph Convolution GNN은 CNN과 유사하게 convolution 연산을 수행한다. 다만, 그래프의 불규칙한 구조를 반영할 수 있도록 기존의 1D 또는 2D convolution가 아닌 graph convolution 연산을 사용한다. 아래 그림 출처) Graph convolution 연산의 핵심은 노드를 임베딩함에 있어 엣지로 연결된 노드들, 즉 이웃 노드들의 정보를 활용하는 것이다. 하나의 중심 노드에 대해, 그 노드가 이웃하는 노드들의 정보를 하나로 모아 중심 노드를 표현할 수 있는 벡터로 출력한다. 이러한 과정은 이웃 노드들이 엣지를 따라 중심 노드로 정보를 전달한다는 측면에서 **message passing

GNN과 NeighborSampler
Task에 따라 적합한 그래프 로드 방식이 있다 만약 회귀 예측을 목표로 하고 있다면, 전체 그래프에서 지역적인 이웃 정보를 사용하여 추론하는 작업이 필요하다. 그럴 때는 Data로 그래프를 구성한 뒤, DataLoader를 바로 사용해서는 원하는 결과를 얻을 수 없다. 아마도 수많은 인덱스 에러를 마주칠 것이다. 그 이유는 바로 Pytorch Geometric의 DataLoader가 주로 노드 분류나 그래프 분류 작업에 사용되고, 이런 작업은 일반적으로 그래프 데이터를 배치 처리하는 데 초점을 맞추기 때문이다. 그래서 어떻게 해결할까? 이 문제를 해결하려면 NeighborSampler를 사용하면 된다. 그러면 각 미니 배치에 대해 지역적인 그래프 정보를 샘플링할 수 있다. 즉, 배핑된 인덱스를 사용해 직절한 피쳐를 로드하는 것은 DataLoader와 NeighborSampler의 결합을 통해 이루어진다. 과정 Data 객체 생성: 데이터를

Graph Data의 Batch 학습 (DataLoader, Custom DataLoader)
그래프 데이터도 배치 단위로 모델에 넣을 수 있다. DataLoader() 메서드를 사용하면 된다. 다시 말해, Graph Data를 모델에 넣기 위해서는 먼저 DataLoader를 설정하고, 그 다음 학습 과정을 구현해야 한다. DataLoader DataLoader() 메서드는 기본 PyTorch 데이터 로더다. 반면, PyTorch Geometric에서는 그래프 데이터를 처리하기 위한 목적으로 별도의 데이터 로더를 제공한다. 이를 DataLoader라고 부르며, torch_geometric.data.DataLoader에서 찾을 수 있다. torch_geometric.data.DataLoader는 그래프 데이터와 관련된 몇 가지 주요 기능을 제공한다. 그래프 데이터를 배치로 분할 노드 및 엣지 인덱스를 자동으로 업데이트 연속적인 그래프 구조를 유지 특히, 그래프 데이터를 다룰 때 torch_geometric.data.DataLoader를 사용하는 것이

Graph data Split : 그래프 데이터 분할
Graph Data를 train-test 셋으로 나누는 가장 일반적인 방법은 노드 기반 분할(Node-based splitting)과 엣지 기반 분할(Edge-based splitting)이다. 노드 기반 분할과 엣지 기반 분할의 차이점은 데이터 분할의 핵심이 노드 정보인지 엣지 정보인지에 있다. 또한 Task마다 Graph 분할 방법은 그래프의 구조와 모델의 목적에 따라 선택하는 것이 좋다. Split Fundamentals 그래프 데이터를 분할하는 원리는 전체 데이터를 무작위로 섞은 후, 지정한 비율에 따라 노드 또는 엣지를 train과 test 셋으로 분할하는 것이다. 노드에 대한 정보를 기반으로 학습하고 예측하는 것이 중요한 경우에는 Node-based splitting 방식으로 그래프의 노드를 분할하고, 엣지에 대한 정보를 기반으로 학습하고 예측하는 것이 중요한 task라면 그래프의 엣지를 분할하는 Edge-based splitting을 진행한다. No

Graph Data와 교차 검증
Graph Data로도 교차 검증(Cross validation)이 가능하다. 다시 말해, 일반적인 ML 학습처럼 train-test 분할이 가능하다는 것이다. 여기엔 두 가지 방법이 있다. 1. Edge 기반 split 그래프의 일부 엣지를 테스트용으로 제거하고, 나머지 엣지를 사용해 모델을 학습한 다음, 제거된 엣지를 예측하는 데 사용한다. 실행 방법 전체 그래프에서 일부 엣지를 무작위로 선택하여 테스트 셋으로 분할 테스트 셋으로 분할된 엣지를 그래프에서 제거. 이로 인해 학습 셋이 된다. 학습 셋을 사용하여 모델을 학습시키고, 제거된 엣지를 예측하는 데 사용. 이 과정을 k번 반복하여 k-fold 교차 검증을 실행한다. 2. Node 기반 split 일부 노드를 테스트 셋으로 선택하고, 해당 노드와 연결된 엣지를 테스트 셋에 포함시키는 방법이다. 엣지가 노드로 바뀔 뿐, 프로세스는 Edge 기반 split과 동일하다. 유저가 상품에 남길 평

Pytorch Geometric 튜토리얼
0. PyG Pytorch Geometric, 줄여서 PyG는 그래프 신경망(GNN)을 쉽게 작성하고 훈련할 수 있도록 PyTorch를 기반으로 구축된 라이브러리다. 그래프 혹은 불규칙한 구조에 대해 여러 논문에서 제안된 딥러닝 기법들로 구성되어 있다. 1. 데이터 1.1. 데이터 핸들링 PyG에서 다루는 데이터는 그래프다. 이에 따라 그래프를 torch_geometric.data.Data 클래스를 통해 데이터 형태로 변환한다. 예를 들어, 그림과 같이 3개의 노드로 구성된 그래프를 PyG에서 정의된 데이터로 변환해보자. 그래프 내의 노드들은 모두 1개의 feature를 갖고 있고, 이들 중 노드 0과 1, 노드 1과 2는 방향성이 없는 엣지로 연결되어 있다. 이러한 정보들을 텐서로 표