不同类型的语义相似度损失函数(SentenceTransformerLoss)


不同输入类型的损失

根据任务数据类型选择合适的损失,详见这里
在这里插入图片描述


输入类型:[(anchor, positive/negative, label 1/0)…],label为1距离小、为0距离大

ContrastiveLoss(对比损失)

对于样本对A和B:

  • 正样本对(类别为1),它们之间的距离应尽可能近;
  • 负样本对(类别为0),它们之间的距离应尽可能远,只惩罚距离小于margin的负样本对,距离超过阈值时不再惩罚;

distance_metric默认为余弦距离,margin默认为0.5,lossd^2(a,p) + max(margin - d^2(a,n), 0)

def forward(self, sentence_features: Iterable[dict[str, Tensor]], labels: Tensor) -> Tensor:
    reps = [self.model(sentence_feature)["sentence_embedding"] for sentence_feature in sentence_features]
    assert len(reps) == 2
    rep_anchor, rep_other = reps
    distances = self.distance_metric(rep_anchor, rep_other)
    losses = 0.5 * (
        labels.float() * distances.pow(2) + (1 - labels).float() * F.relu(self.margin - distances).pow(2)
    )
    return losses.mean() if self.size_average else losses.sum()

OnlineContrastiveLoss

ContrastiveLoss基本相同,该loss仅选择批次内困难样本计算损失,通常效果比对比损失更优。

损失:选择距离小于最大正样本对距离的负样本,选择距离大于最小负样本对距离的正样本。忽略负样本对最小距离正样本对最大距离的差超过阈值的easy实例。

def forward(self, sentence_features: Iterable[dict[str, Tensor]], labels: Tensor, size_average=False) -> Tensor:
    embeddings = [self.model(sentence_feature)["sentence_embedding"] for sentence_feature in sentence_features]

    distance_matrix = self.distance_metric(embeddings[0], embeddings[1])
    negs = distance_matrix[labels == 0]
    poss = distance_matrix[labels == 1]

    # select hard positive and hard negative pairs
    negative_pairs = negs[negs < (poss.max() if len(poss) > 1 else negs.mean())]
    positive_pairs = poss[poss > (negs.min() if len(negs) > 1 else poss.mean())]

    positive_loss = positive_pairs.pow(2).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值