GNN 프레임워크 (3) 모델 학습

문재경·2023년 3월 12일
0
post-thumbnail

GNN 프레임워크

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

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

GNN 모델이 message computation & aggregation을 수행하는 GNN 레이어들이 쌓여 만들어지는 것은 알았다. 또한, 그 과정에서 더 좋은 모델을 만들기 위해 적용할 수 있는 기법들에 대해 학습하였다.

이제 GNN 모델은 만들었으니 이 모델을 학습시키는 과정으로 시선을 옮기는 절차를 밟아보도록 하자.

1. Graph manipulation

그 전에, 한 가지 짚고 넘어가야 하는 것이 있다. 지금까지는 모델에 초점을 두다보니 입력 되는 그래프는 이상적인 형태로 가정했었다. 따라서 입력 그래프가 곧바로 계산을 위해 사용될 수 있었지만, 실제로 입력되는 그래프가 반드시 이상적일 것이라는 보장은 없다. 모델이 임베딩하기 어려운 그래프들이 있으며 이것들은 입력되기 전에 적절하게 수정되어야 한다.

1.1. Feature가 부족한 입력 그래프

일단 message 계산에 사용되어야 할 노드 feature가 없으면 레이어를 통해 전달될 message가 없어 학습에 차질이 생긴다. 이 경우 feature augmentation을 사용할 수 있다. 각 노드에 특정 상수를 배정하거나 one-hot 벡터를 이용하여 고유한 ID를 배정하는 방식이 일반적이다.

동일한 상수를 노드들에 feature로 부여하면 각 노드의 feature가 갖는 의미는 없지만 GNN을 통해서는 전체적인 그래프 구조의 학습이 가능하다. 또한, 1차원 feature를 사용하기 때문에 연산에 있어 강점을 가지며, 동일한 값을 부여함에 따라 새로운 노드가 추가되더라도 적용이 가능하다.

반면, one-hot 벡터를 이용해 노드에 고유 ID를 부여하면 각 노드들이 ID를 통해 구분됨에 따라 노드의 고유한 정보를 유지할 수 있다. 하지만 새로운 노드가 추가될 때마다 ID를 다시 부여하여 학습을 진행해야하며, 노드가 많아지면 그만큼 feature의 차원도 늘어나 연산량이 증가하게 된다.

노드 feature가 있긴 한데 feature augmentation을 사용해야 하는 상황도 있다. 입력 그래프의 구조가 GNN 모델이 학습하기 어려울 때도 feature augmenation이 사용될 수 있는데 cycle 구조를 갖는 그래프가 그 예이다.

Cycle 구조의 그래프가 있을 때, 그 그래프가 몇 개의 노드로 이뤄졌던 간에 각 노드는 두 개의 이웃 노드만을 갖는다. GNN 모델은 이웃 관계를 통해 그래프의 구조적 특징을 학습하기 때문에, 노드 수에 관계 없이 항상 같은 계산 그래프를 갖는 cycle 구조의 그래프들을 구분할 수가 없다.

Cycle count를 노드 feature로 사용한다면 GNN 모델이 cycle 그래프들을 구분할 수 있게 해줄 수 있다. 예를 들어 3개의 노드가 형성하는 cycle에 어떤 노드가 속해있다면 길이가 3인 cycle을 의미하는 one-hot 벡터를 해당 노드의 feature로 부여하는 것이다. 이를 통해 cycle 구조에 속한 노드가 몇 개의 노드로 이뤄진 cycle에 속해있는지를 GNN이 구분하여 학습에 반영하는 것이 가능하다.

Cycle 구조의 그래프는 한 가지 예이며 이 외에도 입력 그래프의 구조를 GNN이 학습하기 어려운 경우, 그래프의 구조가 반영된 feature를 노드에 부여함으로써 해결이 가능하다. 즉, 구조를 학습하기 어려우니 그 구조에 대한 정보를 노드에 담아버리는 것이다. 여기에는 Clustering coefficient나 PageRank, centrality 등의 여러 방법들이 사용될 수 있다.

1.2. 너무 sparse한 그래프

그래프가 sparse하다는 건, 노드들이 있을 때 그 노드들을 연결하는 엣지들이 적음을 의미한다. 노드들의 연결 관계가 부족하기 때문에 충분히 message를 주고 받을 수 있도록 깊은 모델을 필요로 한다. 이 때, 가상의 노드나 엣지의 추가를 통해 이러한 필요성을 제거할 수 있다.

