MoCO ——Momentum Contrast for Unsupervised Visual Representation Learning

Title: Momentum Contrast for Unsupervised Visual Representation Learning

作者:Kaiming He Haoqi Fan Yuxin Wu Saining Xie Ross Girshick

发表单位:Facebook AI Research(FAIR)

关键词:clip、多模态

论文:https://arxiv.org/pdf/1911.05722

代码:https://github.com/facebookresearch/moco

一句话带过:提出带有动量的对比网络来维持对比样本的一致性。如图所示,其实encoder 可以是来自同一个encoder,也可以是来自不同的encoder.图1(a)是常见的对比损失方法,拿出xq和xk做点积,计算xq和xk的相似度。但这种方式局限于batch_size的大小,只能与batch_size范围内的样本进行对比。图1(b)是一种memory bank的方式,把所有的样本(例如ImageNet-1K)都放在memory bank中,那memory bank存放着1M*feature 的数据(大约600M)。但这种方式也有不足之处,缺少了一致性。假设batch_size为1,每次更新只更新一个样本,此时的encoder已经经过backward回传更新了,剩下的999999个样本与当前的encoder已经丢失一致性了(因为是在不同时刻的encoder产生的),如果把整个队列都更新一遍,最新的样本的最旧的样本差距是很大的。因此提出带有动量的更新方式。Moco是一个折中的方式,既保留了一致性,也维持了样本容量要大的特点。它创建了一个队列,做对比的时候只与队列中的数据进行对比。同时用了动量的方式,每次momentum encoder不是完全=encoder,而是通过公式:θk← mθk + (1− m)θq.进行更新,m通常为0.999,这样能保证每次的更新不是很大,保持一致性。

Abstract

我们提出了用于无监督视觉表征学习的动量对比度(MoCo)。从对比学习(29)作为字典查找的角度出发,我们构建了一个带有队列和移动平均编码器的动态字典。这使得能够动态构建一个大型且一致的词典,从而促进对比无监督学习。MoCo在ImageNet分类的通用线性协议下提供有竞争力的结果。更重要的是,MoCo学习到的表示可以很好地传递给下游任务。MoCo可以在PASCAL VOC、COCO和其他数据集上的7项检测/分割任务中优于其监督的预训练对手,有时甚至可以大大超过它。这表明,在许多视觉任务中,无监督和有监督的表征学习之间的差距已经基本消除。

 Introduction

无监督表征学习在自然语言处理中非常成功,如GPT[50,51]和BERT[12]所示。但有监督的预训练在计算机视觉中仍然占主导地位,而无监督的方法通常滞后于此。原因可能源于它们各自信号空间的差异。语言任务具有离散的信号空间(单词、子单词单元等),用于构建标记化词典,无监督学习可以基于此。相比之下,计算机视觉更关注词典的建立[54,9,5],因为原始信号位于连续的高维空间中,并且不是为人类交流而构建的(例如,与单词不同)。最近的几项研究【61、46、36、66、35、56、2】在使用对比缺失相关方法的无监督视觉表征学习方面取得了有希望的结果【29】。尽管受到各种动机的驱动,这些方法可以被认为是构建动态词典。字典中的“键”(标记)从数据(例如图像或补丁)中采样,并由编码器网络表示。无监督学习训练编码器执行字典查找:编码的“查询”应该与其匹配的关键字相似,而与其他关键字不同。学习被表述为最小化对比损失[29]。

从这个角度来看,我们假设最好是建立以下词典:(i)大型词典和(ii)在培训过程中不断演变的词典。直观地说,较大的字典可以更好地对底层连续的高维视觉空间进行采样,而字典中的键应该由相同或类似的编码器表示,以便它们与查询的比较是一致的。然而,使用对比损失的现有方法可能局限于这两个方面中的一个(后面将在上下文中讨论)。

我们提出动量对比(MoCo)是一种为无监督学习构建大型一致词典的方法,这种方法会导致对比损失(图1)。我们将字典维护为一个数据样本队列:当前小批量的编码表示被排队,最旧的表示被排队。队列将字典大小从最小批量大小中分离出来,允许它变大。此外,由于字典密钥来自之前的几个小批量,因此提出了一种缓慢进行的密钥编码器,作为基于动量的查询编码器移动平均来实现,以保持一致性。

