Example #1
0
File: nmrn.py Project: kiminh/PERec
    def step(self, user, item):
        u_e = self.user_embedding[user]
        i_e = self.item_embedding[item]
        u_e = u_e.unsqueeze(dim=1)

        reward = (-1) * euclidean_distance(u_e, i_e)

        return reward
Example #2
0
File: nmrn.py Project: kiminh/PERec
    def forward(self, user, pos, neg, **kwargs):
        u_e = self.user_embedding[user]
        pos_e = self.item_embedding[pos]
        neg_e = self.item_embedding[neg]
        negs_e = self.item_embedding[kwargs["negs"]]

        reg_loss = self.regs * l2_loss(u_e, pos_e, neg_e, negs_e)

        pos_d = euclidean_distance(u_e, pos_e)
        neg_d = euclidean_distance(u_e, neg_e)
        negs_d = euclidean_distance(u_e.unsqueeze(dim=1), negs_e)

        impostor = (pos_d.unsqueeze(dim=1) - negs_d + self.margin > 0).float()
        rank = torch.mean(impostor, dim=1) * self.n_user

        hinge_loss = torch.sum(
            torch.log(rank + 1) *
            torch.clamp(self.margin + pos_d - neg_d, min=0))

        return hinge_loss, reg_loss
Example #3
0
def get_score_v2(model, train_user_dict, s, t):
    u_e = model.user_embedding[s:t, :]
    i_e = model.item_embedding

    if model.name == "NMRN":
        u_e = u_e.unsqueeze(dim=1)
        score_matrix = (-1) * euclidean_distance(u_e, i_e)
    else:
        score_matrix = torch.matmul(u_e, i_e.t())
        if hasattr(model, "bias"):
            score_matrix = score_matrix + model.bias

    for u in range(s, t):
        pos = train_user_dict[u]
        score_matrix[u - s][pos] = -1e5

    return score_matrix
Example #4
0
File: nmrn.py Project: kiminh/PERec
    def throw(self, user, items):
        u_e = self.user_embedding[user]
        i_e = self.item_embedding[items]

        u_e = self.umlp(u_e)
        i_e = self.imlp(i_e)

        u_e = u_e.unsqueeze(dim=1)
        distance = euclidean_distance(u_e, i_e)
        prob = F.softmax(-distance, dim=1)

        sampled_id = torch.multinomial(prob, num_samples=1)
        row_idx = get_row_index(u_e)

        good_neg = items[row_idx, sampled_id].squeeze()

        return good_neg
Example #5
0
File: nmrn.py Project: kiminh/PERec
    def forward(self, user, items, reward):
        u_e = self.umlp(self.user_embedding[user])
        i_e = self.imlp(self.item_embedding[items])

        u_e = u_e.unsqueeze(dim=1)
        distance = euclidean_distance(u_e, i_e)
        probs = F.softmax(-distance, dim=1)

        sampled_id = torch.multinomial(probs, num_samples=1)
        row_ids = get_row_index(u_e)

        log_probs = F.log_softmax(-distance, dim=-1)
        sampled_probs = log_probs[row_ids, sampled_id]
        sampled_reward = reward[row_ids, sampled_id]

        gan_loss = -torch.mean(sampled_probs * sampled_reward)
        reg_loss = self.regs * l2_loss(u_e, i_e)

        return gan_loss, reg_loss