Momentum Contrast for Unsupervised Visual Representation Learning

2022-09-02 10:44:45 浏览数 (1)

摘要

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

1、介绍

无监督表示学习在自然语言处理中非常成功,例如,如GPT和BERT所示。但是有监督的预训练在计算机视觉中仍然占主导地位,无监督的方法普遍落后。原因可能源于它们各自信号空间的差异。语言任务有离散的信号空间(单词、子单词单元等)。)用于构建标记化词典,无监督学习可以基于该词典。相比之下,计算机视觉进一步关注词典构建,因为原始信号处于连续的高维空间中,并且不是为人类通信而构建的(例如,不同于单词)。

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

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

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

MoCo是一种为对比学习建立动态词典的机制,可以用于各种借口任务。在本文中,我们遵循一个简单的实例识别任务;如果一个查询匹配一个关键字,它们是同一图像的编码视图(例如,不同的作物)。利用这个借口任务,MoCo在ImageNet数据集中的线性分类的共同协议下显示了竞争结果。

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

2、相关工作

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

损失函数:

定义损失函数的一种常见方式是测量模型预测和固定目标之间的差异,例如通过L1或L2损失重建输入像素(例如自动编码器),或者通过交叉熵或基于边缘的损失将输入分类到预定义的类别(例如八个位置、颜色条)。如下所述,其他替代方案也是可能的。

对比损失衡量样本对在表示空间中的相似性。在对比损失公式中,不是将输入与固定目标匹配,而是在训练过程中目标可以动态变化,并且可以根据网络计算的数据表示来定义。对比学习是最近几部关于无监督学习的著作的核心,我们将在后面的上下文中详细介绍。

对抗损失衡量概率分布之间的差异。这是一种广泛成功的无监督数据生成技术。在中探讨了表征学习的对抗方法。生成对抗网络和噪声对比估计之间存在关系。

Pretext任务:

提出了一系列借口任务。示例包括在某些损坏下恢复输入,例如去噪自动编码器、上下文自动编码器或跨通道自动编码器(彩色化)。一些借口任务通过例如单个(“样本”)图像的变换、面片排序、跟踪或分割视频中的目标或聚类特征来形成伪标签。

Contrastive learning vs. pretext tasks:

各种Pretext任务可以基于某种形式的对比损失函数。实例识别方法与基于范例的任务和NCE相关。对比预测编码(CPC)中的Pretext任务是上下文自动编码的一种形式,而在对比多视图编码(CMC)中,它与彩色化有关。

3、方法

3.1、对比学习作为字典查找表

对比学习及其最近的发展可以被认为是为字典查找任务训练一个编码器,如下所述。考虑一个编码查询q和一组编码样本left{k_{0}, k_{1}, k_{2}, ldotsright} 是字典的键。假设字典中有一个与q匹配的键(表示为k )。对比损失是当q与其正键k 相似而与所有其他键(被认为是q的负键)不相似时,其值较低的函数。利用点积度量的相似性,本文考虑了一种叫做InfoNCE的对比损失函数:

mathcal{L}_{q}=-log frac{exp left(q cdot k_{ } / tauright)}{sum_{i=0}^{K} exp left(q cdot k_{i} / tauright)}

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

对比损失作为无监督的目标函数,用于训练表示查询和关键字的编码器网络。通常,查询表示为q=f_{a}left(x^{q}right) ,其中f_q 是编码器网络,x^q 是查询样本(同样,left.k=f_{mathrm{k}}left(x^{k}right)right) )。它们的实例化依赖于特定的pretext任务。输入x^{q}x^k 可以是图像,patch,或由一组补丁组成的上下文。网络f_qf_k 可以是相同的,部分共享的,或者不同的。

3.2、动量对比

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

字典作为队列:

我们方法的核心是将字典维护为一个数据样本队列。 这使我们可以重用前面的小批量的已编码密钥。 队列的引入将字典大小与迷你批处理大小解耦。 我们的字典大小可以比典型的迷你批处理大小大得多,并且可以灵活独立地设置为超参数。 词典中的样本逐步被替换。 当前的迷你批处理被放入字典中,队列中最老的迷你批处理被删除。 字典总是表示所有数据的抽样子集,而维护这个字典的额外计算是可管理的。 此外,删除最旧的迷你批处理可能是有益的,因为其编码的密钥是最过时的,因此与最新的密钥最不一致。