가상의 노드를 추가한다면 그 노드는 그래프에 존재하는 기존 노드들과 모두 연결되도록 만든다.

이렇게 하면 원래 그래프에서 먼 이웃이었던 노드들도 가상의 노드를 통해 2의 거리로 연결될 수 있다.
(Node A - Virtual node - Node B)

가상의 엣지를 추가한다면 2-hop의 이웃들까지 가상의 엣지로 연결하는 방법이 대표적이다. 원래 그래프의 인접행렬인 AA에다가 2-hop 이웃을 나타내는 A2A^2을 더한 A+A2A+A^2을 GNN 모델에 입력하는 것이다.

논문-저자 관계를 나타내는 bipartite 그래프를 예로 들면, 2-hop의 이웃들을 연결하는 가상 엣지는 저자들의 공동 연구 관계를 나타낼 수 있다.

1.3. 너무 dense한 그래프

노드들이 너무 빽빽하게 연결되어 있으면 message를 전달하는 과정 상의 많은 연산량이 학습을 방해한다. 크리스티아누 호날두의 인스타그램 팔로워 수가 2023년 3월 7일 기준 5.5억 명인데 호날두의 인스타그램 계정을 하나의 노드로서 임베딩할 때 5.5억 개의 계정을 이웃 노드로 간주하여 message passing을 수행하면 그 때의 연산량은 매우 많을 것이다.

호날두의 노드 임베딩을 보다 효율적으로 계산하기 위해서는 5.5억 명의 팔로워 중 message를 전달할 팔로워들을 무작위로 샘플링하는 방법을 이용해야 한다.

예를 들어, 노드 A의 임베딩 계산에서 랜덤 추출한 결과로 노드 B와 D만이 message를 전달하였다면, 모델의 다른 어딘가에서 노드 A의 임베딩을 계산할 때는 다시 랜덤 추출한 결과를 사용하는 것이다.

이를 통해, 모델의 반복적인 학습 과정에서 노드 A의 임베딩을 계산하는 그래프가 매번 다르게 구성될 수 있다. 그렇게 여러 번의 학습에서 모든 이웃을 포함시킨다면 모든 이웃을 사용하여 학습시켰을 때와 비슷한 결과를 적은 연산량으로 얻을 수 있게 된다. 하지만 랜덤 샘플링 과정에서 중요한 정보가 담긴 이웃 노드가 계산에서 제외될 수 있는 리스크는 존재한다.

1.4. 너무 큰 그래프

그래프의 크기가 너무 크면 그에 따른 계산 그래프를 GPU가 감당할 수 없는 문제가 있다. 이는 전체 그래프를 부분 그래프로 나눠 접근하는 방법이 사용될 수 있는데, 이 부분은 추후에 다룬다고 한다..

2. Prediction with GNNs

결국 모델은 task를 수행하여 얻어지는 손실함수 값을 바탕으로 업데이트를 해나간다. 이제까지는 입력 그래프에서 노드 임베딩을 얻는 과정에 대한 내용을 다루었다면, 지금부터는 노드 임베딩을 활용하는 방법에 관한 내용을 다룬다.

2.1. Prediction Head

기본적으로 예측을 수행하는 모델에 대해서, 그래프 내에서 예측하고자 하는 대상에 따라 다른 형태의 head를 필요로 한다. 다음과 같이 크게 3가지로 나눌 수 있다.

2.1.1. Node-level prediction

노드 수준에서는 GNN을 통해 계산된 dd차원의 노드 임베딩 {𝐡v(L)R𝑑,vG}\lbrace𝐡_v^{(L)}\inℝ^𝑑,\forall v\in G\rbrace을 곧바로 이용하면 된다. 수식으로는 다음과 같이 나타낼 수 있다.

𝐲^v=Headnode(𝐡𝑣(𝐿))=𝐖(𝐻)𝐡𝑣(𝐿)\hat{𝐲}_v=Head_{node}(𝐡_𝑣^{(𝐿)})=𝐖^{(𝐻)}⁡𝐡_𝑣^{(𝐿)}

