MoCo

Momentum Contrast for Unsupervised Visual Representation Learning[1]

作者是来自FAIR的Kaiming He等人。论文引用[1]:He, Kaiming et al. “Momentum Contrast for Unsupervised Visual Representation Learning.” 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2019): 9726-9735.

Time

  • 2020.Mar

Key Word

  • Self-Supervised learning
  • 一句话总结:就是用momentum update,来动态更新key encoder。

总结

  1. 作者提出了Momentum Contrast(MoCO),用于无监督的视觉表征学习。从对比学习作为一种字典查找(dictionary lookup)的视角出发,作者构建了一个具有队列和moving-averaged encoder,这能够即时构建一个大的dictionary, 促进了对比无监督学习。
  1. NLP中的无监督学习取得了成功,但是在CV中, 监督与训练还是主流,无监督方法还是落后了,主要的原因是它们的respective signal spaces, 语言tasks是离散的signal spaces, words, sub-word units, 用于构建tokenized dictionaries, 从而作为无监督学习的基础。但是在CV中,还需要关注字典的构建,因为raw signal 是在一个连续的、高维的空间,不具备人类通信的结构,不像words

    一些最近的研究,用和contrastive loss相关的方法,在无监督视觉表征上取得了很好的效果。尽管是有多个motivations,这些方法可以被认为是 构建dynamic dictionaries。dictionaries中的key(tokens) 是从data(images/patches)中采样得到的,由一个encoder network来表征。无监督训练encoders来进行dictionary lookup: 一个encoded query应该和它匹配的key相似,和其它的不相似, Learning被建模为最小化contrastive loss

    从这个角度,作者假设构建如下的dictionary是有益的:

    • large
    • 在训练过程中保持一致性,直觉上,更大的dictionary可能更好地采样潜在的、连续的高维视觉空间,dictionary 中的keys应该被相同或者相似的encoder进行represent,以确保它们与query之间的比较具有一致性。然而,现有的方法用contrastive losses在这两个方面中存在局限性。

    作者提出了MoCo,作为一种构建large 和consistent dictionaries的方式,用一个constrative loss 用于无监督学习。作者将dictionary作为一个data samples的queue:当前mini-batch编码的representations入列,oldest出列。队列将来自mini-batch size的dictionary 进行解耦,使其可以变大。此外,由于字典键来源于前几个mini-batch,本文提出了一种通过基于动量的移动平均机制实现的缓慢演化的key encoder,以保持一致性。

    MoCo 是一个用于contrastive learning的,构建dynamic dictionary的机制,可以用于多个下游任务。作者follow一个简单的instance discrimination task:如果一个query和key是相同image的encoded views,则它们是匹配的。用这个代理任务,MoCo在ImageNet 数据集上,在线性分类的common protocol下,展示出了有竞争力的results。

    无监督学习的一个主要目的是预训练representations(features),能够通过fine-tuning迁移到下游任务。作者展示了和detection相关的7个下游任务。MoCo无监督预训练能够超过对应的ImageNet监督训练。实验结果表明: MoCo在很多CV任务上缩小了监督和无监督表征学习的gap,在一些applications中,可以作为ImageNet监督预训练的alternative。

  2. 无监督/自监督学习方法主要涉及两个方面: pretext tasks和loss functions。pretext是指,所解决的任务并非真正感兴趣所在,而真正的目的是学习一个good data representation, loss functions可以独立于pretext tasks进行研究。MoCo关注于loss function aspect

    • Loss functions: 定义一个loss function的通常的方式是测量model的prediction和一个fixed target之间的difference,例如通过L1/L2 losses重建input pixels,或者将input通过cross-entropy 或者margin-based losses分类为预定义的类别。contrastive losses测量sample pairs在representation space中的相似度。而不是将一个input和fixed target进行匹配。与将输入匹配到固定目标不同,在对比损失框架中,target在训练过程中动态变化,并且可以根据网络计算的data representation来进行定义。对比学习是最近一些无监督学习工作的核心。

    adversarial losses测量probability distribution之间的difference。它是一个成功的technique,用于无监督data generation。generative adversarial networks和noise-contrastive estimation(NCE)之间有联系。

    • Pretext tasks: 有很多的pretext tasks被提出来了。包括在一些corruption条件下回复input, denoising auto-encoders, context autoencoders, or cross-channel auto-encoders。一些ppretext tasks形成了通过将single image进行transformation,patch orderings, tracking or segmenting objects in videos,形成pseudo-labels。

    • Contrastive learing vs. pretext tasks: 一些pretext tasks可以基于一些形式的contrastive loss functions。instance discrimination 方法和exemplar-based task和NCE相关。在contrastive predictive coding(CPC)中的pretext task是一种形式的context auto-encoding,在contrastive multiview coding中,他和colorization有关。

  3. Contrastive learning as Dictionary Look-up: 对比学习和最近的developments,可以被认为是训练一个encoder,用于dictionary look-up task。考虑encoded query \(q\)和一些encoded samples \({k_0, k_1, k_2,...}\),它们是dictionary的keys。假设这里有一个single key \(k_+\) in the dictionary 和 \(q\) 匹配,一个contrastive loss是一个function,当q和它的positive key \(k_+\) 类似,和其它的keys不类似的时候,它的value是low。similarity 是通过dot product计算得到的,是一个形式的contrastive loss function,称之为InfoNCE,如下:

    \[ \mathcal{L}_q = -\log \frac{\exp(q \cdot k_+ / \tau)}{\sum_{i=0}^K \exp(q \cdot k_i / \tau)} \]

    \(\tau\) 是 temperature 超参数,这个求和操作是针对one positive 和K个negative samples。直观地,这种损失是一个基于softmax的(K+1)类分类器的对数损失,该分类器试图将查询样本 q 分类为正样本 \(k_+\),对比损失也有基于其它形式的函数,例如margin-based losses和NCE losses的变体。

    这个contrastive loss作为一个无监督的objective function,用于训练represent queries和keys的encoder networks。通常,query representation是 \(q = f_q(x^q)\)\(f_q\) 是要给encoder network,\(x^q\) 是一个query sample。它们的初始化依赖于specific pretext task。输入 \(x^q\)\(x^k\) 可以是images, patches或者一组patches组成的context。这个网络 \(f_q\)\(f_k\) 相同的网络,部分shared,或者不同。

  4. Momentum Contrast: 从以上的观点,对比学习是一个在高维连续输入例如images上构建离散的dictionary的方式,字典是动态的,因为键是随机采样的,且键编码器在训练过程中不断演变。作者的假设是:good features可以被一个覆盖丰富负样本呢的large dictionary所学习,同时encoder for dictionary keys在evolution的时候尽可能保持一致。基于这个动机,作者提出了Momentum Contrast. Dictionary as a queue:方法的核心是: **将dictionary维持为一个data samples的队列,这使得重新使用preceding mini-batches的encoded keys,queue的引入将dictionary size和mini-batch size进行解耦。作者的dictionary size可以比一些典型的mini-batch size更大,可以灵活和独立地设为一个超参数。

    这个dictionary中的samples是逐步被replaced,当前的mini-batch会被加入dicitonary queue,oldest的mini-batch in the queue会被removed。dictionary总是代表所有data的采样的subset,同时保持这个dictionary的额外的计算是manageable的。另外,去掉oldest mini-batch是有益的,因为它的encoded keys是过时的,和最新的最不一致。

    • Momentum update: 用一个queue能够使dictionary large,但是也使其很难通过反向传播更新key encoder。一个naive 的解决方式是将key encoder从query encoder copy过来,忽略它的gradient。但是这个方法在实验中产生了poor results。作者假设:这个失败是由于rapidly 改变encoder,降低了key representations consistency造成的,作者提出的momentum update来解决这个问题。

    Formally, 将\(f_k\) 表示为 \(\theta_k\)\(f_q\) 表示为 \(\theta_q\),通过如下更新 \(\theta_k\):

    这里 \(m \in [0,1)\) 是一个momentum coefficient,只有超参数 \(\theta_q\) 是通过反向传播更新的。公式中 momentum update使得 \(\theta_k\)\(\theta_q\) 更新地更smoothly。因此,虽然queue中的keys是通过不同的encoders进行encoded的,这些encoder之间的差距是很小的。实验中,像一个相对大的momentum 比一个更小的value效果好,表明:一个缓慢evolving 的key encoder 是利用queue的核心。

    • 和之前机制的关系: MoCo是一个用contrastive losses的通用的机制,将它和现有的两种存在的机制进行对比,在dictionary size和一致性上展示出了不同的特点。 通过反向传播的端到端的更新是natural mechanism,它用当前mini-batch中的samples作为dictionary,因此keys的编码是一致的,大那是dictionary size适合mini-batch size解耦的,受限于GPU memory size,它也被large mini-batch optimization所挑战。一些近期的方法,基于pretext tasks,是由local positions驱动的,dictionary size可以被多个positions弄的很大。但是,这些pretext tasks可能要求特殊的网络涉及,例如patchifying the input,或者定制化receptive field size,可能会使网络迁移到下游任务变得复杂。

    • 另一个机制是memory bank,memory bank包含数据集中所有samples的representations,这个dictionary for each mini-batch随机从memory bank中采样,没有反向传播,因此它能支持一个large dictionary size。然而,一个memory bank中的sample的representation当它最后被seen的时候被更新,因此,sampled keys本质上反映了过去一个训练周期(epoch)中多个不同训练步骤下的编码器状态,导致表示的一致性降低。也有在memory bank中采用momentum update,它的momentum update作用于同一样本的表示 (而非编码器本身)。这种动量更新与我们的方法无关,因为MoCo并不追踪每个样本的表示。此外,我们的方法内存效率更高,能够处理十亿级规模的数据训练,而这对传统记忆库(memory bank)而言可能是不可行的。

  5. Pretext task:contrastive learning能够推出多种pretext tasks,本文的焦点不是设计一个新的pretext task,作者用一个简单的,主要following instance discrimination task,跟踪前人的工作,作者考虑一个query和key,作为一个positive pair,如果它们来自于同一个image,其它的视为negative sample pair。作者将**相同image的两个random views构成一个positive pair,queries和keys分别被它们的encoders进行编码,encoder可以是任何CNN。

    对于当前的mini-batch,作者encoder queries和它们对应的keys,构成了positive sample pairs,negative samples来自于queue。

    作者采用ResNet作为encoder,最后一个全连接层有固定的维度输出,这个输出的vector通过L2-norm进行归一化。这是query或者key的representation, ​

\(Fig.1^{[1]}\) 三种contrastive loss机制的对比。这里作者解释了query和key的pair,这三种机制不同的地方在于keys是如何maintained以及key encoder是如何update的。