度量学习(Metric Learning)
度量学习(Metric Learning)
Metric Learning.
**度量学习(Metric Learning)**旨在通过深入分析样本间的相似性关系,在给定的具体任务中构建合适的距离测度函数。传统的基于深度的学习方法多采用非线性的映射策略,在原始数据特征空间中构建映射后的优化模型。随后在此优化后的模型中应用预设的标准测距函数来评估各样本间的相似程度。
基于给定的数据集f_{\theta}(x), 深度度量学习通过共享权重机制构建了一种深度神经网络, 将输入样本x通过映射作用于低维特征空间. 该网络通过合理设计的度量损失函数以确保同类样本在特征空间中的距离较近, 而不同类样本之间的距离则较为遥远. 这一机制不仅能够实现对不同样本相似性程度的估算, 还能被应用于包括人脸识别、行人重识别和图像检索在内的依赖于样本配对的任务.
本文目录:
- 数据采集策略用于正负样本的采样。
- 研究人员致力于网络架构构建。
- 模型训练时采用损失函数定义。
- 通过PyTorch Metric Learning开展度量学习过程。
1. 正负样本的采样
度量学习旨在缩小相似样本之间的距离,并扩大不相似样本之间的距离。基于此考虑输入的x(称为锚定样本),我们需要科学地选取正样例(即与之类似的样例)和负样例(即与之不相关的样例)。
在深度度量学习中,在不同标签下的样本对数量通常显著高于相同标签下的正样本对数量。若采用简单的随机采样策略,则可能导致网络学习效果受限的原因是存在大量低质量的负面配对难以为网络提供有价值的信息;因此建议采用**负样本挖掘(negtive mining)**策略来筛选高质量的负面配对
- EasyNegativeMining: 选择显著不同的负样本可能会导致过于简单的NegativeSamplePair.
- HardNegativeMining: 被训练数据确定的FalsePositiveSample被选作DifficultSample.
- Semi-HardNegativeMining: 在指定范围内搜索NegativeSample.

2. 网络结构的设计
深度度量学习基于深度神经网络表征样本对之间的距离。典型的架构采用Siamese网络模式,在共享权重的架构下同时接收成对图像(包括正样本与负样本),通过设计合理的损失函数来计算图像对之间的差异程度。Siamese网络的本质是将同一个网络架构经过两次前馈传播过程以完成特征提取与对比任务。

3. 损失函数的设计
基于pair的度量损失:在一批样本中分析配对关系,在保证正类配对相似性的同时优化其相似程度,在负类配对比中增强其差异性,并通过Contrastive Loss, Binomial Deviance Loss等方法实现这一目标。
基于proxy的度量损失:引入代表每个类别的代理模型或参数,在保证同类别与自身代表趋近的同时抑制不同类别间代表间的趋近程度。
(1) 基于对的度量损失 Pair-based Metric Loss
针对(Pair-based) 的度量损失,在一个批次中考察各组样例间的相互关联性时,应尽量缩小正样例间的距离并扩大负样例间的距离。这种关联性既可基于少数几个样例进行分析(局部视角),也可基于整个批次的所有样例展开研究(非局部视角)。
⚪ Contrastive Loss
对比损失(Contrastive Loss)是一种用于识别给定样本对(x_i,x_j)之间真实类别关系的方法,在深度学习模型中被广泛应用于对比学习任务中。对于被标记为正样本的样本对,则要求其对应的特征向量间的欧氏距离趋近于零;而对于被标记为负样本的样本对,则要求其对应的特征向量间的欧氏距离至少达到一个预先设定的小值\epsilon。
⚪ Binomial Deviance Loss
Binomial Deviance Loss(二项式偏差损失)属于对比损失的一种更柔和的版本,并采用 softplus 函数替代 Hinge loss。
该损失函数由两部分组成:当实例i与j属于同一类别时(即y_i=y_j),其计算结果为指示函数\Bbb{I}乘以对数值\log(1+\exp(\alpha(D[f_{\theta}(x_i),f_{\theta}(x_j)]-\[lambda]())));而当实例i与j属于不同类别时(即y_i\neq y_j),则计算结果为另一指示函数\Bbb{I}乘以类似的对数值表达式\log(1+\exp(\beta(\lambda- D[f_{\theta}(x_i),f_{\theta}(x_j)])))
⚪ Triplet Loss
Triplet Loss (三元组损失) 为每一个输入x选取一个对应的正样例x^+和一个对应的负样例x^-, 以确保正样例对之间的距离与负样例对之间的距离之差小于指定的margin值\epsilon。