MoCo是一种为对比学习构建动态词典的机制,可用于各种借口任务。在本文中,我们遵循一个简单的实例判别任务【61、63、2】:如果查询是同一图像的编码视图(例如,不同的作物),则查询会匹配一个键。使用这个借口任务,MoCo在ImageNet数据集中的线性分类通用协议下显示了竞争结果【11】。无监督学习的一个主要目的是预训练表示(即特征),这些表示可以通过微调转移到下游任务。我们表明,在与检测或分割相关的7个下游任务中,MoCo无监督预训练可以超过其ImageNet监督的对应任务,在某些情况下,可以达到非平凡的边缘。在这些实验中,我们探索了在ImageNet或10亿Instagram图像集上预先训练过的MoCo,证明了MoCo可以在更真实的世界、10亿图像规模和相对未经处理的场景中很好地工作。这些结果表明,在许多计算机视觉任务中,MoCo在很大程度上缩小了无监督和有监督表示学习之间的差距,并且可以在一些应用中替代ImageNet监督的预训练。 

Related work

 无监督/自我监督的学习方法通常涉及两个方面:借口任务和损失函数。术语“借口”意味着所解决的任务不是真正感兴趣的,而只是为了学习良好的数据表示的真正目的而解决的。损失函数通常可以独立于借口任务进行调查。MoCo专注于损失功能方面。接下来,我们将讨论这两个方面的相关研究。损失函数。定义损失函数的一种常见方法是测量模型预测和固定目标之间的差异,例如通过L1或L2损失重建输入像素(例如,自动编码器),或通过交叉熵或基于边缘的损失将输入分类为预定义类别(例如,八个位置[13],色位[64])。如下文所述,其他替代方案也是可能的。对比损失[29]衡量表征空间中样本对的相似性。与将输入与固定目标匹配不同,在对比损失公式中,目标可以在训练期间动态变化,并且可以根据网络计算的数据表示进行定义【29】。对比学习是最近几项关于无监督学习的工作的核心【61、46、36、66、35、56、2】,我们将在后面的上下文中详细阐述(第3.1节)。 

对抗性损失【24】衡量概率分布之间的差异。这是一项非常成功的技术用于无监督的数据生成。[15,16]探讨了表征学习的对抗性方法。生成性对抗网络与噪声对比估计(NCE)之间存在关系(见【24】)【28】。

借口任务。提出了各种各样的借口任务。示例包括在某些损坏情况下恢复输入,例如去噪自动编码器【58】、上下文自动编码器【48】或跨通道自动编码器(着色化)】【64、65】。一些借口任务通过变换单个(“示例”)图像【17】、补丁排序【13、45】、跟踪【59】或分割视频中的对象【47】或聚类特征【3、4】形成伪标签。

对比学习与借口任务。各种借口任务可以基于某种形式的对比损失函数。实例判别法【61】与基于范例的任务【17】和NCE【28】相关。对比预测编码(CPC)[46]中的借口任务是上下文自动编码的一种形式[48],而对比多视角编码(CMC)[56]中的借口任务与色彩化有关[64]。

Method

3.1  Contrastive Learning as Dictionary Look-up

对比学习[29]及其最新发展可以看作是为字典查找任务培训编码器,如下所述。考虑一个编码查询q和一组编码样本{k0,k1,k2,…}那是字典的钥匙。假设字典中有一个q匹配的键(表示为k+)。对比损失[29]是指当q与其正键k+相似,而与所有其他键(被视为q的负键)不同时,其值较低的函数。通过点积来衡量相似度,本文考虑了一种称为InfoNCE的对比损失函数形式[46]:

 其中,τ是【61】中的温度超参数。总和超过一个正样本和K个负样本。直观地说,这种损失是(K+1)路softmax分类器的对数损失,该分类器试图将q分类为K+。对比损失函数也可以基于其他形式[29、59、61、36],例如基于margin的loss和NCE损失的变体。

对比损失作为一个无监督的目标函数,用于训练表示查询和键的编码器网络【29】。通常,查询表示为q=fq(xq),其中fq是编码器网络,xq是查询样本(同样,k=fk(xk))。它们的实例化取决于特定的借口任务。输入xq和xk可以是图像[29、61、63]、补丁[46]或由一组补丁组成的上下文[46]。网络fq和fk可以相同[29、59、63]、部分共享[46、36、2]或不同[56]。

3.2 Momentum Constract

 从上述角度来看,对比学习是一种基于图像等高维连续输入构建离散词典的方法。字典是动态的,因为密钥是随机抽样的,并且密钥编码器在训练过程中不断进化。我们的假设是,覆盖大量负面样本的大型词典可以学习到良好的特征,而词典键的编码器则尽可能保持一致,尽管其不断进化。基于这一动机,我们将呈现动量对比,如下所述。

