首页 > 其他分享 >衡量相似度:度量学习MetricLearning

衡量相似度:度量学习MetricLearning

时间:2024-06-04 17:55:58浏览次数:20  
标签:Loss right Vert 样本 MetricLearning 损失 衡量 相似 度量

总览

一般的机器学任务是,给定一个输入,预测其对应的的标签、值或一组值。这样的任务使用像是交叉熵损失 Cross-Entropy Loss 和均方误差损失 Mean Square Error Loss 就行。度量学习 Metric Learning 则不一样,它的目标是预测不同输入的相对距离。例如,衡量两张人脸的相似程度,或是推理两句话表达含义的相似度。

衡量相似度的通常做法是,让模型使用各种输入 生成代表特征的 embedding 向量,然后用各个向量间的距离(例如欧氏距离、余弦相似度)衡量这些输入的相似度。

排名损失 Ranking Loss

排名损失 Ranking Loss 函数就是用于解决 Metric Learning 问题的损失函数。根据应用场景的不同,Ranking Loss 拥有不同的名称,例如对比损失 Contrastive Loss、间隔损失 Margin Loss、铰链损失 Hinge Loss 或三元损失 Triplet Loss。

常用损失函数主要有对比损失 Contrastive Loss 和三元组损失 Triplet Loss。介绍之前,先给一些符号定义:

  • \(f(I)\),使用模型将图片转换为 embedding
  • \(\left\Vert f(I_p)-f(I_q) \right\Vert_2\),取两个 embedding 的欧氏距离

对比损失 Contrastive Loss

对比损失 Contrastive Loss,也可称为 成对损失 Pairwise Loss。

\[L=y \left\Vert f(I_p)-f(I_q) \right\Vert_2 +(1-y)\max \left\{ 0, m-\left\Vert f(I_p)-f(I_q) \right\Vert_2 \right\} \]

  • \(I_p\) \(I_q\),两张图片
  • \(y\),当 \(I_p\) \(I_q\) 被标记为相似时为 1,被标记为不相似时为 0
  • \(m\),不相似阈值

可以这样解释:若 \(I_p\) \(I_q\) 相似,直接用欧氏距离作为损失;若 \(I_p\) \(I_q\) 不相似,欧式距离大于 \(m\) 时进行惩罚,小于 \(m\) 时不做处理。

三元组损失 Triplet Loss

\[L=\max \left\{ 0, \left\Vert f(I_a)-f(I_q) \right\Vert_2 - \left\Vert f(I_a)-f(I_n) \right\Vert_2 + m \right\} \]

  • \(I_a\),锚点图片
  • \(I_p\),正样本,与 \(I_a\) 相似的图片
  • \(I_n\),负样本,与 \(I_a\) 不相似的图片
  • \(m\),期望的正负样本差距

这个损失函数很直观,最小化正样本欧氏距离、最大化负样本欧氏距离。\(m\) 决定了正负样本期望的与锚点的欧氏距离之差,值越大则模型对正负样本分得越开。

Triplet Loss 将学习任务从 Contrastive Loss 的 “使得正负样本差距更大” 变为了 “使得正负样本相对于锚点的差距更大”。实验结果证明这样做拥有更好的性能。

mini-batch

使用排名损失会带来的问题:

  • 样本爆炸。我们不可能训练所有可能的正负样本组合
  • 简单样本陷阱。随着网络的训练,越来越多的正负样本组合会得到极小的 loss,应当有选择地为网络提供困难的样本组合
  • 计算浪费。使用三元组损失时,一次需要计算 3 个 embedding,但这些 embedding 只会用来算一次损失