⚪ Improved Triplet Loss
Improved Triplet Loss 在Triplet Loss框架方面有所改进,并且强制约束正样本对的距离必须满足\beta < \alpha。
⚪ Batch Hard Triplet Loss
Batch Hard Triplet Loss 对于每个输入样本x而言,系统会自动识别出其对应的难度最大的K个正样本集合\{x^+_k\}以及难度最高的K个负样本集合\{x^-_k\}。随后,在这些被选定的正负样本对中挑选出具有最佳区分度的难易对比实例,并通过构建相应的损失函数来实现模型参数的有效优化。
最大值(零)与...的最大值减去最小值加\epsilon
⚪ Hierarchical Triplet Loss
分层三元组损失(Hierarchical Triplet Loss) 根据数据集构建层次化的树结构,并通过采样生成相应的三元组;在此基础上设定相应的违背边界以反映类间关系。

⚪ Angular Loss
基于角度损失(angular loss)的方法, 通过引入包含三元组(x_a,x_p,x_n)的三阶几何约束条件, 实现了对目标物体尺度变化及旋转变化下的鲁棒识别能力。该方法通过构建以锚点样本x_a及其正样本x_p中心位置为基准点, 即中心点坐标计算公式为\mathbf{x}_c = (\mathbf{x}_a + \mathbf{x}_p)/2, 并以此为中心绘制圆形区域; 接着将负样本\mathbf{x}_n与该基准点\mathbf{x}_c连接起来并绘制垂线至圆形区域相交于另一端点\mathbf{x}_m. 当检测到目标物体的角度参数n'减少时, 负样本\mathbf{x}_n将被强制使其沿着\mathbf{x}_c\mathbf{x}_n方向移动远离原来的锚定位置, 同时使得锚定位置间的距离逐渐缩小。

⚪ Quadruplet Loss
对于每一个输入样本x来说,在挑选一个对应的正样本x^+的同时,则需要挑选出两个不同的负样本x^-_1和x^-_2。从而使得正样本对之间的相似度值低于任意一对负样本之间的相似度值,并且同时也低于另外一对负样本之间的相似度值
该表达式由两部分组成:第一部分为\max(0, d(f_\theta(x), f_\theta(x^+)) - d(f_\theta(x), f_\thetaxy^{-}_1) + \\alpha);第二部分则为\max(0, d(f_theta{x}, f_theta{x^+}) - d(f_theta{x^{-}_2}, f_theta{x^{-}_1}) + beta)。\这两部分通过加法运算结合在一起

⚪ N-pair Loss
该方法将Triplet损失拓展为能够同时比较所有负类样本间距离的技术。对于任意给定的输入样本x来说,在其对应的正样本空间中选取一个匹配对象x^+的同时,在其余不同类别空间中选取全部可能的负样本实例x_1^-,...,x_{N-1}^-. 通过这种多对多的关系构建多个元组组合体后, 该方法基于上述构建的元组集合提出了一种新的损失函数定义。

⚪ Lifted Structured Loss
Lifted Structured Loss 基于一批样本内部的所有样本对之间的关系动态地构建最具挑战性的三元组集合。针对每一个正样本对(i,j), 分别找出与i最近的一个负样例k, 以及与j最近的一个负样例l, 然后选择两者中离得较近的那个作为n \in (k,l), 并构造相应的三元组(i,j,n).
考虑所有(i,j)属于集合P的情况下,
评估分数为:
\frac{1}{2|\mathcal{P}|} \sum_{(i,j)\in\mathcal{P}} \left( D_{ij} + \varepsilon - \underbrace{ \max( (i,k)\in\mathcal{N}, (j,l)\in\mathcal{N} ) }_{最大距离减去ε} ) ^2

⚪ Histogram Loss
直方图损失(Histogram Loss) 为了估计正样本对与负样本对各自对应的两个特征距离分布p^{+}(x)与p^{-}(x)(此处采用直方图H^{+}与H^{-}进行近似估算)。接着评估所有正样本点之间的相对相似程度与所有负样本点之间相对相似程度的比较结果。
\int_{-1}^{1}p^-(x) [\int_{-1}^{x}p^+(y)dy] dx ≈ \sum_{r=1}^R (h^-_r \sum_{q=1}^rh_q^+)

