深度度量学习中的损失函数
文章作者:杨旭东 阿里 算法工程师
编辑整理:Hoh Xil
内容来源:杨旭东@知乎
出品社区:DataFun
导读: 度量学习 ( metric learning ) 研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法 ( kNN、k-means 等 ) 取得较好的性能。深度度量学习 ( deep metric learning ) 是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间 ( 称之为嵌入空间,embedding space ) 的映射,使得同类对象在嵌入空间上使用常用的距离函数 ( 欧氏距离、cosine 距离等 ) 计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、人脸验证、图像检索、签名验证、行人重识别等。
损失函数在深度度量学习中起到了非常重要的作用。很多深度度量学习的损失函数构建在样本对 ( pair ) 或者样本三元组 ( triplet ) 之上,因而样本空间的量级 ( O ( N2) 或者 O ( N3 ) ) 非常大。一般而言,模型在训练过程中很难穷举学习所有的样本对;并且大多数样本对或者样本三元组的信息量是很小的,尤其在模型训练的后期,这些样本对或者样本三元组上梯度值几乎为0。若不做任何针对性的优化,学习算法的收敛速度会很慢,且易陷入局部最优。
困难样本挖掘是加快学习算法的收敛速度,并改进学习效果的一种重要手段。它通常和特定的损失函数一起使用,以期望达到最好的效果。困难样本挖掘可以理解为在学习过程中给每一个样本对动态赋予一个权重。在学习不同样本对时给它们不同的权重,如果某个样本对包含的信息比较多或比较难学习,那么它就需要比较大的权重。信息量较少的样本对则会被赋予较小的权重。若某些样本对被赋予的权重为0,则意味着在计算梯度时不考虑这些样本对,相当于这些样本对被丢弃了。
不同的损失函数在设计时,对于样本对的赋权是不同的,或者说与这些损失函数配合使用的困难样本挖掘方法是不同的。下面列举一些常用的深度度量学习中使用的损失函数,同时了解一下它们是如何来给做困难样本挖掘的。
损失函数 ( Loss functions )
▌1. Contrastive loss
Contrastive loss 的输入是两个样本组成的样本对,label 为该样本对是否属于同类。
其中,fi_ _是函数 f(xi) 的简写,表示输入 xi 映射之后的 embedding 向量;1{·} 是指示函数,在输入为 true 时返回1,否则返回0;m 是预先设定的超参数,表示不同类样本之间的距离应超过该 margin 值。
Contrastive loss
最原始的 contrastive loss 只考虑了输入样本对本身的相似性。
▌2. Triplet loss
Triplet loss 的输入由一个三元组组成,每个三元组包含一个 query、一个与 query 属于同一类的正样本、一个与 query 属于不同类的负样本。
Triplet loss 要求 query 到负样本的距离与 query 到正样本的距离之差要大于 m。
Contrastive Loss 和 Triplet Loss 都很常用,一般来说,Triplet Loss 的效果比 Contrastive Loss 的效果要好,因为他考虑了正负样本与锚点的距离关系。然而,这两种 Loss 函数如果单独使用则会遭遇收敛速度慢的问题。在学习过程的后期,大多数样本都能满足损失函数的约束条件,这些样本对应进一步学习的贡献很小。因此,这两种损失函数都需要配合 hard sample mining 的学习策略一起使用,例如 FaceNet 提出的 simi-hard negative sample mining 方法。
Triplet loss
▌3. N-pair-ms loss
Triplet Loss 在学习参数的更新过程中,只比较了一个负样本,而忽略了其他类的负样本。因而,只能促进 query 的 embedding 向量与选中的一个负样本保持较大的距离,但却不能保证与其他未被选择的负样本也保持较大的距离。
N-pair-ms loss 对 Triplet Loss 的上述问题进行了改进,不同于 Triplet Loss 使用单个的正负样本,N-pair-ms loss 损失函数利用了数据之间的结构信息来学习到更有区别性的表示,其在每次参数更新的过程中同时考虑了 query 样本与其他多个不同类的负样本之间的关系,促使 query 与其他所有类之间都保持距离,这样能够加快模型的收敛速度。N-pair-ms loss 的每个训练样本由 N+1 元组组成,即:
其中,x+ 是相对于 x 而言的正样本, 是负样本。N+1 元组一般不会提前构建好,而是在训练的过程中,从同一个 mini batch 中构建出来。
其中,f(·;θ) 是由深度神经网络定义的 embedding kernel。
▌4. Lifted Struct loss
Lifted Struct loss 基于训练集 ( mini batch ) 中所有的正负样本对来计算 loss,其定义如下:
其中, 是正样本对 ( pair 的左变量和右边量来自同一个类 ) 的集合; 是负样本对的集合; Di,j 是样本对 { i , j } 的距离。
仔细分析该 loss function,发现对于每一个正样本对 { i , j } ,模型分别挖掘其左变量 i 和右变量 j 对应的最困难的负样本,独立地找到距离左变量最近的负样本,假设为 k ;同时找到距离右边量最近的负样本,假设为 l。接着通过比较 Di,k 和 Dj,l,找出其中较小的距离对应的负样本,假设为 n。最后,计算三元组 { i,j,n } 确定的 triplet loss 函数。如下图所示:
Hard negative edge is mined with respect to each left and right example per each positive pairs. In this illustration with 6 examples in the batch, both x3 and x4 independently compares against all other negative edges and mines the hardest negative edge.
Lifted Struct loss 与 Triplet Loss 的不同之处就在于,Triplet Loss 的样本三元组是提前确定好的,而 Lifted Struct loss 是为每一个正样本对动态构建最困难的三元组,在构建的过程中考虑了 ( mini batch 中 ) 所有的负样本。
由于上述定义的 Lifted Struct loss 函数是不光滑的函数,嵌套的 max 函数在实际中容易导致网络陷入较差的局部最优,因此可以改写为一个光滑的上界函数来避免词问题。
Lifted Struct loss
▌5. Proxy NCA loss
这个方法提出的目的是去解决采样的问题。假设 W 代表着训练集中的一小部分数据,在采样时通过选择与 W 中距离最近的一个样本 u 作为代理 ( proxy ),即:
基于选择的 proxy,NCA 损失为:
▌6. Ranked list loss
上述的损失函数都存在如下的两点局限性:
1. 这些损失函数虽然都提出了加入更多的负样本来获得结构化的信息,但是使用的负样本仅仅是一小部分;
2. 另外这些损失函数没有考虑类内的数据分布,都追求将同一个class压缩到一个点上。
Ranked List Loss 对这两个问题提出了改进。
假设 表示训练集,其中每一组元素 ( xi , yi ) 表示成对的样本与其标签,总共包括 C 个类别,即:
表示属于类别 c 的所有样本,Nc 表示相应类别的样本数量。
我们的目标是学习到一个函数 f 使得正样本对之间的相似度高于负样本之间的相似度。为了将正负样本区分开,Ranked List Loss 希望负样本之间的距离大于某个阈值 α ,并且正样本之间的距离小于 α - m ,即正负样本之间至少有 m 的间隔。基于此,提出了 pairwise margin loss:
其中,当 yi=yj 时,yij=1,否则 yij=0;dij 表示 f(xi) , f(xj) 之间的欧式距离,[·]+ 是 hinge 函数。
对样本进行合适采样可以加快模型的收敛速率和提高模型性能。Ranked List Loss 使用的采样策略很简单,就是损失函数不为0的样本,具体来说,对于正样本,损失函数不为0意味着它们与 anchor 之间的距离大于 α - m,类似的,对于负样本,损失函数不为0意味着它们与 anchor 之间的距离小于 α,相当于使得同一类别位于一个半径为 α - m 大小的超球体内。
给定一个 anchor xic 基于相似度对其他样本进行排序,在这个排序结果中,有 Nc - 1 个正样本,用 表示。同样地,有 个负样本,用 表示。于每个 anchor xic , 我们希望使得它与正样本集 Pc,i 的距离越近越好,并且与负样本集 Nc,i 之间存在着 m 的间隔,同时,我们还希望使得 anchor 与负样本的距离大于边界 α 。在执行困难样本挖掘后,得到困难的正样本集合为:
困难的负样本集合为:
因此,对于正样本我们使用的损失函数为:
对于负样本集,考虑到它的样本数量比较大,对每个负样本使用加权的方式:
其中, ,T 是超参数。
最终,整个损失为:
通常情况下,设置 λ = 1。
上述几种 loss 函数的对比如下图所示:
其中,蓝色圆形表示 anchor ( query ) 样本,不同的形状表示来自不同类的样本。
▌7. Multi-Similarity loss
前面说过,困难样本挖掘可以理解为在学习过程中给每一个样本对动态赋予一个权重。给样本赋权的核心在于判断样本的局部分布,即它们之间的相似性,局部样本之间的分布和相互关系并不仅仅取决于当前两个样本之间的距离或相似性,还取决于当前样本对与其周围样本对之间的关系。
因此,对于每一个样本对,我们不仅需要考虑样本对本身的自相似性,同时还要考虑它与其它样本对的相对相似性。其中相对相似性又可以分为正相对相似性 ( 正样本 )、负相对相似�
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B7%B1%E5%BA%A6%E5%BA%A6%E9%87%8F%E5%AD%A6%E4%B9%A0%E4%B8%AD%E7%9A%84%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com