Chapter19. Applications of Graph Neural Networks

투빅스 13기 이예지

마지막 강의는 지금까지 다뤘던 GNN이 다양한 도메인에서 어떻게 활용되고 있는지 살펴본다.

크게 3가지에 대해 다룬다.

  1. 추천시스템에서 GNN의 활용

  2. Heterogeneous Graph에 GNN의 활용

  3. 분자구조에서 부작용(side-effect)을 찾기 위한 GNN의 활용

PinSAGE: GNN for Recommender System

핀터레스트(Pinterest)의 데이터를 활용한 graph-based recommendation이다. 우버이츠에서도 사용되고 있다고 한다. 즉, 실제 산업에서도 추천시스템에 graph-based rec을 활용하는 경우는 생각보다 많다.

우리는 set of users가 어떤 set of item과 interaction을 하고 있는지 알 수 있다. ex) 어떤 영화를 봤는가 , 어떤 상품을 샀는가, 어떤 음악을 들었는가

이 데이터를 활용하여 우리는 개인화된 추천을 하고싶다. 즉, 유저가 볼만한 영화, 살만한 음식, 들을만한 음악을 찾고싶다.

간단히 생각하면, 고객 X가 Metallica와 Megadeth CD를 샀다면, Metallica를 산 Y 사용자에게 Megadeth를 추천해줄 수 있을 것이다.

Figure 2에 있는 아래 그림을 보자. set of users와 set of items이 있을 때, 새로운 user가 지고 어떻게 interaction을 하는지에 따라 new item을 추천해줄 수 줄것이다.

우리가 하려고 하는 것. Q를 했을 때 RECOMMENDATION을 해주는 것.

결국, 우리는 Query를 했을 때 set of items을 추천해주는 것이다. (유저가 선택한 item을 알려줬을 경우(q) set of items(rec)을 내뱉는 것.)

Define

이 때 item이 아니라 items가 주어졌을 경우, set of relative items(rec)을 해주는 것이 최종 목표이다. (given a set of query items, retrieve relative items )

Figure 4를 보면, 실제로 굉장히 비슷한 아이템들이 추천되고 있음을 알 수 있다.

그렇다면 서로 다른 아이템에 대해 "비슷하다"는 정의를 어떻게 할까?

일반적으로 다음과 같이 두가지로 정의된다.

  • content-based item의 feature를 사용하여 가장 유사한 아이템을 추천해줌. ex) 이미지, 텍스

  • graph-based (collaborative filtering) user와 item 간의 interaction을 bipartite graph(이분 그래프)로 나타냄. user가 주어졌을 때, 나와 비슷한 items을 좋아하는 유저를 찾고, 그것을 based로 하여 추천해줌. 여기서 item의 feature 자체가 중요한 것이 아님. 나와 비슷한 것을 좋아하는 user가 중요함

Recommendation을 하기위해 3가지가 필요하다.

  • Collect data 유저가 어떤 노래를 좋아하는지 어떤 노래를 싫어하는지 알아야 함.

  • Prediction problem user가 unknown item에 대해 얼마나 좋아할지를 predict해야 함.

  • Evaluating methods 내 method가 얼마나 성공적인지를 평가해야 함.

따라서, 위의 3가지를 어떻게 하는지 살펴보자.

우리는 두가지를 얻을 수 있다.

features: 각각의 pin(node)에 대한 이미지와 텍스트 정보 등등

graph: user와 item의 interaction. 그리고 이 interaction은 dynamic하게 changing 됨.

이제 이 데이터로부터 predict를 하기 위해 우리는 item을 임베딩한다. 임베딩을 하면 고차원 공간에 각각의 item이 point로 존재할 것이고, relative item들은 이 공간에서 매우 가깝게 맵핑되어 있을 것이다.

즉, 고차원에 item들이 point로 존재하고, 내가 collect한 아이템과 가까운 point를 추천해주면 되는 것이다. 다음의 예시를 살펴보자.

