对比损失Contrastive Loss

部署运行你感兴趣的模型镜像

【时间】2-019.01.21

【题目】对比损失Contrastive Loss

PS:本文转载自Contrastive Loss

Contrastive Loss

在传统的siamese network中一般使用Contrastive Loss作为损失函数,这种损失函数可以有效的处理孪生神经网络中的paired data的关系。

1531909-0244cbc55e300cd2.png

siamese network-孪生神经网络
contrastive loss的表达式如下:

1531909-0ecc6b2518f1afe1.png
其中d=||an-bn||2,代表两个样本的欧式距离,y为两个样本是否匹配的标签,y=1代表两个样本相似或者匹配,y=0则代表不匹配,margin为设定的阈值。
这种损失函数最初来源于Yann LeCun的Dimensionality Reduction by Learning an Invariant Mapping,主要是用在降维中,即本来相似的样本,在经过降维(特征提取)后,在特征空间中,两个样本仍旧相似;而原本不相似的样本,在经过降维后,在特征空间中,两个样本仍旧不相似。

您可能感兴趣的与本文相关的镜像

Dify

Dify

AI应用
Agent编排

Dify 是一款开源的大语言模型(LLM)应用开发平台,它结合了 后端即服务(Backend as a Service) 和LLMOps 的理念,让开发者能快速、高效地构建和部署生产级的生成式AI应用。 它提供了包含模型兼容支持、Prompt 编排界面、RAG 引擎、Agent 框架、工作流编排等核心技术栈,并且提供了易用的界面和API,让技术和非技术人员都能参与到AI应用的开发过程中

对比损失函数用于衡量正负样本对之间的相似度或距离,并指导模型进行学习[^1]。其核心原理是通过设计合适的损失函数,让模型学习到正样本对之间的相似度高,负样本对之间的相似度低。 常见的对比损失函数有以下几种: - Contrastive Loss:最早的对比损失函数,用于衡量正负样本对之间的欧氏距离[^1]。 - Triplet Loss:使用三元组 (anchor, positive, negative) 进行学习,使得 anchor 与 positive 的距离小于 anchor 与 negative 的距离[^1]。 - InfoNCE Loss:基于互信息最大化的对比损失函数,在对比学习中取得了显著的成果[^1]。 SimCSE(Simple Contrastive Learning of Sentence Embeddings)是一种简单有效的句子嵌入对比学习方法。在 SimCSE 中,对比损失起到了关键作用。SimCSE 的核心思想是通过构造正样本对和负样本对,利用对比损失来优化模型。具体来说,对于一个输入句子,通过不同的方式(如 Dropout)生成两个不同的表示作为正样本对,而批量内的其他句子表示则作为负样本。 SimCSE 使用 InfoNCE(Info Noise Contrastive Estimation)损失作为对比损失,公式如下: \[ \mathcal{L}_{i}=-\log \frac{\exp \left(\text{sim}\left(\mathbf{h}_{i}, \mathbf{h}_{i}^{+}\right) / \tau\right)}{\sum_{j = 1}^{N} \exp \left(\text{sim}\left(\mathbf{h}_{i}, \mathbf{h}_{j}\right) / \tau\right)} \] 其中,$\mathbf{h}_{i}$ 和 $\mathbf{h}_{i}^{+}$ 是第 $i$ 个句子的正样本对表示,$\mathbf{h}_{j}$ 是批量内的其他句子表示,$\text{sim}$ 是相似度函数(通常为余弦相似度),$\tau$ 是温度参数。 通过最小化这个对比损失,SimCSE 可以学习到更好的句子嵌入,使得正样本对之间的相似度更高,负样本对之间的相似度更低。 ```python import torch import torch.nn.functional as F def info_nce_loss(features, temperature=0.07): batch_size = features.shape[0] labels = torch.arange(batch_size).to(features.device) similarity_matrix = F.cosine_similarity(features.unsqueeze(1), features.unsqueeze(0), dim=2) mask = torch.eye(batch_size, dtype=torch.bool).to(features.device) labels = labels[~mask].view(batch_size, -1) similarity_matrix = similarity_matrix[~mask].view(batch_size, -1) logits = similarity_matrix / temperature loss = F.cross_entropy(logits, labels[:, 0]) return loss # 示例 batch_size = 32 embedding_dim = 128 features = torch.randn(batch_size, embedding_dim) loss = info_nce_loss(features) print(loss) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值