论文标题: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时,它们编码的是同一张图片的不同视图(比如不同的裁剪)。
二、方法
- 对比学习与词典查找
对比学习以及近来相关的进展,可以看做训练一个用于词典查找的encoder的任务。考虑一个被编码的query 以及一个被编码的词典中key的样本集合。假设词典中只有一个key(记作)能够匹配。一个对比损失函数应该满足当与其positive key相似以及与其他key(看做negative key)不相似时函数值应该是小的。当使用点积作为相似度度量时,一种对比损失函数(叫做InfoNCE)的形式如下:
是一个温度超参数,上式分母是一个正样本和个负样本的相应值的加和。直观上来看,这个损失函数相当于一个softmax分类器,这个分类器试图将分类为。本文中方法采用InfoNCE作为损失函数。
对比损失作为一种无监督目标函数来训练encoder以表示query和key。通常,query的表示,是一个encoder网络,是一个query样本,类似的,。这里的和可以是图像,图像块或者由多个图像块组成的上下文。和可以是同一个,部分共享或者不同的神经网络。
- 动量对比
对比学习的目的是学习一个词典,这个词典是动态的,也就是说其中的key是经过随机采样获得的,并且key encoder在训练过程中不断地演化。基于这种动机,本文提出了动量对比(Momentum Contrast)的方法。
- 词典作为队列
本文方法的核心在于将词典管理成一个数据样本的队列。这样可以解除词典大小与mini-batch大小的绑定,词典大小可以比mini-batch大小更大,并且可以通过超参数来控制。词典中的样本是在训练过程中被逐渐地替代,当前mini-batch入队,最早入队的mini-batch出队。词典总是所有数据的一个采样子集。删除最早入队的mini-batch可能是有益的,这是因为encoder随着训练在不断的更新,这个mini-batch里的key是最过时的,因此也是最不一致的。
- 动量更新
使用队列作为词典造成的问题是通过反向传播更新encoder是不可行的,这是因为梯度通过队列中的所有样本进行传播。一个简单的解决方案是直接从复制得到,这种方法在实验中证明结果不好,原因可能是因为key encoder参数的急剧变化伤害了表示的一致性。因此本文提出动量更新的方法来解决这个问题。
具体的,将和的参数记作和,然后更新如下:
这里。只有通过反向传播进行更新。上式这样的参数更新方式使得比演化地更平滑,这样就可以使得虽然队列中的key被不同的encoder编码(不同的mini-batch),但是这些encoder之间的不同是很小的。 实验证明取一个比较大的效果较好,比如0.999,效果比相对小的0.99要好很多,这表明一个缓慢演化的key encoder对于采用队列的方法很关键。
- 与相关其他机制的对比
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,而负样本来自队列。
- 一些细节
我们使用ResNet作为encoder,它的最后的全连接层(全局平均池化之后)有一个固定维度的输出(128-D),这个输出向量进行L2标准化,这相当于query或者key的表示。温度超参数被设置为0.07。
- Shuffling BN
本文的和都包含Batch Normalization(BN) 。然而在实验中我们发现BN妨碍了学习好的表示。模型能够骗过预训练任务而轻易达到低损失。这可能是因为样本之间的batch内通信(BN引起的)泄露了信息。
我们采用Shuffling BN来解决这个问题。我们采用多GPU来训练,并且在每个GPU的样本上独立地执行BN。对于key encoder,首先打乱当前mini-batch内样本的顺序,然后再分配给各个GPU,编码以后再还原顺序。当前mini-batch内query的顺序未改变。
三、实验
实验在ImageNet-1M和Instagram-1B两个数据集上进行预训练,具体数据集统计参看原文。
- 消融实验:对比损失机制
- 消融实验:动量
- 与先前方法的对比
- 特征迁移实验
网友评论