GNN 프레임워크 (2) 레이어 연결

문재경·2023년 2월 28일
0
post-thumbnail

GNN 프레임워크

GNN 모델의 프레임워크에 대해 단계적으로 살펴보고 있다.

  1. Message
    : GNN 레이어에서 이웃 노드들로부터 메시지를 계산하는 방법
  2. Aggregation
    : GNN 레이어에서 이웃 노드들의 메시지를 취합하는 방법
  3. Layer connectivity
    : 신경망 형태로 만들기 위해 여러 레이어를 쌓는(연결하는) 방법
  4. Graph augmentation
    : 입력 그래프를 적절하게 수정하는 방법
  5. Learning objective
    : task에 따른 모델의 학습 방향

하나의 GNN 레이어는 1) Message computation과 2) Aggregation의 두 단계의 연산으로 구성되었다.

이제 이러한 레이어 여러 개로 GNN 모델을 구성해보자.

1. The standard way

일반적인 방법은 레이어를 연속적으로 쌓는 것이다. 예를 들어 3개의 레이어로 구성된 GNN 모델은 다음과 같이 나타낼 수 있다.

첫 레이어의 입력으로는 노드의 가공되지 않은 feature 벡터를 사용한다(𝐡𝑣(0)=𝐱𝑣)(𝐡_𝑣^{(0)}=𝐱_𝑣). 이후 레이어를 거치면서 임베딩 벡터로 계산되고, 마지막 LL번째 레이어의 출력을 최종 노드 임베딩으로 사용한다(𝐡𝑣(L)=𝐳𝑣)(𝐡_𝑣^{(L)}=𝐳_𝑣).

2. Issue of stacking

다만, GNN의 특성 상 신경써야 하는 부분이 있다. GNN에서는 레이어의 개념이 조금 다르기 때문이다. 입력 그래프를 학습하는데 있어 구조적인 특징을 반영하기 위해 message passing을 기본 전제로 함에 따라, 레이어의 수(깊이)는 노드 임베딩 계산에 몇 번째 이웃까지 포함시킬지를 의미하게 된다. 레이어를 추가할수록 더 먼 이웃으로부터 정보를 가져와 계산에 반영하게 되며, 이렇게 한 노드의 임베딩 계산에 반영되는 노드들의 집합이 GNN의 receptive field에 해당한다.

다시 말해, GNN에서 receptive field는 레이어 수 만큼의 hop에 해당하는 이웃 노드들까지를 포함하며 해당 노드의 임베딩을 결정하는 집합을 의미한다.

노란색으로 표시한 노드의 receptive field를 빨간색으로 표시하였다. 레이어 수가 늘어날수록 빨간색으로 표시된 노드가 많아지는 것을 볼 수 있다.
레이어가 1개인 경우엔 노란색과 직접적으로 연결된 이웃 노드들만 receptive field에 포함되지만, 레이어를 하나 추가하여 2개로 구성한 모델에서는 레이어가 1개일 때의 receptive field에 해당하는 노드들과 직접적으로 연결된 이웃 노드들까지 receptive field에 포함된다. 레이어를 3개까지 늘려 모델을 구성하면 receptive field가 크게 증가하여 거의 모든 노드에 걸쳐 있게 된다.

'Receptive field가 넓어지면 그만큼 더 많은 정보를 노드 임베딩 계산에 반영할 수 있는 거 아니야?'라고 생각할 수 있겠지만 문제가 있다. 그래프에 존재하는 노드 수는 한정적인데 receptive field가 증가하면 겹치는 부분이 반드시 발생한다.

이번에는 노란색으로 표시한 노드가 두 개다. 그리고 두 노란색 노드가 공유하는 이웃 노드를 빨간색으로 표시하였다. 두 노드가 직접적으로 연결된 1-hop 이웃 노드 중에서는 겹치는 노드가 단 1개지만, 이웃의 이웃인 2-hop 이웃 노드까지 고려하면 20개로 늘어난다. 3-hop에 이르러서는 그래프 내의 대부분의 노드가 빨간색으로 표시된다.