⚪ Ranked List Loss
基于给定的锚点样本x_i^c之后应用Ranked List Loss模型通过相似性评估确定其他样本的排序顺序。随后系统会筛选出与锚点的距离超过阈值α减去m的所有正类样例以及与锚点的距离低于α的所有负类样例。并期望所有负类样例之间的相互距离均高于α值;同时所有正类样例之间的相互距离均低于(α−m)。

⚪ Soft Nearest Neighbor Loss
Soft Nearest Neighbor Loss 被用来评估不同类别样本之间的相互影响程度,在表征学习中具有重要的应用价值。对于给定的数据集X={x_i}^n_{i=1}来说,该损失函数的具体形式如下:
⚪ Multi-Similarity Loss
MSLE 将基于深度度量损失的 Multi-Similarity Loss 表述为一种基于样本间距离进行加权整合的形式,并进而分别赋予正负样本间的相似关系权重
该公式可表示为:
\text{α的倒数用于计算第一项中的对数值}
其中,
\text{第一项为}\frac{1}{\alpha}\log(1+\sum_{k∈\mathcal P_i}\text{α乘以括号内各项之总和})
而第二项则为:
\text{β的倒数用于计算第二项中的对数值}
其中,
\text{第二项为}\frac{1}{β}\log(1+\sum_{k∈\mathcal N_i}\text{-β乘以括号内各项之总和})
将两部分相加即为最终结果。

⚪ Circle Loss
Circle Loss 在处理那些欠优化的样本对的距离时会赋予更高的权重;这些处理后的距离会使偏离最优中心的样本对受到更多关注并承担更大的惩罚。
计算这个值的对数等于1加上两个累加项的乘积。第一个累加项是对所有属于节点i的邻居节点j进行求和运算的结果;第二个累加项是对所有属于节点i的父节点k进行求和运算的结果。每个求和运算内部都包含了一个指数函数:第一个指数函数带有负号,并且其参数是Gamma乘以Alpha_n^j与(D_ij + Delta_n)之和;第二个指数函数则带有正号,并且其参数是Gamma乘以Alpha_p^k与(D_ik + Delta_p)之和。

(2) 基于代理的度量损失 Proxy-based Metric Loss
通过Proxy-based方法的度量损失指标为每个类别引入一个代理样本,并降低了同一类别内的样本与相应代lab之间的距离;同时提高了不同类别间的样本与各自代表性的代lab之间的距离。其中部分代lab可通过给定的数据集生成预设值域中的向量表示或优化得到可学习向量参数化形式。
⚪ Magnet Loss
基于Magnet Loss进行检索,并通过分析所有相关邻近的聚类簇来优化目标函数:首先,在各聚类簇内部最小化各点与其对应样本均值之间的距离;其次,在跨簇对比中最大化不同聚类簇之间样本均值之间的距离。
该损失函数通过计算负对数概率比来衡量样本之间的差异程度。
分子部分表示特定类别的置信度,
分母则代表所有其他类别对应的置信度总和。

⚪ Clustering Loss
Clustering Loss 设定每个类别对应的聚类中心位置,并规定该划分下的最优聚类得分为所有可能划分中最高,并且此最高值必须至少达到结构化边界\Delta

⚪ Proxy-NCA
Proxy-NCA 在每个类别中随机初始化一个代理向量 p ,在遍历各个样本时 ,通过邻域成分分析 (NCA ) 的方法 拉近每个 样本 x 和其所属 类别 y 对应 的 代理 向量 p_y 之间 的 距离 ,同时扩大与其他 类别 代理 向量 p_z 之间 的 距离 。

⚪ ProxyNCA++
ProxyNCA++ 在Proxy-NCA 的基础上增添了几项改进措施,在损失函数方面的主要改进体现在优化代理分配概率以及实施低温缩放策略。

⚪ Proxy-Anchor
通过为每个类别随机初始化一个代理向量p来实现;通过遍历每一个代理向量来降低与该代理向量的距离;同时提高与其他类别样本之间的距离。

