Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
이전 글에서는 GNN의 Computation Graph와 Aggregation 방법에 대해 정리하였다.
요약하면 각 GNN의 각 Layer에서는 이웃 노드가 보내는 메시지와 이들을 취합하는 Aggregation 단계가 이루어진다.
그다음 단계는 Layer끼리는 어떻게 결합해야 하는 가이다.
최종적으로는 어떤 목적 함수를 만들고 어떻게 학습시켜 나갈지 결정해야 한다.
GNN Layer
GNN Layer는 node 자신과, 그 이웃의 노드 embedding을 input들로 다음 node embedding을 만든다.
Message computation은 이전의 node embedding을 어떻게 다음 노드로 transfer 하는 가를 결정한다.
간단히 W라는 가중치 메트릭스를 곱해주어 전달하는 방식도 있을 수 있다.
Aggregation 단계에서는 취합한 message들을 하나의 벡터로 압축시켜야 한다.
간단히 하면, 합, 평균, 최대 값을 사용하는 방식을 예로 들 수 있다.
단, 이런 방식은 target node 자체의 성질이 아닌 이웃 노드에서만 성질을 전달받아 반영한다.
따라서 해당 노드 자신의 embedding 정보도 반영해 주어야 한다.
자신의 embedding 값은 다른 이웃 노드들과는 다르게 별도의 메트릭스 B로 곱해 준다.
이제 이웃 노드들의 메시지 m(u)와 자신의 메시지 m(v)를 이어 붙이거나 더해주는 방식으로 Aggreation에 반영시킨다.
이제 Aggregation으로 생성된 출력 값을 비선형 활성화 함수로 계산해주면 하나의 Layer가 완료된다.
이제부터 Classic 한 GNN 모델들을 살펴보자.
GCN (Graph Convolution Networks)
GCN에서는 이웃 노드들의 embedding 값을 v의 degree로 normalize 하여 값을 합하였고,
이를 가중치 메트릭스 W와 곱한 후, 활성화 함수로 최종 출력을 결정하였다.
이때 가중치 매트릭스를 이동시켜 Message 단계와 Aggregation 단계로 식을 나눌 수 있다.
GraphSAGE
graphSAGE는 GCN에서 Aggregation 방식을 두 단계로 변형한 모델이다.
1단계에서는 일단 node v의 이웃 노드의 embedding들을 aggregation 하고,
2단계에서 이를, v자신의 이전 층에서의 embedding 값과 이어 붙인(concat) 후, 가중치와 활성화 함수를 적용한다.
1단계의 Aggregation 함수는 Message computation를 포함하고, 아래의 3가지가 존재한다.
Mean: 이웃들의 가중치 평균값 (GCN과 동일)
Pool: Message computation 단계에 MLP를 적용하고, 그 결과에 Mean 또는 Max를 진행한다.
embedding 된 vector들을 각기 다른 크기를 가질 수 있다.
따라서 모든 Laye 마다 L2 정규화를 진행해 주자.
값을 범위를 맞춰주는 것이 최종적으로 성능 향상에도 도움이 된다.
Graph Attention Networks (GAT)
Attention wieghts가 v로 오는 u의 중요도를 의미한다.
GCN과 GraphSAGE는 Attention wieghts를 단순히 v의 degree로 나누었다.
이는 모든, 이웃이 동일한 중요도를 가지게 되므로, 핵심적인 이웃 노드의 embedding을 제대로 반영하기 힘들다.
따라서 attetion 기법으로 중요한 input 데이터에 가중치를 주고, 나머지는 fade-out 시키는 방식을 취하자.
물론, attetion weight도 학습시켜 나가야 한다.
attetion weight에 대한 자세한 내용은 강의 영상을 참고하자.
GNN Layer 설계
일반적인 GNN Layer 모델에 modern deep learning modulue 추가하면 더 나은 성능을 기대할 수 있다.
대표적으로 BatchNormalization, Dropout, Activate function 등을 적용할 수 있다.
Layer 쌓기
Layer 간에 서로를 쌓는 방식은 어떻게 만들까?
위의 3개의 layer 층에서, 첫 층은 이전 층이 없으므로 node의 feature를 받아오고,
이제부터는 이전 층의 embedding 값을 input으로 받아 진행하게 된다.
GNN에서는 Layer 층을 많이 쌓으면 발생하는 문제들이 있다.
Over-smoothing problem은 모든 노드가 동일한 embedding 값으로 수렴하게 되는 것이다.
Receptive field는 target node의 embedding에 영향을 주는 노드들의 집합이다.
위에서 확인할 수 있듯이, 3 layer만 가더라도 그래프 내의 거의 모든 노드들이 target node에 영향을 주게 된다.
결국, 자신의 embedding을 결정하기 위해 모든 노드들을 확인해야 한다.
이러한 그래프에서 몇 가지의 target node들이 공유하는 노드를 찾는다면, 거의 모든 노드를 서로 공유하게 된다.
다시 생각해 보자.
GNN은 이웃 노드로 부터 embedding 값을 가져와 계산을 진행한다.
위의 3가지 노란색의 노드를 3 Layer로 계산하면, 이 계산에 그래프의 거의 모든 노드를 동일하게 사용하고, 결국 embedding 값도 굉장히 비슷한 값이 나오게 된다.
이처럼 이웃에게 너무 많은 정보를 가져오면, 모든 노드들이 비슷하게 embedding 되어 발생하는 문제가 Over-smoothing problem 문제이다.
따라서 층이 많은 GNN이 항상 좋은 것이 아니다.
또한 필요한 Receptive field를 분석할 필요도 있다.
그렇다면, 적은 GNN layer로도 높은 성능을 낼 수 있는 방법이 있을까?
1. 각 Layer 층의 성능을 높인다.
기존의 message computation과 aggregation 방식에 MLP를 적용한다.
2. GNN의 앞뒤로 MLP Layer를 추가한다.
Pre-process layer에서 node들의 각 feature를 잘 반영할 수 있도록 encoding 한다.
예를 들어 node가 각각 image를 의미한다면 CNN을 적용할 수 있다.
GNN Layer 들 이후에는 Post- process layers를 추가하여 embedding의 출력을 잘 반영하도록 한다.
또한 GNN Layer에 Skip connection을 추가할 수 있다.
항상 최종 layer의 값이 좋은 embedding 결과를 내는 것은 아니다.
따라서 이전 layer에서의 embedding 값이 다음 embedding에도 영향을 미치도록 설계한다.
혹은 다음 layer가 전혀 영향 미치지 않도록 skip 할 수도 있다.
다음 layer를 반영, 혹은 반영하지 않는 것으로 2^N의 path가 생성된다.
이 path들을 mix 하는 것으로 더 나은 성능을 기대해 볼 수 있다.
Skip layer는 1개 이상의 layer를 skip 하는 방식도 선택할 수 있다.
참조
강의 자료: http://web.stanford.edu/class/cs224w/index.html
강의 영상: https://www.youtube.com/watch?v=JAB_plj2rbA&list=PLoROMvodv4rPLKxIpqhjhPgdQy7imNkDn
참조 게시글: https://velog.io/@tobigsgnn1415/7.-Graph-Neural-Networks-2
'개발 > GNN' 카테고리의 다른 글
Attention 간단 정리 (0) | 2023.02.23 |
---|---|
Seq2Seq 간단 정리 (0) | 2023.02.23 |
[논문 리뷰] LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation (0) | 2023.01.05 |
[GNN] Graph Neural Networks - 1 (0) | 2023.01.03 |
[GNN] node embedding 방법 정리 (0) | 2023.01.03 |