introduction

度量学习的对象通常是样本特征向量的距离,度量学习的目的是通过训练和学习,减小或限制同类样本之间的距离,同时增大不同类别样本之间的距离。

度量学习 (Metric Learning) == 距离度量学习 (Distance Metric Learning,DML) == 相似度学习 是人脸识别中常用的机器学习方法,由Eric Xing在NIPS 2002提出。既可基于监督学习的,也可以基于非监督学习。

与经典识别网络的区别 经典识别网络有一个bug:必须提前设定好类别数,例如softmax loss。 这也就意味着,每增加一个新种类,就要重新定义网络模型,并从头训练一遍。

比如我们要做一个门禁系统,每增加或减少一个员工(等于是一个新类别),就要修改识别网络并重新训练。很明显,这种做法在某些实际运用中很不科学。

科普一下在训练和测试人脸识别分类器的时候经常被提到的Open-set 和Close-set:— close-set,就是所有的测试集都在训练集中出现过。所以预测结果是图片的ID,如果想要测试两张图片是否是同一个,那么就看这两张图片的预测ID是否一样即可。 open-set,就是测试的图片并没有在训练集中出现过,那么每张测试图片的预测结果是特征向量,如果想要比较两张图片的人脸是否属于同一个人,需要测试图像特征向量的距离。

理想的Open-set就需要度量学习,人脸识别学习到的特征应当在特定的度量空间中,满足同一类的最大类内距离小于不同类的最小类间距离。然后再使用最近邻检索就可以实现良好的人脸识别和人脸验证性能。 然而softmax loss仅仅能够使得特征可分,还不能够使得特征具有可判别性,所以需要对softmax loss进行改造。

因此,Metric Learning作为经典识别网络的替代方案,可以很好地适应某些特定的图像识别场景。一种较好的做法,是丢弃经典神经网络最后的softmax层,改成直接输出一个feature vector,去特征库里面按照Metric Learning寻找最近邻的类别作为匹配项。

基本流程: 一般的度量学习包含以下步骤:

  • Encoder编码模型:用于把原始数据编码为特征向量(重点如何训练模型)
  • 相似度判别算法:将一对特征向量进行相似度比对(重点如何计算相似度,阈值如何设定)

关键问题:

  • 网络设计:代表有孪生神经网络(Siamese network)
  • hard negative mining:找出难以区分的样本,更利于训练收敛。
  • pairs weighting/pair-based loss functions:改进loss函数,促使网络优化, 使具有相同标签的样本在嵌入空间中尽量接近 ,具有不同标签的样本在嵌入空间中尽量远离。

损失函数

度量学习(metric learning)损失函数常用度量学习损失函数度量学习 度量函数 metric learning deep metric learning 深度度量学习『深度概念』度量学习中损失函数的学习与深入理解浅谈人脸识别中的loss 损失函数

baseline

Softmax loss

基于距离的算法

Triplet loss, center loss

基于角度的算法

angular loss

基本loss概述

1. Softmax loss

Face Emotion Recognition综述 distance or face to face learning_github

Face Emotion Recognition综述 distance or face to face learning_度量学习_02

这种方式只考虑了能否正确分类,却没有考虑类间距离。所以提出了center loss 损失函数。

2. Center loss

Face Emotion Recognition综述 distance or face to face learning_损失函数_03

Face Emotion Recognition综述 distance or face to face learning_损失函数_04

center loss 考虑到不仅仅是分类要对,而且要求类间有一定的距离。上面的公式中Face Emotion Recognition综述 distance or face to face learning_三元组_05表示某一类的中心,Face Emotion Recognition综述 distance or face to face learning_github_06表示每个人脸的特征值。作者在softmax loss的基础上加入了Face Emotion Recognition综述 distance or face to face learning_github_07,同时使用参数Face Emotion Recognition综述 distance or face to face learning_度量学习_08来控制类内距离,整体的损失函数如下:

Face Emotion Recognition综述 distance or face to face learning_度量学习_09

Face Emotion Recognition综述 distance or face to face learning_github_10

3. Triplet Loss

Face Emotion Recognition综述 distance or face to face learning_三元组_11

三元组损失函数,三元组由Anchor, Negative, Positive这三个组成。从上图可以看到,一开始Anchor离Positive比较远,我们想让Anchor和Positive尽量的靠近(同类距离),Anchor和Negative尽量的远离(类间距离)。

Face Emotion Recognition综述 distance or face to face learning_度量学习_12

表达式左边为同类距离 ,右边为不同的类之间的距离。使用梯度下降法优化的过程就是让类内距离不断下降,类间距离不断提升,这样损失函数才能不断地缩小。

Triplet Loss和triplets挖掘

更多原理与细节请参考文章: https://omoindrot.github.io/triplet-loss 中文翻译:Tensorflow实现Triplet Loss 对应tensorflow代码:https://github.com/omoindrot/tensorflow-triplet-loss

如何将triplet应用于分类: https://github.com/adambielski/siamese-triplet

