GNN Layer
classic GNN layer는 이러한 구조를 갖고, 최신 딥러닝 모듈들(BatchNorm, Dropout, etc.)을 추가하여 layer를 구성할 수 있다.
Batch Normalization
Neural Network가 안정적으로 학습할 수 있도록 함.
batch단위 input의 centering과 scaling을 조정한다.
GNN에서는, node embedding의 평균을 $0$으로 조정하고, 분산도 단위분산으로 크기를 조정한다.
$\mathbf{X} \in \mathbb{R}^{N \times D}$: $N$개의 node embeddings
$\mathbf{\gamma, \beta} \in \mathbb{R}^{D}$: trainable parameters
$\mathbf{Y} \in \mathbb{R}^{N \times D}$: Normalized node embeddings
(1) $N$개의 임베딩의 평균과 분산(모분산처럼 계산)을 구한다.
\[ \mathbf{\mu}_j = \cfrac{1}{N}\sum_{i=1}^{N}\mathbf{X}_{i,j} \]
\[ \sigma_j^2 = \cfrac{1}{N}\sum_{i=1}^{N}(\mathbf{X}_{i,j} - \mathbf{\mu}_j)^2 \]
(2) (1)에서 구한 평균과 분산을 이용하여 node embedding의 크기를 정규화한다.
\[ \widehat{\mathbf{X}}_{i, j} = \cfrac{\mathbf{X}_{i,j} - \mathbf{\mu}_j}{\sqrt{\mathbf{\sigma}_j^2 + \epsilon}} \]
\[ \mathbf{Y}_{i, j} = \mathbf{\gamma_j \widehat{X}_{i, j} + \beta_j} \]
Dropout
neural network가 overfitting되는 것을 방지하도록 한다.
(training) 일정 확률 $p$만큼 뉴런의 값을 $0$으로 한다. (turn off)
(testing) 모든 뉴런을 사용하여 결과를 계산한다. (No turn off)
GNN에서의 dropout은 message function의 linear layer($\mathbf{m}_u^{(l)} = \mathbf{W}^{(l)} \mathbf{h}_u^{(l-1)}$)에 적용된다.
Activation (Non-linearity)
자주 사용되는 activation function으로는 ReLU, Sigmoid, Parametric ReLU이다.
GNN에서는 Parametric ReLU가 성능이 더 좋다고 한다.
\[ \text{PReLU}(\mathbf{x}_i) = \max(\mathbf{x}_i, 0) + a_i \min(\mathbf{x}_i, 0) \quad a_i \text{ is a trainable parameter} \]
Stacking GNN Layers
GNN layer끼리 연결하는 방법은 크게 2가지가 있다.
- 순차적으로 layer 쌓기(stacking)
- skip connection 만들기 (CNN family의 ResNet처럼)
Standard way: Stack GNN layers sequentially
초기값으로 node feature $\mathbf{h}_v^{(0)} = \mathbf{x}_v$로 사용하여 $L$개의 layer를 통과하여 $\mathbf{h}_v^{(L)}$을 얻는다.
Over-smoothing problem
layer를 통과할 수록 모든 node embedding이 같은 값으로 수렴하는 현상. 그런데 우리는 node embedding이 달라야 의미를 갖기 때문에 이것은 문제가 된다.
over-smoothing 이 생기는 이유는?
$K$개의 layer를 쌓은 GNN을 생각해보자. 이 경우 각 노드는 $K$-hop(노드 간의 거리가 $K$인) 이웃 노드들로부터 영향을 받는다. 그런데 $K$가 커질 수록 공유하는 이웃 노드들은 매우 빠르게 증가하여 거의 모든 노드들과 공유하게된다. ($K=3$만 되어도 거의 모든 노드들이 연결된다.) Receptive field가 너무 커지는 것이다.
GNN layer를 많이 stacking → receptive field가 매우 많이 겹친다→ node embedding은 매우 유사할 것이다 → over-smoothing problem 발생
따라서 GNN layer를 쌓을때 $L$이 필요이상으로 커지지 않도록 주의하여 $L$값을 정해야한다. (receptive field를 사전에 분석하여 정하는 방법이 될 것이다.)
Shallow GNN
그렇다면, GNN layer가 깊지 않으면서(shallow) 어떻게 그래프의 표현력을 높일 수 있을까?
하나의 방법은 GNN layer 자체의 표현력을 높이는 것이다. Transformation이나 Aggregation 단계에서 Linear모델 대신에 DNN 모델을 적용하면 하나의 GNN layer도 높은 표현력을 가질 것이다.
두번째 방법은 GNN layer 앞과 뒤에 전처리/후처리 layer를 추가하는 것이다. 실제로 이렇게 전처리/후처리 layer를 추가하는 것 역시 매우 잘 동작한다.
Skip Connections
Shallow GNN을 만들어서 일부 해결할 수 있지만, 그럼에도 불구하고 더 깊은 layer를 쌓아야 하는 경우가 있다.
over-smoothing의 문제점에서, 이전 단계의 node embedding이 오히려 더 노드들을 구별하는 능력이 있지 않을까라는 아이디어에서 착안한다.
skip-connection이 잘 동작하는 이유
skip-connection은 모델을 섞어주는 효과를 갖는다. $N$개의 skip connection은 $2^N$개의 경우의 수를 만들어 낸다. (skip or include the module) 따라서 skip connection을 추가하는 것 만으로도 shallow GNN은 사실상 deep GNN으로 만들어지는 효과를 얻을 수 있다.
Skip Connections in GCN
standard GCN layer와 skip connection이 있는 GCN layer의 수식을 비교하면 다음과 같다.
\[ \mathbf{h}_v^{(l)} = \sigma \left( \sum_{u \in N(v)}\mathbf{W}^{(l)} \cfrac{\mathbf{h}_u^{(l-1)}}{|N(v)|} \right) \]
\[ \mathbf{h}_v^{(l)} = \sigma \left( \sum_{u \in N(v)}\mathbf{W}^{(l)} \cfrac{\mathbf{h}_u^{(l-1)}}{|N(v)|} + \mathbf{h}_v^{(l-1)} \right) \]
Other options of Skip Connections
skip connection을 구성하는 방법은 다양하다. 그 중 마지막 layer에만 node embedding을 더하여 aggregate하는 방법도 있다.
'스터디 > 인공지능, 딥러닝, 머신러닝' 카테고리의 다른 글
[CS224w] Colab 2 - PyG, OGB, GNN (0) | 2023.03.21 |
---|---|
[CS224w] 5. A General Perspective on GNNs (1), 이론편 (0) | 2023.03.11 |
[CS224w] 4. Graph Neural Networks (0) | 2023.03.07 |
[CS224w] Colab 1 - Node Embeddings (1) | 2023.03.06 |
[CS224W] 3. Node Embeddings (0) | 2023.01.28 |