文献阅读-MOCO

Scroll Down

Momentum Contrast for Unsupervised Visual Representation Learning

Abstract

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

1. Introduction

无监督表示学习在自然语言处理中非常成功,如GPT[50,51]和BERT[12]所示。但在计算机视觉领域,监督预训练仍然占主导地位,而非监督方法通常落后于此。其原因可能源于它们各自信号空间的差异。语言任务具有离散的信号空间(词,子词单位等),用于构建标记化字典,无监督学习可以基于此。相比之下,计算机视觉则进一步关注字典构建[54,9,5],因为原始信号处于连续的高维空间中,并且不适合人类交流(例如,不像单词)。

最近的几项研究[61,46,36,66,35,56,2]在使用与对比损失相关的方法进行无监督视觉表征学习方面取得了令人鼓舞的结果[29]。尽管受到各种动机的驱动,但这些方法可以被认为是构建动态字典。字典中的“键”(令牌)从数据(例如,图像或补丁)中采样,并由编码器网络表示。无监督学习训练编码器执行字典查找:编码的“查询”应该与其匹配的键相似,而与其他键不同。学习被表述为最小化对比损失[29].

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

我们提出了动量对比(MoCo)作为一种构建具有对比损失的无监督学习的大型一致字典的方法(图1)。我们将字典维护为数据样本队列:当前小批的编码入队,最老的出队。队列将字典大小与mini-batch大小解耦,从而允许它很大。此外,由于字典键来自于前面的几个小批量,因此提出了一种缓慢推进的键编码器,作为查询编码器的基于动量的移动平均来实现,以保持一致性。

MoCo是一种为对比学习构建动态字典的机制,可用于各种借口任务。在本文中,我们遵循一个简单的实例识别任务[61,63,2]:如果它们是同一图像的编码视图(例如,不同的作物),则查询匹配一个键。使用此借口任务,MoCo在ImageNet数据集的常见线性分类协议下显示了竞争结果[11]。

无监督学习的一个主要目的是预训练表征(即特征),这些表征可以通过微调转移到下游任务。我们表明,在与检测或分割相关的7个下游任务中,MoCo无监督预训练可以超过其ImageNet有监督的对应项,在某些情况下,这一差距非常大。在这些实验中,我们探索了在ImageNet或10亿张Instagram图像集上预训练的MoCo,证明MoCo可以在更真实的、10亿张图像规模和相对未经策划的场景中很好地工作。这些结果表明,MoCo在很大程度上缩小了许多计算机视觉任务中无监督和有监督表示学习之间的差距,并且可以在一些应用中作为ImageNet监督预训练的替代方案。

无监督/自监督学习方法一般包括两个方面:借口任务和损失函数。术语“借口”意味着要解决的任务不是真正感兴趣的,而是为了学习良好的数据表示而解决的。损失函数通常可以独立于借口任务进行研究。MoCo侧重于损失函数方面。下面我们就这两个方面的相关研究进行讨论。

损失函数。定义损失函数的一种常见方法是测量模型预测与固定目标之间的差异,例如通过L1或L2损失重建输入像素(例如,自编码器),或者通过交叉熵或基于边缘的损失将输入分类为预定义的类别(例如,八个位置[13],颜色箱[64]).其他选择,如下面所述,也是可能的。

对比损失[29]衡量一个表示空间中样本对的相似性。在对比损失公式中,目标可以在训练过程中动态变化,并且可以根据网络计算的数据表示来定义,而不是将输入与固定目标匹配[29]。对比学习是最近几项关于无监督学习的研究的核心[61,46,36,66,35,56,2],我们将在后面的上下文中详细阐述(第3.1节)。

image.png

对比损失测量概率分布差异,它在无监督数据生成中是广泛成功的技巧,表征学习的对抗性方法在[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]。

3. Method

3.1 Contrastive Learning as Dictionary Look-up

对比学习[29]及其最近的发展,可以被认为是为字典查找任务训练编码器,如下所述。

考虑一个编码查询q和一组编码样本image.png是字典的键。假设字典中有一个键(记为k+)与q匹配。对比损失[29]是指当q与它的正键k+相似,且与其他所有键不相似时(认为是q的负键),其值较低的函数。通过点积度量相似性,本文考虑了一种对比损失函数InfoNCE [46]:
image.png

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

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

image.png

3.2 Momentum Contrast

