18. Graph Neural Networks-GNN

juhyeok99·2022년 12월 4일
0

AI_tutorial

목록 보기
14/15

Graph Neural Networks for Capturing Dependencies in Graph Structured Data

그래프 데이터, 즉 그래프 신경망(GNN)에서 작동하는 딥 러닝 모델의 클래스를 소개할 것이다.

GNN은 다음과 같은 다양한 영역에 적용 할 수 있다.

먼저 GNN을 설명하기전에 그래프라는 개념부터 알아야한다.

넓게 말하면, 그래프는 우리가 데이터에서 관계를 설명하고 포착하는 특정 방식을 나타낸다. 그래프는 비선형적이고 추상적인 특정한 종류의 데이터 구조이다. 그리고 그래프는 추상적인 객체이기 때문에 그래프가 작동할 수 있도록 구체적인 표현이 정의되어야 한다. 또한 그래프는 서로 다른 표현을 필요로 하는 특정 속성을 갖도록 정의할 수 있다. 그림 1에는 일반적인 유형의 그래프가 요약되어 있다.

Fig 1. Common types of graphs

Undirected garphs

무방향 그래프(undirected graph)는 노드의 순서와 연결이 중요하지 않은 모서리를 통해 연결된 노드(그래프 이론에서는 정점이라고도 함)로 구성된다. 그림 2는 무방향 그래프의 두 가지 전형적인 예, 친구 그래프 및 화학 결합을 통해 연결된 원자로 구성된 화학 분자의 그래프를 보여준다(이러한 분자 그래프는 나중에 더 자세히 설명할 것이다).

Fig 2. Two examples of undirected graphs

Directed garphs

위에 섹션에서 설명한 무방향 그래프와 달리 방향 그래프는 방향 에지를 통해 노드를 연결합니다. 수학적으로 이들은 변의 집합인 E가 순서쌍의 집합이라는 점을 제외하고는 무방향 그래프와 같은 방식으로 정의된다.
Fig 3. An example of a directed graph






implementing a basic graph convolution

Fig 4. A representation of a graph

그림 4는 nxn 인접 행렬 A와 nxfin 노드 특징 행렬 X에 의해 지정된 노드 레이블을 가진 무방향 그래프를 나타내며, 여기서 유일한 특징은 녹색(G), 파란색(B) 또는 주황색(O)의 각 노드 색상의 원핫 표현이다.

NetworkX를 사용하여 그림 4에 표시된 그래프를 다음과 같이 구성할 수 있습니다.

>>> import numpy as np
>>> import networkx as nx
>>> G = nx.Graph()
... # Hex codes for colors if we draw graph
>>> blue, orange, green = "#1f77b4", "#ff7f0e", "#2ca02c"
>>> G.add_nodes_from([
... (1, {"color": blue}),
... (2, {"color": orange}),
... (3, {"color": blue}),
... (4, {"color": green})
... ])
>>> G.add_edges_from([(1,2), (2,3), (1,3), (3,4)])
>>> A = np.asarray(nx.adjacency_matrix(G).todense())
>>> print(A)
[[0 1 1 0]
[1 0 1 0]
[1 1 0 1]
[0 0 1 0]]
>>> def build_graph_color_label_representation(G, mapping_dict):
... one_hot_idxs = np.array([mapping_dict[v] for v in
... nx.get_node_attributes(G, 'color').values()])
>>> one_hot_encoding = np.zeros(
... (one_hot_idxs.size, len(mapping_dict)))
>>> one_hot_encoding[
... np.arange(one_hot_idxs.size), one_hot_idxs] = 1
>>> return one_hot_encoding
>>> X = build_graph_color_label_representation(
... G, {green: 0, blue: 1, orange: 2})
>>> print(X)
[[0., 1., 0.],
[0., 0., 1.],
[0., 1., 0.],
[1., 0., 0.]]

