안녕하세요,
Pytorch geometric 을 사용하여 link prediction 모델을 개발하고자 합니다.
input data는 사용자, 제품, 제품의 특성 등의 노드로 구성된 heterogeneous 한 graph이고, pytorch에 제공된 예시 코드를 참고하며 모델을 만들어 training, validation, test 과정을 거쳤습니다.
그런데 실제로 해당 모델을 사용하여 user 1번에게 추천된 item 리스트를 뽑아보고자하는 부분에서 막히어 질문을 올립니다.
예시를 참고하여 구축한 모델은 다음과 같습니다.
class GNNEncoder (torch.nn.Module):
def __init__(self, hidden_channels, out_channels):
super().__init__()
self.conv1 = GATConv((-1, -1), hidden_channels, add_self_loops=False)
self.conv2 = GATConv((-1, -1), out_channels, add_self_loops=False)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index).relu()
x = self.conv2(x, edge_index)
return x
class EdgeDecoder(torch.nn.Module):
def __init__(self, hidden_channels):
super().__init__()
self.lin1 = Linear(2 * hidden_channels, hidden_channels)
self.lin2 = Linear(hidden_channels, 1)
def forward(self, z_dict, edge_label_index):
z = torch.cat([z_dict['user'][edge_label_index[0]], z_dict['item'][edge_label_index[1]]], dim=-1)
z = self.lin1(z).relu()
z = self.lin2(z)
return z.view(-1)
class Model(torch.nn.Module):
def __init__(self, data, hidden_channels):
super().__init__()
self.encoder = GNNEncoder(hidden_channels, hidden_channels)
self.encoder = to_hetero(self.encoder, data.metadata(), aggr='sum')
self.decoder = EdgeDecoder(hidden_channels)
def forward(self, x_dict, edge_index_dict, edge_label_index):
z_dict = self.encoder(x_dict, edge_index_dict)
return self.decoder(z_dict, edge_label_index,)
그리고 heterogeneous한 그래프 데이터 형태는 다음과 같습니다.
- 노드: 사용자 271907명, 아이템 339606개, 아이템 특성 1362개, 아이템 특성의 특성 748개
- 엣지: (사용자, rate, 아이템) 772190개, (아이템, has, 특성) 25913031개, (특성, has, 특성의 특성) 169710개
해당 모델과 데이터를 가지고 어떻게 사용자 1번이 rate를 할 만한 새로운 아이템 리스트를 뽑을 수 있나요?