从上面的角度来看,对比学习是一种在高维连续输入(如图像)上构建离散字典的方法。字典是动态的,因为键是随机采样的,并且键编码器在训练过程中不断发展。我们的假设是,好的特征可以通过一个包含丰富负样本集的大字典来学习,而字典键的编码器尽管在进化中仍尽可能保持一致。基于这一动机,我们提出动量对比,如下所述。

字典作为一个队列 我们方法的核心是将字典维护为数据样本队列。这允许我们重用前面小批量的编码密钥。队列的引入将字典大小与小批处理大小解耦。我们的字典大小可以比典型的迷你批处理大小大得多,并且可以灵活和独立地设置为超参数。

字典中的样本逐渐被替换。当前的小批被加入字典队列,队列中最老的小批被删除。字典总是表示所有数据的一个抽样子集,而维护这个字典的额外计算是可管理的。此外,删除最旧的迷你批可能是有益的,因为它的编码密钥是最过时的,因此与最新的密钥最不一致。

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

形式上,将fk的参数记为θk, fq的参数记为θq,我们将θk更新为:image.png
这里image.png为动量系数。只有参数θq通过反向传播更新。Eqn.(2)中的动量更新使得θk比θq更平滑地演化。因此,尽管队列中的键由不同的编码器编码(在不同的mini-batch中),但这些编码器之间的差异可以很小。在实验中,相对较大的动量(例如m = 0.999,我们的默认值)比较小的动量(例如m = 0.9)要好得多,这表明缓慢发展的密钥编码器是利用队列的核心。

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

通过反向传播进行的端到端更新是一种自然机制(例如[29,46,36,63,2,35],图2a)。它使用当前迷你批处理中的样本作为字典,因此键被一致地编码(由相同的编码器参数集)。但是字典大小与mini-batch大小相结合,受到GPU内存大小的限制。它也受到大型小批量优化的挑战[25]。最近的一些方法[46,36,2]是基于由局部位置驱动的借口任务,其中多个位置可以使字典大小变大。但这些借口任务可能需要特殊的网络设计,如修补输入[46]或定制接受域大小[2],这可能会使这些网络向下游任务的转移复杂化。
image.png

另一种机制是由[61]提出的记忆库方法(图2b)。内存库由数据集中所有样本的表示组成。每个mini-batch的字典都是从内存库中随机采样的,没有反向传播,因此它可以支持较大的字典大小。然而,在memory bank中样本的表达在上一次被看见时更新,所以采样键本质上是关于编码器在多个不同的步骤在过去的纪元,因此不太一致。文献[61]对内存库采用动量更新。它的动量更新是在相同样本的表示上,而不是在编码器上。这个动量更新与我们的方法无关,因为MoCo并没有跟踪每个样本。此外,我们的方法具有更高的内存效率,可以在十亿规模的数据上进行训练,这对于内存库来说是难以处理的。

第4节对这三种机制进行了实证比较。

3.3 Pretext Task

对比学习可以驱动各种各样的借口任务。由于本文的重点不是设计一个新的借口任务,我们使用了一个简单的借口任务,主要是遵循[61]中的实例区分任务,最近的一些研究[63,2]与实例区分任务有关。

根据[61],如果查询和键来自同一图像,我们将其视为正对,否则将其视为负样本对。按照[63,2],我们在随机数据增强的情况下,对同一张图像随机取两个“视图”,形成正对。查询和键分别由它们的编码器fq和fk编码。编码器可以是任何卷积神经网络[39]。

算法1提供了对于借口任务MoCo的伪代码,对于当前的小批量,我们对查询及其对应的键进行编码,它们形成正样本对。负样本来自队列。

技术细节。我们采用ResNet[33]作为编码器,其最后一个全连接层(经过全局平均池化)具有固定维输出(128-D[61])。该输出向量由l2范数归一化[61]。这是查询或键的表示形式。设Eqn.(1)中的温度τ为0.07[61]。数据增强设置如下[61]:从随机调整大小的图像中截取224×224-pixel裁剪,然后经历随机颜色抖动,随机水平翻转和随机灰度转换,这些都可以在PyTorch的torchvision包中使用。

打乱BN。我们的编码器fq和fk都与标准ResNet[33]一样具有批处理归一化(BN)[37]。在实验中,我们发现使用BN会阻止模型学习良好的表示,正如[35]中类似的报道(避免使用BN)。该模型似乎“欺骗”了借口任务,并很容易找到低损失的解决方案。这可能是因为样品之间的批内通信(由BN引起)泄露了信息。