노드 vv의 임베딩 𝐡𝑣(𝐿)𝐡_𝑣^{(𝐿)}𝐖(𝐻)Rk𝑑𝐖^{(𝐻)}\inℝ^{k*𝑑}⁡를 통해 kk차원으로 선형변환하여 예측값 𝐲^vRk\hat{𝐲}_v\inℝ^k를 얻는다고 볼 수 있다.

2.1.2. Edge-level prediction

엣지는 두 개의 노드 사이에서만 존재할 수 있기 때문에 이 점이 head에 반영되어야 한다.

𝐲^uv=Headedge(𝐡u(𝐿),𝐡𝑣(𝐿))\hat{𝐲}_{uv}=Head_{edge}(𝐡_u^{(𝐿)},𝐡_𝑣^{(𝐿)})

즉, 두 노드의 임베딩을 입력으로 받도록 head가 구성되어야 한다. 강의에서는 다음의 두 가지 선택지를 설명한다.

  1. Concatenation + Linear
    : graph attention에서 처럼 두 노드 임베딩을 합치고 선형변환하는 것이다.
    𝐲^uv=Linear(Concat(𝐡u(𝐿),𝐡𝑣(𝐿)))\hat{𝐲}_{uv}=Linear(Concat(𝐡_u^{(𝐿)},𝐡_𝑣^{(𝐿)}))
    여기서 Linear()Linear(\cdot)(2d)(2*d)차원의 벡터를 예측하고자 하는 kk차원으로 변환한다.
  1. Dot product
    : 두 벡터의 내적을 이용하는 방법도 있다.
    𝐲^uv=(𝐡u(𝐿))T𝐡𝑣(𝐿)\hat{𝐲}_{uv}=(𝐡_u^{(𝐿)})^T𝐡_𝑣^{(𝐿)}
    이 방법은 𝐲^uv\hat{𝐲}_{uv}가 스칼라로 출력되기 때문에 엣지의 존재 여부를 예측하는 link prediction과 같이 1가지 값만 예측할 때 적용할 수 있다. 만약 kk개의 값을 예측하고자 한다면 multi-head attention처럼 kk개의 선형변환을 추가하여 head를 구성할 수 있다.
    𝐲^uv(1)=(𝐡u(𝐿))T𝐖(1)𝐡𝑣(𝐿)𝐲^uv(2)=(𝐡u(𝐿))T𝐖(2)𝐡𝑣(𝐿)...𝐲^uv(k)=(𝐡u(𝐿))T𝐖(k)𝐡𝑣(𝐿)𝐲^uv=Concat(𝐲^uv(1),𝐲^uv(2),...,𝐲^uv(k))Rk\hat{𝐲}_{uv}^{(1)}=(𝐡_u^{(𝐿)})^T𝐖^{(1)}𝐡_𝑣^{(𝐿)}\\\hat{𝐲}_{uv}^{(2)}=(𝐡_u^{(𝐿)})^T𝐖^{(2)}𝐡_𝑣^{(𝐿)}\\...\\\hat{𝐲}_{uv}^{(k)}=(𝐡_u^{(𝐿)})^T𝐖^{(k)}𝐡_𝑣^{(𝐿)}\\\hat{𝐲}_{uv}=Concat(\hat{𝐲}_{uv}^{(1)},\hat{𝐲}_{uv}^{(2)},...,\hat{𝐲}_{uv}^{(k)})\inℝ^k

2.1.3. Graph-level prediction

그래프의 예측에는 그 그래프를 이루는 모든 노드의 임베딩이 사용되어야 한다.

𝐲^G=Headgraph({𝐡v(𝐿)R𝑑,vG})\hat{𝐲}_G=Head_{graph}(\{𝐡_v^{(𝐿)}\inℝ^𝑑,\forall v \in G\})

그래프 내의 모든 노드 임베딩을 모아 새로운 임베딩(그래프 임베딩)을 만든다는 점이 GNN 레이어 내의 AGG()AGG(\cdot)와 유사하다. 그래서인지 평균, 최댓값, 합을 통해 head를 구성할 수 있다. 다만, 이들은 그래프가 작을 때는 잘 작동하지만 큰 그래프에서는 정보를 잃는 이슈가 있다.

5개의 노드로 구성된 두 개의 그래프 G1G_1G2G_2가 있을 때 GNN을 통해 얻은 각각의 노드 임베딩이 다음과 같다고 가정해보자.

