Momentum Contrast for Unsupervised Visual Representation Learning

Momentum Contrast for Unsupervised Visual Representation Learning

我们提出了动量对比(MoCo),用于无监督的视觉表征学习。从对比学习[29]的角度来看,我们用一个队列和一个移动平均编码器建立了一个动态字典。这使得我们能够即时建立一个大型的、一致的字典,从而促进了对比性无监督学习。MoCo在ImageNet分类的common linear protocol下提供了有竞争力的结果。更重要的是,MoCo学到的表征可以很好地转移到下游任务中。MoCo可以在PASCAL VOC、COCO和其他数据集上的7个检测/分割任务中超过它的有监督的训练前的对手,有时会超过它的很大幅度。这表明,在许多视觉任务中,无监督表征学习和有监督表征学习之间的差距已经在很大程度上缩小了。

1. Introduction

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

最近的一些研究[61, 46, 36, 66, 35, 56, 2]提出了与对比性损失[29]有关的方法,在无监督的视觉表征学习方面取得了很好的结果。尽管有不同的动机,这些方法可以被认为是建立动态字典。词典中的 “键”(tokens)是从数据(如图像或斑块)中采样的,并由一个编码器网络表示。无监督学习训练编码器进行字典查询:一个编码的 "查询 "应该与它匹配的键相似,而与其他键不相似。学习被表述为最小化对比性损失[29]。

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

在这里插入图片描述

图1. Momentum Contrast (MoCo)通过将编码的查询q与使用对比损失的编码键的字典相匹配来训练一个视觉表示编码器。字典中的键{k0, k1, k2, …}是由一组数据样本即时定义的。字典是作为一个队列建立的,当前的mini-batch被入队,最古老的mini-batch出队,与mini-batch的大小解耦。key是由一个slowly progressing encoder编码的,由查询编码器的动量更新驱动。这种方法能够为学习视觉表征提供一个大而一致的字典。

我们提出了Momentum Contrast(MoCo),作为一种建立大型一致的字典的方法,用于具有对比性损失的无监督学习(图1)。我们把字典作为数据样本的队列来维护:当前minibatch的编码表示被入队,而最旧的表示被出队。这个队列将字典的大小与mini-batch的大小解耦,允许它很大。此外,由于字典中的键来自前面的几个小batch,因此提出了一个slowly progressing key encoder,作为查询编码器的基于动量的移动平均值来实现,以保持一致性。

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

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

2. Related Work

无监督/自监督学习方法通常涉及两个方面:pretext tasks和损失函数。"pretext"一词意味着被解决的任务不是真正感兴趣的,而只是为了学习一个好的数据表示的真正目的而解决的。损失函数通常可以独立于pretext任务进行研究。MoCo专注于损失函数方面。接下来我们讨论这两个方面的相关研究。

Loss functions. 定义损失函数的常见方法是测量模型的预测和固定目标之间的差异,例如通过L1或L2损失重建输入像素(如自动编码器),或通过交叉熵或margin-based losses将输入分为预先定义的类别(如八个位置[13],颜色分栏[64])。其他替代方案,如接下来描述的,也是可能的。

对比性损失[29]测量样本对在一个表示空间中的相似性。在对比性损失公式中,不是将一个输入与一个固定的目标相匹配,而是将 输入与一个固定的目标相匹配,而在对比性损失公式中 目标可以在训练过程中实时变化,并且可以定义为 可以用网络计算的数据表示法来定义。 [29]. 对比性学习是最近几个无监督学习的核心 的核心[61, 46, 36, 66, 35, 56, 2]。我们将在后面的内容中详细介绍(第3.1节)。

对抗性损失[24]衡量概率分布之间的差异。它是一种广泛成功的无监督数据生成技术。代表性学习的对抗性方法在[15, 16]中进行了探讨。生成式对抗网络和噪声对比估计(NCE)[28]之间存在着关系(见[24])。

Pretext tasks. 已经提出了一系列广泛的Pretext任务。例子包括在某些破坏下恢复输入,例如去噪自动编码器[58],上下文自动编码器[48],或跨通道自动编码器(着色)[64, 65]。一些借口任务通过以下方式形成伪标签,例如,单个(“典范”)图像的变换[17],patch排序[13, 45],跟踪[59]或在视频中分割物体[47],或聚类特征[3, 4]。