我们通过变换BN来解决这个问题。我们使用多个GPU进行训练,并对每个GPU的样本独立执行BN(如常见实践所做的那样)。对于密钥编码器fk,我们在当前的小批量中打乱采样顺序,然后将其分配给gpu(并在编码后打乱);查询编码器fq的小批量示例顺序没有改变。这确保了用于计算查询及其正键的批统计信息来自两个不同的子集。这有效地解决了作弊问题,并使培训受益于BN。

我们在我们的方法和其端到端消融对应的方法中都使用了shuffle BN(图2a)。它与对应的内存库无关(图2b),后者不受此问题的影响,因为正键过去来自不同的小批量。

4. Experiments

我们研究在以下情况下进行的无监督训练:

ImageNet- 1m (in - 1m):这是ImageNet[11]训练集,在1000个类中有~ 128万张图像(通常称为ImageNet- 1k;我们计算图像数量,因为类不会被无监督学习利用)。该数据集的类分布很平衡,其图像通常包含对象的标志性视图。

Instagram- 1b (IG-1B):如下[44],这是一个来自Instagram的约10亿(940M)公开图像的数据集。这些图像来自大约1500个与ImageNet类别相关的标签[44]。与IN-1M相比,该数据集相对而言是未经整理的,并且具有长尾,不平衡的真实数据分布。该数据集包含标志性物体和场景级图像。

训练。我们使用SGD作为优化器。新元权重衰减为0.0001,新元动量为0.9。对于in - 1m,我们在8个gpu中使用256(算法1中的N)的mini-batch大小,初始学习率为0.03。我们训练了200个epoch,在120和160个epoch时学习率乘以0.1[61],训练ResNet-50需要53个小时。对于IG-1B,我们在64个gpu上使用1024个小批,学习率为0.12,每62.5k次迭代(64M张图像)后,学习率指数衰减0.9倍。我们训练了1.25M次迭代(IG-1B的~ 1.4个epoch), ResNet-50的训练时间为~ 6天。

4.1 Linear Classification Protocol

我们首先通过冻结特征的线性分类验证我们的方法,遵循一个共同的协议。在本小节中,我们对In - 1m进行无监督预训练。然后我们冻结特征并训练一个有监督的线性分类器(一个全连接层,然后是softmax)。我们在ResNet的全局平均池化特征上训练该分类器100次。我们在ImageNet验证集上报告了1-crop, top-1的分类精度。

对于这个分类器,我们执行网格搜索,发现最优初始学习率为30,权重衰减为0(类似的报道在[56]中)。这些超参数在本节介绍的所有消融项中表现一致。这些超参数值意味着特征分布(例如,大小)可能与ImageNet监督训练的特征分布有很大不同,我们将在第4.2节中重新讨论这个问题。

消融:对比损失机制。我们比较图2中所示的三种机制。为了关注对比损失机制的影响,我们在3.3节中描述的同一借口任务中实现所有这些机制。我们也使用同样形式的InfoNCE作为对比损失函数Eqn.(1)。因此,比较仅针对这三种机制。

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

当K较小时,端到端机制的性能与MoCo相似。但是,由于端到端需求,字典大小受到小批处理大小的限制。在这里,高端机器(8 Volta 32GB gpu)可以负担得起的最大迷你批处理是1024个。更重要的是,大型小批量训练是一个开放的问题[25]:我们发现有必要在这里使用线性学习率缩放规则[25],如果没有它,准确率会下降(对于1024个小批量,准确率会下降~ 2%)。但是,使用更大的小批进行优化是比较困难的[25],即使内存足够,这种趋势是否可以外推到更大的K也是值得怀疑的。
image.png

内存库[61]机制可以支持更大的字典大小。但比MoCo低2.6%。这与我们的假设是一致的:记忆库中的密钥来自非常不同的编码器,它们在过去的时代都是不一致的。请注意,58.0%的内存库结果反映了[61].2的改进实现消融:动量。下表显示了预训练中使用的不同MoCo动量值(公式(2)中的m)的ResNet-50精度(这里K = 4096):image.png

当m在0.99 ~ 0.9999之间时,它的性能相当好,这表明缓慢进展(即相对较大的动量)密钥编码器是有益的。当m太小(例如0.9)时,精度会大幅下降;在无动量的极端情况下(m = 0),训练损失振荡,不能收敛。这些结果支持我们构建一致字典的动机。

