论文标题:Momentum Contrast for Unsupervised Visual Representation Learning
论文链接:https://arxiv.org/abs/1911.05722
论文来源:CVPR 2020
一、概述
在自然语言处理中无监督表示学习已经获得了巨大的成功(比如GPT、BERT等模型的应用),但是在计算机视觉领域仍然是以有监督的预训练为主流的方式,而无监督的方法相对落后。原因可能是因为语言和图像有不同的信号空间,语言的信号空间是离散的(由词或者子词单元组成),可以构建词元化的词典(dictionary),从而进行无监督学习;而计算机视觉领域的原始信号处在一个高维连续的空间中,并且不像词那样是结构化的,这为词典的构建造成了困难。
近来的一些研究利用对比损失在无监督学习方面进行了一些有希望的研究,这些方法可以被看做是一个建立动态词典(dynamic dictionary)的过程。词典中的key(相当于token)从数据(图像或图像块)中采样然后用encoder神经网络进行编码。无监督学习训练encoder进行词典的查找(dictionary look-up):一个被编码的query应该与它的匹配key相似而与其他的不相似,学习的过程是一个最小化对比损失的过程。
我们的目标是建立这样的词典:
①足够大;
②在训练过程中词典不断演化,要保持词典的一致性(consistent)。
对于第①点,一个足够大的词典能够更好地采样底层数据所处的连续高维的空间。而对于第②点,词典中的key应该尽可能地由同样的或者相似的encoder来编码表示,以此来保证其与query的比较时的一致性,具体来说就是在训练的过程中通常是用一个个mini-batch的数据来更新encoder,更新后encoder的参数变化,那么不同的mini-batch的数据就是使用的不同的encoder进行编码,需要保证这些不同的encoder编码的一致性。目前现有的使用对比损失的方法在这两个方面往往受到限制。
本文提出的MoCo就是一种构建大且一致的词典的方法。MoCo具有以下两个特色,分别对应上述两点要求:
①MoCo将一些数据样本的队列(queue)作为词典,当前mini-batch的样本被编码后的表示入队,而最早入队的mini-batch出队,这个队列就解除了词典大小与mini-batch大小的绑定,而使得词典能够是足够大的(可以是多个mini-batch的大小);
②词典中的key来自先前多个mini-batch,也就是来自一个逐渐演化的key encoder,这个key encoder以一种基于动量(momentum)的方式来平均query encoder(query encoder与key encoder是两个不同的encoder)的参数而不断演化,MoCo以这种方式来保证一致性。
MoCo能够使用多种预训练任务来进行训练,在本文中我们采用一种简单的实例识别任务,具体来说,当一个query匹配一个key时,它们编码的是同一张图片的不同视图(比如不同的裁剪)。
二、方法
- 对比学习与词典查找
- 动量对比
对比学习的目的是学习一个词典,这个词典是动态的,也就是说其中的key是经过随机采样获得的,并且key encoder在训练过程中不断地演化。基于这种动机,本文提出了动量对比(Momentum Contrast)的方法。
- 词典作为队列
本文方法的核心在于将词典管理成一个数据样本的队列。这样可以解除词典大小与mini-batch大小的绑定,词典大小可以比mini-batch大小更大,并且可以通过超参数来控制。词典中的样本是在训练过程中被逐渐地替代,当前mini-batch入队,最早入队的mini-batch出队。词典总是所有数据的一个采样子集。删除最早入队的mini-batch可能是有益的,这是因为encoder随着训练在不断的更新,这个mini-batch里的key是最过时的,因此也是最不一致的。
- 动量更新
- 与相关其他机制的对比
end-to-end的方式是一种比较常用的机制,它使用当前mini-batch的样本作为词典,所以词典中的key被一致地编码。不过这种方法的缺点是词典的大小与mini-batch的大小绑定,受到GPU显存限制,而且也受到较大的mini-batch更新的挑战。
另一种机制是memory bank的方法。一个memory bank包含数据集中所有样本的表示,每个mini-batch的词典从memory bank中采样而不需要反向传播,所以这支持一个大的词典大小。然而,memory bank中一个样本的表示在它最后一次被看到时更新,所以本质上被采样的key来自过去epoch中不同step的不同的encoder,因此非常地不一致。
下图对比了包括本文动量更新在内的三种方法:
对比
- 预训练任务
对比学习可以采样多种预训练任务,但是本文关注的重点不在于设计一个新的预训练任务,本文仅采用前面提到的简单的实例识别任务。
如果一个query和一个key来自同一张图片,那么它们是positive pair,否则就是negative pair。我们采用相同图片的两种随机的view来做数据增强以建立positive pair。Query和key通过和编码,这些encoder可以是任意的卷积神经网络。
下列算法展示了MoCo的伪代码:
MoCo
对于当前的mini-batch,我们编码它们的query和key,而负样本来自队列。
- 一些细节
三、实验
实验在ImageNet-1M和Instagram-1B两个数据集上进行预训练,具体数据集统计参看原文。
- 消融实验:对比损失机制
消融实验:对比损失机制
- 消融实验:动量
消融实验:动量
- 与先前方法的对比
与先前方法的对比
目标检测
三种机制对比
- 特征迁移实验
目标检测
COCO
对比监督方法