度量学习之三元组损失
Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 815-823.
这篇论文虽然是是用在人脸识别上的,但是行人重识别中的一个影响力十分大损失函数——triplet loss就是在这篇论文中提出的,之前用到的对比损失(contrastive loss)能够起到缩小类内距离,增大类间距离的作用,从而通过距离判断两类相似与否。但是contrastive loss有一个痛点,就是我们无法约束类间距离和类内距离的大小,虽然缩小了类内距离,也扩大了类间距离,但是类内距离仍然可能比类间距离大,这就是contrastive loss的局限性。由此作者想到增加一个类内距离比类间距离小的约束,于是三元组诞生了,如下图所示:
这里的Anchor指的就是我们的查询图像,Positive是与Anchor一类的图像,Negative是与Anchor不同类的图像,将这三种图像通过CNN提取得到的特征计算欧式距离,放入损失函数中进行计算,就得到了我们的triplet loss:
值得注意这里的loss设置了一个超参数,这个参数的作用是要让类内距离不止比类间距离小,还要小一个的距离。
这个损失函数的基本思想是比较浅显易懂的,但是要让这个损失函数运作起来才是重点。在预训练好的数据集上,由于大多数的类内图像的距离就已经比类间图像的距离小了,因此损失值计算得到的就是0,则模型参数就不会发生更新,如果采用暴力的方式穷举所有可能,那么会浪费大量的算力在无用的计算上,这里的计算复杂度大致为,所以是无法穷举的,那么这里作者提出一个Generate triplets Online的方法。也就是在每一批数据中找到一个Positive使之与Anchor之间的距离最大同时再找到一个Negative使之与Anchor之间的距离最小,这样的三元组往往是有效的。
最后作者还讨论了一下各种因素对模型的影响:
图像质量:
嵌入维度:
数据集大小:
可以从上图得知嵌入维度在128时效果最好,除此之外,图像质量(尺寸)和数据集大小都是越大好。