IGMC (Inductive Graph-based Matrix Completion)

CODA·2022년 9월 30일
0

최근 추천시스템과 GNN을 공부하면서 피눈물을 흘리고 있다
미숙한 Pytorch와 Graph이론, 딥러닝 기본 이론부터 선형대수학까지..
정말 오랜만에 내용이 너무 어려워서 하기 싫다는 생각을 하고있다 웬만하면 잘 포기하지않고 꾸준히 하는 나인데..
고로 IGMC에 대한 본 포스팅도 부족한 내용이 많을 수 있다
그래도 계속 공부해가면서 꾸준히 수정하도록 하겠다!

paper link

reference

IGMC의 특징은 다음과 같다

  • GNN + 행렬분해 알고리즘 (잠재 벡터)
  • 기존의 GNN을 이용한 GC-MC 보다 node의 feature 의존성 ↓
  • node level이 아닌 graph level
  • global graph가 아닌 sub graph 이용
    • sub graph : user u와 item i에 관련되어있는 local subgraph

sub graph 관련

위 그림에서 진한 초록색 5점의 예시에서 sub graph를 이해할 수 있다
해당 유저가 아이템에게 5점을 평가한것은 target rating이 되는것이고
이 link말고도 이외에 연결되는 n-hop 이웃과 (그림에선 1 hop)
아이템 입장에서의 n-hop 이웃을 포함하는것이 sub graph가 된다
=> 따라서 모델 정의 전 sub graph를 추출하는 과정이 필요하다

또한 IGMC는 global graph가 아닌 sub graph를 nerual network로 통과시키므로 sub graph별 node에 대해 새로운 labeling이 필요하다

모델 관련

기본적인 GNN 구조를 따르지만, GC-MC를 비롯한 여러 알고리즘과 달리 node-level이 아닌 graph-level로 GNN을 사용한다
그리고 subgraph단위로 계산되기때문에 연산이 효율적이다 (하지만 애초에 graph-level로 진행되므로 학습 세팅 시간이 많이 걸린다)

graph-level이므로 graph 표현 벡터를 얻어야 하는데 이를 (sub)graph representaion이라 한다
sub graph 내부 user, item 각각의 hidden 벡터를 구한다음에 concat하면 된다

코드 구현

  • 위 링크를 통해 예제를 진행할 수 있다. movielens로 진행하는 경우 pivot 외에 특별한 전처리는 필요하지 않다
  • 다만 subgraph로 진행되므로 이에 대한 작업이 별도로 필요하다. 위의 링크에서도 논문 저자의 깃허브를 refer해서 진행한다. 나는 이부분때문에 완전한 코드실습을 하지못하였다
  • model bulid 과정 중 forward 부분을 보면 알고리즘을 보다 이해하기 좋다
    def forward(self, data):
        # 1. drop out layer : 랜덤으로 edge 제거 (avoid overfitting)
        num_nodes = len(data.x)
        edge_index_dr, edge_type_dr = dropout_adj(data.edge_index, data.edge_type,\
                                p=0.2, num_nodes=num_nodes, training=self.training)

        out = data.x
        h = []
        # 2. subgraph의 각 node extract 하기
        for conv in self.rel_graph_convs:
            # message passing layer
            out = conv(out, edge_index_dr, edge_type_dr)
            # activated func
            out = torch.tanh(out)
            print(out.shape)
            h.append(out)
        # h = final한 노드의 임베드
        h = torch.cat(h, 1) # torch.cat : concat임 1은 가로로붙인다는거
        h = [h[data.x[:, 0] == True], h[data.x[:, 1] == True]] # 이게 user, item concat 
        g = torch.cat(h, 1) # g는 graph 레벨 features 
        out = self.linear_layer1(g)
        out = F.relu(out)
        out = F.dropout(out, p=0.5, training=self.training)
        out = self.linear_layer2(out)
        out = out[:,0]
        return out
profile
금융권에 가고싶은 김코다입니다. 취업을 하면 기타치며 조르바처럼 살고파요.

0개의 댓글