深度学习之三元组损失原理与选取策略

三元组损失概述

三元组损失(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本质上是属于度量学习(Metric Learning)的范围,其借鉴了度量学习中的经典大间隔最近邻(Large Margin Nearest Neighbors,LMNN)算法。以Triplet loss为训练准则的深度神经网络模型既兼顾了度量学习的朴素性,又拥有神经网络优秀的非线性建模能力,能够在极大程度上简化并且控制模型训练过程。

优势

基于Triplet loss的神经网络模型可以很好的对细节进行区分,尤其是在图像分类任务中,当两个输入很相似的时候,Triplet loss对这两个差异性较小的输入向量可以学习到更好的表示,从而在分类任务中表现出色。

相比其他分类损失函数,Triplet loss通常能在训练中学习到更好的细微的特征feature,更特别的是Triplet loss能够根据模型训练的需要设定一定的阈值。
带Triplet loss的网络结构在进行训练的时候一般都会设置一个阈值margin,设计者可以通过改变margin的值来控制正负样本的距离。

缺点

虽然Triplet loss很有效,但也有缺点:三元组的选取导致数据的分布并不一定均匀,所以在模型训练过程表现很不稳定,而且收敛慢,需要根据结果不断调节参数,而且Triplet loss比分类损失更容易过拟合。

所以,大多数情况下,我们会把这种方法放在模型的预训练过程中,或者和softmax函数(分类损失)结合在一起使用。

理论推导

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 = m a x { d ( a , p ) − d ( a , n ) + m a r g i n , 0 } L = max \lbrace d(a, p)-d(a, n) + margin,\quad 0 \rbrace L=max{d(a,p)d(a,n)+margin,0}
对于阈值margin的设置需要注意选择合适大小的值,理论上来说,较大的margin能够增强模型对不同类样本的区分度,但是如果在训练初期就将margin设置得比较大,则可能会增加模型训练的难度,进而出现网络不收敛的情况。在模型训练初期先使用一个较小的值对网络进行初始化训练,之后再根据测试的结果对margin的值进行适当的增大或缩小,这样可以在保证网络收敛的同时让模型也能拥有一个较好的性能。
在这里设样本为 x x x f ( x ) f(x) f(x)为映射函数,整个训练集的大小为N,则每个triplet的输入<a, p, n>,对应的Triplet loss形式化表示就可以写作:

1 N { ∑ i N [ ∣ f ( x i a ) − f ( x i p ) ∣ 2 − ∣ f ( x i a ) − f ( x i n ) ∣ 2 + α ] + } \frac{1}{N} \{ \sum_i^N[|f(x_i^a) - f(x_i^p)|^2 - |f(x_i^a) - f(x_i^n)|^2 + \alpha]_+\} N1{iN[f(xia)f(xip)2f(xia)f(xin)2+α]+}

式中 ∣ f ( x i a ) − f ( x i p ) ∣ 2 |f(x_i^a) - f(x_i^p)|^2 f(xia)f(xip)2表示的是2-范数的平方,其作用是计算欧几里得空间的长度或者向量的模,具体的展开形式为: ∣ ∗ ∣ 2 = ∣ v k ∣ 2 |\ast|^2 = |v_k|^2 2=vk2
若式子小于 0,则说明此时的triplet满足损失值的要求,不同类别样本间的距离要远远大于相同类别样本间的距离,由于这样的triplet对神经网络的反向传播和参数更新没有提供帮助,因此将其损失值置为 0。至此我们可以看出,其实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)成为了关键,困难样本应该包括同类(匹配样本)中距离较大的和非同类(非匹配样本)中距离较小的样本。

1 N { ∑ i N [ ∣ f ( x i a ) − f ( x i p ) ∣ 2 − ∣ f ( x i a ) − f ( x i n ) ∣ 2 + α ] + } \frac{1}{N} \{ \sum_i^N[|f(x_i^a) - f(x_i^p)|^2 - |f(x_i^a) - f(x_i^n)|^2 + \alpha]_+\} N1{iN[f(xia)f(xip)2f(xia)f(xin)2+α]+}

对于上述的公式,实际上并没有体现困难挖掘,所以随机选取的样本并不能保证是困难样本,恰恰相反,这样选取的三元组实际上大部分为简单样本。

并且在大量图片样本下使用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就会是真正的困难样本。

  • 35
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值