⭐ 参考文献
- Deep Metric Learning for Practical Person Re-Identifification:(arXiv1407)实践的人体重识别中的深度度量学习。
- FaceNet: A Unified Embedding for Face Recognition and Clustering:(arXiv1503)FaceNet:通过三元组损失实现人脸识别和聚类的统一嵌入。
- Deep Metric Learning via Lifted Structured Feature Embedding:(arXiv1511)基于提升结构化特征嵌入的深度度量学习。
- Metric Learning with Adaptive Density Discrimination:(arXiv1511)通过自适应密度判别实现度量学习。
- Person Re-identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function:(CVPR2016)通过多通道基于部位的卷积神经网络和改进的三元组损失函数实现人体重识别。
- Learning Deep Embeddings with Histogram Loss:(arXiv1611)通过直方图损失学习深度嵌入。
- Improved Deep Metric Learning with Multi-class N-pair Loss Objective:(NIPS2016)通过多类别N-pair损失改进深度度量学习。
- Deep Metric Learning via Facility Location:(arXiv1612)通过设施位置实现深度度量学习。
- In Defense of the Triplet Loss for Person Re-Identification:(arXiv1703)为人体重识别任务中的三元组损失辩护。
- No Fuss Distance Metric Learning using Proxies:(arXiv1703)使用代理的无融合距离度量学习。
- Beyond triplet loss: a deep quadruplet network for person re-identification:(arXiv1704)用于行人重识别的四元组损失。
- Deep Metric Learning with Angular Loss:(arXiv1708)通过角度损失实现深度度量学习。
- Deep Metric Learning with Hierarchical Triplet Loss:(arXiv1810)通过层次化三元组损失实现深度度量学习。
- Analyzing and Improving Representations with the Soft Nearest Neighbor Loss:(arXiv1902)通过软最近邻损失分析和改进表示学习。
- Ranked List Loss for Deep Metric Learning:(arXiv1903)深度度量学习中的排序列表损失。
- Multi-Similarity Loss with General Pair Weighting for Deep Metric Learning:(arXiv1904)深度度量学习的多重相似性损失与通用对加权。
- Circle Loss: A Unified Perspective of Pair Similarity Optimization:(arXiv2002)Circle Loss: 成对相似性优化的统一视角。
- Proxy Anchor Loss for Deep Metric Learning:(arXiv2003)深度度量学习的代理锚点损失。
- ProxyNCA++: Revisiting and Revitalizing Proxy Neighborhood Component Analysis:(arXiv2004)ProxyNCA++: 回顾和改进深度度量学习中的代理邻域成分分析。
4. 使用PyTorch Metric Learning实现度量学习
该PyTorch Metric Learning库专为深度度量学习领域开发,并提供了一系列工具和模块以简化模型训练过程;获取方法包括通过官方GitHub仓库直接下载或访问其在线演示页面获取详细安装说明和示例代码
pip install pytorch-metric-learning
首先初始化一个度量损失函数,以计算训练集中样本对的度量损失:
from pytorch_metric_learning import losses
loss_func = losses.TripletMarginLoss()
正样本对通常由具有相同标签的特征向量组成;而负样本对则由不同类别的特征向量组成;通过合理设计采样策略能够筛选出更具挑战性的样本对比其分类器进行训练
from pytorch_metric_learning import miners
miner = miners.MultiSimilarityMiner()
在训练阶段输入到模型中的特征嵌入(尺寸为(batch\_size, embedding\_size))以及对应的标签(尺寸为(batch\_size)):
# your training loop
for i, (data, labels) in enumerate(dataloader):
optimizer.zero_grad()
embeddings = model(data)
hard_pairs = miner(embeddings, labels)
loss = loss_func(embeddings, labels, hard_pairs)
loss.backward()
optimizer.step()
该系统可通过distances, reducers, regularizers构建其损失函数体系。具体而言,在数据处理流程中首先利用难例挖掘技术识别出不同类别的样本对索引;随后使用预设的距离模型来评估每一对样本的距离,并最终导出总损失值;regularizer组件负责为每个单独的样本点生成对应的基础性损耗指标;随后应用衰减机制以筛选出贡献度较高的单个损失项。
from pytorch_metric_learning.distances import CosineSimilarity
from pytorch_metric_learning.reducers import ThresholdReducer
from pytorch_metric_learning.regularizers import LpRegularizer
from pytorch_metric_learning import losses
loss_func = losses.TripletMarginLoss(distance = CosineSimilarity(),
reducer = ThresholdReducer(high=0.3),
embedding_regularizer = LpRegularizer())

