본문 바로가기

DL & ML/Graph

[DGL] Graph와 Heterogeneous Graph의 차이

728x90
반응형

그래프 데이터를 학습시키기 위해서는 데이터를 그래프 형태로 변형을 해주어야 합니다.

GNN을 조금 더 쉽고, 편리하게 개발할 수 있도로 도와주는 라이브러리로 dgl(Deep Graph Library)가 존재합니다.

 

DGL에서 만들 수 있는 그래프 객체의 종류는 크게 'heterograph'와 'graph' 두 가지가 있습니다.

 

 

1. graph (Homogeneous Graph)

그래프는 node와 edge의 종류가 한 가지인 것을 의미합니다.

예를 들어 페이스북 친구 관계를 그래프로 표현한다면 다음과 같을 것입니다.

노드는 사용자, 엣지는 친구 여부를 의미합니다.

즉, 노드와 엣지의 종류가 한가지라고 볼 수 있습니다.

 

 

만드는 방법도 간단합니다.

 

노드 source, 즉 어떤 노드에서 출발하여 노드 destination, 즉 어떤 노드로 도착하였는지만 넣어주면 그래프 데이터가 자동으로 만들어집니다.

 

>>> src_ids = torch.tensor([2, 3, 4]) # 노드 source
>>> dst_ids = torch.tensor([1, 2, 3]) # 노드 destination
>>> g = dgl.graph((src_ids, dst_ids))

 

 

 

2. heterograph

그렇다면 heterograph는 무엇일까요?

heterograph는 단순 graph와 달리 노드와 엣지의 타입이 여러 개인 것을 의미합니다.

 

예를 들어 영화 컨텐츠를 그래프로 표현한다고 하면 다음과 같이 나타낼 수 있습니다.

특정 영화의 감독, 등장한 배우 등을 그래프로 표현하게 된다면 

노드는 영화, 감독, 배우로 종류가 여러개가 되겠죠? 

엣지도 영화를 찍은 감독, 영화에 등장한 배우를 의미하는 각각 다른 종류의 엣지가 만들어질 것입니다.

 

이러한 그래프를 hetero graph라고 말합니다.

 

 

 

만드는 방법은 단순 그래프보다 조금 더 까다롭습니다.

각각의 관계와 노드를 따로 표현해야하기 때문입니다.

 

아래는 어떤 사용자가 어떤 사용자를 팔로우하고 있는지,

어떤 사용자가 어떤 topic을 팔로우하고 있는지

어떤 사용자가 어떤 게임을 플레이하는지에 대한 정보를 하나의 그래프로 표현한 것입니다.

다음과 같이 딕셔너리 형태로 heterograph를 만들어낼 수 있습니다.

 

>>> data_dict = {
...     ('user', 'follows', 'user'): (torch.tensor([0, 1]), torch.tensor([1, 2])),
...     ('user', 'follows', 'topic'): (torch.tensor([1, 1]), torch.tensor([1, 2])),
...     ('user', 'plays', 'game'): (torch.tensor([0, 3]), torch.tensor([3, 4]))
... }
>>> g = dgl.heterograph(data_dict)

 

참고로 ('user', 'follows', 'user'): (torch.tensor([0, 1]), torch.tensor([1, 2]))의 의미는

user 0이 1을 팔로우하고, 1이 2를 팔로우합니다. 라고 생각하면 됩니다!

 

 

dgl로 간단하게 그래프 데이터를 형성하는 방법에 대해 정리해봤습니다!

더 자세한 내용은 dgl 공식 문서를 참고하시길 바랍니다!

728x90
반응형