guodong's blog

master@zhejiang university
   

论文阅读:Momentum Contrast for Unsupervised Visual Representation Learning

文章地址:https://arxiv.xilesou.top/abs/1911.05722

作者提出动量对比度(MoCo),用于无监督视觉表示学习。从作为字典查找的对比学习的角度来看,作者构建了一个具有队列和移动平均编码器的动态字典。这样就可以实时构建大型且一致的词典,从而促进对比性无监督学习。 MoCo在ImageNet分类的通用线性协议下提供了有竞争力的结果。更重要的是,MoCo学习到的表示形式可以很好地转移到下游任务。在PASCAL VOC,COCO和其他数据集上的7个检测/细分任务中,MoCo可以胜过其监督的预训练模型,有时甚至可以大幅度超过它。这表明在许多视觉任务中,无监督和有监督的表征学习之间的鸿沟已被大大缩小。

作者提出了Momentum Contrast (MoCo),作为一种构建大型且一致的字典,用于使用对比损失的无监督学习。作者将字典作为数据样本的队列进行维护:将当前迷你批处理的编码表示放入队列,而将最早的小批放出队列。队列使字典大小与迷你批处理大小分离,从而使其更大。此外,由于字典键来自前面的几个小批处理,因此提出了一种缓慢进行的键编码器,该键编码器被实现为查询编码器的基于动量的移动平均值,以保持一致性。

MoCo是一种用于建立用于对比学习的动态词典的机制,可用于各种pretext任务,但都遵循一个简单的实例判别任务:如果查询是同一张图片的编码视图(例如不同的crop),则查询会匹配关键字。使用此pretext任务,MoCo在ImageNet数据集中的线性分类的通用协议下显示出有竞争性的成果。

无监督学习的主要目的是预训练可通过微调转移到下游任务的表示形式(即特征)。在7个与检测或分割有关的下游任务中,MoCo无监督的预训练可以超过其ImageNet受监督的,在某些情况下,可以节省很少的利润。在这些实验中,作者们探索了在ImageNet或10亿个Instagram图像集上经过预训练的MoCo,这表明MoCo可以在更真实的世界,数十亿图像的规模和相对未知的情况下很好地工作。这些结果表明,MoCo在很大程度上弥补了许多计算机视觉任务中无监督和有监督的表示学习之间的差距,并且可以在某些应用中替代ImageNet有监督的预训练。

注:Pretext Task: Pretext tasks are pre-designed tasks for networks to solve, and visual features are learned by learning objective functions of pretext tasks.(前置任务)
Downstream Task: Downstream tasks are computer vision applications that are used to evaluate the quality of features learned by self-supervised learning. These applications can greatly benefit from the pretrained models when training data are scarce.(下游任务)

如图所示,动量对比度(MoCo)通过使用对比损失将编码查询q与编码键字典匹配来训练视觉表示编码器。字典键{k0,k1,k2,…}由一组数据样本即时定义。该词典被构建为一个队列,其中当前的迷你批处理入队,而最先的迷你批处理出队。字典大小与迷你批处理大小分离。键由缓慢进行的编码器编码,并由查询编码器的动量更新驱动。此方法启用了一个大而一致的字典,用于学习视觉表示。

对比学习以及它的变种都可以认为是训练编码器以执行字典查找任务,进一步解释就是,考虑一个编码查询q和一组编码样本{k0,k1,k2,…},它们是字典的关键字。假设在与q匹配的字典中只有一个键(表示为k +)。对比损失是一个函数,当q与其正键k +相似且与所有其他键(q的负键)不同时,其值较低。用InfoNCE表示:

τ 是超参数。在一个正样本和K个负样本上取和,随后求对数,就是着K+1路的基于softmax的趋向于分类为K+的分类器。也有其他变体。对比损失充当无监督目标函数,即训练编码器网络,用于表达查询和建。

从以上角度来看,对比学习是一种在高维连续输入(例如图像)上构建离散词典的方法。字典是动态的,从某种意义上说,键是随机采样的,并且键编码器会在训练过程中进化。作者的假设是,可以通过包含大量负样本的大型字典来学习良好的特征,而尽管字典键不断演进,但字典键的编码器仍应保持尽可能一致

Dictionary as a queue:方法的核心是将字典作为数据样本队列进行维护。这可以重用前一个小批处理中的已编码的键。队列的引入使字典大小与小批量大小分离。本方法的字典大小可能比典型的迷你批处理大小大得多,并且可以灵活且独立地设置为超参数。

字典中的样本将逐步替换。当前的迷你批处理将入队词典,并且队列中最先的迷你批处理将被出队。字典总是代表所有数据的采样子集,而维护此字典的额外计算是可管理的。此外,删除最先的迷你批处理可能是有益的,因为它的编码key是最过时的,与最新键的一致性最小。

Momentum update:使用队列可以使字典变大,但是通过反向传播来更新key编码器也很棘手(梯度应该对队列中的所有样本均有效)。朴素的解决方案是从查询编码器fq复制key编码器fk,忽略该梯度。但是该解决方案在实验中产生的结果很差。假设这种故障是因为编码器的快速变化导致编码器的一致性降低,于是提出了动量更新来解决此问题。

形式上,将fk的参数表示为θk,将fq的参数表示为θq,因此通过

来更新θk,m是个动量系数,范围是0-1,只有θq通过反向传播更新。这样的话θk的更新更加平滑。结果是,尽管队列中的key由不同的编码器(在不同的小批处理中)编码,但是这些编码器之间的差异很小。在实验中发现,m越大越好,默认0.999.

如上图所示,是三种对比学习的概念图。

a是端到端的机制,它使用当前的迷你批量的样本作为字典,所以它的键是一致编码的(通过同一个编码器参数)。但是字典大小和mini batch大小有关,容易收到GPU内存限制,同时,大批量优化也是一个挑战。最近的一些方法是基于本地位置驱动的前置任务,其中字典大小可以通过多个位置来增大。但是这些前置任务可能需要特殊的网络设计,例如修补输入或自定义接收域大小,这可能会使这些网络向下游任务的传输变得复杂。

b是存储库方法。存储库由数据集中所有样本的表示组成。每个小批量的字典都是从存储库中随机抽取的,没有反向传播,因此它可以支持较大的字典大小。然而,当最后一次看到一个样本时,它在内存库中的表示形式会更新(However, the representation of a sample in the memory bank was updated when it was last seen 没懂)因此,采样的key本质上是关于编码器在过去一个epoch的多个不同步骤,因此不太一致。[59]中对存储库采用了动量更新。它的动量更新是基于同一个样本的表示,而不是编码器。这种动量更新与作者的方法无关,因为MoCo没有跟踪每个样本。此外,作者的方法具有更高的存储效率,可以在十亿规模的数据上进行训练,这对于一个存储库来说是很难的。




上一篇:
下一篇:

头像

guodong

没有评论


你先离开吧:)



发表评论

电子邮件地址不会被公开。 必填项已用*标注