Contrastive learning vs. pretext tasks. 各种Pretext 任务都可以基于某种形式的对比性损失函数。instance discrimination method [61]与exemplar-based task[17]和NCE[28]有关。对比性预测编码(CPC)[46]中的Pretext 任务是上下文自动编码的一种形式[48],而在对比性多视图编码(CMC)[56]中,它与着色有关[64]。

3. Method

3.1. Contrastive Learning as Dictionary Look-up

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

考虑一个encoded query q和一组encoded samples{k0, k1, k2, …},它们是一个字典的键。假设字典中存在一个与q相匹配的键(表示为k+)。对比损失[29]是一个函数,当q与它的正键k+相似而与所有其他键(被认为是q的负键)不相似时,其值为低。通过点积来衡量相似性,本文考虑了一种对比性损失函数的形式,称为InfoNCE[46]。

在这里插入图片描述

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

对比损失作为一个无监督的目标函数,用于训练represent the queries and keys的编码器网络[29]。一般来说,query的表示方法是 q = f q ( x q ) q = f_q(x^q) q=fq(xq),其中 f q f_q fq是一个编码器网络, x q x_q xq是一个查询样本(同样, k = f k ( x k ) k = f_k(x^k) k=fk(xk))。它们的实例化取决于具体的Pretext任务。输入 x q x_q xq x k x_k xk可以是图像[29, 61, 63]、patches[46],或由一组patches组成的context[46]。网络fq和fk可以是相同的[29, 59, 63],部分共享[46, 36, 2],或不同的[56]。

3.2. Momentum Contrast

从上述角度来看,对比学习是一种在高维连续输入(如图像)上建立离散字典的方法。词典是动态的,即key是随机抽样的,而且key编码器在训练过程中会发生变化。我们的假设是,好的特征可以通过涵盖丰富的负面样本集的大型字典来学习,同时,尽管字典中的键的编码器在演变中也尽可能保持一致。基于这一动机,我们提出了接下来描述的Momentum Contrast。

Dictionary as a queue. 我们方法的核心是将字典作为数据样本的队列来维护。This allows us to reuse the encoded keys from the immediate preceding mini-batches.。队列的引入使字典的大小与mini-batch的大小脱钩。我们的字典大小可以比典型的mini-batch大小大得多,并且可以灵活地独立设置为一个超参数。

词典中的样本被逐步替换。当前的mini-batch被排到字典中,而队列中最老的mini-batch被删除。字典总是代表所有数据的一个采样子集,而维护这个字典的额外计算是可控的。此外,删除最古老的mini-batch处理可能是有益的,因为它的编码键是最过时的,因此与最新的键最不一致。

Momentum update.

使用队列可以使字典变大,但它也使得通过反向传播来更新key encoder变得难以实现(梯度应该传播到队列中的所有样本)。一个天真的解决方案是,从query encoder fq中复制key encoder fk,忽略这个梯度。但是这个解决方案在实验中产生了很差的结果(第4.1节)。我们假设,这种失败是由快速变化的编码器造成的,它降低了key表示的一致性。我们提出一个动量更新来解决这个问题

形式上,将 f k f_k fk的参数表示为 θ k θ_k θk f q f_q fq的参数表示为 θ q θ_q θq,我们通过以下方式更新 θ k θ_k θk

在这里插入图片描述

这里m∈[0,1]是一个动量系数。只有参数θq是通过反向传播更新的。公式(2)中的动量更新使θk比θq更平稳地发展。因此,尽管队列中的key是由不同的编码器(在不同的小批中)编码的,但这些编码器之间的差异可以变得很小。在实验中,一个相对较大的动量(如m=0.999,我们的默认值)比一个较小的值(如m=0.9)效果好得多,这表明一个缓慢演化的key encoder是利用队列的核心。

Relations to previous mechanisms.

MoCo是一个使用对比性损失的一般机制。我们将其与图2中的两个现有的一般机制进行比较。它们在dictionary size和一致性方面表现出不同的特性。

在这里插入图片描述