networks.py EmbeddingNet — base network for encoding images into embedding vectorClassificationNet — wrapper for an embedding network,adds a fully connected layer and log softmax for classificationSiameseNet — wrapper for an embedding network, processes pairs of inputs TripletNet - wrapper for an embedding network, processes triplets of inputs

triplet网络模型: https://github.com/SpikeKing/triplet-loss-mnist

Triplet Loss的核心是锚示例、正示例、负示例共享模型,通过模型,将锚示例与正示例聚类,远离负示例。 Triplet Loss Model的结构如下: 输入:三个输入,即锚示例、正示例、负示例,不同示例的结构相同; 模型:一个共享模型,支持替换为任意网络结构; 输出:一个输出,即三个模型输出的拼接。

Face Emotion Recognition综述 distance or face to face learning_github_13

Face Emotion Recognition综述 distance or face to face learning_github_14

为什么不用softmax? 谷歌的论文FaceNet: A Unified Embedding for Face Recognition and Clustering最早将triplet loss应用到人脸识别中。他们提出了一种实现人脸嵌入和在线triplet挖掘的方法,这部分内容我们将在后面章节介绍。

在监督学习中,我们通常都有一个有限大小的样本类别集合,因此可以使用softmax和交叉熵来训练网络。但是,有些情况下,我们的样本类别集合很大,比如在人脸识别中,标签集很大,而我们的任务仅仅是判断两个未见过的人脸是否来自同一个人。

Triplet loss就是专为上述任务设计的。它可以帮我们学习一种人脸嵌入,使得同一个人的人脸在嵌入空间中尽量接近,不同人的人脸在嵌入空间中尽量远离。

定义损失

Triplet可以理解为一个三元组,它由三部分组成:

  • anchor在这里我们翻译为原点
  • positive同类样本点(与原点同类)
  • negative异类样本点

针对三元组中的每个元素(样本),训练一个参数共享或者不共享的网络,得到三个元素的特征表达(embedings)

Triplet loss的目标:

  • 使具有相同标签的样本在嵌入空间中尽量接近
  • 使具有不同标签的样本在嵌入空间中尽量远离

值得注意的一点是,如果只遵循以上两点,最后嵌入空间中相同类别的样本可能collapse到一个很小的圈子里,即同一类别的样本簇中样本间的距离很小,不同类别的样本簇之间也会偏小。因此,我们加入间隔(margin)的概念——跟SVM中的间隔意思差不多。只要不同类别样本簇简单距离大于这个间隔就阔以了。

我们要求,在嵌入空间d中,三元组(a,p,n)的损失函数为:Face Emotion Recognition综述 distance or face to face learning_三元组_15 最小化该L,则d(a,p)→0, d(a,n)>margin。

Triplets挖掘

基于前文定义的Triplet loss,可以将三元组分为一下三个类别:

  • easy triplets:可以使loss = 0的三元组,即容易分辨的三元组
  • hard triplets:d(a,n)<d(a,p)的三元组,即一定会误识别的三元组
  • semi-hard triplets:d(a,p)<d(a,n)<d(a,p)+margin的三元组,即处在模糊区域(关键区域)的三元组 图中,a为原点位置,p为同类样本例子,不同颜色表示的区域表示异类样本分布于三元组类别的关系. 显然,中间的Semi-hard negatives样本对我们网络模型的训练至关重要。

N-pair loss

Sohn, K.: Improved deep metric learning with multi-class n-pair loss objective. In: NIPS. (2016)Improved Deep Metric Learning with Multi-class N-pair Loss Objective论文N-pair loss解读与实现 pytorch代码:1、https://github.com/ChaofWang/Npair_loss_pytorch/blob/master/Npair_loss.py 2、https://github.com/leeesangwon/PyTorch-Image-Retrieval/blob/public/losses.py tensorflow代码(多种度量学习loss函数):https://github.com/tensorflow/tensorflow/blob/r1.10/tensorflow/contrib/losses/python/metric_learning/metric_loss_ops.py

Angular Loss

【2017_ICCV】Deep Metric Learning with Angular Loss tensorflow代码:https://github.com/geonm/tf_angular_loss pytorch代码:https://github.com/leeesangwon/PyTorch-Image-Retrieval/blob/public/losses.pySphereFace论文学习:该文提到的A-softmax loss就是Angular Loss的源泉

  • 提出了Angular Loss,用角度关系作为相似性度量。- 之前的方法主要用距离进行相似性度量,距离度量在尺度变化时比较敏感,并且对于不同的intra-class采用相同的margin也不合适,Angular Loss自带旋转不变和尺度不变。
  • 优点:
  • 引入尺度不变,提高了目标对于特征差异的鲁棒性;
  • 增加了三阶几何限制,捕获了triplet triangles的附加局部结构;
  • 收敛更好。

文章列表

Improved Deep Metric Learning with Multi-class N-pair Loss Objective论文N-pair loss解读与实现

CVPR2019 Ranked List Loss for Deep Metric Learning | 论文分享

距离和相似度度量方法