为了解决这些问题,使用 mini-batch 是一个很好的思路。例如一个 mini-batch 里有 64 个样本,不仅算出的 64 个 embedding 可以排列组合利用多次,还能在选定锚点样本和正样本后,选择一个对模型来说相对分辨困难的负样本。具体的样本选择策略很值得探讨,但本文不再深究。可以查阅 pytorch-metric-learning 文档中的 Miners 一节(https://kevinmusgrave.github.io/pytorch-metric-learning/miners/)。

参考来源

标签:Loss,right,Vert,样本,MetricLearning,损失,衡量,相似,度量
From: https://www.cnblogs.com/chirp/p/18231409

相关文章

  • 【深度好文】到底什么是质量意识?如何衡量,如何提升?
    大家好,我是狂师!在软件测试中,质量意识是一个核心且至关重要的概念。相信大家,经常会听到:"这个家伙质量意识很强,某某某要提升质量意识“之类的话语。在企业中,“质量意识”不仅关乎产品和服务的优劣,更是企业竞争力和可持续发展的关键因素。那么,到底什么是质量意识呢?坦白讲,”质量意......
  • 2021新书Python程序设计 人工智能案例实践 Python编程人工智能基本描述统计集中趋势和
    书:pan.baidu.com/s/1owku2NBxL7GdW59zEi20AA?pwd=suov​提取码:suov我的阅读笔记:图像识别:使用深度学习框架(如TensorFlow、PyTorch)创建图像分类模型。探索迁移学习,使用预训练模型进行定制。自然语言处理(NLP):构建一个情感分析模型,用于分析文本中的情感。实现一个文本生成模型,......
  • 软件缺陷数据度量和分析
    缺陷报告,是软件测试这个职位最重要得产出之一。甚至对软件测试这个行业你可以用比较狭隘的描述去定义他为:‘测试就是为了找到缺陷’。测试人员报出的缺陷,可以很好的反应产品中的问题,修复了这些问题,就可以有效的降低产品风险。其实缺陷报告不单单能帮助研发团队发现问题,他也......
  • 【机器学习聚类算法实战-5】机器学习聚类算法之DBSCAN聚类、K均值聚类算法、分层聚类
    ......
  • 1.什么是模块化,为什么要模块化? 2.衡量模块化独立的定性标准是什么?用自己的话表达其含
    模块化是将一个系统划分为多个独立的模块或组件,每个模块负责处理系统的一部分功能或任务。模块化能够使代码结构更清晰、易于维护和扩展,提高代码的重用性和可读性。通过模块化,开发人员可以更加高效地协同工作,降低系统复杂度。衡量模块化独立的定性标准包括内聚性和耦合性。内......
  • 自动化建设度量
    一、核心能力及建设要求1、资产维度 资产维度更多是在Case构建维度,如何构建出高质量自动化,主要从稳定性和覆盖率维度做引导;稳定性:希望能引导工程师关注测试用例执行结果,不断提升测试用例的可执行性和代码逻辑的正确性,用例执行通过率越高越好;覆盖率:希望能引导工程师通过用例......
  • 理解独立思考的定义后,可以设计一种评估方式来衡量个体的独立思考能力。以下是一种可能
    理解独立思考的定义后,可以设计一种评估方式来衡量个体的独立思考能力。以下是一种可能的评估方式:独立思考等级评估方式1.自主性(Autonomy)自我启发(Self-Inspiration):个体是否能够自主地提出问题或主张观点,而不是依赖外部指导或命令。自我引导(Self-Guidance):个体是否能......
  • 1.2.2 算法的效率度量
    1.2.2算法的效率度量算法的效率度量时间复杂度空间复杂度算法时间复杂度事前预估算法时间开销T(n)与问题规模n的关系(T表示”time“)时间复杂度运算规则加法规则,多项想加,只保留最高阶的项,且系数变为1乘法规则,多项相乘,都保留时间复杂度各阶数大小关系例题对数......
  • 如何评估一个回答的好坏——BERTScore 基于预训练模型的相似度度量方式
    基于预训练模型的相似度度量方式BERTScoreBERTScore是一种基于BERT(双向编码器表示器转换器)语言模型的相似度度量。它将问题和回答编码为BERT向量,然后计算两个向量的余弦相似度。与传统的基于重叠词语的相似度度量不同,BERTScore能够捕获语义相似性,即使两个句子不包含相同的......
  • R语言Copula对债券时间序列数据的流动性风险进行度量|附代码数据
    全文链接:http://tecdat.cn/?p=32707原文出处:拓端数据部落公众号在金融市场中,债券的流动性风险一直是一个备受关注的问题。流动性风险是指在市场上,债券价格的波动程度受到市场流动性的影响,这种影响可能导致债券价格的剧烈波动,从而影响投资者的收益。因此,对于债券流动性风险的度量......