度量学习整理笔记

深度度量学习初步整理

知乎:triplet loss 在深度学习中主要应用在什么地方?有什么明显的优势?

文章链接

Triplet loss通常是在个体级别的细粒度识别上使用,传统的分类是花鸟狗的大类别的识别,但是有
些需求是要精确到个体级别,比如精确到哪个人的人脸识别,所以triplet loss的最主要应用也就是
face identification, person re-identification, vehicle re -identification的各种identification识
别问题上

  • 当然你可以把每个人当做一个类别来进行分类训练,但是往往最后会造成softmax的维数远大于
    feature的维数,想想resnet50 global ap出来- -个2048的feature对应到一 -个几万,几十万的分
    类softmax就可怕。

  • 另外一个结论就是triplet loss通常能比classification得到更好的feature,我个人测试triplet loss
    至少比classification高10个点。

  • 还有一个优点就是triplet loss可以卡阈值, triplet losi训练的时候要设置- 个margin, 这个
    margin可以控制正负样本的距离,当feature 进行normalization之后,可以更加方便的卡个阈
    值来判断是不是同一个ID

当然triplet loss也有缺点,就是收敛慢,而且比classification更容 易overfitting (此条待考究,并且即使过拟合了也比classification性能要好),此外需 要对输入的数据按照label进行特别的排列,非常重要的一点是没有triplet loss的API,新手小白可能连十行代码都不到的triplet loss都写不出 来,所以deep learning不只是调库调参而已现在triplet loss已经有很多改进版本了,可以搜索improved triplet loss,in defense of triplet loss,beyond triplet loss等论文

知乎:Triplet Loss

文章链接

Triplet Loss

三元组(Triplet)计算而来的损失(Loss)

由Anchor(A),Negative(N),Positive§组成,基点为A,正匹配为P,负匹配为N。

Triplet Loss的学习目标可以形象的表示如下图:

img

网络没经过学习之前,A和P的欧式距离可能很大,A和N的欧式距离可能很小,如上图左边,在网络的学习过程中,A和P的欧式距离会逐渐减小,而A和N的距离会逐渐拉大。

网络会直接学习特征间的可分性:同一类的特征之间的距离要尽可能的小,而不同类之间的特征距离要尽可能的大。

通过学习,使得类间的距离要大于类内的距离

损失函数为:

img

其中,左边的二范数表示类内距离,右边的二范数表示类间距离,α是一个常量。优化过程就是使用梯度下降法使得损失函数不断下降,即类内距离不断下降,类间距离不断提升。
a r g m i n x i p ∣ ∣ f ( x i a ) − f ( x i p ) ∣ ∣ 2 2 argmin_{x^p_i}||f(x^a_i)-f(x^p_i)||_2^2 argminxipf(xia)f(xip)22
以及hard negative
a r g m a x x i n ∣ ∣ f ( x i a ) − f ( x i n ) ∣ ∣ 2 2 argmax_{x^n_i}||f(x^a_i)-f(x^n_i)||_2^2 argmaxxinf(xia)f(xin)22
来作为我们的三元组

Hard Triplets应该是满足类内距离最大化并且类间距离最小化的三元组。

深度度量学习中的损失函数

