知乎专栏:https://zhuanlan.zhihu.com/p/27748177
在检索和验证任务中,经常使用contrastive 损失或 triplet损失作为损失函数,大多数论文也主要关注如何选取损失函数,这篇论文认为训练样本的选取也很重要。提出了distance weighed sampling,选取信息量更大更稳定的训练样本。此外,提出了margin based loss,效果更好。
深度嵌入学习的一般流程:
先验知识回顾
contastive损失:
三元损失:
对于contrastive损失,困难负样本挖掘可以帮助更快收敛。但对于三元损失来说,困难负样本易导致collapse。FaceNet提出了挖掘半困难负样本的方法:给定anchor-positive对,在batch中,通过如下关系选择负样本:
Distance Weighted Margin-Based Loss
1.随机挑选样本的问题
在高维空间中,pairwise距离分布趋向于正态分布,这意味着如果均匀的选择负样本,容易获得1.414以外的样本,对于距离小的样本就很少获得。
2.只挖掘太困难负样本的问题
Hard negative样本通常离anchor的距离较小,这时如果有噪声,那么这种采样方式就很容易受到噪声的影响,从而造成训练时的模型坍塌,困难负样本的梯度方差较大,具有较小的信噪比。
3.distance weighted sampling
根据距离均匀的筛选样本,及带权值的筛选,为避免选择到噪声样本,再对筛选进行裁剪。最终,给定anchor样本,距离加权的采样通过下式采样负样本:
下图显示了不同方法采样负样本,距离的方差,可以看到提出的距离加权的采样提供了较大距离范围的样本:
三元损失比对比损失好的原因:第一点,三元损失不需要预选的阈值去分割相同、不同的图像,它更能适应outliers;第二点,三元损失仅需要正样本距离比负样本距离近,对比损失需要将正样本聚合的越来越近。
对于三元损失来说,困难负样本的梯度趋于0,梯度主要来自困难正样本对,很少来自困难负样本对,对于网络训练是没有帮助的。使用真实距离值代替平方距离值将好点,这在上一篇博文中提到的论文也有提到,即:
论文提出的基于对比损失的改进损失为,$\beta$定义了正例对距离与负例对距离之间的界限,如果正例对距离Dij大于$\beta$,则损失加大;或者负例对距离Dij小于$\beta$,损失加大:
这里$\beta$是正负样本的决策边界,$\alpha$控制分割的边距。下图显示了四种损失与距离的关系:
为了同时使用三元损失的灵活性能,这里使用较为灵活的决策边界$\beta$,beta(class)称为样本偏置, beta(img)称为类别偏置,第一个beta(0)是人工定义的初始值,利用梯度下降,不断调整beta(class)和beta(img)的值(就如同调整神经网络的参数)以在训练集上达到最优,这时能够得到最优的beta(class)和beta(img)(每个类一个beta(class),每个样本一个beta(img)):
为了正则化$\beta$,引入超参数v,这里类似于v-SVM中的技巧
实验结果
不同样本采样方式的对比,在semi-hard采样方法中,constrastive loss和triplet loss的性能类似,而如果使用随机采样,constrastive loss的性能要差很多(triplet loss不能随机采样),这其实反证了一个结论:triplet loss的性能不仅仅来自于其自身的函数结构,也与采样方式有很大的关系。
与其他人脸识别方法的对比: