Momentum Contrast for Unsupervised Visual Representation Learning

论文名称:[Momentum Contrast for Unsupervised Visual Representation Learning](CVPR 2020 Open Access Repository (thecvf.com))

作者:Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie, Ross Girshick

时间:2020

期刊:CVPR

解读:MoCo 论文逐段精读【论文精读】_哔哩哔哩_bilibili

原文摘要

We present Momentum Contrast (MoCo) for unsupervised visual representation learning. From a perspective on contrastive learning as dictionary look-up, we build a dynamic dictionary with a queue and a moving-averaged encoder. This enables building a large and consistent dictionary on-the-fly that facilitates contrastive unsupervised learning. MoCo provides competitive results under the common linear protocol on ImageNet classification. More importantly, the representations learned by MoCo transfer well to downstream tasks. MoCo can outperform its supervised pre-training counterpart in 7 detection/segmentation tasks on PASCAL VOC, COCO, and other datasets, sometimes surpassing it by large margins. This suggests that the gap between unsupervised and supervised representation learning has been largely closed in many vision tasks.

前置知识

对比学习就是学习一组对象中,哪一部分是相似的,与另一部分完全不一致。比如说我们有3张照片,2张是人,1张是狗。对比学习的目的就是要知道2张人之间,知道彼此是相似的,人与狗之间,知道彼此是不相似的。

代理学习是定义正负样本的方法,比如我们一张图片进行了两个不同的增强操作,那么这两个不同的结果就是图像的正样本,其他都是负样本。比如ImageNet数据集中有1000个类,拿到代理学习中就是一张图像一个类,这样ImageNet就不是单单只有1000个类这么简单了。

动量(Momentum),动量是用来控制图像变化的一个方法,其可以用公式表示为Yt=mYt1+(1m)XtY_t = m \cdot Y_{t-1} + (1-m) \cdot X_t,。在这个公式中m就是动量,Yt1Y_{t-1}是上一个时刻的计算结果,YtY_t是当前时刻的计算结果,XtX_t是当前时刻的输出,从公式上看,m就是控制图像变换是否依赖上一时刻或下一时刻的一个超参数。

介绍

无监督学习在NLP领域有了很大的提高,但是在CV领域的作用还没有这么显著。这是因为,两个内容数据的信号空间不同,句子的意思在很大程度上取决于对应的单词以及词根和词缀,而视觉任务中的数据集一张图像和其对应的语义信息并没有太大的关联。通俗的说就是NLP数据集能够更快和更方便的获得对应的语义信息,而视觉任务就相对困难。

在NLP和视觉任务的无监督学习中,大部分的方法都已经取得了不错的成果,他们都有一个共同的特征,就是要建立一个动态字典(dynamic dictionaries)

在这个动态字典中,会将不同图像经过一个编码器生成对应的特征存储在动态字典中,然后当有新的输入进来时,会使用另一个不同的编码器对其进行编码,然后编码出来的特征被当成一个查询向量(query),而动态字典中存储的内容,则被看成是key,query的结果,要尽可能与key中的某一个相近,然后与其他尽可能地原理。

本文主要是从代理任务和目标函数讲解自监督的学习过程。

在有监督学习的流程中,首先是需要输入一张图像,然后将这张图像输入到模型中获取一个输出,然后再将这个输出与GT做对比的一个过程。而无监督或自监督学习呢,就是没有这个GT,但是他会通过代理任务获取一个自监督信号,将这个信号充当GT,接着使用损失函数对比其差异即可完成自监督的过程。

方法

通过查字典的方式进行对比学习(Contrastive Learning as Dictionary Look-up)

对比学习及其变体都可以看做是一个训练一个编码器,从而去做一个字典查找的工作。

当我们有了一个查询向量q,以及对应的字典k0,k1,k2....k_0,k_1,k_2....,我们经过模型计算出的损失函数应该满足如下特点:

  1. 当q经过编码器与其唯一配对的k+k_+(正样本)相似时,损失值应该尽可能的小
  2. 当q经过编码器与k+k_+以外的key完全不相似时,损失值也应该尽可能的小

这里先引入交叉熵损失函数,在这个损失函数中,我有监督学习是需要有对应的标签,并转换成对应的one-hot矩阵后才能进行计算。但是无监督学习,距离实例分类的代理任务,其一张图片就是一个类,这样的做法将导致one-hot矩阵特别巨大,以至于softmax无法进行工作。因此提出了nceloss,这个loss值专门用于无监督学习的损失函数,他不讲类别进行区分,而是将多类别转化成一个二分类的问题,区分成数据样本和噪声样本,计算损失时,只需要将数据样本和噪声样本进行对比即可。但如果还是将整个数据集都当做负样本,虽然解决了类别多的问题但是计算复杂度还是没有下降。因此nceloss通常是会从这个数据集中采样一些负样本,来进行loss计算。

本质上来说NCELoss就将一个超级多分类问题转化成了一个二分类问题,从而使得softmax可以再次工作。

在本文中采用InfoNCELoss作为损失函数,用公式表示为

Lq=logexp(qk+/τ)i=0Kexp(qki/τ)\mathcal{L}_{q}=-\log \frac{\exp \left(q \cdot k_{+} / \tau\right)}{\sum_{i=0}^{K} \exp \left(q \cdot k_{i} / \tau\right)}

其中q是查询向量K是负样本的数量,kik_ik+k_+分别表示每一个字典的key和唯一相似的key,τ\tau是用来控制损失函数曲线平滑程度的一个超参数,使得训练更加有针对性。

动量对比(Momentum Contrast)

将字典做成队列(Dictionary as a queue):由于直接把字典放入显存中会造成显卡负担过大,因此在本文汇总直接使用队列的方式作为字典对key进行一个存储,在队列的字典中每次都会传入最新mini-batch的key,并且淘汰掉最老的mini-batch的key。

动量更新(momentum update),假设key的编码器函数fkf_k的参数用θk\theta_k表示,查询q的编码器fqf_q的参数用θk\theta_k表示,那么θk\theta_k的更新方式就表示为

θkmθk+(1m)θq\theta_{\mathrm{k}} \leftarrow m \theta_{\mathrm{k}}+(1-m) \theta_{\mathrm{q}}

在这个式子中,m表示动量,是可以手动设置的超参数,作者使用的是m=0.999m=0.999这个值远比0.9有效得多(实验证明)。从公式中可以看出,θk\theta_k的每次更新很大程度上取决于上一次编码器的参数,很少的程度取决于θq\theta_q,这就保证了创建的动态字典的一致性。