KG增强,随机生成两个子KG
def get_kg_views(self):
kg = self.gcn_model.kg_dict
view1 = drop_edge_random(kg, world.kg_p_drop,
self.gcn_model.num_entities)
view2 = drop_edge_random(kg, world.kg_p_drop,
self.gcn_model.num_entities)
return view1, view2
在两个子KG中分别聚合项目的邻域信息并计算项目表示的相似度:
def item_kg_stability(self, view1, view2):
kgv1_ro = self.gcn_model.cal_item_embedding_from_kg(view1)
kgv2_ro = self.gcn_model.cal_item_embedding_from_kg(view2)
sim = self.sim(kgv1_ro, kgv2_ro)
return sim
选择信息聚合的方式:
def cal_item_embedding_from_kg(self, kg: dict = None):
if kg is None:
kg = self.kg_dict
if world.kgcn == "RGAT":
return self.cal_item_embedding_rgat(kg)
elif (world.kgcn == "NO"):
return self.embedding_item.weight
RGAT关系感知聚合方法:
def cal_item_embedding_rgat(self, kg: dict):
item_embs = self.embedding_item(
torch.IntTensor(list(kg.keys())).to(
world.device)) # item_num, emb_dim
item_entities = torch.stack(list(
kg.values())) # item_num, entity_num_each
item_relations = torch.stack(list(self.item2relations.values()))
entity_embs = self.embedding_entity(
item_entities) # item_num, entity_num_each, emb_dim
relation_embs = self.embedding_relation(
item_relations) # item_num, entity_num_each, emb_dim
# w_r = self.W_R[relation_embs] # item_num, entity_num_each, emb_dim, emb_dim
# item_num, entity_num_each
padding_mask = torch.where(item_entities != self.num_entities,
torch.ones_like(item_entities),
torch.zeros_like(item_entities)).float()
return self.gat.forward_relation(item_embs, entity_embs, relation_embs,
padding_mask)
def forward_relation(self, item_embs, entity_embs, w_r, adj):
x = F.dropout(entity_embs, self.dropout, training=self.training)
x = torch.cat([
att.forward_relation(item_embs, x, w_r, adj) for att in self.layers
],
dim=1)
x = self.out(x)
x = x + item_embs
x = F.dropout(x, self.dropout, training=self.training)
return x
参考论文: Yang Y, Huang C, Xia L, et al. Knowledge Graph Contrastive Learning for Recommendation[J]. arXiv preprint arXiv:2205.00976, 2022.