스탠포드 강의를 듣고 정리한 내용입니다.
지난 포스팅에서는 단일 레이어에서 GNN이 어떻게 동작하는지 살펴보았습니다.
이번 포스팅에서는 단일 레이어를 어떻게 쌓는지 한번 살펴보겠습니다.
Stacking Layer
앞의 포스팅에서 단일 레이어를 배웠으니 이제 쌓아서 여러 계층의 GNN을 만들어 봅시다. 일반적으로 딥러닝 모델에서 레이어를 쌓는다고 하면, 더 "깊은"계층을 가지게 됩니다. 하지만 GNN에서는 깊이라기 보다는 너비의 의미가 강한데요. 더 깊게 쌓을 수록 더 멀리있는 노드의 정보를 받을 수 있습니다. 즉, GNN에서 깊은 계층이란 거쳐올 hop의 수를 뜻합니다.
아키텍처를 한번 그려보자면, 다음과 같이 그릴 수 있습니다.
초기 임베딩 값인 xv을 받아서 각 GNN layer를 거치고, 결과로 나온 값을 또 다른 계층의 GNN layer에 넣는 것이죠.
깊게 쌓을 수록 더 멀리있는 노드 정보를 얻을 수 있으니 깊게 쌓는게 좋은거 아닌가? 라는 생각을 하실 수 있는데요.
여기서 Over-smoothing 문제가 발생합니다.
Over-smoothing
Over-smoothing이란 모든 노드의 값이 비슷하게 수렴하는 경우를 뜻합니다. GNN의 목적 자체가 각각 노드의 특징을 잘 살려서 임베딩 하는 것인데, 모든 노드가 같아져버리면 그 목적에 어긋나게되죠.
그렇다면 왜! 이런 문제가 생기는 걸까요?
여기서 Receptive Field개념이 등장하게 됩니다. Receptive Field란 현재 기준이 되는 노드의 임베딩을 결정짓는(영향을 주는) 노드의 집합을 뜻합니다.
위의 그림에서 파란색 부분이 바로 receptive field입니다.
조금더 자세히 보자면 다음과 같이 나타낼 수 있습니다. 노란색이 기준이 되는 노드이고, 빨간색이 receptive field입니다.
layer가 깊어질수록 점점 범위가 넓어집니다.
여기서 over-smoothing문제를 한번 생각해볼까요?
대부분의 기준 노드에서 3-layer GNN을 봤을때도 위와 같이 영향을 받는 노드 범위가 굉장히 넓어질것입니다.
즉, 각 노드의 receptive field 집합이 매우 많이 겹치게 되는 것이죠. receptive field는 기준 노드의 임베딩에 영향을 미치는데, 그 재료들이 같다면 노드 임베딩이 비슷하게 되겠죠?
여기서 기준 노드를 두개로 설정한다면, layer가 깊어질수록 공유되는 노드 수는 빠르게 증가합니다.
그렇다면 GNN에서는 layer를 조금만 쌓아야할까요? 이 문제를 어떻게 해결해야할까요?
해결 방법
여기서는 크게 3가지의 해결 방법을 제시하고 있습니다.
1. Increase the expressive power within each GNN layer
이 방법은 정말 GNN layer를 많이 쌓지 않는 방법입니다. GNN layer를 많이 쌓아도 문제지만, 너무 적게 쌓을 경우에는 그 표현력이 떨어지게 되는데요. 이러한 부분을 보완하고자 GNN layer 내에 fc계층을 쌓아 표현력을 풍부하게 늘리는 방법입니다.
즉, GNN layer를 쌓지 말고 Transformation 혹은 Aggregation 내에서 fc레이어를 추가하면 됩니다.
2. Add layers that do not pass message
over-smoothing의 본질적인 문제는 receptive field를 너무 많이 거쳐왔기 때문인데요. 여기서 GNN layer 자체를 수정하는 것이 아닌, 모델 자체를 깊게 쌓는 방법입니다.
3. Add skip connections
skip connection이라는 것을 추가할 것인데요. 이것을 간단하게 이야기하자면 residual connection을 생각하시면 됩니다.
즉, 이전 노드와 GNN layer를 거친 노드 두개를 더해서 노드의 embedding으로 사용하는 방법이죠.
수식으로 그 변화를 보자면 아래와 같습니다.
초기 노드의 receptive field는 많이 겹치지 않는 경우가 많을텐데요. 이렇게 임베딩된 노드를 잘 유지하면서 각 계층을 거친다면, 깊은 레이어를 거치더라도 레이어 정보들을 더 잘 구분해줄것입니다.
실제 각 layer의 수식은 다음과 같이 나타낼 수 있습니다.