图2. 三种对比性损失机制的概念性比较(经验性比较见图3和表3)。这里我们说明了one pair of query and key。这三种机制在维护key的方式和更新key编码器的方式上有所不同。(a): 用于计算query and key representations 的编码器通过反向传播进行端到端的更新(两个编码器可以不同)。(b): key representations从存储库中取样[61]。©: MoCo通过动量更新编码器对新的key进行即时编码,并保持一个key 队列(该图中没有说明)。

通过反向传播的端到端更新是一种自然的机制(例如,[29, 46, 36, 63, 2, 35],图2a)。它使用当前mini-batch中的样本作为字典,因此keys 的编码是一致的(通过同一组编码器参数)。但是,字典的大小是与mini-batch的大小相联系的,受限于GPU的内存大小。它也受到 large mini-batch 优化的挑战[25]。

最近的一些方法[46, 36, 2]是基于由局部位置驱动的借口任务,其中字典的大小可以由多个位置变大。但是这些借口任务可能需要特殊的网络设计,如修补输入[46]或定制接受场大小[2],这可能会使这些网络转移到下游任务中变得复杂。

另一种机制是由[61]提出的记忆库方法(图2b)。记忆库由数据集中所有样本的表示组成。每个mini-batch的字典都是从记忆库中随机抽取的,没有反向传播,所以它可以支持大的字典大小。然而,记忆库中样本的表示是在它最后一次被看到时更新的,所以采样的键基本上是关于过去epoch中多个不同步骤的编码器的,因此不太一致。

在[61]中,记忆库上采用了动量更新。它的动量更新是在同一样本的表示上,而不是在编码器上。这种动量更新与我们的方法无关,因为MoCo并不跟踪每个样本。此外,我们的方法更具有内存效率,可以在十亿规模的数据上进行训练,这对内存库来说是难以解决的。

3.3. Pretext Task

对比学习可以驱动各种Pretext 任务。由于本文的重点不是设计一个新的Pretext 任务,我们使用一个简单的任务,主要是沿用[61]中的实例判别任务,最近的一些工作[63,2]与此有关。

继[61]之后,我们认为如果a query and a key源自同一图像,则为正数对,否则为负数对。继[63,2]之后,我们在随机数据增强的情况下取同一图像的两个随机 "视图 "来形成一个正样本对。query和key分别由其编码器fq和fk编码。编码器可以是任何卷积神经网络[39]。

算法1提供了MoCo在这个Pretext任务中的伪代码。对于当前的mini-batch,我们对query和其相应的key进行编码,这就形成了正样本对。负样本来自队列。

在这里插入图片描述

Technical details.

我们采用ResNet[33]作为编码器,其最后一个全连接层(全局平均池化后)有一个固定维度的输出(128-D[61])。这个输出向量被其L2-norm[61]规范化。这就是query or key的表示。公式(1)中的温度τ被设定为0.07[61]。数据增强设置遵循[61]:从随机调整的图像中提取224×224像素的裁剪,然后进行随机颜色抖动、随机水平翻转和随机灰度转换,这些都可以在PyTorch的torchvision包中找到。

Shuffling BN. 我们的编码器fq和fk都有Batch Normalization(BN)[37],就像标准ResNet[33]一样。在实验中,我们发现使用BN会阻止模型学习好的表征,这与[35](避免使用BN)的报告相似。该模型似乎 "欺骗 "了pretext 任务,并很容易找到一个低损失的解决方案。这可能是因为intra-batch communication(由BN引起)泄露了信息。

我们通过shuffling BN来解决这个问题。我们用多个GPU进行训练,并对每个GPU的样本进行独立的BN(如通常的做法)。对于key encoder fk,我们在将其分配给GPU之前,对当前mini-batch的样本顺序进行洗牌(并在编码后洗牌);query 编码器fq的mini-batch的样本顺序不被改变。这确保了用于计算query 的批量统计和其正key 来自两个不同的子集。这有效地解决了作弊问题,并允许训练从BN中受益。

我们在我们的方法和它的端到端消融对应物中都使用了shuffled BN(图2a)。这与记忆库的对应方法(图2b)无关,后者不存在这个问题,因为 positive keys来自过去不同的mini-batches。

在我们的方法和它的端到端消融对应物中都使用了shuffled BN(图2a)。这与记忆库的对应方法(图2b)无关,后者不存在这个问题,因为 positive keys来自过去不同的mini-batches。

猜你喜欢

转载自blog.csdn.net/weixin_37958272/article/details/119146821