Metric Learning——度量学习
1、度量(Metric)
再说一下关于度量的概念:在数学领域中,我们称其为度量或距离函数的一个描述了集合内元素间距离规则的函数。而具备这种度量的集合则被统称为度量空间。
2、度量学习的作用
度量学习也叫作相似度学习,根据这个叫法作用就很明确了。
因为进行度量学习能够为某些算法提供有效的评估依据,在这些算法中会基于给定的度量执行特定操作:例如,在K-means聚类过程中会使用欧氏距离来计算样本点与中心之间的距离,在K近邻分类器中也会采用类似的欧氏距离测量方法。这些计算实际上反映了样本点与中心点之间的相似程度。
这里的distance learning在field of pattern recognition, particularly inimage recognition, is employed to determine whether two images represent the same object. This is achieved by measuring the similarity between two images, with a higher similarity indicating a higher likelihood of belonging to the same category.
3、常用到的度量学习方法
在广义范畴内,度量学习被划分为基于线性变换的方法以及非线性的模型类别。
2 几种损失函数
2.1 Contrastive Loss
仅关注每一对类别间的距离关系及其对应的 margin 策略设计,在分类器优化过程中需要平衡两类之间的间距与内部样本的距离关系。
特别引入了带 margin 的策略(具体形式为 max(0, margin - loss)),我认为这一策略非常值得借鉴。
由于优化类间距离的目标是使它们尽可能大,在深度学习模型中通常采用在梯度下降过程中逐渐减小的趋势。
为了防止损失函数过于剧烈变化导致训练不稳定的问题,在实际实现中我们可能需要对传统的损失函数进行一定的变换处理。
值得注意的是,在实际应用中我们并不需要让类间距离变得过于巨大,在达到某个阈值即可有效地区分类别。
为了进一步提升模型性能,在后续实验中可能会尝试将损失函数取负后叠加 margin 等策略进行改进。
2.2 Triplet Loss
采用三元组框架,在锚样本、正样本与负样本之间调整间距关系。具体而言,在Triplet损失中,在每一次计算过程中不仅比较了正样本对的距离还评估了负样本对的距离,并且通过这种设计提升了整体的训练效率。值得注意的是,在Triplet损失设计中,我们的目标是让不同类别之间的平均距离大于同一类别内部的距离。对应的也是一个越大越好的目标函数值。在这里我们采用了取负值并附加了一个margins策略,并将其截断为一个区间减函数形式来构造损失函数。
在Triplet loss的基础上发展起来的各种损失函数中包含N-pair Loss、RankList Loss、MultiSimilarity Loss以及Circle Loss等多种新方法。总体上说,在学习过程中倾向于更多地考虑样本之间的相对距离关系,并根据样本难度的不同给予不同的权重处理。通过提升困难样本的学习权重,在Circle Loss中还引入了类别信息的应用机制,并结合了分类损失进行优化。
- 常见的多模态神经网络模型
2.1 经典双胞胎神经网络架构(CNN)
典型的双胞胎神经网络架构包括一个包含两个完全相同的子模型(子网),它们共享相同的权重参数(权重共享)。对于这两个子网分别施加来自不同来源的图像信号后,在完成特征提取后会执行相应的匹配逻辑。
典型的双胞胎神经网络架构包括一个包含两个完全相同的子网(子模型),它们共享相同的权重参数(权重共享)。对这两个子网分别施加来自不同来源的图像信号后,在完成特征提取后会执行相应的匹配逻辑。
孪生网络的训练过程,如下图所示:
(1) 通过网络传递图像对的第一张图像。
(2) 通过网络传递图像对的第二张图像。
(3) 使用(1)和(2)中的输出来计算损失。
其中,l12为标签,用于表示x1的排名是否高于x2。
在训练过程中, 两个分支网络生成了复杂的高级特征, 这些特征等同于 quality score. 当处理输入时, 作为输入使用了两幅图片, 分别计算出各自的得分值. 接下来, 计算两者的得分差值并将其纳入损失函数计算中, 然后进行反向传播.
(4) 返回传播损失计算梯度。
(5) 使用优化器更新权重。
对比损失函数(Contrastive Loss function)
其主要目的是通过区分图像来实现任务。由于传统分类方法依赖于将相似性转换为类别归属的问题,在此背景下采用对比度作为衡量标准更为合适。该架构更适合采用对比度作为衡量标准。
在判断图片相似性时,Dw被定义为姐妹孪生网络输出间的欧氏距离。其取值范围限定于1和0两个值。若模型预测输入相似度较高,则判定结果Y=0;反之,则判定结果Y=1。m代表的是一个正数边界参数(margin parameter)。存在一个边界参数m,它决定了当两个样本之间的差异超过该阈限时,就不会产生损失。
Siamese网络架构需要一个输入对,以及标签(类似/不相似)。
Siamese网络的代码地址:
https://github.com/xialeiliu/RankIQA
2.1 Triplet网络
Triplet网络的作者基于前人提出的多种特征提取方法构建了该模型。通过比较不同距离来学习有用的变量(在深度学习中这些变量被用来拟合函数),经过多组不同数据集的测试后发现,在性能上Triplet网络超越了传统的Siamese网络。
Triplet network基本原理:
在Siamese网络中存在以下问题:当使用随机对象的数据集进行比较时,可能导致单个目标被误判与其配对的对象相似。然而,在仅需区分同一组中的两个目标时,这可能导致认为同一组中的其他目标与其并不相似。在特征提取过程中缺乏足够的信息来明确两者之间的关系,在面对训练样本数量有限的情况下可能会产生误差。作者提出了一种称为Triplet网络的方法,在这种网络中三个样本组成一个训练组以获取拟合函数
其基本结构如图1所示:
该网络由三个共享参数的前馈结构组成,在训练过程中需要输入三个实例:一个是Anchor样本(记为x),一个是与之同类别的正样本(记为x+),还有一个是异类别的负样本(记为x-)。网络的目标是通过优化过程使Anchor点趋向于正样本特征表示的同时远离负样本特征表示。具体而言,在Triplet损失框架下,在每个训练步骤中模型会学习如何将同一类别中的Anchor点与Positive点的距离最小化,并将不同类别的Negative点的距离最大化。这种多目标的学习策略能够有效提升分类性能并确保模型对各类别都有较好的区分能力。
triplet loss:
对于有监督学习中的场景...通常假设数据被划分为固定的类别,并且可以通过带有Softmax激活函数的交叉熵损失函数来进行模型训练。然而,在某些情况下(比如分类问题中类别数量不确定或动态变化),我们则需要采用其他损失函数来替代传统的交叉熵损失函数。以Triplet Loss为例,在这一框架下我们可以有效地解决这些问题。具体来说,在人脸识别任务以及Quora问题对齐任务中(或称为问答对齐任务),Triplet Loss的优势主要体现在对细微差别(细微之处)的捕捉能力上:当两个输入高度相似时(或具有较高的相似度),Triplet损失机制能够更有效地捕捉这些微小的变化,并通过构建一个三维差异空间来增强模型对数据特征的理解能力。这种方法不仅有助于提升模型在特定任务中的性能表现(如识别能力或配准效果),还能通过优化输入之间的差异建模过程来进一步提升模型的整体表现能力。然而,在实际应用中需要注意的是:这种方法收敛速度较慢,在某些情况下可能无法达到预期效果
Triplet loss的主要目的是最小化同一身份样本在嵌入空间中的距离,同时最大化不同身份样本之间的距离。
Triplet loss 定义:
triplet loss的目标是:
两个具有同样标签的样本,他们在新的编码空间里距离很近。
两个具有不同标签的样本,他们在新的编码空间里距离很远。
进一步地,在一对positive examples和一个negative example中(即两个正样本与一个负样本之间),要求负样本与正样本之间的间距必须超过正样本之间间距的范围,并且这个差距必须超过某个预先设定的阈值参数:margin.
triplet loss定义在下面三元组概念之上:
- an anchor(基准正例)
- a positive of the same class as the anchor (正例)
- a negative of a different class (负例)
对于(a,p,n)这个triplet(三元组),其triplet loss就可以写作:
此时通过最小化该损失函数实现a与p之间距离的最小化,并使a与n之间距离的计算结果超过a到p的距离加上一个边距margin。当negative example容易被识别时该损失函数将等于零从而表明negative example被正确地区分出来否则其值会显著增大。