예시 그래프에서 3-레이어 모델처럼, 거의 모든 그래프에 걸쳐 있는 receptive field는 제대로 기능하지 못한다. Receptive field로부터 정보를 가져와 노드 임베딩을 결정해야 하는데, 어떤 노드이던 간에 정보를 가져오는 소스가 같다면 최종적으로는 비슷한 결과로 수렴할 것이기 때문이다. 이러한 현상을 over-smoothing problem이라 한다.

Over-smoothing problem은 모델이 노드를 구분하기 어렵게 만든다. 최종 노드 임베딩은 그 노드를 잘 설명하는 벡터인데, 모든 노드의 임베딩이 비슷한 값으로 수렴하면 임베딩으로는 서로 다른 노드들을 구분할 수 없어진다. 이러한 상황에서 도출된 노드 임베딩을 바탕으로 노드나 그래프 분류, 링크 예측 등의 task를 수행하는 모델은 그 성능을 기대하기 어렵다. 따라서 레이어를 쌓아 GNN 모델을 만드는데 있어 반드시 over-smoothing problem의 발생을 고려해야 한다.

3. Design GNN layer connectivity

레이어를 쌓아 GNN 모델을 구성하는 상황으로 돌아오자.

Over-smoothing problem을 생각하면 적은 수의 레이어로 얕은 모델을 구성할 수 밖에 없다. CNN과 다르게 깊게 쌓인 레이어가 성능 향상을 가져오지 않기 때문이다. 이에 따라 문제 상황에서 필수적인 receptive field의 수준에 대한 분석 후, 그보다 조금 넓은 receptive field를 갖도록 레이어를 쌓아 모델을 구성할 수 있다.

얕은 모델은 일반적으로 파라미터의 수가 적기 때문에 깊은 모델에 비해 표현력(expressive power)이 떨어지는 한계가 있다. 학습 과정에서 입력 데이터, 즉 그래프로부터 가져올 수 있는 정보가 비교적 제한적인 것이다. 다행히도 레이어를 깊게 쌓지 않으면서 표현력을 증가시킬 수 있는 방법이 있다.

3.1. GNN 레이어 자체의 파라미터 수 증가

단일 레이어의 파라미터 수가 같다면, 깊은 모델이 얕은 모델보다 파라미터 수가 많은 건 단순히 레이어가 많기 때문이다. 여기서 얕은 모델을 구성하는 레이어의 파라미터 수를 증가시킨다면 얕은 모델도 깊은 모델만큼 많은 수의 파라미터를 통해 표현력을 확보할 수 있다.

단일 레이어 내의 message computation & aggregation 과정에서, 예로 들었던 간단한 선형 변환이 아니라 다층 신경망과 같은 방법을 적용하면 레이어를 구성하는 파라미터 수를 늘리는 것이 가능하다.

3.2. GNN 레이어 앞뒤로 GNN이 아닌 레이어 추가

또 다른 방법은 message를 전달하지 않는 레이어를 추가하는 것이다. Over-smoothing problem은 결국 receptive field가 방대해져 발생하는 문제이고, receptive field는 GNN 레이어를 지나면서 점차 증가하는 것을 확인하였다. GNN 모델이라고 해서 반드시 GNN 레이어로만 구성될 필요는 없으며 오히려 특정 task 수행을 위해서는 레이어들을 필요로 한다.

이에 따라 GNN 레이어로 구성된 부분은 얕게 쌓되, 그 앞뒤로 GNN이 아닌 레이어를 추가하여 전체 모델은 깊게 쌓는다면 모델의 표현력을 향상시킬 수 있다. MLP나 CNN과 같은 레이어들은 message를 전달하지 않기 때문에 receptive field를 증가시키지 않으면서 특정 대상에 대해 장점을 가진다. 예를 들어 이미지나 텍스트가 노드라면 먼저 CNN을 통해 노드의 feature를 임베딩할 수 있고, GNN을 통해 임베딩한 결과를 더 복잡한 신경망에 통과시켜 분류 작업을 수행할 수도 있다.

3.3. Skip Connetion

그런데 언젠가는 모델을 얕게 쌓는 것이 어려울 수도 있다. 그런 경우에는 skip connection을 사용할 수 있다.

