Multi-Sample based Contrastive Loss for Top-kRecommendation(IR 2021)

本文探讨了对比学习(CL)在推荐系统中的应用,指出传统CL正负样本不平衡的问题,并提出多采样正样本的CL(MCL),通过加权和多路径学习优化正样本的使用。此外,文章还介绍了MSCL损失函数,用于同时考虑多个正样本,以提升推荐效果。作者认为将用户交互项目视为相似可能欠妥,并分享了一篇相关知乎文章供读者参考。
摘要由CSDN通过智能技术生成

在 CL 中,将同一批次中的所有非正样本作为负样本,可以简单的快速获取大量负样本,CL_loss 意在最大化正对的相似性并最小化负对的相似性。而BPR 一般采用随机抽取的方式使用一个或几个负样本,BPR_loss意在最大化正样本和负样本之间的距离。它们都是通过对比过程学习的,所以BPR 损失也可以看成对比损失的一种。

为解决 CL 中正负样本不均衡的问题,作者提出了多采样正样本的 CL ,如上图。正负样本添加了权重来权衡它们之间的重要性,还可以同时使用多个正样本来参与 CL。

ICL (加入权重后的 CL_loss):                                                                                       a ∈(0,1)

MCL(基于多个正样本的CL):针对正样本使用不足的问题,文中提出了一种

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个batch-balanced contrastive loss的PyTorch代码示例: ```python import torch import torch.nn.functional as F class BatchBalancedContrastiveLoss(torch.nn.Module): def __init__(self, margin=1.0, batch_size=256, num_classes=10): super(BatchBalancedContrastiveLoss, self).__init__() self.margin = margin self.batch_size = batch_size self.num_classes = num_classes def forward(self, features, labels): # Compute pairwise cosine similarity similarity_matrix = F.cosine_similarity(features.unsqueeze(1), features.unsqueeze(0), dim=2) # Create mask for positive pairs (same class) mask_pos = torch.zeros_like(similarity_matrix) for i in range(self.batch_size): mask_pos[i*self.num_classes:(i+1)*self.num_classes, i*self.num_classes:(i+1)*self.num_classes] = 1 mask_pos = mask_pos.to(features.device) # Create mask for negative pairs (different class) mask_neg = 1 - mask_pos # Compute losses for positive and negative pairs loss_pos = torch.sum(mask_pos * (1 - similarity_matrix)**2) loss_neg = torch.sum(mask_neg * torch.relu(similarity_matrix - self.margin)**2) # Compute the final loss by balancing the positive and negative losses num_pos = torch.sum(mask_pos).item() num_neg = torch.sum(mask_neg).item() beta = num_neg / (num_pos + num_neg) loss = beta * loss_pos + (1 - beta) * loss_neg return loss ``` 在这个例子中,我们创建了一个`BatchBalancedContrastiveLoss`类,它继承自`torch.nn.Module`。`margin`参数是对比损失函数中的间隔参数,`batch_size`参数是每个batch中的样本数量,`num_classes`参数是每个类别的样本数。 在`forward`方法中,我们首先使用`F.cosine_similarity`函数计算特征向量之间的余弦相似度矩阵。我们然后创建了一个`mask_pos`变量,它是一个大小为(batch_size*num_classes, batch_size*num_classes)的零矩阵,其中对角线上的元素为1,代表同类别样本之间的相似度。我们还创建了一个`mask_neg`变量,它是`mask_pos`的补集,代表不同类别样本之间的相似度。 接下来,我们计算正样本对和负样本对的损失。对于正样本对,我们使用(1-相似度)^2计算损失。对于负样本对,我们使用max(0, 相似度-间隔)^2计算损失。 最后,我们计算平衡的对比损失,通过计算正样本对和负样本对的损失之间的权衡。我们使用beta=num_neg/(num_pos+num_neg)来计算负样本在损失函数中所占的比例,其中num_pos和num_neg分别是正样本对和负样本对的数量。 这个代码示例可以用于训练具有类别标签的对比学习模型,例如具有训练集中的类别标签的图像数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值