【人脸识别】
1、Triplet loss(三元组损失),由Google研究团队在论文《FaceNet:A Unified Embedding for Face Recognition》所提出,常用于人脸识别任务。主要是为了非同类极相似样本的区分,例如同卵双胞胎的区分。Triplet loss的优势在于细节区分,即当两个输入相似时,Triplet loss能够更好地对细节进行建模,相当于加入了两个输入差异性差异的度量,学习到输入的更好表示,从而在上述两个任务中有出色的表现。
【基本思想】
对于设定的三元组(Anchor, Positive, Negative) (Anchor和Positive为同类的不同样本,Anchor与Negative为异类样本),Triplet loss试图学习到一个特征空间,使得在该空间中相同类别的基准样本(Anchor)与 正样本(Positive)距离更近,不同类别的 Anchor 与负样本(Negative)距离更远。
【优势】
基于Triplet loss的神经网络模型可以很好的对细节进行区分,Triplet loss通常能在训练中学习到更好的细微的特征feature,更特别的是Triplet loss能够根据模型训练的需要设定一定的阈值。
带Triplet loss的网络结构在进行训练的时候一般都会设置一个阈值margin,设计者可以通过改变margin的值来控制正负样本的距离。
【缺点】
三元组的选取导致数据的分布并不一定均匀,所以在模型训练过程表现很不稳定,而且收敛慢,需要根据结果不断调节参数,而且Triplet loss比分类损失更容易过拟合。
【理论】
Triplet loss 由一个三元组<a, p, n>构成,需要三张图片作为输入,如上一段中的图片所示,其中a: anchor 表示基准样本,p: positive 表示与anchor相同类别但不同的正样本,n: negative 表示与基准样本不同类别的负样本。利用生成的每个triplet,模型就能够创建出对应的positive pair <a, p>和negative pair <a, n>。
Triplet loss的目的是,在一定的距离(margin)上,将positive pair和negative pair分开,通过优化保证嵌入空间(Embedding Space)中类别相同的样本点之间距离足够近,而类别不同的样本点间距离足够远,即基准样本与负样本的距离要远远大于基准样本与正样本间的距离。
则Triplet loss的思想用欧氏距离形式化表示为:
L=max{d(a,p)−d(a,n)+margin,0}
对于阈值margin的设置需要注意选择合适大小的值,理论上来说,较大的margin能够增强模型对不同类样本的区分度,但是如果在训练初期就将margin设置得比较大,则可能会增加模型训练的难度,进而出现网络不收敛的情况。在模型训练初期先使用一个较小的值对网络进行初始化训练,之后再根据测试的结果对margin的值进行适当的增大或缩小,这样可以在保证网络收敛的同时让模型也能拥有一个较好的性能。
在这里设样本为 x,f ( x ) 为映射函数,整个训练集的大小为N,则每个triplet的输入<a, p, n>,对应的Triplet loss形式化表示就可以写作:
【应用】
在图像任务中,Triplet loss经常用作样本点在欧氏空间上的距离向量表示,它可以极大地提升深度特征的判别能力。为了使训练更加迅速有效,需要注意设计好训练策略,只选择合适的triplet进行训练,因为一个数据集的triplet组合非常多,全部进行训练的话会大大降低效率。
基于我们对Triplet loss的定义,一般而言,会将triplet分为三类,如图所示:
1、easy triplets (简单三元组): 指在未经过训练的情况下,Triplet loss值已经为0的三元组,此时网络不需要训练学习就满足损失函数的要求。简单的用欧式距离表示为:d ( a , n ) d(a, n)d(a,n)>d ( a , p ) d(a, p)d(a,p)+ margin;
2、semi-hard triplets(一般三元组): 指负样本与基准样本间的距离大于正样本与基准样本间的距离,但Triplet loss值还没有达到0,此时网络通过恰当的学习可以不断降低损失值。用欧式距离表示为:d ( a , p ) d(a, p)d(a,p)<d ( a , n ) d(a, n)d(a,n) <d ( a , p ) d(a, p)d(a,p)+margin;
3、hard triplets(困难三元组): 指负样本与基准样本间的距离小于正样本与基准样本间的距离,这是网络最难学习的样本组,此时的损失值会出现较大的震荡。用欧式距离表示为:d ( a , n ) d(a, n)d(a,n) <d ( a , p ) d(a, p)d(a,p)。
由于简单三元组的损失值为0,如果训练网络只能学习到简单的triplets,会导致网络的泛化能力受到限制,网络没有学习到任何特征,对训练任务并没有帮助。因此当一个训练批次中包含大量的easy triplets时,会导致训练网络的收敛速度大大降低。
而一般三元组非常适合网络的前期训练,能够帮助训练网络的收敛,并且同时可以得到大量比较有效的统计信息。
困难三元组则在网络训练后期起到很好的学习作用,能够帮助提升网络的性能。让网络学习一些很难的样本特征,可以大大提高训练网络的分类能力,尤其是对难以判断的样本的判别能力。
但Triplet loss有一个缺点是,有可能很多次模型从训练集中挑选的三张图片,恰好是比较简单的三元组,计算出的损失值会很不稳定,从而导致模型很难学习到图片的主要特征。因此我们在使用Triplet loss函数时,要注意选取的训练集不宜过大,还要设计好训练策略来选择恰当的triplet。
【三元组选取策略】
如何有效的进行困难样本挖掘(OHEM)成为了关键,困难样本应该包括同类(匹配样本)中距离较大的和非同类(非匹配样本)中距离较小的样本。
对于上述的公式,实际上并没有体现困难挖掘,所以随机选取的样本并不能保证是困难样本,恰恰相反,这样选取的三元组实际上大部分为简单样本。
并且在大量图片样本下使用triplet loss也并非容易,如何有效的在large-scale情况下高效优化?使用triplet会发现数据量激增,可组合的三元组变多,如果要遍历所有组合是不现实的,或者极其低效。
主要有两种方法,一是将triplet loss转为softmax loss(triplet net一文中,将triplet loss结合了softmax的输出与mse),另一种是batch OHNM。但是第二种挖掘样本的方法都是直接考虑在所有的样本空间来sample一个batch,如果这个batch中有不满足margin的就认为是困难样本。然而这样做并不能保证采样时正好选取了很多很相似的样本,而且(a,p,n)图像组一经选取就已经固定,不会再有其他的组合,所以效率较低。所以寻找相似的个体(类别)是提高triplet net的核心关键**。
对于含有10个个体(人)的人脸数据,难以区分的肯定是那些长的很像的个体(比如甲与乙为兄弟二人)。之前的困难挖掘是首先在这些打散的整体空间中随机设置(a,p,n)三元组然后成批去训练,分错的作为困难样本。这就使得你这些三元组都已经固定了,困难样本不一定是真的困难,除非运气好使得三元组中有很多甲、乙中的样本。所以一个想法是首先对于所有样本进行聚类,观察哪些样本比较接近,(甲和乙长得像肯定聚类结果很接近),那么我就在聚好类的子空间中选取(a,p)二元组组成batch,n在这个batch中来选取,那么这个负样本n就会是真正的困难样本。
————————————————
【参考文章链接】https://blog.csdn.net/zenglaoshi/article/details/106928204
网友评论