앞서 언급하였듯, over-smoothing problem은 깊게 쌓인 GNN 레이어를 지나면서 방대해진 receptive field에서 기인한다. 여기서 receptive field가 증가하는 양상을 최종 레이어에서 초기 레이어가 아니라, 초기 레이어에서 최종 레이어 방향으로 생각해보자. GNN에서 초기 레이어는 멀리 떨어져 있는 이웃 노드를 의미한다.

멀리 떨어져 있는 이웃 노드에서 점차 레이어를 지날수록 receptive field는 증가한다. 오히려 초기 레이어에서 도출한 정보는 더 적은 수의 이웃, 즉 receptive field가 방대해지기 이전에 계산되었기 때문에 노드를 더 잘 구분할 수 있다. Skip connection은 이러한 정보가 여러 레이어를 거치면서 소실되는 것을 막고 최종 노드 임베딩에 영향을 줄 수 있도록 한다.

Skip connection을 도식화하면 다음과 같다.

레이어를 통과하기 전의 입력 𝐱𝐱와 레이어를 통과한 후의 출력 F(𝐱)ℱ(𝐱)를 더한 결과를 활성 함수에 통과시켜 다음 블록으로 전달한다.
GCN을 예로 들어보자. GCN에서 레이어 내의 연산을 수식으로 나타내면 다음과 같았다.

𝐡𝑣(𝑙)=σ(𝐖(𝑙)𝑢𝑁(𝑣)𝐡𝑢(𝑙1)𝑁(𝑣))𝐡_𝑣^{(𝑙)}=\sigma(𝐖^{(𝑙)}∑_{𝑢∈𝑁(𝑣)}{𝐡_𝑢^{(𝑙−1)}\over|𝑁(𝑣)|})

여기서 활성 함수 σ()\sigma(\cdot)를 통과하기 전의 𝐖(𝑙)𝑢𝑁(𝑣)𝐡𝑢(𝑙1)𝑁(𝑣)𝐖^{(𝑙)}∑_{𝑢∈𝑁(𝑣)}{𝐡_𝑢^{(𝑙−1)}\over|𝑁(𝑣)|}F(𝐱)ℱ(𝐱)가 되며 skip connection을 적용하여 식을 F(𝐱)+𝐱ℱ(𝐱)+𝐱로 나타내면 다음과 같아진다.

𝐡𝑣(𝑙)=σ(𝐖(𝑙)𝑢𝑁(𝑣)𝐡𝑢(𝑙1)𝑁(𝑣)+𝐡v(𝑙1))𝐡_𝑣^{(𝑙)}=\sigma(𝐖^{(𝑙)}∑_{𝑢∈𝑁(𝑣)}{𝐡_𝑢^{(𝑙−1)}\over|𝑁(𝑣)|}+𝐡_v^{(𝑙−1)})

기존에는 이웃 노드로부터 message를 계산하고 aggregation한 결과를 활성 함수에 통과시켜 중심 노드의 임베딩을 구했으나, skip connection을 적용하면 이웃 노드로부터 계산한 message를 aggregation한 결과에 연산되지 않은 노드 임베딩 𝐡v(𝑙1)𝐡_v^{(𝑙−1)}를 더해 활성 함수에 통과시키게 된다.

이렇게 skip connection을 이용하면 얕은 모델과 깊은 모델이 혼합된 모델을 사용하는 효과를 얻을 수 있다. Skip connection은 그 작동 원리를 통해 모델이 해당 레이어를 통과할지 말지를 결정해주기 때문이다. 따라서 NN개의 skip connection은 모델로 하여금 2N2^N가지의 경로로 정보를 보낼 수 있도록 만든다.

이를 통해 모델은 때에 따라 적은 수의 레이어를 통과하는 얕은 모델로도, 많은 수의 레이어를 통과하는 깊은 모델로도 기능할 수 있다.

Skip connection을 사용하는 방식에 있어 또 다른 방법은 모든 레이어에 대한 입력을 바로 최종 레이어로 보내는 것이다.

이 방법에서는 마지막 레이어에서 앞선 레이어들에서 구해진 모든 임베딩을 합쳐 최종 임베딩을 출력한다.

profile
안녕하세요...

0개의 댓글