与以往结果比较。以前的无监督学习方法在模型大小上有很大的不同。为了进行公平和全面的比较,我们报告了准确性与#parameters3之间的权衡。除了ResNet-50 (R50)[33],我们还报道了它的2倍和4倍宽(更多通道)的变体,在[38].4之后我们设K = 65536, m = 0.999。表1是比较。

具有R50的MoCo具有竞争力,达到60.6%的准确率,优于所有类似模型尺寸的竞争对手(~ 24M)。MoCo受益于更大的型号,并在r50w4x上达到68.6%的精度。

值得注意的是,我们使用标准的ResNet-50实现了具有竞争力的结果,并且不需要特定的架构设计,例如:image.png

image.png

拼接输入[46,35],精心定制的接受域[2],或者结合两个网络[56]。通过使用不是为借口任务定制的架构,可以更容易地将特征转移到各种视觉任务并进行比较,这将在下一小节中进行研究。

本文的重点是一般对比学习的机制;我们没有探索可能进一步提高准确性的正交因素(如特定的借口任务)。例如,“MoCo v2”[8]是该手稿初稿的扩展版本,在数据增强和输出投影头[7]发生微小变化的情况下,R50的准确率达到71.1%(高于60.6%)。我们认为这一附加结果显示了MoCo框架的通用性和鲁棒性。

image.png

4.2 Transferring features

无监督学习的一个主要目标是学习可转移的特征。ImageNet监督预训练在作为下游任务微调的初始化时最具影响力(例如[21,20,43,52])。接下来,我们将MoCo与ImageNet监督的预训练进行比较,将其转移到各种任务中,包括PASCAL VOC [18], COCO[42]等。作为先决条件,我们讨论了涉及的两个重要问题[31]:规范化和调度。

规范化。如4.1节所述,与ImageNet监督预训练相比,无监督预训练产生的特征可以具有不同的分布。但是,下游任务的系统通常具有超参数(例如,学习率),用于监督预训练。为了解决这个问题,我们在微调时采用特征归一化:我们对训练好的BN进行微调(并在gpu间同步[49]),而不是用仿射层冻结它[33]。我们还在新初始化的层中使用BN(例如,FPN[41]),这有助于校准震级.

我们在微调有监督和无监督预训练模型时执行归一化。MoCo使用与ImageNet监督的对等体相同的超参数。

时间表。如果微调时间表足够长,随机初始化的训练检测器可以是强基线,并且可以在COCO上匹配ImageNet监督的对应物[31]。我们的目标是研究特征的变换,因此,我们的实验是在受控时间表上进行的,例如,COCO的1×(~ 12个epoch)或2×时间表[22],而不是[31]中的6× ~ 9×时间表。在像VOC这样的小数据集上,长时间的训练可能跟不上[31]。

尽管如此,在我们的微调中,MoCo使用与ImageNet监督对应的相同的调度,并提供随机初始化结果作为参考。

总之,我们的微调使用了与监督预训练相同的设置。这可能会使MoCo处于不利地位。即便如此,MoCo仍具有竞争力。这样做还可以在多个数据集/任务上进行比较,而无需额外的超参数搜索。

image.png

4.2.1 PASCAL VOC Object Detection

设置。检测器为Faster R-CNN[52],主干网为r50 - expanded - c5或R50-C432,BN调优,在[60]中实现。我们对所有层进行端到端的微调。图像尺度在训练时为[480,800]像素,在推理时为800像素。所有条目都使用相同的设置,包括监督的预训练基线。我们评估了AP50的默认VOC指标(即,IoU阈值为50%)和co -style AP和AP75的更严格的指标。评价依据2007年VOC测试集。

消融:backbone。表2显示了在trainval07+12 (~ 16.5k图像)上微调的结果。对于R50-dilatedC5(表2a),在IN-1M上预训练的MoCo与监督预训练的MoCo相当,而在IG-1B上预训练的MoCo则超过了它。对于R50-C4(表2b),带有IN-1M或IG-1B的MoCo比有监督的MoCo更好:高达+0.9 AP50, +3.7 AP和+4.9 AP75。

有趣的是,传递精度取决于探测器的结构。对于现有基于resnet的结果默认使用的C4主干[14,61,26,66],无监督预训练的优势更大。在过去,预训练与检测器结构之间的关系被掩盖了,这应该是一个考虑的因素。

