RUCAIBox / RecBole

A unified, comprehensive and efficient recommendation library
https://recbole.io/
MIT License
3.35k stars 603 forks source link

[🐛BUG] 关于LINE的损失计算问题 #1505

Closed ShelveyJ closed 1 year ago

ShelveyJ commented 1 year ago

描述这个 bug 在运行图嵌入模型LINE时,发现损失的计算过程如下:

class NegSamplingLoss(nn.Module):
    def __init__(self):
        super(NegSamplingLoss, self).__init__()

    def forward(self, score, sign):
        return -torch.mean(torch.sigmoid(sign * score))

在计算均值之前没有对结果进行取对数。

预期 使用原损失计算过程得到的结果为:

23 Oct 15:52    INFO  best valid : OrderedDict([('recall@10', 0.0979), ('mrr@10', 0.2787), ('ndcg@10', 0.1384), ('hit@10', 0.5292), ('precision@10', 0.1083)])
23 Oct 15:52    INFO  test result: OrderedDict([('recall@10', 0.1146), ('mrr@10', 0.3305), ('ndcg@10', 0.1706), ('hit@10', 0.5589), ('precision@10', 0.1281)])

将torch.sigmoid更换为F.logsigmoid之后结果为:

23 Oct 15:46    INFO  best valid : OrderedDict([('recall@10', 0.1922), ('mrr@10', 0.3606), ('ndcg@10', 0.2108), ('hit@10', 0.7211), ('precision@10', 0.1491)])
23 Oct 15:46    INFO  test result: OrderedDict([('recall@10', 0.2139), ('mrr@10', 0.4284), ('ndcg@10', 0.2552), ('hit@10', 0.7296), ('precision@10', 0.1752)])
zhengbw0324 commented 1 year ago

@ShelveyJ 您好! 感谢您的提醒,我们参考原论文后,在 loss 计算中加上了 log,详见#1507