G1:{1,2,0,1,2}G2:{10,20,0,10,20}G_1: \{-1, -2, 0, 1, 2\}\\G_2: \{-10, -20, 0, 10, 20\}

두 그래프의 노드 임베딩은 분명 다르다. 그러나 평균이나 합을 이용하여 HeadgraphHead_{graph}를 구성하면 𝐲^G1=𝐲^G2=0\hat{𝐲}_{G_1}=\hat{𝐲}_{G_2}=0이 되고 결국 두 그래프를 구분할 수 없게 되어 버린다.

이러한 이슈는 노드 임베딩을 모으는 과정을 계층적으로 수행하여 해결할 수 있다.

위와 동일한 G1G_1G2G_2에 대해 이번에는 앞의 두 노드의 임베딩끼리 모으고 뒤의 세 노드의 임베딩끼리 모은다. 그렇게 얻은 2개의 임베딩을 다시 모아 최종 그래프 임베딩으로 출력하는 것이다. 이처럼 계층적으로 수행하면 매 계층마다 계층마다 ReLU()ReLU(\cdot)와 같은 비선형함수의 도입이 가능하다. 그 결과, 앞서와 달리 두 그래프의 임베딩이 다름을 확인할 수 있다.

여기서 그럼 어떻게 계층을 나눠야 하는지에 대해 의문점이 생기는데, DiffPool과 같은 방법론이 그 답을 제공할 수 있다.

DiffPool에서는 노드 임베딩을 계산하는 GNN과 노드가 속할 군집을 계산하는 GNN을 동시에 학습시키면서 효과적으로 임베딩과 클러스터링을 진행한다.

2.2. Supervised vs Unsupervised

학습은 크게 지도 학습과 비지도 학습의 2가지로 구분된다. 그래프에 대해서는 두 개념을 레이블의 위치로 구분할 수 있다. 지도 학습은 분자 구조로 약물의 유사성을 분류하는 것처럼 레이블이 그래프의 외부에 존재하는 경우에 해당한다. 비지도 학습은 반대로 그래프가 내부에 보유한 속성을 레이블로 이용하는 것으로, 두 노드의 연결 여부를 예측하는 link prediction이 그 예이다.

2.2.1. Supervised labels on graph

지도 학습을 위한 레이블은 특정 상황에서의 사용을 위해 생겨난다. 아래는 그 예이다.

  • Node labels yvy_v: 논문 인용 네트워크에서 논문이 속하는 분야
  • Edge labels yuvy_{uv}: 거래 내역 네트워크에서 거래의 위조 여부
  • Graph labels yGy_G: 분자 구조 네트워크에서 약물의 유사성

2.2.2. Unsupervised signals on graph

비지도 학습의 문제는 그래프만 달랑 있고 학습에 사용할 레이블이 외부로부터 주어지지 않는 것이다. 이 경우에는 그래프 내부에 암시된 signal을 지도 학습의 레이블처럼 사용할 수 있다. Link prediction을 생각해보자. 두 노드 간의 연결 유무는 그래프 내부에 존재하는 정보로 이를 예측하는 task는 비지도 학습으로 볼 수 있다. 이 외에도 노드 수준에서 clustering coefficient 또는 PageRank와 같은 노드 통계량을 예측하거나, 그래프 수준에서 두 그래프가 isomorphic한지와 같은 그래프 통계량을 예측하는 task 등이 비지도 또는 자기지도 학습에 해당된다.

2.3. Loss function & Evaluation metrics

GNN에서도 여타 모델들과 마찬가지로 회귀를 위한 손실함수로는 Mean Squared Error(MSE)를 사용하고 분류를 위한 손실함수로는 Cross Entropy(CE)를 주로 사용한다.

또한, 모델의 성능을 확인하는 지표로서 회귀에서는 Root Mean Squared Error나 Mean Absolute Error의 사용이 일반적이다. 분류의 경우 다중 레이블 분류에서는 accuracy를, 이진 분류에서는 accuracy, precision, recall, ROC AUC를 사용한다.

2.4. Dataset Split

