首页 > 其他分享 >pairwise损失_triplet损失_提升精排模型的trick

pairwise损失_triplet损失_提升精排模型的trick

时间:2023-03-12 17:12:49浏览次数:43  
标签:loss triplet 精排 样本 损失 pairwise scores self

多标签

import torch
import torch.nn as nn
import torch.optim as optim

class RankModel(nn.Module):
    def __init__(self, num_features):
        super(RankModel, self).__init__()
        self.num_features = num_features
        self.fc1 = nn.Linear(num_features, 32)
        self.fc2 = nn.Linear(32, 16)
        self.fc3 = nn.Linear(16, 1)
        self.relu = nn.ReLU()
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.relu(self.fc1(x))
        out = self.relu(self.fc2(out))
        out = self.sigmoid(self.fc3(out))
        return out

def pairwise_loss(scores, labels, margin=1.0):
    """
    计算pairwise损失
    :param scores: tensor, 每个样本的分数
    :param labels: tensor, 每个样本的标签
    :param margin: float, 损失函数的边界
    :return: tensor, 损失
    """
    n = scores.size(0)
    diffs = scores.view(n, 1) - scores.view(1, n)
    mask = (labels.view(n, 1) != labels.view(1, n)).float()
    loss = torch.clamp(margin - mask * diffs, min=0)
    loss = torch.sum(loss) / (n * (n - 1))
    return loss

# Example usage
model = RankModel(num_features=10)
optimizer = optim.SGD(model.parameters(), lr=0.01)

x = torch.randn(16, 10)
y = torch.randint(0, 2, size=(16,))

for i in range(100):
    optimizer.zero_grad()
    scores = model(x)
    loss = pairwise_loss(scores, y)
    loss.backward()
    optimizer.step()
    print("Epoch {}, Loss: {:.4f}".format(i+1, loss.item()))

# 这个模型包含了三层全连接层和一个Sigmoid激活函数,使用pairwise损失函数进行训练。在训练过程中,我们使用随机生成的输入和标签,然后计算损失和梯度,并使用优化器更新模型参数。

# 请注意,这个模型是非常基本的,您可以根据自己的需求和数据来调整模型架构、超参数、正则化等。

01标签

def pairwise_loss(scores, labels, margin=1.0):
    """
    计算pairwise损失
    :param scores: tensor, 每个样本的分数
    :param labels: tensor, 每个样本的标签 (0 or 1)
    :param margin: float, 损失函数的边界
    :return: tensor, 损失
    """
    n = scores.size(0)
    diffs = scores.view(n, 1) - scores.view(1, n)
    mask = (labels.view(n, 1) != labels.view(1, n)).float()
    loss = torch.clamp(margin - mask * diffs, min=0)
    loss = torch.sum(loss) / (n * (n - 1))
    loss *= 2.0  # 将损失乘以2
    return loss

# 请注意,在使用这种方法时,模型的输出应该是标量而不是向量。例如,如果您的模型有一个sigmoid输出层,则可以使用以下代码计算模型的输出和损失:
scores = torch.sigmoid(model(x)).squeeze()
loss = pairwise_loss(scores, y)

上述使用的损失函数是pairwise损失函数,也称为triplet损失函数的变体。该损失函数用于训练排序模型,旨在最小化输入样本的间隔。

具体来说,pairwise损失函数通过比较每个样本对之间的分数差异,强制要求具有相似标签的样本之间的分数差异较小,并且具有不同标签的样本之间的分数差异较大。这有助于使得训练的模型具有更好的排序性能,即对于具有相似标签的样本,模型将更有可能将它们排在一起,而对于具有不同标签的样本,模型将更有可能将它们分开。

在pairwise损失函数中,样本之间的差异是通过一个边界来约束的,即样本之间的距离应大于或等于边界。如果两个具有相似标签的样本之间的距离小于边界,则会导致损失函数值变大,从而鼓励模型增加它们之间的分数差异。相反,如果两个具有不同标签的样本之间的距离大于边界,则会导致损失函数值变大,从而鼓励模型减少它们之间的分数差异。

使用pairwise损失函数的主要优点是它可以使用任何排序模型来训练,而不需要对模型进行任何修改。此外,由于该损失函数能够考虑所有样本对之间的关系,因此它可以在许多不同的排序任务中使用,并能够产生很好的结果。

标签:loss,triplet,精排,样本,损失,pairwise,scores,self
From: https://www.cnblogs.com/douzujun/p/17208547.html

相关文章

  • pifpaf的scale损失
    torch.nn.Softplus默认公式为log(1+exp(x))importtorchimportnumpyasnpm=torch.nn.Softplus()print(m(torch.Tensor([4])))  对x作软relu处理然后跟target进......
  • pifpaf的回归损失
    首先把输出和表情需要计算的数值提取出来然后用regression_loss去计算损失值。  调用的location_loss就是把x,y坐标图的差和bmin做了l2范式。后矩阵除以b再加上logb。......
  • 推荐系统[八]算法实践总结V2:排序学习框架(特征提取标签获取方式)以及京东推荐算法精排
    0.前言「排序学习(LearningtoRank,LTR)」,也称「机器排序学习(Machine-learnedRanking,MLR)」,就是使用机器学习的技术解决排序问题。自从机器学习的思想逐步到信息检索等领域......
  • 梯度下降,损失函数,模型训练
    我发现这种数学问题,国内的教材,就会给你整的罗里吧嗦,说不清楚,让人非常难理解损失函数(lossfunction)或代价函数(costfunction)是将随机事件或其有关随机变量的取值映射为非负......
  • 推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwis
    0.前言召回排序流程策略算法简介推荐可分为以下四个流程,分别是召回、粗排、精排以及重排:召回是源头,在某种意义上决定着整个推荐的天花板;粗排是初筛,一般不会上复杂模型......
  • 损失函数之 L1 loss, IOU loss, GIOU loss, DIOU loss, CIOU loss
    目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成回归损失函数的发展过程主要包括:最原始的SmoothL1Loss函数、2016年提出的IoULoss、2019年提出的GI......
  • 19、损失函数与反向传播
    1、损失函数(1)计算实际输出和目标之间的差距;(2)为更新输出提供一定的依据(反向传播);LossFunction:nn.L1Loss:输入值是x,输出值是y,那么L1Loss是采用 |yi-xi|/x的个数,就是每......
  • 损失函数
    损失函数参考:“损失函数”是如何设计出来的?直观理解“最小二乘法”和“极大似然估计法”_哔哩哔哩_bilibili“交叉熵”如何做损失函数?打包理解“信息量”、“比特”、“......
  • 常见损失函数用法及其比较
    1. 损失函数损失函数(lossfunction)或代价函数(costfunction)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。在应......
  • 常用的损失函数
        Loss函数机器学习中的监督学习本质上是给定一系列训练样本(xi,yi),尝试学习x→y的映射关系,使得给定一个x,即便这个x不在训练样本中,也能够输出y^,尽量与真实的y......