Query로 어떤 케이크가 주어졌다. 우리는 스웨터보다, 또 다른 케이크를 추전하는 것이 더 올바른 추천일 것을 알고 있다. 그렇다면 오른쪽의 식이 이해될 것이다. 여기서 dd 는 distance를 의미한다.

임베딩 공간에서 (cake1과 cake2)의 거리보다 (cake1과 sweater)의 거리가 더 커야할 것이다.

우리의 가정에 맞게 임베딩을 하기 위해 GNN을 써보자.

bipartite graph가 주어지고, 이 때 input으로 item(circle)들은 이미지만 사용하는 것이 아니라 관련 feature들을 사용한다. (오른쪽의 circle은 이분 그래프에서 item을 의미함.)

이제 cake1과 cake2를 임베딩해보자. 우리는 cake1과 cake2의 거리 d(z1,z2)d(z_1, z_2)가 매우 작기를 바란다. 이때, 오른쪽 그림을 보면 cake1을 임베딩하기 위해 자기 자신만 사용하는 것이 아니라 이웃들까지 같이 활용하고 있는 것을 볼 수 있다.

Key idea 케이크1을 임베딩하기 위해 내 피쳐만 사용하는 것이 아니라, 내 이웃들의 피쳐까지 함께 사용해서 임베딩함.

그렇다면, 위의 그림처럼 그래프로 이 문제를 푸는 것이 잘 작동할까...?

전통적으로 비슷한 아이템을 추천하는 것(content-based), 어떤 아이템과 내가 산 아이템이 얼마나 유사한지에 대해 추천해주는 것은 한계가 있다. 예를 들어 울타리 사진이 Q로 주어졌을 때, 비슷하게 생긴 침대를 추천해줄 때가 있다. 그러나 그래프를 활용하면, 주변 이웃 정보에 따라 울타리의 임베딩 파트가 있고, 침대의 임베딩 파트가 따로 존재할 것이다. 이 때문에 전통적 추천 시스템에서 발생하는 실수의 확률이 적다.

PinSAGE의 pipeline

데이터 수집 가장 먼저 training data를 수집해야 한다. 이 때, positive pair와 negative pair를 수집해야 한다. - positive pair

매우 짧은 시간 안에 동시에 수집된 것을 related item이라고 정의한다. - negative pair random으로 수집한다.

  1. trainset에 존재하는 노드(pin) 임베딩을 위해 GNN을 학습시킨다.

  2. 모든 pin에 대해 임베딩 값을 한다.

  3. nearest neighbor search를 통해 추천해준다.

모델 학습을 위한 objective function은 다음과 같다.

positive data에 대해 가깝게 임베딩을 해야하며, negative data에 대해 멀리 떨어져 있어야하므로 cosine similarity(element-wise)를 구하여 objective function을 만들 수 있다.

따라서 다음과 같이 구성되어 있다.

positive pair: 우리가 현재 가깝게 하고자 하는 pair이고, negative example보다 크게 만들어야 .

negative example: 우리는 이것을 작게 만들어야 . (random set이므로 example이란 말이 붙는 것 같다.)

Δ\Delta: margin으로 불리며, positive pair과 negative example보다 최소한 이것보다 커야한다를 주기 위함. 즉, objective funition을 최소로 만드려면 max(0, something)이 0이 나와야하고, something부분이 0이 나오려면 zuzv+zuz==Δ-z_u^{\intercal}z_v+z_u^{\intercal}z == \Delta 가 만족되어야 . 따라서 델타가 margin으로 불림.

four key innovations

  1. on-the-fly graph convolutions 임베딩해야 하는 노드가 정해지면, dynamically small computation graph를 생성함(mini-batch). computation graph에 없는 노드들을 굳이 볼 필요가 없으므로, parallel하게 processing 될 수 있음.

3. efficient MapReduce inference 같은 계산을 여러 번 하는 computation redundancy를 줄이기 위해 값을 저장해놓고 참조함.

Negative examples