动量更新:

使用队列可以使字典变大,但也使通过反向传播更新关键编码器变得难以处理(梯度应该传播到队列中的所有样本)。一个简单的解决方案是从查询编码器fq复制关键编码器f_k ,忽略这个梯度。但是这种方法在实验中效果不佳。4.1).我们假设这种失败是由快速变化的编码器导致的,它降低了关键表示的一致性。我们提议更新势头以解决这一问题。

形式上,将f_k 的参数表示为theta_k ,将f_q 的参数表示为theta_q

,我们对θk的更新如下:

theta_{mathrm{k}} leftarrow m theta_{mathrm{k}} (1-m) theta_{mathrm{q}}

这里m in[0.1) 是动量系数。只有参数theta_{mathrm{q}} 通过反向传播更新。方程中的动量更新。(2)使theta_{mathrm{k}} 的演化比theta_q 更平滑。结果,尽管队列中的密钥由不同的编码器编码(在不同的小批量中),但这些编码器之间的差异可以变小。在实验中,相对较大的动量(例如,m = 0.999,我们的默认值)比较小的值(例如,m = 0.9)工作得更好,这表明缓慢发展的密钥编码器是利用队列的核心。

和以前机制的关系:

MoCo是使用对比损失的一般机制。我们将其与图2中两个现有的通用机制进行了比较。它们在字典大小和一致性上表现出不同的特性。反向传播的端到端更新是一种自然机制(图2a)。它使用当前小批量中的样本作为字典,因此密钥是一致编码的(由同一组编码器参数)。但是字典大小与小批量大小相关联,受到GPU内存大小的限制。它还受到大型小批量优化的挑战。最近的一些方法是基于由本地位置驱动的借口任务,其中字典大小可以通过多个位置变大。但是这些借口任务可能需要特殊的网络设计,例如拼接输入或定制感受野大小,这可能会使这些网络向下游任务的转移变得复杂。

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

3.3、pretext任务

对比学习可以驱动各种借口任务。 由于本文的重点不是设计一种新的借口任务,所以我们采用了一个简单的借口任务,主要是在[61]的实例识别任务之后,与最近的一些研究[63,2]相关。

在[61]之后,如果一个查询和一个关键字来自同一个图像,我们将它们视为正对,否则视为负样本对。继[63,2]之后,我们在随机数据扩增下对同一图像取两个随机“视图”,形成正对。查询和关键字分别由它们的编码器f_qf_k 编码。编码器可以是任何卷积神经网络。

算法1为这个借口任务提供了MoCo的伪代码。 对于当前的迷你批处理,我们对查询及其对应的键进行编码,它们形成了正样本对。 阴性样本来自队列。

技术细节:

我们采用一个ResNet作为编码器,它的最后一个全连接层(全局平均池化后)有一个固定维的输出(128-D)。该输出向量通过其L2范数进行归一化。这是查询或键的表示。方程中的温度τ。(1)设为0.07。数据增强设置如下:从随机调整大小的图像中截取224×224像素的裁剪,然后进行随机颜色抖动、随机水平翻转和随机灰度转换,所有这些都在PyTorch的torchvision包中提供。

Shuffling BN:

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

我们通过洗牌解决这个问题。我们使用多个图形处理器进行训练,并为每个图形处理器独立地对样本执行BN(如通常实践中所做的)。对于关键编码器f_k ,我们在分配给GPU之前,对当前小批量中的样本顺序进行洗牌(编码后再洗牌);查询编码器fq的小批量样本顺序不会改变。这确保了用于计算查询及其正关键字的批处理统计信息来自两个不同的子集。这有效地解决了作弊问题,并使培训受益于BN。我们在我们的方法及其端到端消融对应物中都使用了混洗BN(图2a)。它与内存库无关(图2b),内存库没有这个问题,因为正密钥来自过去不同的小批量。

0 人点赞