이제는 학습에 필수적인 데이터셋 분할에 대해 알아보자. 기본적으로 fixed split과 random split의 두 가지 방법이 있다.
Fixed split은 전체 데이터셋을 train/validation/test로 나누어 이를 고정해서 사용하는 것이다. 그러나이 방법은 최종 성능을 확인하는 test set이 다른 두 데이터셋의 영향을 받게 되는 경우가 있다. 이에 따라 random split은 같은 데이터셋에 대해 다른 시드로부터 무작위로 분할한 데이터셋으로 모델의 학습을 반복하고 각 데이터셋에 대한 성능의 평균을 최종 성능으로 사용한다.

그런데 중요한 문제가 있다. 이미지 분류를 위한 이미지 데이터셋의 분할에서는 각 데이터가 이미지였다. 이러한 각 이미지들은 데이터셋 내에서 서로에게 어떠한 영향도 미치지 않는다. 반면, 그래프 데이터셋은 그렇지 않다. 노드를 분류하기 위해서는 각 노드를 하나의 데이터로 간주하여 데이터셋을 분할해야 하는데 그래프 내에서 노드들은 독립적이지 않다. 연결 관계를 통해 message를 전달하며 다른 노드의 임베딩에 영향을 주기 때문이다.

2.4.1. Splitting graph

이러한 그래프 데이터셋의 특성에 맞게 분할하는 방법에는 두 가지 관점이 존재한다.

먼저, transductive setting에서는 특정 노드를 추출하는 방법으로 접근한다.

모델의 train과 validation, test에서 모두 전체 그래프에 대해 노드 임베딩을 계산하되, train 단계에서는 train set에 해당하는 노드로만 파라미터를 최적화하고 validation 단계에서는 validation set에 해당하는 노드로만 모델을 평가하는 것이다. 따라서 transductive setting에서 데이터셋은 하나의 그래프로 구성되며, 노드나 엣지를 예측하는 task에 대해서만 적용이 가능하다.

이와 달리, inductive setting에서는 엣지를 끊어 train과 validation, test를 위한 그래프를 별도의 3개의 그래프로 분리한다.

모델의 train 단계에서는 train 그래프의 임베딩만 계산하고 이를 학습에 사용하고, validation 단계에서도 validation 그래프의 임베딩만 계산하여 이를 모델의 평가에 사용한다. Inductive setting은 노드나 엣지에 더해 그래프를 예측하는 task에 대해서도 적용이 가능하지만 그래프 구조를 변형시킴에 따라 실제 성능과는 차이가 발생할 수도 있다.

2.4.2. Node classification example

Transductive setting을 이용하여 하나의 그래프로 데이터셋을 구성하고 training과 validation, test를 위한 노드를 지정할 수 있다.

아니면 inductive setting을 이용하여 하나의 그래프의 엣지를 끊어 training과 validation, test를 위한 여러 그래프로 데이터셋을 구성할 수도 있다.

2.4.3. Graph classification example

그래프 분류는 inductive setting만이 적용될 수 있다. 기본적으로 데이터셋은 여러 개의 그래프로 구성되어야 하며 training / validation / test set으로 분리된 그래프들은 서로에게 영향을 주지 않는다.

Link prediction은 비지도 학습이기 때문에 레이블도 만들고 데이터셋도 분리해야 하기 때문에 비교적 까다롭다.

우선, 원래 그래프의 엣지들을 message를 전달하는 message edges와 예측을 위한 레이블로 사용할 supervision edges로 구분한 다음, message edges만을 GNN에 입력하기 위해 남기고 supervision edges는 잠시 지운다.

그리고나서 데이터셋을 분리한다. Inductive setting에서는 그냥 개별적인 그래프를 각각 training / validation / test set으로 분리하면 된다.

그런데 가지고 있는 그래프가 하나인 transductive setting이라면 한 그래프 내에서 엣지를 training message edges / training supervision edges / validation edges / test edges의 4가지 유형으로 구분해야 한다.

이를 바탕으로 training 단계에서는 training message edges로 임베딩을 계산하고 training supervision edges를 이용해 예측 모델의 학습을 진행한다. 이후 validation 단계에서는 training에서 사용한 엣지들로 validation edges를 예측하여 모델을 평가하고, test 단계에서는 training과 validation에서 사용한 엣지들로 test edges를 예측하여 최종 성능을 측정하게 된다.

profile
안녕하세요...

0개의 댓글