harder negative examples을 고르는게 핵심이다.

위의 그림처럼 positive pair가 주어졌다고 생각하자. 우리는 negative sample을 뽑아야 한다. 오른쪽의 아이템 중 어떤 것을 negative sample로 만들어주는 것이 좋을까?

모자를 negative sample로 할 수도 있겠지만, 이 경우는 모델이 너무 맞추기 쉬운 case라고 할 수 있다. 따라서 모델이 맞추기 어려운, postive sample과 유사하지만 그렇다고 너무 relative하지 않은 sample을 negative sample로 하면 어떨까? 이런 example을 보통 harder examples이라고 하는데, 이것을 negative sample로 활용함으로써 모델은 더 좋아질 것이다.

그렇다면 어떻게 이러한 negative sample을 만들 수 있을까? 단순히 생각하면 전체 item을 sorting한 후, rank를 구할 수 있을 것이다. 그러나 이건 computationally hard이다. 이를 해결하기 위해 우리는 random walk를 사용할 수 있다. random walk를 활용해서 완전히 관련없는 negative sample 대신, more related example을 뽑는 것이다.

Evaluation

평가 지표로 Hit-rate와 MRR이 사용된다.

Mean Reciprocal Rank(MRR): first relevant recommendation을 찾는다.

Hit-rate: prediction 값들 중 실제 relevant item이 몇 개 있는지 계산한다.

DECAGON: Heterogeneous GNN

Heterogeneous graph란, multiple type of nodes, multiple type of edges를 가진 그래프이다. Heterogeneous graph를 어떻게 GNN에서 다룰 수 있을지에 대해 살펴보자.

여러 개의 drug을 섭취했을 경우(Polypharmacy), side-effect가 발생할 수 있다. 우리는 이 경우, 어떤 side-effect가 발생할 수 있을지 예측하고자 한다.

heterogeneous graph는 다음과 같이 생성된다.

node의 type: drugs and proteins

edge의 type:

  • protein-drug: drug이 어떤 단백질과 결합, 교하는지

  • drug-drug: side effect reffectr_{effect} 를 가짐.

  • protein-protein

우리는 최종적으로 "새로운 drug pair (c,d)가 주어졌을 때, side  effect=edgec,dside\;effect = edge_{c,d} 가 존재하는가?"를 알고자 한다.

오른쪽 아래의 이미지는 heterogeneous에서 1-layer GNN의 예시이다. separated aggregation 하는 것을 알 수 있다.

edge의 type(side-effect의 종류)에 따라 aggregation을 해주고, 다른 종류의 node type에 대해서도 aggregation을 해준 뒤 내가 관심있는 pair의 노드에 대한 embedding 값을 구하게 된다.

이렇게 노드의 임베딩 값을 구했다면, edge의 type을 예측해야 한다.

즉, 하나의 pair의 모든 edge type에 대해 확률을 계산해줘야 함.

다음은 전체 process에 대한 그림이다.

pair의 노드를 이웃들의 정보를 이용하여 각각 임베딩한 후, 모든 edge type에 대한 확률을 구하기 위해 디코더를 활용한다. 이렇게 모든 확률을 구했다면 back-propagation을 통해 모델을 학습하게 된다.

GCPN: Goal-Directed Graph Generation(an extension of GraphRNN)

graph generation targeted way

Grpha RNN의 확장으로, 이 모델의 목적과 프로세스 다음과 같다.

결국 우리는 objective function이 커지는방향으로 그래프를 generation하고 싶은 것이다.

Input: molecules의 일부분

Output: molecules의 나머지 부분을 생성하여 새롭게 만든 그래프

위의 예시와 같이 모델에 미완성된 graph를 넣으면 오른쪽처럼 나머지 부분을 generate하게 된다. 이 때 score가 더 커지는 방향으로 generate된 것을 확인할 수 있다.

(강의 시간 부족으로 이 부분을 좀 더 자세하게 다뤄주지는 않으셨다.)

Last updated