두 개의 가중치 행렬 W1과 W2는 각각의 열이 개별 필터인 필터 뱅크로 간주할 수 있다. 이 필터 설계는 그래프 데이터 이전의 로컬리티가 유지될 때 가장 효과적입니다. 만약 노드의 값이 훨씬 더 멀리 떨어진 다른 노드의 값과 높은 상관관계가 있다면, 단일 컨볼루션은 그 관계를 포착하지 못할 것이다. 그림 5과 같이 컨볼루션을 쌓으면 더 먼 관계를 포착할 수 있습니다(단순성을 위해 편향을 0으로 설정).

Fig 5. Capturing relationships from a graph

Fig 6. The convolutions implemented on the graph and the message form

이전 섹션에서는 그래프 컨볼루션 연산을 이해하고 구현하는 데 초점을 맞췄다. 이 섹션에서는 처음부터 시작할 경우 이러한 방법을 그래프에 적용하는 방법을 설명하기 위해 그래프 신경망의 기본 구현에 대해 설명합니다. 이 접근법이 복잡해 보이는 경우에는 걱정하지 마십시오. GNN은 구현하기에 상대적으로 복잡한 모델입니다. 따라서 그래프 신경망의 구현과 데이터 관리를 용이하게 하는 도구를 제공하는 PyTorch 지오메트리를 사용하면 된다.






Defining the NodeNetwork model

우리는 GNN의 PyTorch를 처음부터 끝까지 구현하는 것으로 이 섹션을 시작할 것이다. 우리는 NodeNetwork라고 부르는 주요 신경망 모델을 시작으로 하향식 접근을 할 것이다. 그리고 나서 개별 세부 사항을 채울 것이다.

import networkx as nx
import torch
from torch.nn.parameter import Parameter
import numpy as np
import math
import torch.nn.functional as F
class NodeNetwork(torch.nn.Module):
def __init__(self, input_features):
super().__init__()
self.conv_1 = BasicGraphConvolutionLayer (
input_features, 32)
self.conv_2 = BasicGraphConvolutionLayer(32, 32)
self.fc_1 = torch.nn.Linear(32, 16)
self.out_layer = torch.nn.Linear(16, 2)
def forward(self, X, A, batch_mat):
x = F.relu(self.conv_1(X, A))
x = F.relu(self.conv_2(x, A))
output = global_sum_pool(x, batch_mat)
output = self.fc_1(output)
output = self.out_layer(output)
return F.softmax(output, dim=1)

방금 정의한 NodeNetwork 모델은 다음과 같이 요약할 수 있습니다.

  1. 두 개의 그래프 컨볼루션(self.conv_1과 self.conv_2)을 수행합니다.
  2. 나중에 정의할 global_sum_pool을 통해 모든 노드 임베딩을 풀링합니다.
  3. 풀링된 임베딩을 두 개의 완전히 연결된 레이어(self.fc_1 및 self)를 통해 실행합니다.아웃레이어)
  4. softmax를 통해 클래스 멤버쉽 확률 출력

각 계층이 수행하는 작업에 대한 시각화와 함께 네트워크의 구조가 그림 7에 요약되어 있습니다.

Fig 7. A visualization of each neural network layer






Summary

우리가 접근할 수 있는 데이터의 양이 계속 증가함에 따라, 데이터 내의 상호 관계를 이해해야 할 필요성도 증가할 것이다. 이 작업은 여러 가지 방법으로 수행되지만, 그래프는 이러한 관계를 증류식으로 표현하기 때문에 사용 가능한 그래프 데이터의 양은 증가할 뿐입니다.
이 장에서는 그래프 컨볼루션 레이어와 GNN을 처음부터 구현하여 그래프 신경망을 처음부터 설명했다. 그래프 데이터의 특성으로 인해 GNN을 구현하는 것이 실제로 매우 복잡하다는 것을 알았다. 따라서 분자 편광 예측과 같은 실제 사례에 GNN을 적용하기 위해, 우리가 필요로 하는 많은 빌딩 블록의 구현을 제공하는 PyTorch 기하학 라이브러리를 활용하는 방법을 배웠다. 마지막으로,GNN 문헌에 더 깊이 들어가기 위해 주목할 만한 문헌들을 검토했다.

profile
아이디어가 고픈 상태

0개의 댓글