字典作为队列。我们方法的核心是将字典作为数据样本队列进行维护。这允许我们重用前面小批量中的编码密钥。队列的引入将字典大小与小批量大小分离。我们的字典大小可以远远大于典型的小批量大小,并且可以灵活地独立设置为超参数。词典中的示例将逐步替换。当前的小批量将排入字典队列,并删除队列中最旧的小批量。字典始终表示所有数据的采样子集,而维护此字典的额外计算是可以管理的。此外,删除最旧的小批量也是有益的,因为它的编码密钥是最过时的,因此与最新的密钥最不一致。

动量更新。使用队列会使字典变大,但也会使通过反向传播更新密钥编码器变得困难(梯度应该传播到队列中的所有样本)。一个简单的解决方案是从查询编码器fq复制密钥编码器fk,忽略此梯度。但这种解决方案在实验中产生的结果很差(第4.1节)。我们假设这种失败是由快速变化的编码器导致的,编码器降低了密钥表示的一致性。我们建议更新势头以解决这一问题。

形式上,将fk的参数表示为θk,fq的参数表示为θq,我们将θk更新为:

此处m∈ [0,1)是动量系数。只有参数θq通过反向传播更新。等式(2)中的动量更新使θk比θq进化得更平滑。因此,尽管队列中的密钥由不同的编码器(在不同的小批量中)编码,但这些编码器之间的差异可以变小。在实验中,相对较大的动量(例如,m=0.999,我们的默认值)比较小的值(例如,m=0.9)工作得更好,这表明缓慢演化的密钥编码器是使用队列的核心。

与以前机制的关系。MoCo是使用对比损失的一般机制。我们将其与图2中现有的两种通用机制进行比较。它们在字典大小和一致性方面表现出不同的特性。

通过反向传播进行端到端更新是一种自然机制(例如,[29、46、36、63、2、35],图2a)。它使用当前小批量中的样本作为字典,因此密钥的编码是一致的(由相同的编码器参数集)。但字典大小与小批量大小相结合,受到GPU内存大小的限制。它还面临着大规模小批量优化的挑战[25]。最近的一些方法[46,36,2]基于由本地位置驱动的借口任务,其中字典大小可以通过多个位置来扩大。但这些借口任务可能需要特殊的网络设计,如修补输入[46]或定制接受野大小[2],这可能会使这些网络向下游任务的传输变得复杂。

另一种机制是[61]提出的内存库方法(图2b)。内存库由数据集中所有样本的表示组成。每个小批量的字典都是从内存库中随机抽取的,没有反向传播,因此它可以支持较大的字典大小。但是,在内存库在最后一次看到时进行了更新,因此采样的密钥基本上是关于过去历元中多个不同步骤的编码器,因此不太一致。[61]中对内存库采用了动量更新。它的动量更新是在同一样本的表示上,而不是在编码器上。这个动量更新与我们的方法无关,因为MoCo并没有跟踪每个样本。此外,我们的方法具有更高的内存效率,并且可以在十亿规模的数据上进行训练,这对于内存库来说是很困难的。第。4实证比较这三种机制。

伪代码讲解:

1、首先初始化encoder  f_q,f_k

2、对数据x进行随机增强, x的样本量是N,x_q和x_k代表N个正样本对。

3、向前forward 推理,把k的梯度去了。

4、计算q和k的对齐(可以理解为相似性)。

5、计算q与队列的对齐程度(相似性),队列有K个样本(ImageNet有1M)

6、合并,得到了一个(N,K+1)的矩阵    1是正样本,剩下K是负样本。

