작성자: 이정은
해당 포스팅은 ToBigs GNN스터디에서 발표를 진행했습니다.
https://velog.io/@tobigsgnn1415/7.-Graph-Neural-Networks-2
위 그림과 같이 일반적인 GNN의 framework는 다음과 같고, GNN을 디자인하는 방법을 총 5가지로 나눠서 볼 수 있습니다. 오늘 강의에서는 이 중 3단계까지에 대해서만 다룹니다. 간단하게 설명하자면
GNN Layer = Message + Aggeration은 핵심적인 요소로 이 과정을 어떻게 하느냐에 따라서 GCN, GraphSAGE, GAT 등의 GNN 그래프 종류가 나눠집니다.
Layer Connectivity: 어떻게 multi layer를 쌓을건지를 결정하는 부분으로, 일반적으로 sequential하게 층을 쌓고 옵션으로 skip connection도 추가할 수 있습니다.
단일 GNN layer에서는 이전 계층에서 넘어 온 하위 벡터 집합의 Message Computation을 진행하고, 나온 결과들을 Message Aggeration 과정을 거쳐 하나의 단일 벡터로 압축시킵니다.
Message 함수()는 이전 계층에서 넘어온 각 노드의 정보, 표현을 transform하여 다음 층으로 보낼 message를 만들어냅니다.
예시로 weight matrix 를 함수로 사용하여 노드 feature와 곱하여 linear하게 변형하는 방법이 있습니다.
Aggregation은 특정 노드 v가 있을 때, 이의 이웃 노드들인 u의 메세지를 모두 집계하여 하나의 벡터로 압축시키는 과정입니다. Aggerator로 쓰이는 함수()에는 대표적으로 가 있고 이는 모두 permutation invariant한 순서에 영향을 받지 않는 함수라는 특징이 있습니다.
위와 같은 Aggregation 과정을 거치면 노드 v의 이웃 노드들에 대한 정보만 계산되어 가 에 직접적으로 의존하지 않습니다. 따라서 노드 v 자기 자신에 대한 정보가 소실되는 문제가 발생합니다.
이를 해결하는 방법은 계산에 값을 포함하는 것입니다.
Message computation 할 때에는 자신 노드와 이웃 노드들에 다른 함수를 사용합니다.
Aggregation은 기존 방식과 동일하게 이웃 노드들의 message를 집계한 이후에 자기 자신에서온 message를 concatenation 혹은 summation으로 집계합니다.
Message와 Aggregate 과정은 모두 선형 함수입니다. 따라서 비선형성을 더해주기 위해 activation function을 통과시킵니다. 이 과정은 더 좋은 표현력을 만들어주기 때문에 매우 중요한 과정입니다. 로 주로 쓰이며, 등의 함수가 있습니다.
Message Computation과 Aggregation에 따른 몇 가지 중요한 GNN 모델을 살펴보고자 합니다.
GCN은 지난 강의에서도 다뤘던 가장 기본적인 GNN 모델입니다.
해당 수식을 message와 aggregation으로 나눠서 살펴보면
각 노드의 메세지는 node degree로 normalize를 진행합니다.
노드 v의 이웃 노드 u의 메세지를 합산하고, 활성 함수를 거칩니다.
GraphSAGE는 GCN을 기반으로 확장된 모델로, aggregation에서 차이점을 가집니다.
Message는 내에서 계산되고, aggregation은 두 가지 과정을 거칩니다.
GraphSAGE에서의 는 단순 합계뿐만 아니라 다양한 함수를 사용할 수 있습니다.
그리고 이웃 노드들의 계산 결과와 이전 계층의 자기 자신에 대한 정보를 concat하여 활성 함수를 거칩니다.
종류에는 크게 3가지가 있습니다.
Mean: GCN과 동일한 방법으로, 이웃들의 가중 평균값을 구합니다.
Pool: Message computation으로 MLP를 사용하여 non-linear하게 만들고, 이를 Mean 혹은 Max하여 집계를 도출해냅니다.
LSTM: 이웃들로부터 오는 Message sequence model에 LSTM을 사용할 수 있습니다. 다만, sequence model은 order invariant하지 않으므로 훈련할 때 이웃들의 순서를 resuffle해야 합니다.
추가로 모든 layer의 임베딩 벡터에 L2 normalization을 적용할 수 있습니다.
이를 진행하면 모든 벡터는 같은 l2-norm 즉, 길이가 1인 벡터가 됩니다. 기존 임베딩 벡터의 크기나 길이가 많이 다른 경우에는 정규화를 하고 나면 성능이 향상됩니다.
GAT는 이웃 노드에 대한 중요도를 나타낸 attention weights를 추가한 모델입니다.
해당 식에서 는 노드 v로 오는 노드 u의 message에 대한 중요도를 나타냅니다.
기존 GCN과 GraphSAGE에서는 중요도를 즉, node degree로 나눠서 표현했다고 볼 수 있습니다. 이렇게 되면 중요도는 노드 u에 상관없이 노드 v에만 의존하여 이웃 노드 u는 모두 같은 중요도를 가지게 됩니다.
그러나 모든 이웃들은 같은 중요도를 갖고 있지 않습니다. 따라서 attention weight는 중요한 부분에 포커스를 맞추고 나머지는 fade out 시켜, 신경망이 중요한 곳에 컴퓨팅 파워를 쏟을 수 있게 합니다. 어떤 부분이 중요한지는 다 다르기 때문에 attention weight는 훈련을 통해 학습됩니다.
Attention mechanism 를 가지고 attention weight 를 계산합니다. 전체적인 과정은
먼저, 노드 u, v의 message를 기반으로 두 노드의 attention coefficients 를 계산합니다. 이때 는 노드 v로 오는 노드 u의 message에 대한 중요도를 나타냅니다.
그리고 정규화시킨 를 final attention weight 에 넣습니다. 이때 softmax 함수를 사용하여 노드 v에 대한 모든 의 합은 1이 됩니다.
최종적으로 final attention weight 을 기반으로 weighted sum을 합니다.
Attension mechanism 가 simple single-layer nueral network라고 했을 때, 파라미터 a는 weight matrix 와 함께 end-to-end로 학습됩니다.
Multi-head attention은 각각 다른 파라미터 즉, 다른 attention coefficient로 여러 개의 을 구해서 이를 aggregation해 최종 로 사용합니다.
기존 attention에서 를 랜덤하게 초기화시키면 local minimum에 빠져 학습과 수렴에 문제가 발생할 수 있습니다. multi-head attention은 각각의 를 다 합치기 때문에 모델을 robust하고 stabilize하게 바꿔 이러한 문제를 해결할 수 있습니다.
Attention Mechanism의 주된 benefit은 서로 다른 이웃에 대해 다른 중요도를 지정할 수 있다는 것입니다. 이는 추가적으로 다음과 같은 이점을 가집니다.
Computatiionally efficient: 모든 엣지에 대해 병렬 계산이 가능하고, 모든 노드에 대해 병렬적으로 aggregation이 가능합니다.
Storage efficient: sparse matrix에는 O(V+E) 이상은 저장되지 않고, 그래프의 크기에 상관없이 파라미터의 개수가 고정되어 있습니다.
Localized: local network neighborhoods에만 의존합니다.
Inductive capability: edge-wise mechanism과 공유가 가능하고, 이는 global graph structure에는 의존하지 않습니다.
더 좋은 성능을 내기 위해 GNN layer를 디자인할 때, modern deep learning modules를 포함시킬 수 있습니다.
Batch Normalization은 노드 임베딩의 batch마다 평균이 0, 분산이 1이 되게 정규화를 진행합니다. 이는 신경망 훈련을 안정적으로 할 수 있게 합니다.
Dropout은 훈련 시 신경망을 regularize하여 더 robust하게 만들고 overfitting을 방지할 수 있습니다. 훈련할 때에는 확률 p만큼 랜덤하게 뉴런을 0으로 바꿔 사용하지 않고, 테스트 시에는 모든 뉴런을 사용합니다.
GNN에서의 dropout은 message function의 linear layer에 적용됩니다. 따라서 message computation을 거치고 나면 dropout이 진행되어 있는 형태가 됩니다.
앞서 계속 했듯이 message computation과 agggregation을 거쳐 나온 임베딩 벡터에 activation function을 더해 non-linear하게 만들 수 있습니다. 주로 쓰이는 함수로는 가 있는데, 이 중 Parametric ReLU는 ReLU보다 더 좋은 성능을 냅니다.
요약하자면 modern deep learning modules를 GNN layer에 포함시켜 더 좋은 성능을 내는 GNN layer를 디자인할 수 있습니다. 이 분야는 아직도 활발히 연구 중에 있습니다.
기본적으로 GNN layer는 sequencial하게 연결합니다. 특정 노드 feature 가 input으로 들어오면 연결된 GNN layer들을 거쳐 노드 임베딩 이 ouput으로 출력됩니다.
너무 많은 개수의 GNN layer를 쌓다보면 over-smoothing 문제가 발생합니다. 이는 모든 임베딩이 같은 값으로 수렴하게 되는 것을 말합니다.
K-layer GNN의 각 노드는 K-hop neighborhood의 receptive field를 가지게 되는데 이게 깊어지면 깊어질수록 GNN 거의 대부분을 포함하게 됩니다.
임베딩은 receptive filed에 속한 노드들에 의해 결정되기 때문에 그림과 같이 두 노드가 high-overlapped receptive field를 갖는다면 거의 동일한 임베딩 값을 갖게 됩니다.
그렇다면 over-smoothing을 어떻게 해결할 수 있을까?
즉, GNN에서는 층이 많다고해서 꼭 좋은 결과를 내지는 않는다는 것을 알 수 있습니다.
따라서 층의 개수를 너무 많지 않도록 그래프의 직경 등 문제를 해결하는데 필요한 receptive field를 구해내고, 이보다 조금 더 많은 수를 GNN layer 개수로 설정합니다.
반대로 레이어의 개수가 너무 적을 때, GNN의 표현력을 높이는 방법으로는 크게 두 가지가 있습니다.
첫 번째로 message transformation과 aggregation을 deep neural network로 바꾸는 것입니다. 이렇게 되면 기존의 single layer가 3-layer로 바뀌게 됩니다.
두 번째는 GNN layer의 앞 뒤로 MLP layer를 추가하는 방법입니다. Pre-processing layer는 노드 feature를 인코딩할 때 중요한 역할을 하고, Post-preprocessing layer는 노드 임베딩을 가지고 추론하거나 변환할 때 중요한 역할을 합니다. 실제로 이렇게 레이어를 추가하는 방법은 더 좋은 표현을 만들어 냅니다.
만약 위 방법들을 사용해도 아직 레이어의 개수가 부족하다면, skip connection을 추가합니다.
우리는 이전 계층의 노드 임베딩이 노드를 더 잘 구별할 수 있다는 것을 알았기 때문에, skip connection을 추가하여 이전 계층이 최종 임베딩에 끼치는 영향을 증가시킵니다.
Skip connection은 이전 계층과 현재 계층을 weight combination하여 혼합 모델을 만듭니다. N개의 skip connection이 있을 때, 모델은 총 개가 생성되고, 얕은 층의 GNN과 깊은 층의 GNN이 자동으로 혼합되어 표현을 더 효과적으로 생성해낼 수 있습니다.
이를 수식으로 나타내면 왼쪽과 같습니다.
그리고 만약 마지막 계층으로 skip connection을 진행한다면, 최종 계층은 이전 계층의 모든 노드 임베딩에서 직접 aggregate하게 됩니다.
Design GNN framework