消融:对比损失机制。我们指出,这些结果的部分原因是我们为对比学习建立了坚实的检测基线。精确地指出在对比学习中仅由使用MoCo机制贡献的增益,我们使用与MoCo相同的微调设置,使用端到端或内存库机制对预训练的模型进行微调,这两种机制都是由我们实现的(即图3中最好的那些)。

这些竞争对手表现不错(表3)。它们使用C4主干的AP和AP75也高于ImageNet监督的对手,c.f.。表2b,但其他指标更低。它们在所有指标上都不如MoCo。这显示了MoCo的好处。此外,如何在更大规模的数据中训练这些竞争对手是一个悬而未决的问题,他们可能不会从IG-1B中受益。

与以往结果比较。在竞争者之后,我们使用C4主干对trainval2007 (~ 5k图像)进行微调。比较如表4所示。

对于AP50度量,之前的任何方法都无法赶上其相应的监督预训练对应。在IN-1M、IN-14M (full ImageNet)、YFCC-100M[55]和IG-1B中的任何一种上预训练的MoCo都可以优于监督基线。在更严格的指标中可以看到较大的收益:高达+5.2 AP和+9.0 AP75。这些增益大于trainval07+12中的增益(表2b)。

4.2.2 COCO Object Detection and Segmentation

设置。该模型是Mask R-CNN[32]与FPN[41]或C4骨干网,BN调谐,在[60]中实现。图像尺度在训练时为[64,800]像素,在推理时为800像素。我们对所有层进行端到端的微调。我们对train2017集(~ 118k图像)进行微调,并对val2017进行评估。时间表是[22]中默认的1x或2x。

结果。表5显示了FPN(表5a, b)和C4(表5c, d)骨干网在COCO上的结果。使用1x时间表,所有模型(包括ImageNet监督的对应模型)都严重训练不足,正如与2x时间表案例的2个点差距所示。在2倍的时间表下,MoCo在两个主干网的所有指标上都优于其ImageNet监督的对应产品。

4.2.3 More Downstream Tasks

表6显示了更多的下游任务(实现细节见附录)。总的来说,MoCo在ImageNet上有监督预训练后的表现很有竞争力。

COCO关键点检测:监督预训练与随机初始化相比没有明显优势,而MoCo在所有指标上都表现出色。

COCO密集姿态估计[1]:在这个高度定位敏感的任务中,MoCo在APdp 75中显著优于有监督的预训练,例如高出3.7分。

LVIS v0.5实例分割[27]:该任务有~ 1000个长尾分布类别。特别是在LVIS中,对于ImageNet监督基线,我们发现使用冻结BN (24.4 APmk)进行微调比可调BN更好,因此,我们将MoCo与该任务中更好的监督预训练变体进行比较。MoCo与IG-1B在所有指标上都超过了它。

城市景观实例分割[10]:在APmk中,使用IG-1B的MoCo与有监督预训练的MoCo相当,在APmk 50中更高。

语义分割:在cityscape[10]上,MoCo比其有监督的预训练对手高出0.9个点。但在VOC语义分割上,MoCo至少差了0.8个点,这是我们观察到的一个负面案例。

总结。总之,MoCo可以在7个检测或分割任务中优于其ImageNet监督预训练对手此外,MoCo在cityscape实例分割上基本持平,在VOC语义分割上落后;我们在iNaturalist[57]的附录中展示了另一个类似的案例。总的来说,MoCo在很大程度上缩小了多视觉任务中无监督和有监督表示学习之间的差距。

值得注意的是,在所有这些任务中,IG-1B预训练的MoCo始终优于in - 1m预训练的MoCo。这表明MoCo可以在这种大规模的、相对未经整理的数据集上表现良好。这代表了现实世界中无监督学习的场景。

5. Discussion and Conclusion

我们的方法在各种计算机视觉任务和数据集中显示了无监督学习的积极结果。

有几个悬而未决的问题值得讨论。MoCo从IN-1M到IG-1B的改进一直很明显,但相对较小,这表明更大规模的数据可能没有得到充分利用。我们希望一个先进的借口任务将改善这一点。除了简单的实例识别任务[61]外,还可以将MoCo用于伪装自编码等借口任务,例如语言[12]和视觉[46]。我们希望MoCo对其他涉及对比学习的借口任务有用。
image.png

image.png