7、生成label (这里有个技巧,其实生成的labels应该是[1,0,0,….,0],但第一个的下标是0,在计算crossentropy会直接等于0。

8、计算loss。

9、更新loss。

10、出队入队。

3.3 Pretext task

对比学习可以驱动各种借口任务。由于本文的重点不是设计一个新的借口任务,因此我们使用了一个简单的借口任务,主要是在[61]中的实例辨别任务之后,这与一些最近的工作[63,2]有关。在[61]之后,如果查询和密钥来自同一图像,我们将其视为正对,否则将其视为负样本对。在[63,2]之后,我们在随机数据增强下对同一幅图像进行两次随机“查看”,以形成一对正视图。查询和密钥分别由其编码器fq和fk编码。编码器可以是任何卷积神经网络[39]。算法1为这个借口任务提供了MoCo的伪代码。对于当前的小批量,我们对查询及其对应的密钥进行编码,从而形成正样本对。负样本来自队列。技术细节。我们采用ResNet[33]作为编码器,其最后一个完全连接的层(在全局平均池之后)具有固定的维度输出(128-D[61])。该输出向量通过其L2范数进行归一化[61]。这是查询或键的表示形式。方程n中的温度τ。(1) 设置为0.07[61]。数据增强设置如下【61】:从随机调整大小的图像中获取224×224像素的裁剪,然后进行随机颜色抖动、随机水平翻转和随机灰度转换,所有这些都可以在PyTorch的torchvision软件包中获得。正在洗牌BN。

我们的编码器fq和fk都具有标准ResNet中的批标准化(BN)[37]。在实验中,我们发现使用BN会阻止模型学习良好的表示,正如[35]中所述(避免使用BN)。该模型似乎“欺骗”了借口任务,很容易找到低损失的解决方案。这可能是因为样本之间的批内通信(由BN引起)泄漏了信息。我们通过改组BN来解决这个问题。

我们使用多个GPU进行训练,并对每个GPU的样本独立执行BN(按照常规做法)。对于密钥编码器fk,我们先在当前小批量中洗牌样本顺序,然后再将其分配给GPU(并在编码后洗牌);查询编码器fq的小批次的样本顺序未更改。这确保了用于计算查询及其正键的批次统计信息来自两个不同的子集。这有效地解决了作弊问题,并使培训从BN中受益。我们在我们的方法及其端到端消融对应物中使用了混洗BN(图2a)。它与对应的内存库无关(图2b),它不会受到此问题的影响,因为正密钥过去来自不同的小批量。 

 Experiments

我们研究在ImageNet-1M(in-1M)中执行的无监督训练:这是ImageNet[11]训练集,具有∼1000个类中有128万张图像(通常称为ImageNet-1K;我们计算图像数量,因为类不会被无监督学习利用)。该数据集的类分布非常均衡,其图像通常包含对象的图标视图。Instagram-1B(IG-1B):继[44]之后,这是一个∼Instagram上的10亿(9.4亿)公众图片。图像来自∼1500个与ImageNet类别相关的标签[44]。与IN-1M数据集相比,该数据集相对不完整,并且真实世界数据的分布具有长尾性和不平衡性。此数据集包含图标对象和场景级图像。

训练我们使用SGD作为优化器。SGD重量衰减为0.0001,SGD动量为0.9。对于IN-1M,我们在8个GPU中使用256(算法1中为N)的最小批量,初始学习率为0.03。我们训练200个时代,120和160个时代的学习率乘以0.1【61】,取∼53小时培训ResNet-50。对于IG-1B,我们在64个GPU中使用1024个小批量,学习率为0.12,每62.5k次迭代(64M个图像)后,学习率呈指数衰减0.9倍。我们为125万次迭代进行培训(∼1.4 IG-1B的时代),采取∼ResNet-50为6天。

 4.1 Linear classification protocal(linear protocol 的意思是冻结backbone,只训练分类头)

我们首先首先按照通用协议,对冻结特征进行线性分类,以验证我们的方法。在本小节中,我们对In-1M进行无监督的预培训。然后,我们冻结特征并训练一个有监督的线性分类器(一个完全连接的层,后跟softmax)。我们根据100个时代的ResNet的全局平均池特性来训练这个分类器。我们在ImageNet验证集上报告了1-crop、top-1分类精度。对于该分类器,我们执行网格搜索,发现最佳初始学习率为30,权重衰减为0(类似于文献[56]中的报告)。这些超参数在本小节中介绍的所有消融条目中都表现良好。这些超参数值意味着特征分布(例如,大小)可能与ImageNet监督训练的分布有很大不同,我们将在第二节中重新讨论这个问题。4.2。(作为认为学习率30的原因是因为Insgram数据分布与ImageNet有很大的不同)

消融:对比损失机制。我们比较了图2中所示的三种机制。为了关注对比损失机制的效果,我们在第3.3节所述的同一个借口任务中实现了所有这些机制。我们还使用了与对比损失函数相同的信息形式,即Eqn.(1) 。因此,仅就这三种机制进行比较。

结果如图3所示。总的来说,所有三种机制都受益于更大的K。在记忆库机制下,在[61,56]中观察到了类似的趋势,而在这里,我们表明,这种趋势更普遍,可以在所有机制中看到。这些结果支持了我们构建大型词典的动机。

当K很小时,端到端机制的性能类似于MoCo。然而,由于端到端的要求,字典大小受到小批量大小的限制。在这里,一台高端机器(8 Volta 32GB GPU)能承受的最大迷你批量是1024台。更重要的是,大规模小批量训练是一个开放的问题【25】:我们发现有必要在这里使用线性学习率缩放规则【25】,如果没有该规则,准确率会下降(通过∼2%(1024小批量)。但是,使用更大的小批量进行优化比较困难[25],而且即使内存足够,这种趋势是否可以外推到更大的K值也是值得怀疑的

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月24日
下一篇 2022年5月24日

相关推荐