최근 추천시스템과 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
위 그림에서 진한 초록색 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하면 된다
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