Deep learning

[딥러닝] Graph Neural Networks(GNN) 2 - GNN : GCN, subgraph embedding, graph attention network(GAT), HAN, GTN

공돼 2022. 8. 11. 00:45

https://u-b-h.tistory.com/7 에서 shallow encoder node embedding 방법인 random walk, Deep walk, node2vec, metapath2vec을 다루었습니다.

 

이 글은 그 shallow encoder 방식의 한계점을 보완하고자 더 DNN 스러운 deep한 방법인 GNN 에 대해서 설명하고자 합니다. GNN은 graph structure data를 위한 DNN입니다.

 더 쉽게 이전 글에서 다뤘던 node embedding 으로 설명하면, GNN에 graph를 넣으면 각 node들의 embedding vector가 출력으로 나옵니다. 즉 node embedding task에서 GNN은 embedding vector를 만들어내는 function이라고도 볼 수 있습니다. 이제 더 이상 vertex 갯수 만큼의 vector를 가지고 있지 않아도 되며, 이 function을 통해 vector를 구할 수 있다고 생각하면 됩니다. 

 

추가로 GNN의 graph data setup은 vertex 집합인 V, adjacency matrix A와 node feature matrix인 X가 주어집니다. 

 

base aggregation GNN

 

GNN의 기본원리는 인접한 node들을 기반으로 node embedding을 하는 것입니다. 

여기서 입력인 layer 0에 들어가는 node vector는 미리 주어진 data인 node feature를 사용합니다. 

box는 이웃한 node 정보를 합치고 이를 matrix를 곱한 후 non linear function을 통과시키는 과정 입니다. 

aggregation을 어떻게 하느냐에 따라 GCN, GAT 등으로 달라지게 됩니다. 

 

구하고 싶은 특정 v 의 embedding vector는 아래 식으로 계산합니다. aggregation 식이라고도 합니다. W와 B가 학습되는 parameter이고 h는 layer마다 계산되어 나오는 값입니다. 

여기서 알아야할 것은 W와 B는 layer마다 하나만 있고 같은 layer에서 모든 node의 embedding을 구할 때 같은 W와 B를 사용합니다. 이렇게 layer마다 W, B가 공통으로 존재하기 때문에 layer 수만 같다면 이미 학습된 W와 B를 가지고 처음 보는 graph에 대해서도 embedding이 가능해짐니다. 이러한 특성을 inductive capability라고 합니다. 

위 방식을 보면 layer 하나가 쌓일 때마다 시작 node에서 1 hoop 씩 멀어짐을 알 수 있습니다. 여기에서 문제가 하나 있습니다. 실 graph에서는 5 hoop 이면 모든 node가 연결이 됩니다. 따라서 layer 를 5개 이상 쌓게되면 필요 이상의 관계가 파악되고 이는 oversmoothing을 일으키게 됩니다. 그래서 GCN에서 layer는 3개 정도를 씁니다. 

 

학습을 위해서는 loss와 optimizer를 선택해야하는데 이 떄는 task에 맞게 loss와 optimizer를 택하여 학습하면 됩니다.

unsupervied learning으로 node embedding 을 학습하고 싶다면 지난 글에서 설명한 random walk, node2vec, deepwalk 의 loss function을 사용해도되고, node classification과 같은 특정 task를 위한 학습을 한다면 loss function을 정의하여 학습하면 됩니다. 

 

GCN (graph convolutional networks, ICLR'17 )

 

GCN은 aggregation 식을 아래와 같이 사용한다는 것이 다릅니다. basic 식과 비교해보면 B가 없어지고, 자기자신에 대한 이전 layer embedding 값도 같이 aggregation 하고 W를 통해 변환하며, aggregation 할 때 normalization이 추가되었습니다. 

 

 

GAT ( graph attention networks, ICLR'18 )

GCN 까지는 node aggregation을 평균을 내왔는데, 더 잘 합치는 방법이 없을까 ? 라는 생각에서 제안되어서 attention 으로 합친다는 idea 입니다.

attention을 이용해 aggregation 함으로써 inductive learning에 성능 한계가 있었던 GCN을 보완하여 inductive learning에서도 좋은 성능을 내게 됩니다. 

 

 

sub graph embedding

 

지금까지 설명한 것은 node embedding 을 위한 방법으로 볼 수 있습니다. node embedding이 graph embedding의 전부는 아니다보니, sub graph 를 embedding 은 어떻게 할까요 ? 

 

sub graph를 embedding 하는 방법은 쉽게생각하면 sub graph에 속한 node embedding을 어떻게 합칠지에 대한 문제 입니다. 

쉽게는

1. sub graph 에 속한 node embedding을 평균낼 수도 있고,

2. DNN에서 fully connected layer 처럼 virtual node 하나를 붙이고 GNN을 통과시켜 virtual node의 embedding을 sub graph embedding으로 쓸 수도 있습니다. 

 

HAN (WWW' 19)

이후에는 heterogeneous graph에 대해서도 처리를 하기 위한 연구인 HAN이 있습니다. HAN은 metapath가 있는 heterogeneous graph에 대한 embedding을 다루었습니다. 각 metapath 마다 node-level attention을 해서 embedding 하고 semantic-level attention을 통해 어떤 metapath에 가중치를 줄지 정하여 합치는 방법을 사용합니다. 

 

GTN ( NeurIPS'19 )

기존 metapath가 있는 heterogeneous graph를 다룬 연구들은 metapath는 사전에 알고 있는 지식을 활용하여 이를 모델에 심어줬습니다.

GTN은 metapath 또한 모델이 찾아내도록 한다는 아이디어 입니다. heterogeneous graph 정보를 이용해서 metapath를 합성해내고 이렇게 새로 합성된 metapath graph를 GCN을 통해 embedding 하는 방식입니다.