我们提出了“动量对比”(Momentum Contrast,MoCo)来进行无监督的视觉表示学习。从对比学习的角度来看,我们将其视为字典查找,通过构建一个带有队列和移动平均编码器的动态字典。这使得可以动态构建一个大型且一致的字典,有助于进行对比的无监督学习。MoCo在ImageNet分类的常见线性协议下提供了竞争性的结果。更重要的是,MoCo学到的表示在下游任务中具有很好的迁移性能。MoCo在PASCAL VOC、COCO和其他数据集的7个检测/分割任务中可以胜过其监督预训练的对应方法,有时甚至取得较大的优势。这表明在许多视觉任务中,无监督和监督表示学习之间的差距已经被大大缩小。
无监督表示学习在自然语言处理领域非常成功,例如,如GPT [50, 51]和BERT [12]所示。但在计算机视觉领域,监督预训练仍然占主导地位,而无监督方法通常滞后。这一原因可能源于它们各自的信号空间存在差异。语言任务具有离散的信号空间(单词、子词单元等)用于构建标记化的字典,基于这些字典可以进行无监督学习。相比之下,计算机视觉进一步涉及字典的构建[54, 9, 5],因为原始信号处于连续的高维空间中,且不适合人类交流(例如,与单词不同)。
(最近的关于对比学习的研究主要表现在动态字典的构建方面。,通过query去查找同属于正样本的key,通过查找过程构建代理任务并构造损失函数)
最近的一些研究[61, 46, 36, 66, 35, 56, 2]展示了使用与对比损失[29]相关的方法进行无监督的视觉表示学习取得了令人鼓舞的结果。尽管出发点各不相同,但这些方法可以被视为构建动态字典。字典中的“键”(标记)是从数据(例如图像或补丁)中采样的,并由编码器网络表示。无监督学习训练编码器执行字典查找:编码的“查询”应该与其匹配的键相似,与其他键不相似。学习被表述为最小化对比损失[29]。
A
字典的构造需要满足以下两点:(1)构建的字典应该尽可能的足够大,满足抽样样本尽可能的去逼近整体样本。(2)在字典的从动态的min_batch中抽取特征表示的过程中应该尽可能的去保持字典的一致性---所有负样本特征尽可能的满足都是同一参数的编码器生成的。为满足这个要去。引入动量更新的放大,当学习率M足够大就可以满足:
θk ← mθk + (1 − m)θq.
从这个角度来看,我们假设构建具有以下特点的字典是可取的:(i) 大型,以及 (ii) 在训练过程中保持一致性。直观地说,一个更大的字典可能更好地对连续的高维视觉空间进行抽样,同时字典中的键应该由相同或相似的编码器表示,以便与查询进行一致的比较。然而,现有使用对比损失的方法在这两个方面可能存在限制(稍后在上下文中讨论)。
B
C
提出:
我们提出了“动量对比”(Momentum Contrast,MoCo)作为一种使用对比损失进行无监督学习并构建大型一致字典的方法(图1)。①我们将字典维护为一个数据样本的队列:当前小批量的编码表示被加入队列,而最先进入的被移出队列(FIFO)。队列使得字典的大小与小批量大小分离,使其可以很大。此外,②由于字典的键来自前几个小批量,我们提出了一个缓慢前进的键编码器,实现为查询编码器的基于动量的移动平均,以维持一致性(动态一致性)。
图1. Momentum Contrast(MoCo)通过使用对比损失将编码的查询 q 与编码的键字典进行匹配来训练视觉表示编码器。字典键 {k0, k1, k2, ...} 是根据一组数据样本即时定义的。字典被构建为一个队列,当前min_batch被入队,最先进入的min_batch被出队,与min_batch大小解耦。键由一个缓慢前进的编码器进行编码,由动量更新与查询编码器一起推动(θk ← mθk + (1 − m)θq.)。这种方法能够为学习视觉表示提供一个大而一致的字典。
MoCo是一种用于构建用于对比学习的动态字典的机制,可以与各种预训练任务一起使用。在本文中,我们遵循一个简单的实例辨别任务[61, 63, 2]:如果查询(query)和键(key)是同一图像的编码视图(例如,不同的裁剪),则它们匹配。通过使用这个预训练任务,MoCo在ImageNet数据集[11]的常见线性分类协议下展示了具有竞争力的结果。
无监督学习的一个主要目的是预训练能够通过微调迁移到下游任务的表示(即特征)。我们展示了在与检测或分割相关的7个下游任务中,MoCo无监督预训练可以超越其ImageNet监督对应物,在某些情况下超出相当大的幅度。在这些实验中,我们探索了在ImageNet或一个包含十亿张Instagram图像的数据集上进行的MoCo预训练,这表明MoCo可以在更真实世界、以十亿级别的图像为规模的、相对不经过筛选的情况下很好地工作。这些结果显示,MoCo在许多计算机视觉任务中已经大大缩小了无监督和监督表示学习之间的差距,并可以在一些应用中作为ImageNet 监督预训练的替代选择。
无监督/自监督学习方法通常涉及两个方面:预训练任务和损失函数(代理任务的选择以及损失函数的构建)。术语“代理任务”意味着正在解决的任务不是真正感兴趣的任务,代理任务仅仅是为了学习良好的数据表示而解决的。损失函数通常可以独立于预训练任务进行研究。MoCo关注于损失函数方面。接下来,我们将讨论与这两个方面相关的研究。
损失函数。定义损失函数的一种常见方式是衡量模型的预测(prodict)与(groud trouth)固定目标之间的差异,例如通过L1或L2损失来重构输入像素(例如,自编码器),或者通过交叉熵或基于边际的损失将输入分类为预定义的类别(例如,八个位置[13]、颜色区间[64])。下面将描述其他一些可能的替代方法。
对比损失[29]度量了表示空间中样本对的相似性。与将输入与固定目标匹配不同,在对比损失的形式化中,目标可以在训练过程中实时变化,并可以根据网络计算的数据表示来定义[29]。对比学习是最近几项无监督学习工作的核心[61, 46, 36, 66, 35, 56, 2],我们将在后文中详细阐述(第3.1节)。
对抗损失(GAN)[24]用于度量概率分布之间的差异,是无监督数据生成的一种广泛成功的技术。关于表示学习的对抗方法已在[15, 16]中进行了探讨。此外,存在一些关系(参见[24])将生成对抗网络与噪声对比估计(NCE)[28]联系在一起。这些方法在无监督学习和表示学习领域具有重要的应用。
/*----------------------------------------------------------------***---------------------------------------------------------*/
噪声对比估计(Noise Contrastive Estimation,NCE)是一种用于训练概率模型的估计方法,常用于自监督学习中的对比学习任务。NCE的核心思想是通过对比模型生成的样本与噪声分布中的样本来估计模型参数。
下面是NCE的详细解释:
1. **目标函数:** 在NCE中,我们的目标是最大化正确样本的概率,并最小化噪声样本的概率。这可以通过最大似然估计来表达。给定一个样本集合,我们希望模型分布能够更好地区分这些样本与噪声分布。
2. **正样本和噪声样本:** 在对比学习任务中,正样本通常是来自真实数据分布的样本,而噪声样本则是从噪声分布中采样得到的。噪声分布可以是任何我们希望模型能够区分的分布,通常是对真实数据的某种变换或扰动。
3. **估计方法:** NCE引入了一个二元分类任务。对于给定的样本对(正样本和噪声样本),我们训练一个二分类器来判断哪一个是正样本。该分类器的参数即是我们要学习的模型参数。损失函数包括两部分:最大化正样本的概率和最小化噪声样本的概率。
4. **对比分布:** NCE的核心在于引入一个对比分布,它是一个噪声分布。通过最小化与噪声分布之间的交叉熵,我们迫使模型能够区分真实样本和噪声样本。
5. **应用于对比学习:** 在对比学习任务中,NCE可以用于训练一个表示学习模型。模型通过最大化正样本的概率,即正确样本与其对应的转换版本的概率,同时最小化噪声样本的概率,即噪声样本与其对应的转换版本的概率。
总体而言,NCE为对比学习提供了一个理论基础和实际的优化目标,使得模型能够通过自我生成的对比样本进行有效的训练。
/*----------------------------------------------------------------***---------------------------------------------------------*/
代理任务。提出了各种各样的代理任务。例如,恢复带有一些损坏的输入,如去噪自动编码器 [58]、上下文自动编码器 [48] 或跨通道自动编码器(着色) [64, 65]。有些代理任务任务通过对单个("范例")图像的转换生成伪标签,例如图像变换 [17]、补丁排序 [13, 45]、视频中的目标跟踪 [59] 或分割对象 [47],或者对特征进行聚类 [3, 4]。
对比学习与代理任务。各种代理任务可以基于某种形式的对比损失函数。实例辨别方法 [61] 与基于范例的任务 [17] 和 NCE [28] 相关。对比预测编码(CPC) [46] 中的预文本任务是上下文自动编码的一种形式 [48],在对比多视图编码(CMC) [56] 中,它与着色 [64] 相关。
对比学习[29]及其最近的发展可以被看作是针对字典查找任务训练编码器的过程(通过query去查找对应的),如下所描述。
从样本中选取部分样本进行查询,使字典足够大满足抽样样本尽可能的去逼近整体样本。
考虑一个编码查询 q 和一组编码样本 {k0, k1, k2, ...},它们是字典的键。假设字典中存在一个单一的键(表示为 k+),它与查询 q 匹配。对比损失[29]是一个函数,当查询 q 与其正向键 k+ 相似且与所有其他键(对于查询 q 被视为负向键)不相似时,其值较低。使用点积来衡量相似性,本文考虑了一种对比损失函数,称为InfoNCE[46]:
其中,τ 是一个温度超参数,根据 [61] 中的设定。求和是在一个正样本和 K 个负样本之间进行的。直观地说,这个损失函数是一个基于 (K+1) 分类的 softmax 分类器的对数损失,试图将查询 q 分类为 k+。对比损失函数也可以基于其他形式,比如基于边际的损失和 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]。这些选择根据具体应用的需求而定。
从上述角度来看,对比学习是一种在高维连续输入(如图像)上构建离散字典的方法。这个字典是动态的,因为键是随机抽样的,而键编码器在训练过程中会发生变化。我们的假设是,通过覆盖丰富的负样本集的大型字典,可以学到好的特征,同时尽量保持字典键的编码器在其演变过程中尽可能一致。基于这一动机,我们接下来将介绍所谓的"动量对比"(Momentum Contrast)。
Dictionary as a queue(字典作为队列).我们方法的核心是将字典维护为一个数据样本的队列。这使我们能够重复使用来自直接前几个小批次的编码键。引入队列的概念将字典大小与小批次大小分离。我们的字典大小可以比典型的小批次大小大得多,可以作为一个超参数进行灵活和独立的设置。
字典中的样本会逐渐被替换。当前的小批次被加入到字典中,而队列中最先进入的小批次被移除。字典始终表示了所有数据的抽样子集,同时维护这个字典的额外计算是可以管理的。此外,移除最先进入的小批次可能是有益的,因为它的编码键是最过时的,因此与最新的编码键一致性最差。
动量更新;使用队列可以使字典变得很大,但也使得通过反向传播来更新键编码器成为不可行的(梯度应该传播到队列中的所有样本)。一个朴素的解决方案是从查询编码器 fq 复制键编码器 fk,忽略了这个梯度。但这个解决方案在实验中效果不佳(第4.1节)。我们假设这种失败是由于快速变化的编码器降低了键表示的一致性。为了解决这个问题,我们提出了一个动量更新的方法。
形式上,将fk的参数表示为θ k,将fq的参数表示为θ q,我们通过以下方式更新θ k:
θk ← mθk + (1 − m)θq
这里,m ∈ [0, 1) 是一个动量系数。只有参数 θq 通过反向传播来更新。方程(2)中的动量更新使 θk 的演化比 θq 更加平滑。因此,尽管队列中的键是由不同的编码器(在不同的小批次中)编码的,这些编码器之间的差异可以变得很小。在实验中,相对较大的动量值(例如,m = 0.999,我们的默认值)比较小的值(例如,m = 0.9)效果要好得多,这表明一个慢慢演化的键编码器是利用队列的关键。
与先前机制的关系。MoCo是一种使用对比损失的通用机制。我们将其与图2中的两种现有通用机制进行了比较。它们在字典大小和一致性方面表现出不同的特性。
图2. 三种对比损失机制的概念比较(实验比较见图3和表3)。这里我们展示了一对查询和键。这三种机制在如何维护键以及如何更新键编码器方面有所不同。 (a): 通过反向传播端到端更新用于计算查询和键表示的编码器(这两个编码器可以不同)。 (b): 键表示是从memory bank中抽样的[61]。 (c): MoCo通过一个带有动量更新的编码器实时编码新的键,并维护一个键的队列(在本图中未示意)。
通过反向传播的端到端更新是一种自然的机制(例如[29, 46, 36, 63, 2, 35],图2a)。它使用当前min_batch中的样本作为字典,因此键是一致编码的(使用相同的编码器参数集)。但字典大小与小批次大小耦合在一起,受限于GPU内存大小。它还受到大型小批量优化的挑战[25]。一些最近的方法[46, 36, 2]基于由局部位置驱动的代理任务,其中字典大小可以通过多个位置来扩大。但这些代理任务可能需要特殊的网络设计,例如将输入进行分块处理[46]或自定义感受野大小[2],这可能会使这些网络用于下游任务的转移变得更加复杂。
另一个机制是由[61]提出的memory bank 方法(图2b)。memory bank包括数据集中所有样本的表示。每个小批次的字典是从memory bank中随机抽样的,没有反向传播,因此它可以支持大型字典大小。然而,memory bank中样本的表示是在上次看到它们时更新的,因此抽样的键基本上涉及到整个过去时代中各种不同步骤的编码器,因此不太一致。在[61]中采用了memory bank的动量更新。它的动量更新是在相同样本的表示上,而不是在编码器上。这种动量更新与我们的方法无关,因为MoCo不跟踪每个样本。此外,我们的方法更节省内存,并可以在规模达数十亿的数据上进行训练,而memory bank可能不太适用。
第4节在实验上对这三种机制进行了比较。
对比学习可以用来驱动各种不同的预训练任务。由于本文的重点不在设计新的代理任务,我们使用了一个简单的任务,主要是基于[61]中的instance辨别任务,与最近的一些工作[63, 2]相关。根据[61]的方法,我们将查询和键视为正样本对,如果它们来自同一幅图像,否则视为负样本对。根据[63, 2],我们会采用随机数据增强下同一图像的两个随机“视图”来构成一个正样本对。查询和键分别由它们的编码器fq和fk进行编码。编码器可以是任何卷积神经网络[39]。
算法1提供了MoCo在这个预训练任务中的伪代码。对于当前的小批次,我们对查询和它们相应的键进行编码,形成正样本对。负样本来自队列。
技术细节:我们采用ResNet [33]作为编码器,其最后一个全连接层(在全局平均池化之后)具有固定维度的输出(128维 [61])。该输出向量通过其L2-范数进行标准化[61]。这是查询或键的表示。方程(1)中的温度 τ 设置为0.07 [61]。数据增强设置遵循[61]:从随机调整大小的图像中取出一个224×224像素的裁剪,然后进行随机颜色抖动、随机水平翻转和随机灰度转换,这些都在PyTorch的torchvision包中提供。
批量归一化 (Batch Normalization, BN) 是我们的编码器 fq 和 fk 中的标准组件,就像标准的 ResNet [33] 一样。在实验中,我们发现使用 BN 会阻止模型学到良好的表示,类似于[35]中的报告(该研究避免使用 BN)。模型似乎在代理任务上“作弊”并轻松找到了一个低损失的解决方案。这可能是因为样本之间的批内通信(由 BN 引起)泄漏了信息。
使用所有batch的均值的平均值和所有batch方差的无偏估计。
我们通过打乱 BN 来解决这个问题。我们使用多个 GPU 进行训练,对于每个 GPU,我们独立地对样本执行 BN(这是常见的做法)。对于键编码器 fk,我们在将其分发到 GPU 之前对当前小批次中的样本顺序进行了打乱(并在编码后恢复原样);查询编码器 fq 的小批次样本顺序不发生改变。这确保了用于计算查询和其正向键的批次统计来自于两个不同的子集。这有效地解决了“作弊”问题,并允许训练从 BN 中受益。
在我们的方法和端到端消融对照组中都使用了随机顺序的批量归一化(Figure 2a)。与此问题无关的是内存库对照组(Figure 2b),因为其中的正键来自过去不同的小批量。
我们研究了在以下数据集上进行的无监督训练:
1. ImageNet-1M(IN-1M):这是ImageNet [11]训练集,包含约128万张图像,分为1000个类别(通常被称为ImageNet-1K;我们根据图像数量来计算,因为无监督学习不利用类别信息)。这个数据集在类别分布上很平衡,其图像通常包含对象的标志性视图。
2. Instagram-1B(IG-1B):按照[44]的方法,这是来自Instagram的大约10亿(940M)张公共图像。这些图像来自大约1500个与ImageNet类别相关的hashtag [44]。与IN-1M相比,这个数据集相对不太精选,并且具有长尾、不平衡的现实世界数据分布。这个数据集包含标志性对象和场景级别的图像。
训练。我们使用SGD作为优化器。SGD的权重衰减为0.0001,动量为0.9。对于IN-1M,在8个GPU上,我们使用256的小批量大小(Algorithm 1中的N),初始学习率为0.03。我们训练了200个epoch,学习率在第120和160个epoch时乘以0.1 [61],用时约53小时训练ResNet-50。对于IG-1B,在64个GPU上,我们使用1024的小批量大小,学习率为0.12,每62.5k迭代(6400万图像)指数衰减0.9×。我们进行了125万次迭代(IG-1B的约1.4个时代),用时约6天训练ResNet-50。
首先,我们通过在冻结特征(linear probing)上进行线性分类来验证我们的方法,按照常见的协议进行。在本小节中,我们在IN-1M上进行无监督预训练。然后,我们冻结特征并训练一个监督线性分类器(一个全连接层后跟softmax层)。我们在ResNet的全局平均池化特征上训练这个分类器,进行100个周期的训练。我们报告了ImageNet验证集上的1-crop、top-1分类准确率。
有监督训练的学习率小于1,但是无监督学习的学习率为30,表明:有监督训练的特征分布和无监督训练的特征分布是存在很大的差距的。
对于这个分类器,我们进行了网格搜索,找到了最佳的初始学习率为30,权重衰减为0(类似于[56]中报告的)。这些超参数在本小节中提供的所有消融实验中表现一致良好。这些超参数值意味着特征分布(例如幅度)可以与ImageNet监督训练的特征分布有相当大的差异,这个问题我们将在第4.2节中重新讨论。
消融实验:对比损失机制。我们比较了图2中所示的三种机制。为了专注于对比损失机制的影响,我们在本小节中采用了与instance discrimination相同的代理任务来实现它们。我们还使用了与对比损失函数Eqn.(1)相同的InfoNCE形式。因此,这个比较仅涉及这三种机制。
结果如图3所示。总体而言,这三种机制都受益于更大的K。在memory bank机制下,[61, 56]也观察到了类似的趋势,而在这里,我们展示了这一趋势更为普遍,可以在所有机制中看到。这些结果支持了我们建立大字典的动机。
图3. 在ImageNet线性分类协议下比较三种对比损失机制。我们采用相同的代理任务(第3.3节)只是改变对比损失机制(图2)。在memory bank和MoCo中,负样本的数量为K,而在端到端中为K-1(减去一个是因为正样本键在同一小批次中)。网络采用ResNet-50。
端到端的机制在K较小时表现与MoCo相似。然而,由于end to end的要求,字典的大小受到min_batch大小的限制。在这里,高端机器(8个Volta 32GB GPU)可以负担得起的最大的min_batch为1024。更本质的是,大规模min_batch训练是一个尚未解决的问题[25]:我们发现在这里必须使用线性学习率缩放规则[25],否则准确性会下降(对于batch_size为1024,下降约2%)。但使用更大的min_batch进行优化更加困难[25],而且即使内存充足,趋势是否可以推广到更大的K仍然是有问题的。
Memory bank[61]机制可以支持更大的字典大小。但它比MoCo差2.6%。这与我们的假设一致:Memory bank中的键来自过去一个epoch中非常不同的编码器,它们不一致。需要注意的是,58.0%的Memory bank结果反映了我们对[61]的改进实现。
消融实验:动量。下表显示了在预训练中使用不同MoCo动量值(方程(2)中的m)的ResNet-50准确性(这里K = 4096):
当m在0.99∼0.9999之间时,它表现相当不错,显示出慢速前进(即相对较大的动量)的关键编码器是有益的。当m太小(例如0.9)时,准确性显著下降;在没有动量的极端情况下(m为0),训练损失会波动并且无法收敛。这些结果支持了我们建立一致字典的动机。 与以前的结果进行比较。以前的无监督学习方法在模型大小上可能有很大差异。
M = 0.999,表现相当不错
M =0.9,准确定显著下降
M =0,训练损失会波动并且无法收敛
为了进行公平和全面的比较,我们报告了准确性与参数数量之间的权衡。除了ResNet-50(R50)[33],我们还报告了其宽度是2×和4×的变种,参考[38]。我们设置K = 65536和m = 0.999。表1是比较结果。具有R50的MoCo表现竞争力十足,实现了60.6%的准确性,优于所有相似模型大小(∼24M)的竞争对手。MoCo受益于更大的模型,在R50w4×上实现了68.6%的准确性。值得注意的是,我们使用标准的ResNet-50实现了竞争对手的结果,无需特定的架构设计,例如,这些方法可能包括对输入进行切块[46, 35]、精心定制的感受野[2]或者将两个网络组合[56]。通过使用一个不针对预训练任务定制的架构,可以更容易将特征转移到各种视觉任务并进行比较,这将在下一小节中研究。
表1. 在ImageNet上的线性分类协议下进行的比较。图表化了表格。所有结果都是基于在ImageNet-1M训练集上进行的无监督预训练,然后进行冻结特征的监督线性分类训练,并在验证集上进行评估。参数计数是特征提取器的参数数量。如果有可用的改进的重新实现,我们会进行比较(在数字之后引用)。
本文的重点是对一种通用对比学习机制的研究;我们没有探讨可能进一步提高准确性的其他因素(如特定的代理任务)。例如,“MoCo v2” [8]是本文初稿的扩展版本,通过对数据增强和输出投影头部进行微小修改,实现了R50的准确性提升,从60.6%提高到71.1%。我们相信这个额外的结果展示了MoCo框架的通用性和稳健性。
MoCo在 ImageNet上做监督预训练,然后再在PASCAL VOC [18]、COCO [42]等各种任务上进行微调。
无监督学习的一个主要目标是学习可转移的特征。在下游任务的微调中,ImageNet监督预训练最有影响力(例如,[21, 20, 43, 52])。接下来,我们将比较MoCo和ImageNet监督预训练,以及它们在包括PASCAL VOC [18]、COCO [42]等各种任务中的转移性能。作为前提条件,我们将讨论涉及的两个重要问题:Normalization和Schedules。
Normalization(归一化)。如第4.1节所述,与ImageNet监督预训练相比,无监督预训练产生的特征可能具有不同的分布。但是,下游任务的系统通常会选择针对监督预训练的超参数(例如,学习率)。为了缓解这个问题,我们在微调过程中采用特征归一化:我们使用在微调期间经过训练的BN(并在GPU之间同步[49]),而不是通过仿射层[33]来冻结它。我们还在新初始化的层中使用BN(例如,FPN [41]),这有助于校准幅度。
在微调监督和无监督预训练模型时,我们进行归一化。MoCo使用与ImageNet监督模型相同的超参数。
Schedules.如果微调时间表足够长,从随机初始化开始训练检测器可以成为强大的基线,并可以在COCO上与ImageNet监督模型相匹配[31]。我们的目标是调查特征的可转移性,因此我们的实验采用了受控时间表,例如COCO的1×(约12个周期)或2×时间表[22],与[31]中的6×∼9×时间表相反。在像VOC这样的小型数据集上,训练时间更长可能无法追赶[31]。尽管如此,在我们的微调中,MoCo使用与ImageNet监督模型相同的时间表,随机初始化的结果提供为参考。
总之,我们的微调使用与监督预训练模型相同的设置。这可能会使MoCo处于不利地位。尽管如此,MoCo依然具有竞争力。这样做也使得我们能够在多个数据集/任务上进行比较,而无需进行额外的超参数搜索。
设置。检测器是Faster R-CNN [52],使用R50-dilated-C5或R50-C4 [32]的骨干网络(详细信息请参见附录),BN调整,由[60]实现。我们对所有层进行端对端微调。在训练期间,图像尺度为[480, 800]像素,推断时为800像素。相同的设置用于所有实验,包括监督预训练基线。我们评估了VOC默认的AP50度量(即IoU阈值为50%),以及更严格的COCO风格AP和AP75度量。评估是在VOC test2007数据集上进行的。
消融实验:骨干网络。表2显示了在trainval07+12数据集(约16.5k张图片)上微调的结果。对于R50-dilatedC5(表2a),在IN-1M上预训练的MoCo与监督预训练的对照组相媲美,而在IG-1B上预训练的MoCo则超越了它。对于R50-C4(表2b),使用IN-1M或IG-1B预训练的MoCo优于监督对照组:AP50提高了0.9,AP提高了3.7,AP75提高了4.9。
表2。在PASCAL VOC trainval07+12上微调的目标检测结果。评估是在test2007上进行的,包括AP50(默认的VOC指标)、AP(COCO风格)和AP75,平均值是在5次试验中计算的。所有模型都微调了24,000次迭代(约23个周期)。括号中是与ImageNet监督预训练对照组的差距。在绿色中至少+0.5分的差距。
迁移的准确性取决于检测器所使用的网络
有趣的是,迁移的准确性取决于检测器的结构。对于C4骨干网络,默认用于现有基于ResNet的结果[14, 61, 26, 66],无监督预训练的优势更大。过去,预训练与检测器结构之间的关系一直是模糊的,应该是需要考虑的因素之一。
对比损失机制的消融实验。我们指出,这些结果部分是因为我们为对比学习建立了坚实的检测基线。为了明确使用MoCo机制在对比学习中所带来的收益,我们使用我们自己实施的端到端或memory bank机制(即图3中最好的机制)来微调经过预训练的模型,使用与MoCo相同的微调设置。
图三。ImageNet线性分类协议下三种对比损失机制的比较。我们采用相同的代理任务(第。3.3)并且仅改变对比损失机制(图2)。内存库和MoCo中的负片数为K,端到端为K−1(偏移量为1,因为正片密钥在同一小批处理中)。网络是ResNet-50。
这些竞争对手表现还不错(表3)。它们在C4骨干的AP和AP75也高于ImageNet监督对照组,参见表2b,但其他指标较低。它们在所有指标上都不如MoCo。这显示了MoCo的好处。此外,如何在更大规模的数据上训练这些竞争对手是一个尚未解答的问题,它们可能无法从IG-1B中受益。
由于end to end的结构设计带来了硬件的限制以及memory bank的固定字典大小的限制都成为这两个模型在大的数据上扩展的阻碍。
表3。PASCAL VOC物体检测的三种对比损失机制的比较,在trainval07+12上进行微调,在test2007上进行评估(5次试验的平均值)。所有模型都由我们实现(图3),在IN-1M上进行预训练,并使用与表2相同的设置进行微调。
与以前的结果相比。在竞争对手之后,我们使用C4骨干在trainval2007(约5,000张图像)上进行微调。比较见表4。
表4。与PASCAL VOC trainval2007上微调的先前对象检测方法的比较。评估正在测试2007。ImageNet监督的对应物来自各自的论文,并且被报告为与各自的无监督预训练对应物具有相同的结构。所有条目都基于C4主干。[14]中的模型是R101 v2[34],其他的是R50。RelPos(相对位置)[13]结果是多任务论文[14]中最好的单任务案例。Jigsaw[45]的结果来自[26]中基于ResNet的实现。我们的结果是9k次迭代微调,平均超过5次试验。括号中是与ImageNet监督的预培训对应部分的差距。绿色表示至少+0.5分的差距。
对于AP50指标,以前的方法都无法赶上与自己相对应的监督预训练对照组。MoCo在任何IN-1M、IN-14M(完整的ImageNet)、YFCC-100M [55]和IG-1B上预训练的模型都可以胜过监督基线。在更严格的指标中看到了较大的增益:AP高达+5.2,AP75高达+9.0。这些增益比trainval07+12(表2b)中的增益更大。
(Setup)配置。模型是使用FPN [41]或C4骨干实现的Mask R-CNN [32],采用调整的BN,由[60]实施。在训练期间,图像尺度为[640, 800]像素,推断时为800。我们对所有层进行端到端的微调。我们在train2017数据集上进行微调(约118,000张图像),并在val2017上进行评估。日程安排采用[22]中的默认1×或2×。
(Results)结果。表5显示了在COCO数据集上使用FPN(表5a、b)和C4(表5c、d)骨干的结果。在1×日程表中,所有模型(包括ImageNet监督对照组)都受到了严重的训练不足,这表明与2×日程表情况相比,存在着约2个百分点的差距。在2×日程表中,MoCo在两种骨干上的所有指标都优于其ImageNet监督对照组。
表5。在COCO上微调的对象检测和实例分割:在val2017上评估的边界框AP(APbb)和掩码AP(APmk)。括号中是与ImageNet监督的预培训对应部分的差距。绿色表示至少+0.5分的差距。
表6显示了更多的下游任务(实现细节请参阅附录)。总体而言,MoCo在ImageNet监督预训练方面表现出色:
COCO关键点检测:监督预训练与随机初始化相比没有明显优势,而MoCo在所有指标上表现更好。
COCO密集姿势估计[1]:在这个高度依赖定位的任务中,MoCo大大优于监督预训练,例如APdp 75提高了3.7个百分点。
Table 6. MoCo与在各种任务上进行微调的ImageNet监督预训练的比较。对于每个任务,所有条目使用相同的架构和计划(详见附录)。括号中是与ImageNet监督预训练对应的差距。绿色表示至少为+0.5分的差距。†:此条目是使用BN冻结的结果,这有助于提高性能;请参阅正文。
VIS v0.5实例分割[27]:这个任务有大约1000个长尾分布的类别。具体来说,在ImageNet监督基线的LVIS中,我们发现冻结BN(24.4 APmk)的微调优于可调BN(详见附录)。因此,我们在此任务中将MoCo与性能更好的监督预训练变体进行比较。在所有指标上,使用IG-1B的MoCo都超过了它。
Cityscapes实例分割[10]:使用IG-1B的MoCo在APmk方面与其监督预训练对应物相媲美,并且在APmk 50方面更高。
语义分割:在Cityscapes [10]上,MoCo的性能超过其监督预训练对应物高达0.9个百分点。但是在VOC语义分割任务中,MoCo的性能至少差0.8个百分点,这是我们观察到的一个负面案例。
总结。总体而言,在7个检测或分割任务中,MoCo可以胜过其ImageNet监督预训练对应物。此外,MoCo在Cityscapes实例分割任务上表现不俗,在VOC语义分割任务上落后;在附录中,我们展示了iNaturalist [57]上的另一个可比较的案例。总的来说,MoCo在多个视觉任务中已经大大缩小了无监督和监督表示学习之间的差距。
值得注意的是,在所有这些任务中,使用IG-1B预训练的MoCo始终优于使用IN-1M预训练的MoCo。这表明MoCo在这个大规模、相对未经筛选的数据集上表现出色。这代表了朝着真实世界无监督学习的一种情景。
我们的方法在各种计算机视觉任务和数据集上都取得了积极的无监督学习结果。还有一些值得讨论的问题。MoCo从IN-1M到IG-1B的改进一直都很显著,但相对较小,这表明更大规模的数据可能没有被充分利用。我们希望一个先进的前提任务可以改进这一点。除了简单的实例识别任务[61],MoCo还可以用于像语言[12]和视觉[46]中的遮挡自动编码等前提任务。我们希望MoCo对涉及对比学习的其他前提任务也能有所帮助。
R50-dilated-C5和R50-C4的主干网络与Detectron2 [60]中可用的网络非常相似:(i) R50-dilatedC5:主干网络包括带有膨胀因子2和步幅1的ResNet conv5阶段,然后是一个3×3的卷积(带有BN),将维度减小到512。框预测头包括两个隐藏的全连接层。(ii) R50-C4:主干网络以conv4阶段结束,框预测头由conv5阶段(包括全局池化)后面跟一个BN层组成。
我们将掩码R-CNN(关键点版本)与R50-FPN一起使用,在[60]中实现,在COCO train2017上进行微调,并在val2017上进行评估。时间表是2 ×。
我们将密集R-CNN[1]与R50-FPN一起使用,在[60]中实施,在COCO train2017上进行微调,并在val2017上进行评估。时间表是“s1 ×”。
我们使用带有 R50-FPN 的 Mask R-CNN 模型,在 LVIS [27] 数据集的 train v0.5 上进行了微调,并在 val v0.5 上进行了评估。我们遵循 [27] 中的基线方法(arXiv v3 附录 B)。LVIS 是一个新的数据集,对其上的模型设计还有待探索。以下表格包括相关的消融实验结果(所有结果是经过 5 次试验的平均值):
一个监督预训练的基准,进行端到端调整,但批量归一化(BN)保持冻结状态,达到了24.4 APmk。但在这个基准中调整BN会导致更差的结果和过拟合,这与COCO/VOC数据集上调整BN提供更好或相当的准确性的情况不同。MoCo在IN-1M上的APmk为24.1,而在IG-1B上为24.9,它们在相同可调整BN设置下都优于监督预训练的对应模型。在最佳的个别设置下,MoCo仍然能够胜过监督预训练情况(如在第4.2节的表6中报告的,24.9 vs. 24.4)。
我们使用基于FCN结构的语义分割方法[43]。骨干网络由R50(可能指ResNet-50)的卷积层组成,conv5块中的3×3卷积具有2的膨胀率和1的步幅。接着是两个额外的256通道的3×3卷积层,包括批归一化(BN)和修正线性单元(ReLU)激活函数,然后使用1×1卷积进行像素级分类。总步幅为16(根据FCN-16s[43]的设计)。在这两个额外的3×3卷积层中,膨胀率设置为6,这遵循了[6]中大视野设计的原则。
训练过程包括随机缩放(在[0.5, 2.0]的比率范围内)、裁剪和水平翻转。在VOC数据集上,裁剪尺寸为513,而在Cityscapes数据集上为769。推理时,模型处理原始图像尺寸。训练使用小批量大小为16和权重衰减为0.0001。VOC数据集上的学习率设置为0.003,而Cityscapes数据集上为0.01(在训练的第70和90百分位点处乘以0.1)。在VOC数据集上,我们在经过[30]数据扩增的train aug2012数据集(包括10582张图像)上进行30,000次迭代的训练,然后在val2012数据集上进行评估。在Cityscapes数据集上,我们在train fine数据集(包括2975张图像)上进行90,000次迭代的训练,然后在val数据集上进行评估。结果是对5次试验的平均值。
除了主文中的检测/分割实验外,我们还在iNaturalist 2018数据集[57]上进行了对细粒度分类的研究。我们将预训练模型进行端到端的微调,使用训练集(约437,000张图像,8142个类别)进行微调,然后在验证集上进行评估。微调过程遵循PyTorch中ResNet的典型实现,进行了100个时代的训练。微调的学习率为0.025(与从头开始的0.1相比),在训练的第70和90百分位点处减小10。以下是R50的结果:
MoCo的性能比从随机初始化训练好了大约4%,并且与它的ImageNet监督训练的性能非常接近。这再次表明MoCo的无监督预训练是竞争力强的。
在冻结特征上进行线性分类(参见第4.1节)是评估无监督预训练方法的常见协议。然而,在实践中,更常见的是在下游任务中端对端地微调特征。为了完整起见,以下表格报告了针对1000类ImageNet分类的端对端微调结果,与从头开始训练相比(微调使用初始学习率为0.03,而从头开始的学习率为0.1):
在这里,ImageNet是下游任务,MoCo在IN-1M上进行的预训练不代表一个真实的场景(供参考,我们报告其微调后的准确性为77.0%)。但在单独的、未标记的IG-1B数据集中进行的无监督预训练代表了一个典型的情况:在这种情况下,MoCo的准确性提高了0.8%。
在表5中,我们报告了在COCO上采用1×(约12个时期)和2×的调度的结果。这些调度是从最初的Mask R-CNN论文[32]中继承的,考虑到后来该领域的进展,它们可能不是最佳选择。在表A.1中,我们补充了6×调度(约72个时期)的结果[31],并将其与2×调度的结果进行比较。我们观察到:(i) 在ImageNet监督预训练的微调仍然有所改进(41.9 APbb);(ii) 从头开始训练大部分赶上(41.4 APbb);(iii) MoCo对应部分进一步改进(例如,提高到42.8 APbb),并且具有更大的差距(例如,与6×相比,+0.9 APbb,与2×相比,+0.5 APbb)。表A.1和表5表明,当微调时间更长时,MoCo预训练的特征可以比ImageNet监督特征具有更大的优势。
表5。在COCO上微调的对象检测和实例分割:在val2017上评估的边界框AP(APbb)和掩码AP(APmk)。括号中是与ImageNet监督的预培训对应部分的差距。绿色表示至少+0.5分的差距。
表A.1。在COCO上微调的对象检测和实例分割:2倍对6倍时间表。括号中是与ImageNet监督的预培训对应部分的差距。绿色表示至少+0.5分的差距。
图A.1提供了使用或不使用Shuffling BN的MoCo的训练曲线:去除Shuffling BN会明显过拟合于预训练任务:预训练任务的训练准确率(虚线曲线)迅速增加到>99.9%,kNN-based验证分类准确率(实线曲线)很快下降。这在MoCo和端到端变体中都观察到;内存银行变体隐含地对q和k使用不同的统计数据,因此避免了这个问题。这些实验表明,没有Shuffling BN,子批次统计数据可以作为一个“签名”来告诉正样本键位于哪个子批次。Shuffling BN可以消除这个签名并避免这种欺骗。
图A.1. Shuffling BN消融实验。虚线:预训练任务的训练曲线,以(K+1)-way字典查找的准确率绘制。实线:ImageNet分类准确率的kNN监视器[61]的验证曲线(不是线性分类器)。该图显示了训练的前80个epoch:没有Shuffling BN进行更长时间的训练会导致更多的过拟合。