度量学习(metric learning)研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means等)取得较好的性能。深度度量学习(deep metric learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(称之为嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、人脸验证、图像检索、签名验证、行人重识别等。

损失函数在深度度量学习中起到了非常重要的作用。很多深度度量学习的损失函数构建在样本对(pair)或者样本三元组(triplet)之上,因而样本空间的量级( O ( N 2 ) O(N^2) O(N2)或者 O ( N 3 ) O(N^3) O(N3))非常大。一般而言,模型在训练过程中很难穷举学习所有的样本对;并且大多数样本对或者样本三元组的信息量是很小的,尤其在模型训练的后期,这些样本对或者样本三元组上梯度值几乎为0。若不做任何针对性的优化,学习算法的收敛速度会很慢,且易陷入局部最优。

困难样本挖掘是加快学习算法的收敛速度,并改进学习效果的一种重要手段。它通常和特定的损失函数一起使用,以期望达到最好的效果。困难样本挖掘可以理解为在学习过程中给每一个样本对动态赋予一个权重。在学习不同样本对时给它们不同的权重,如果某个样本对包含的信息比较多或比较难学习,那么它就需要比较大的权重。信息量较少的样本对则会被赋予较小的权重。若某些样本对被赋予的权重为0,则意味着在计算梯度时不考虑这些样本对,相当于这些样本对被丢弃了。

不同的损失函数在设计时,对于样本对的赋权是不同的,或者说与这些损失函数配合使用的困难样本挖掘方法是不同的。下面列举一些常用的深度度量学习中使用的损失函数,同时了解一下它们是如何来给做困难样本挖掘的。

损失函数(Loss functions)

1. Contrastive loss

Contrastive loss的输入是两个样本组成的样本对,label为该样本对是否属于同一类。
L ( x i , x j ; f ) = 1 { y i = y j } ∥ f i − f j ∥ 2 2 + 1 { y i ≠ y j } max ⁡ ( 0 , m − ∥ f i − f j ∥ 2 ) 2 L\left(x_{i}, x_{j} ; f\right)=\mathbf{1}\left\{y_{i}=y_{j}\right\}\left\|f_{i}-f_{j}\right\|_{2}^{2}+\mathbf{1}\left\{y_{i} \neq y_{j}\right\} \max \left(0, m-\left\|f_{i}-f_{j}\right\|_{2}\right)^{2} L(xi,xj;f)=1{ yi=yj}fifj22+1{ yi=yj}max(0,mfifj2)2
其中, f i f_i fi 是函数 f ( x i ) f(x_i) f(xi) 的简写,表示输入 x i x_i xi 映射之后的embedding向量; 1 { . } 1\{.\} 1{ .} 是指示函数,在输入为true时返回1,否则返回0; m m m 是预先设定的超参数,表示不同类样本之间的距离应超过该margin值。

img

最原始的contrastive loss只考虑了输入样本对本身的相似性。

2. Triplet loss

Triplet loss的输入由一个三元组组成,每个三元组包含一个query、一个与query属于同一类的正样本、一个与query属于不同类的负样本。
L ( x , x + , x − ; f ) = max ⁡ ( 0 , ∥ f − f + ∥ 2 2 − ∥ f − f − ∥ 2 2 + m ) L\left(x, x^{+}, x^{-} ; f\right)=\max \left(0,\left\|f-f^{+}\right\|_{2}^{2}-\left\|f-f^{-}\right\|_{2}^{2}+m\right) L(x,x+,x;f)=max(0,ff+22ff22+m)
Triplet loss要求query到负样本的距离与query到正样本的距离之差要大于 m m m

Contrastive loss和triplet loss都很常用,一般来说,Triplet-Loss的效果比Contrastive Loss的效果要好,因为他考虑了正负样本与锚点的距离关系。然而,这两种loss函数如果单独使用则会遭遇收敛速度慢的问题。在学习过程的后期,大多数样本都能满足损失函数的约束条件,这些样本对应进一步学习的贡献很小。因此,这两种损失函数都需要配合hard sample mining的学习策略一起使用,例如FaceNet提出的simi-hard negative sample mining方法。

Contrastive loss能够让正样本对尽可能的近,负样本对尽可能的远,这样可以增大类间差异,减小类内差异。但是其需要指定一个固定的margin,即公式中的 m m m,因为 m m m 是固定的,所以这里就隐含了一个很强的假设,即每个类目的样本分布都是相同的,不过一般情况下这个强假设未必成立

例如,有一个数据集有三种动物,分别是狗、狼 、猫,直观上狗和狼比较像,狗和猫的差异比较大,所以狗狼之间的margin应该小于狗猫之间的margin,但是Contrastive loss使用的是固定的margin,如果margin设定的比较大,模型可能无法很好的区分狗和狼,而margin设定的比较小的话,可能又无法很好的区分狗和猫。

6. Ranked list loss

上述的损失函数都存在如下的两点局限性:

  1. 这些损失函数虽然都提出了加入更多的负样本来获得结构化的信息,但是使用的负样本仅仅是一小部分;
  2. 另外这些损失函数没有考虑类内的数据分布,都追求将同一个class压缩到一个点上。

假设 X = { ( x i , y i ) } i = 1 N X=\left\{\left(x_{i}, y_{i}\right)\right\}_{i=1}^{N} X={ (xi,yi)}i=1N 表示训练集, 其中每一组元素 ( x i , y i ) \left(x_{i}, y_{i}\right) (xi,yi) 表示成对的样 本与其标签, 总共包括 C C C 个类别, 即 y i ∈ [ i , 2 , ⋯   , C ] , { x i c } i = 1 N c y_{i} \in[i, 2, \cdots, C], \quad\left\{x_{i}^{c}\right\}_{i=1}^{N_{c}} yi[i,2,,C],{ xic}i=1Nc 表示属于 类别 c c c 的所有样本, N c \quad N_{c} Nc 表示相应类别的样本数量。
我们的目标是学习到一个函数 f f f 使得正样本对之间的相似度高于负样本之间的 相似度。为了将正负样本区分开,Ranked List Loss希望负样本之间的距离大 于某个间值 α , \alpha, α, 并目正样本之间的距离小于 α − m \alpha-m αm ,即正负样本之间至少有 m m m 的间隔。基于此, 提出了pairwise margin loss:
L m ( x i , x j ; f ) = ( 1 − y i j ) [ α − d i j ] + + y i j [ d i j − ( α − m ) ] + L_{m}\left(x_{i}, x_{j} ; f\right)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值