文 | 葛艺潇
源 | PaperWeekly
本文介绍一篇我们发表于 NeurIPS-2020 的论文《Self-paced Contrastive Learning with Hybrid Memory for Domain Adaptive Object Re-ID》,该工作提出自步对比学习框架及混合记忆模型,旨在解决无监督及领域自适应表征学习中数据无法被充分挖掘的问题。
这项工作在无监督的目标重识别任务上显著地超越最先进技术高达 16.7%;领域自适应的目标重识别任务中,在无监督的目标域上超越最先进技术高达 5.0%,同时可以提升有监督的源域性能高达 6.6%。
实验结果充分证明其广泛的应用场景及有效性:可被应用于解决无监督学习任务,也可被应用于利用额外无监督数据提升有监督学习的任务。代码和模型均已公开,方法也被收录于 OpenUnReID 代码库。
论文链接:
https://arxiv.org/abs/2006.02713
代码链接:
https://github.com/yxgeee/SpCL
https://github.com/open-mmlab/OpenUnReID
项目主页:
https://geyixiao.com/projects/spcl.html
视频介绍:
https://www.zhihu.com/zvideo/1302759986926096384
背景简介
近年来,在无监督学习的浪潮下,无监督及领域自适应的目标重识别任务也逐渐受到大家的关注,在刚刚过去的 ECCV2020 中这个方向所发表的论文就有十余篇。
目标重识别(Object Re-ID),包括行人重识别、车辆重识别等,旨在跨摄像机检索和追踪目标人物或车辆。重识别任务的关键之一是学习具有辨识性的特征,并在多样的条件变化下保持鲁棒性。
在如今深度学习盛行的时代,大规模数据集推动了目标重识别任务的快速发展,然而,领域差异及标注数据的高消耗等都成为了部署重识别算法中无法忽视的问题。
领域自适应的目标重识别(Domain Adaptive Object Re-ID) 旨在通过源域有标注的数据和目标域无标注的数据进行训练,从而在目标域上取得较好的性能。这里区分一下一般分类任务上的领域自适应,分类任务上的两个领域的类别往往有部分或者全部的重叠,而重识别任务上的两个领域,我们一般认为类别完全没有重复。
这是由于领域自适应的重识别任务一般应用在:将城市A训练的重识别模型应用于城市B、将虚拟合成数据训练的重识别模型应用于真实世界的场景等。在这些场景中,两个领域间的类别一般很难存在重复。
无监督的目标重识别(Unsupervised Object Re-ID) 与上述领域自适应重识别非常相似,问题设置上的唯一区别在于没有有标签的源域数据。这里着重区分一下目前很受关注的无监督预训练(Unsupervised Pre-training)任务,存在两点主要区别:
1)无监督预训练任务从网络随机初始化开始,无监督重识别任务从预训练好的网络开始;2)无监督预训练的网络需要经过fine-tune才可以应用在下游任务上,而无监督重识别任务本身可以看作一个无监督的下游任务,经过训练的网络可直接部署。
领域自适应重识别任务的研究历史较无监督重识别任务而言较长一些,但本质上这两项任务是非常相似的。正如上文所述,领域自适应重识别任务相较于无监督重识别任务而言,只是在问题设置上多出了有标签的源域数据。
所以,大部分的算法也都可以通用,因为很多领域自适应重识别算法只需要去除源域预训练的步骤,即可应用于无监督重识别任务上。该论文所介绍的方法在这两项任务上也都取得了很不错的结果。
下面,将先以领域自适应重识别任务为例介绍方法,再讲解如何应用于无监督重识别任务。
问题与动机
解决领域自适应重识别任务的算法可以分为两类,伪标签类和域转换类,目前伪标签类可以获得更好的性能,而伪标签类中的基于聚类的伪标签法较为有效,所以本文所基于的 baseline 是基于聚类的伪标签算法。
目前大部分基于聚类的伪标签算法(如 SSG、MMT 等)在训练上分为两步:第一步,在源域上利用有标签的源域数据进行有监督的预训练;第二步,在预训练的模型基础上,利用目标域无标签的数据及其聚类产生的伪标签进行 fine-tune。
这样的算法流程目前已经可以获得相对令人满意的结果,但他们仍然存在两点缺陷:
1)在第二步的目标域训练中忽略了源域数据(仅用于预训练),但我们认为源域的数据由于具有真实准确的标签,所以应当被充分利用;
2)在基于聚类的伪标签法中,往往没有用到全部的目标域无标签数据,因为基于密度的聚类(如 DBSCAN 等)本身会产生聚类离群值(outlier),这些聚类离群值由于无法分配伪标签,所以被丢弃,不用于训练。但我们认为,这样的聚类离群值往往正是那些值得挖掘的困难训练样本。尤其在训练的早期,往往存在大量的聚类离群值,若简单丢弃它们,训练样本将大幅减少。
所以如何合理地挖掘所有可用的信息是提升性能的关键。如上图所示,我们提出在训练中使用全部的源域数据和目标域数据,并利用一个混合记忆模型(Hybrid Memory)来提供监督:对于源域数据而言,监督是他们真实的标签;
对于目标域聚类内的数据而言,监督是他们的聚类标签;对于目标域的聚类离群值而言,他们每张图本身被看作一个单独的类,所以监督是实例级的标签。我们将所有的源域类、目标域聚类、目标域每个聚类离群值实例看成平等的类别。
自步对比学习框架
以下是我们所提出自步对比学习(Self-paced Contrastive Learning)框架,包括一个图像特征编码器(Encoder)和一个混合记忆模型(Hybrid Memory)。
核心是混合记忆模型在动态变化的类别下所提供的连续有效的监督,以统一对比损失函数(Unified Contrastive Loss)的形式监督网络更新,实现起来非常容易,且即插即用。下文将具体介绍。
统一对比损失函数
类别原型(Class Prototype) 可以理解为该类别中较为有标志的特征,例如无偏分类器中的权重(Weights)。
在这里,我们使用源域真实类别的类质心(Class Centroids) 作为源域数据的类别原型 {w},使用目标域聚类的质心(Cluster Centroids) 作为聚类内的目标域数据的类别原型 {c},使用目标域聚类离群值的实例特征(Outlier Instance Features) 作为无聚类的目标域数据的类别原型 {v}。
我们所提出的混合记忆模型可以实时提供这三种类别原型以作训练监督,后文将具体介绍这三种类别原型的更新过程。
对于每一组输入的 mini-batch,同时包含源域数据和目标域数据(我们在编码器中使用 Domain-specific BNs 来消除不同领域数据间的域差异),他们需要与上述三种类别原型进行比较。所以我们提出统一对比损失函数(Unified Contrastive Learning):
该损失函数可以使得每个训练样本靠近它所属于的类别(包含源域真实类、目标域聚类、目标域无聚类实例),而远离其他类别。
举例来说,对于一个来自源域的样本,其对应的正面原型(Positive Prototype) 则是它真实类别所对应的质心(Class Centroids);对于一个来自目标域的样本,若其在聚类内,则正面原型为其所对应的聚类质心(Cluster Centroids),反之,若其不在聚类内,为聚类离群值,则正面原型为该离群值所对应的实例特征(Outlier Instance Features)。
其实,我们所设计的“混合记忆模型(Hybrid Memory)+统一对比损失函数(Unified Contrastive Loss)”与大家常用的“分类器(Classifier)+交叉熵损失函数(Cross-entropy Loss)”在工作机理上非常相似,可以简单的认为混合记忆模型是非参数化(Non-parametric)的分类器。
那么,为什么我们不用普通分类器来完成这一任务呢?这是由于目标域的聚类及聚类离群值在训练过程中动态变化(一般每个 epoch 前更新),无法使用固定的聚类 ID 及离群值实例 ID 训练分类器。如若在每次更新完 ID 后需要重置分类器,分类器由于无法连续更新,会导致性能较差。
有同学会问,以前的算法(如MMT),每个 epoch 重置分类器依然训练效果很好,这是为什么?这是因为这些算法不使用聚类离群值进行训练。
试想,将每个聚类离群值也看做单独的类加入分类器,而每个 epoch 只能遍历到该类对应的样本一次(因为一个离群值是一个类),那么,在类样本数如此不平均的情况下,分类器几乎得不到有效的训练,便会被重置。
我们所提出的统一对比损失函数与自监督任务(如 MoCo、SimCLR 等)中常用的对比损失函数最主要的区别在于,我们同时考虑了三种不同的类别原型,而以前的对比损失函数只考虑实例级的类别原型。
他们将所有样本看作独立的类,进行实例区分(Instance Discrimination)训练,这样的算法很大程度上忽略了类内(Intra-class)关系,也就是同一 ID 的不同图像间的联系,故以前的对比损失函数不适用于重识别任务。
混合记忆模型
上文中,我们提到混合记忆模型(Hybrid Memory)实时提供三种不同的类别原型,那么,这三种类别原型是如何动态地在混合记忆模型中连续更新变化的呢?
我们提出使用动量更新(Momentum Update),想必这个词对大家来说并不陌生,在 MoCo、Mean-teacher 等模型中常有见到,简单来说,就是以“参数=(1-动量)x新参数+动量x参数”的形式更新。在这里,我们针对源域和目标域采取不同的动量更新算法,以适应其不同的特性。
对于源域的数据而言,由于具有真实的类别,我们提出以类为单位进行存储。这样的操作一方面节省空间,一方面在实验中也取得了较好的结果。我们将当前 mini-batch 内的源域特征根据类别算均值,然后以动量的方式累计到混合记忆模型中对应的类质心上去,详见下图。
对于目标域的数据而言,我们提出全部以实例为单位进行特征存储,这是为了让目标域样本即使在聚类和非聚类离群值不断变化的情况下,仍然能够在混合记忆模型中持续更新(Continuously Update)。具体而言,我们将当前 mini-batch 内的目标域特征根据实例的index累计到混合记忆模型对应的实例特征上去。
那么,如何获得目标域的聚类质心及离群值实例特征呢?我们在混合记忆模型中,将同一聚类 ID 的特征做平均,即可获得聚类质心;而离群值的实例特征则直接从混合记忆模型中提取剩下的实例特征即可,如下图。
由简入难的自步学习
我们发现,由于聚类和聚类离群值都被看作平等且独立的类,所以聚类的可靠性对训练的影响至关重要。由于网络在训练的一开始对于图像的辨别性较差,聚类的噪声也较大。
所以我们借鉴自步学习(Self-paced Learning) 的思想,先从最可靠的聚类开始,再逐步增加聚类,由简入难。我们提出了一个聚类可靠性评价标准(Cluster Reliability Criterion),保留可靠的聚类,而将不可靠的聚类拆解回无聚类的离群值实例。
我们所提出的聚类可靠性评价标准分为聚类独立性(Cluster Independence)和聚类紧凑型(Cluster Compactness)。
聚类独立性(Cluster Independence) 体现为一个可靠的聚类应当具有良好的类间距离,通俗点来说,不能和附近的聚类“如胶似漆”。我们提出,放宽聚类的标准,例如 DBSCAN 中的最小类内距离,此时,如果该聚类与周围的聚类融合成了一个大聚类、或者吸收了附近的离群值,那么我们认为,该聚类的独立性不太好。
我们使用一个IoU(Interp over Union)公式来计算聚类的独立性。
聚类紧凑型(Cluster Compactness) 体现为一个可靠的聚类内的样本应该相互靠近,具有良好的类内距离。类似的,我们提出,缩紧聚类的标准,此时,如果该聚类被拆解成了多个小聚类、或者拆出了一些聚类离群值,那么我们认为,该聚类的紧凑型不太好。
我们使用另一个 IoU 公式来计算聚类的紧凑型,如上图所示。
直观地说,该聚类可靠性评价标准的出发点在于,一个可靠的聚类应当在多尺度的聚类环境下保持稳定。从下图训练的统计中可以看出,使用了聚类可靠性评价标准的模型(红色线)相比较于未使用的模型(蓝色线),无论是在聚类的数量还是质量上,都离真实类别更近。
算法流程
以上,我们介绍了核心的模块,我们梳理一下具体训练流程:
初始化(Initialization): 图像编码器(Encoder)的初始化一般使用 ImageNet Pre-trained Weights,混合记忆模型(Hybrid Memory)的初始化使用初始的编码器对所有的样本进行一次前向计算。
聚类和聚类离群值: 在每个 epoch 前进行聚类,并根据聚类可靠性评价标准(Cluster Reliability Criterion)进行聚类的筛选,仅保留可靠的聚类,其余样本均视作聚类离群值。
网络和混合记忆模型的更新: 在每个 iteration 中,首先利用编码器对 mini-batch 的样本进行特征编码,然后利用统一对比损失函数(Unified Contrastive Loss)进行网络的反向传播更新,最后利用编码的特征以动量更新(Momentum Update)的方式更新混合记忆模型(Hybrid Memory)。
无监督重识别上的应用
在一开始曾提到,该方法也可以被有效利用在无监督重识别任务上,只需要将混合记忆模型和统一对比损失函数中有关源域的部分去掉即可。
无监督重识别任务上的自步对比学习框架如下:
对应的统一对比损失函数如下:
实验
由于自步对比学习框架中可以同时训练源域和目标域的数据,所以训练是 one-stage 的,无需单独的源域预训练步骤。实验中,我们针对多个真实及虚拟合成数据集进行了实验,在行人重识别和车辆重识别任务上都测试了该方法的有效性。
领域自适应任务中,我们在无监督的目标域上均超越先前算法,在 PersonX->MSMT17 的任务上领先高达 5.0% 的 mAP,这是由于在“虚拟合成->真实”的迁移任务中,由于聚类噪声较大,产生的聚类离群值较多,所以我们所提出的充分挖掘所有样本的方案所带来的优势将更为突出。
除此之外,一项有趣的发现,VehicleID->VeRi-776 与 VehicleX->VeRi-776 在目标域上获得几乎相似的性能,这说明,在未来,随着领域自适应算法的不断升级,可能我们再也不需要人为标注的源域数据来作为辅助了,可以使用虚拟合成的数据予以代替。
以前的算法由于在目标域的训练中忽视了源域数据,所以会无法避免地忘记源域的信息,而我们提出的方法对源域和目标域数据进行了联合训练,在目标域性能提升的同时,也提升了有监督的源域性能。
可以看到,在 MSMT17-Market-1501 的迁移训练中,我们利用 Market-1501 的无标签数据大幅提升了 MSMT17 上的有监督训练性能(+6.6% mAP)。这意味着,我们所提出的算法可以被用于利用无标签数据提升有监督训练的任务。
同样,在无监督重识别任务上,我们大幅领先已有的算法,在 Market-1501 的 benchmark 上领先高达 16.7% 的 mAP。我们也将 MoCo 在无监督重识别任务上进行了复现,正如我们之前所介绍了,这类无监督预训练任务的算法并不适用于无监督的重识别任务,因为他们将所有的样本视作独立的类,忽视了重识别任务中最重要的类内类间关系。
再强调一下,MoCo 这类算法适用于无监督预训练任务,在应用于下游任务上时需要 fine-tune,而无监督重识别任务本身是一个下游任务。
有细心的同学可能会发现,刚刚展示的结果中没有涉及 DukeMTMC-reID 数据集的实验,这是因为 DukeMTMC-reID 已经官方下架,在 AC 的要求下,我们需要在论文的最终版本中删去所有有关 DukeMTMC-reID 的实验结果。
但是 DukeMTMC-reID 是行人重识别相关任务中常用的数据集,所以为了方便大家未来进行算法的调试和比较,我在这里也简单展示一下 DukeMTMC-reID 相关的结果,更多的结果大家可以在我们 arXiv 的第一个版本(arxiv.org/abs/2006.0271)中找到。
总结
该文提出了一个简单有效的自步对比学习框架,核心思想是利用多种不同形式的类别原型提供混合监督,以实现对所有训练数据的充分挖掘。虽然本文只在目标重识别任务上进行了实验,但是提出的混合记忆模型及统一对比损失函数是即插即用的,有很大潜力在其他任务上取得较好的结果,欢迎大家尝试。
这次 NeurIPS 的评审过程相当刺激,从初审的 7663 到终审的 5553,reviewers 的降分起源对 DukeMTMC-reID 数据集的讨论,最终这份工作也经历了 NeurIPS 今年特有的 Ethics Review,起起落落,最终被 AC 捞起,感恩。可见,目前学术界对于数据集的隐私保护规范要求也越来越严格。
推荐大家在以后领域自适应重识别工作中考虑采用合成数据集,如 PersonX、VehicleX 等,不仅可以避免不必要的麻烦,并且由于合成数据和真实数据的域差异较大,算法上可以提 shua 升 fen 的空间也会较大。
分类任务及分割任务上的领域自适应往往采用合成数据作为源域,且这次 VisDA-2020 的比赛中,源域采用的也是合成数据集 PersonX,可见合成数据到真实数据的自适应任务备受关注。
我近期将会给一个 talk,总结我这一年半以来在在领域自适应及无监督重识别方向上所做的研究,届时欢迎大家关注。
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
有顶会审稿人、大厂研究员、知乎大V和妹纸
等你来撩哦~