MOCO论文前几段精读

MoCo

MoCo是CVPR 2020的最佳论文提名,算是视觉领域里,使用对比学习的一个里程碑式的工作,而对比学习,作为从19年一直到现在,视觉领域乃至整个机器学习领域里,最炽手可热的方向之一,它简单好用强大,以一己之力盘活了从2017年开始,就卷的非常厉害的计算机视觉领域,涌现了一大批优秀的工作,而MOCO就是其中之一。

MOCO作为一个无监督的表征学习的工作,它不仅在分类的任务上,逼近了有监督的基线模型,而且在很多主流的视觉任务上,比如说检测、分割、人体关键点检测,都超越了有监督预训练的模型,即ImageNet上预训练的模型。有的数据集上甚至是大幅度超越,MOCO的出现从某种程度上来说是给视觉领域吃了一个定心丸,就是无监督学习真的可以。

我们有可能真的不需要大规模的标号的数据去做预训练,这个结论其实从侧面也验证了,之前Yann LeCun【杨立昆】在NeurlPS 2016做演讲使用的一张图

MOCO论文前几段精读_第1张图片

在推特上已经被大家玩坏了,已经变成了一张梗图,作者意思是说,如果我们把机器学习比作一个蛋糕的话,那强化学习只能算是蛋糕上的一个小樱桃,有监督学习最多算是蛋糕上的这层糖霜,只有无监督学习才是蛋糕的本质,才是我们真正想要的,

现实现在也的确如此,在自然处理领域,有很多我们耳熟能详的大模型都是用自监督的方式去预训练得到的,在视觉领域这边,也基本快了,多听大佬的Talk有好处,说不定就是下一个研究方向。

MOCO这篇论文是假设我们已经对对比学习有了基础的了解,如果我们对之前的工作不是很了解的话,就不能理解这里为什么要这么做?Momentum Contrast【动量对比学习】

也无法体会到MOCO的精妙之处。

什么是对比学习呢?

假如说我们有两张图,图1图2图3,图1有一个人,图2也有一个人,可能图1的人是高兴地,图2的人是不高兴的,图3里我们有一个狗,我们希望模型在看到这三张图片以后,他可以分辨出前面这两张图片属于一个类别,后面这个明显不是一个类别,所以对比学习顾名思义就是对比着去学习,模型并不需要真的知道这两张图片代表的人,也不需要图3代表的是狗,他只需要知道图1图2类似,而图3和前两张图片不类似。

说得明白点就是,我们把这三张图片都通过一个网络m,然后我们去得到三个特征f1、f2、f3分别对应这三张图片的特征,假如说我们最后一个学好的一个embedding space就一个特征空间,f1、f2、f3分别是这个特征空间里的三个点,那我们希望对比学习能做到什么呢?

就是可以把这两个类似图片的这个特征呢?尽量的拉近,而让这个图片f3的特征尽量和他们两个原理,如果我们可以做到所有类似的物体都在这个特征空间里相邻的区域,而不类似的物体都在不相邻的区域的话,其实我们的目的也就达到了。

MOCO论文前几段精读_第2张图片

我们学到的特征呢就会是一个很好的特征,这里可能会有人问,对比学习虽然不需要知道标签的信息,比如它不需要知道图1图2是人,或者说图3是狗,但是它还不是需要知道这两张图片是类似的,图3跟图1图2不类似么?也就意味着我们不还是需要标签信息去做这种有监督学习么?我们还是需要知道哪两张图片类似,哪两张图片不相似,我们才可以做这个模型的训练,那为什么对比学习在视觉领域一般认为是无监督的训练方式呢?

因为在视觉领域大家通过去设计一些巧妙地代理任务,就是pretext task,从而人为的订立一些规则,这些规则可以用来定义哪些图片是相似的哪些图片是不相似的,从而可以提供一个监督信号去训练模型。这也就是所谓的自监督训练。

我们来举一个例子,讲一个最广为应用的代理任务,叫instance discrimination,这个代理任务就是说如果我们有一个没有标注的数据集,里面如果有n张照片,比如说x1x2一直到xn,那我们该如何去定义,哪些图片是类似的,哪些图片是不类似的?instance discrimination是这样做的,如果我们从数据集里随机选取一张图片,比如xi,现在我们在这张图片上做随机裁剪,从而得到另外两张图,一张做xi1,一张叫xi2,当然在裁剪之后,我们还做了很多数据增广。

图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。例如,我们可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。我们也可以调整亮度、色彩等因素来降低模型对色彩的敏感度。可以说,在当年AlexNet的成功中,图像增广技术功不可没。

我们把裁剪和数据增广,都叫做Transformation,所以我们用T1、T2来代表,

MOCO论文前几段精读_第3张图片

现在我们就得到两张看起来很不一样的照片,但因为他们都是从同一张照片,xi经过某些变化得到的,他们的语义信息不应该发生变化,xi1和xi2被称为正样本,至于哪些图片是跟xi这张图片不相似的呢?instance discrimination这个代理任务就认为这个数据集里剩下所有的图片了都可以被当做是不相似的,也就是说xj(i≠j),这些样本相对于xi来说呢,都是负样本,instance discrimination直译过来就是个体判别,因为在这个代理任务看来,每张图片都是自成一类,剩下所有的图片都跟他不是一类的,拿ImageNet数据集来举例的话,我先现在就不是有1000个类了,而是有100多万个类,因为每个图片都是它自己的类,

一旦我们有了这个代理任务,有了这么一张去定义什么是正样本,什么是负样本的规则,接下来就好办了,接下来,我们通过一个模型再去得到一些特征,然后在这些特征上使用一些常见的对比学习的目标函数就可以了,比如说NCEloss,这个目标函数的细节呢,我们之后会在正文里讲到,基本这样一个框架就是对比学习里常见的一种实现方式了,看起来好像平平无奇,但对比学习最厉害的地方,就在于他的灵活性,就像我们这里看到的一样,我们只要能找到一种方式去定义什么是正样本,什么是负样本,这就够了,剩下的操作都是比较标准的,这样其实很有意思,因为我们可以打开脑动的去制定很多 如何定义正样本和负样本的规则,比如说在视频领域呢,很多人认为同一个视频里的任意两帧都可以认为是正样本,而其他视频里的所有帧都可以是负样本,在NLP领域我们也可以这样用,比如SimCSE这篇论文,就是把同样的句子扔给模型,但是做两个forward,每次forward使用不同的dropout,这样得到的两个特征是正样本,然后其他所有句子的特征就是负样本,还有在CMC这篇论文,作者说一个物体的不同view就是不同视角,也可以是作为正样本的,比如说一个物体的正面和背面,一个物体的RGB图像和一个物体的深度图像,这些通通都可以作为不同形式的 正样本,所以我们可以看到,对比学习确实很灵活,只要我们脑动够大,什么领域都可以使用。所以自然而然,后来也扩展到了多模态领域,也就造就了OpenAi的CLIP模型。

我们现在精读一下这篇MoCO论文

题目说

Momentum_Contrast_for_Unsupervised_Visual_Representation_Learning_CVPR_2020_paper

用动量对比学习的方法去做无监督的表征学习,MoCo这个名字来源于前两个单词的前两个字母,对比学习我们之前简单介绍过了,那什么是动量呢

动量从数学方面可以理解为加权移动平均,y(t)=m*y(t-1)+(1-m)*x(t),m就是动量这个超参数,y(t-1)是上一个时刻的输出,y(t)是这一时刻我们想改变的输出,x(t)是当前时刻的输入,其实意思就是我们不想让我们当前时刻的输出完全依赖于当前时刻的输入,动量超参数m是介于0-1之间的一个数,如果m很大,趋近于1的时候,y(t)的改变是非常缓慢的,因为(1-m)基本趋近于0,不怎么依赖我们当前的输入,反过来m很小的话,当前的输出更多的依赖当前的输入,MoCO利用动量的这种特性,从而缓慢的更新一个编码器,从而让中间学习的字典中的特征,尽可能的保持一致

作者团队来自于FAIR,作者五个人在google scholar的引用加起来超过50万,在各个视觉会议上拿奖拿到手软,

本文我们提出MoCo这个方法去做无监督的表征学习,虽然我们是基于对比学习的,但是我们是从另一个角度来看对比学习的,也就是把一个对比学习看做是一个字典查询的任务,具体来说,我们做了一个动态的字典,动态的字典有两部分组成,第一个部分就是我们有一个队列,第二个部分是我们有一个移动平均的编码器,因为队列里的样本我们呢不需要做梯度回传,所以我们可以往队列里面添加很多负样本,从而使整个字典变得很大,至于为什么用移动平均的编码器?我们是想让字典里的特征尽可能的保持一致,然后我们在训练的过程中,如果我们能有一个很大的而且比较一致的字典,会对无监督的对比学习非常有好处、

这篇论文的主要亮点在于他的结果,所以剩下大篇幅的摘要留给了结果,首先是分类,在ImageNet数据集上,如果我们用大家普遍采用的这个linear protocol去做测试的话,MoCo是可以取得跟之前最好的无监督学习方式差不多的或者更好一点的结果,这里的linear protocol指的是,如果我先预训练好了一个骨干网络,当我们现在把它用在不同的数据集里的时候,我们把骨干网络冻住【back bone freeze】,只去学习最后的全连接层,分类头。 

linear protocol (类似 MAE 的 linear probing)测试:freeze backbone 主干网络的参数不调整,只微调最后的分类全连接层(分类头)。把 backbone 当成特征提取器,可以证明 backbone 学习图片特征的好坏。

这样相当于我们把提前学习好的与训练模型,当做了一个特征提取器,我们只从他去抽特征,这样就可以间接证明之前预训练好的那个模型的特征,到底学的好不好

更重要的是,moco学到的特征能够很好的迁移到下游任务,这个才是文章的精髓,文章最大卖点。

我们之所以想做大规模的无监督预训练就是想去学习到一个很好的特征,这个特征拥有很好的迁移性,我们就可以在一些没有那么多标注数据的下游任务里,获得很好的结果,

Moco作为一个无监督的预训练模型,能够在7个下游 任务【分割检测】,在VOC、Coco各种数据集上,超越之前有监督的预训练模型,有时候甚至是大幅度超越,counterpart的意思是说模型使用的是一样的,比如说都是res50,只是我们训练的方式不一样,一个是用有监督带标签的去训练,一个是无监督没有标签的去训练,总结,这意味着,有监督和无监督的表征学习的这个鸿沟,对于视觉任务来说,已经填上了,这个结果其实是惊人的

因为之前虽然有一些无监督的工作 ,能在某个数据集或者某个任务上能够比他对应的有监督训练好一点,但是moco是第一个,能够在这么多主流视觉任务里,全面让无监督训练模型要比有监督训练模型表现要好。

引言:

GPT和Bert已经证明无监督的表征学习在nlp领域是非常成功地,但是视觉领域还是有监督的预训练占据主要地位,虽然也有很多出色的无监督工作,但是往往要比有监督模型效果差一点,为什么呢》

作者认为这个原因可能是来源于他们非常不同的原始的信号空间,对于自然语言处理任务来说,他们是离散的信号空间,原始的信号空间,是由这些单词或者这些词根词缀去表示的,从而可以很容易的建一些这个tokenized字典,tokenized的意思是把某一个词对应某一个特征,一旦有了这个字典,无监督学习也可以基于它,还很容易的展开,因为我们可以简单地把这个字典里所有的key,所有的条目想象成是一个类别,这不就变成了一个有监督学习的范式么,我们还是类似于有一个标签一样的东西去帮助进行学习,所以在NLP领域,无监督学习就很容易建模,并且建好的模型相对容易去优化,但是对于视觉来说,就完全不一样了,因为视觉的原始信号是在一个连续的而且是高维的空间,不像单词那样有很强的语义信息,而且浓缩的很好,没有那么简洁,所以导致说,并不适合去建立一个字典,

那如果没有字典呢?无监督学习就很难去建模,所以导致在视觉这边,无监督学习还远不如有监督学习,

第二段:最近有一些无监督表征学习的方式,是基于对比学习的,而且取得了非常不错的效果,虽然这些方式的出发点都不一样,或者说具体的做法不一样,但是他们都可以被归纳成一种方法,也就是说再构造一个动态的字典,这句话如何理解呢?如果我们去看之前的流程图,有一个数据集里面有n张图片,现在我们随机选择一张图片假如说是x1,在这张图片上经过不同的变换后,我们得到了x11和x12,那这两张图片就组成了一个正样本对,一般是管这个x11叫做anchor,也就是锚点基准点的意思,x12我们叫他positive,相对于这个基准点来说呢,x12是x11的一个正样本,剩下的所有图片,从x2到xn都是负样本,

MOCO论文前几段精读_第4张图片

一旦有了正负样本的概念,接下来就是把样本扔给编码器,去得到一些特征输出,比如x11进入到编码器E11里,就会得到特征f11,图片x12进到编码器E12里面,就会得到特征f12,这两个编码器E11、E12既可以是同一个模型,也可以是不同的模型,因为在moco这篇论文里选用的是不同的模型,所以在此我们把它们分开画,至于这些负样本,到底该使用哪一个编码器呢,负样本其实应该使用E12编码器,因为所有的这些负样本和正样本f12,都是相对于这个锚点f11来说的,所以这些负样本也应该和正样本使用同样的编码器,从而让他们的特征保持一致性,于是这些负样本也通过这个编码器从而得到这些f2、f2、到fn的特征

我们之前说的对比学习就是让这个正样本对的 特征f11、f12在特征空间里面尽可能的相近,而让负样本的特征在特征空间里面尽可能的远离f11,那为什么moco的作者认为之前的这些对比学习的方法都可以被归纳为在做一个动态的字典呢?

如果我们把f2、f3、fn的特征当成是一个字典,也就是上文提到的【字典里的这些条目key是从数据里面抽样出来的,然后用一个编码器去表示,这里的key其实对应的是特征,而不时原来的图像】,如果我们把f11当做是一个query,那所有这些字典里的特征都当做是key,那对比学习就转化成一个字典查询的问题么,具体来说,就是对比学习要去训练一些编码器,从而去进行一个字典的查找,查找的目的是什么呢?就是让一个已经编码好的query,这个f11,尽可能的和他匹配的那个key的特征相似,那匹配的key的特征是什么呢?就是f12这个正样本特征,然后和其他的key远离,也就是f2、f3、fn,

整个学习的过程,不就变成了一个对比学习的框架,从而我们只需要最小化一个对比学习的目标函数就可以

在moco这篇论文里,因为他已经把所有的这些对比学习的方法归纳成为了一个动态字典的问题,所以它很少使用anchor或者 正负样本这些词

而取代的是他都用query和key,所以这里的x1一般用xq表示,x12用xk表示,就是x query和x key,同样的,特征f11用的是q代表就是query,剩下的这些特征,用k0、k1一直下去,

读完这两段以后,我们可能就明白,为什么一开始需要将一下对比学习是什么?因为moco的作者是一个自顶向下的方式来写这篇论文的,假设对比学习的这些前人工作已经了如职掌,假设我们可以跟上作者的节奏,

第三段:作者从把对比学习当做动态字典这个角度看,,他们猜想最后要有好的结果,这个字典应该有两个特性,第一个是必须要大,第二个是训练的时候要尽可能的保持一致,为什么这么说?我们先把query和这个字典【里边全是key】,因为字典越大。就能更好地从连续的、高维的视觉空间去做抽样,字典里的key越多,所能表示的视觉信息,视觉特征就越丰富,当拿一个query去跟后面的这些key做对比的时候,我们就真的有可能学到那些把物体区分开的特征,那些更本质的特征,如果字典很小呢,我们的模型就很有可能学到了一个捷径,叫做shortcut solution,从而导致我们预训练好的模型,不能很好的做泛化,

关于一致性呢?字典里的这些key,都应该用相同或者相似的编码器去产生得到,k0、k1、、、kn,这些key应该是用相同或者相似的编码器抽取得到的,这样当我们去跟query做对比的时候,才能保证对比尽可能的一致,否则如果我们这些特征,是由不同的编码器得到的,很有可能这些query呢,就找了和他使用相同或者相似编码器的那个key,而不是真的和他含有相同语义信息的那个key,这样其实也就是变相引用了一个shortcut solution,引入了一条捷径,从而让模型学不好,所以作者最后说,现在已有的这些使用对比学习的方法呢?都至少被上述说的两个方面中的一个所限制,

介绍完了研究动机、还有之前工作的局限性以及想要达到的目标,接下来很自然作者他们自己想要他们自己的方法

作者说他们提出moco是为了给无监督的对比学习构造一个又大又一致的字典,具体的模型总览图如下图

MOCO论文前几段精读_第5张图片

我们有一些query和key的图片,然后这些图片通过一些编码器,从而得到最后的特征,这个query的特征跟所有key的特征做类比,最后用对比学习的loss,去训练整个模型,跟我们之前讲的框架有什么不同呢?

其实主要是queue和这个momentum encoder不同,也就是moco这篇论文的贡献所在

首先我们来看为什么要用队列来表示这个字典呢?

主要还是受限于显卡的内存,如果这里k0、k1,、、、字典太大,也就意味着我们要输入很多的图片,如果这个字典的大小是几千或者甚至上万的话,显卡的内存很定是吃不消的,所以我们需要想一个办法,能让字典的大小,每次的模型去做前向过程的时候batch size的大小剥离开,于是,作者想了一个巧妙地办法,就是用队列的这种数据结构,来完成这项任务,具体来说,这个队列可以很大,但是我们每次更新这个队列,是一点点进行的,但我们用一个很小的batch size的时候,现在这个batch抽取的特征进入队列,然后把最老也就是最早的那个mini-batch移除队列,这样一下子就把训练时候用的mini-batch的大小,跟队列的大小直接分开了,所以最后这个队列的大小,也就是一个字典的大小,可以设置的非常大,因为里面每个iteration都是需要更新的,这样只用普通的gpu,我们也能训练一个很好的模型,但是作者之前也说了,这个字典里的这些key呢?最好要保持一致性,最好是用同一个或者相似的编码器而产生得到的,现在如果只有一小部分,也就是当前的batch,是从当前的编码器得到的,而之前的这些key,都是用不同时刻的编码器去抽取的特征,那不就不一致么,所以作者提出来了第二个改进,即momentum encoder,动量编码器,

MOCO论文前几段精读_第6张图片

虽然我们的动量编码器刚开始是由这边编码器θq,初始化而来的,但是在模型的训练过程中,如果我们选择了一个很大的动量,那这个动量编码器θk其实更新的非常缓慢,他不会跟着θq去快速的改变,从而保证这个字典里所有的key都是由相似的编码器抽取得到的,尽最大可能保持了他们之间的一致性,

基于这两点贡献,moco这个方法可以构建一个又大又一致的字典,从而无监督的学习一个视觉表征,

讲完moco是什么,接下来我们该选用什么代理任务来充当这个自监督信号,从而接近模型的训练,因为moco只是建立中间模型的一个方式,他只是为对比学习,提供了一个动态的字典,具体选择什么样的代理任务,去做自监督学习呢?

文章说其实moco是非常灵活的,他可以跟很多代理任务去合起来使用,这篇论文里就选择了一个非常简单的instance discrimination任务。

【MoCo 论文逐段精读【论文精读】】 https://www.bilibili.com/video/BV1C3411s7t9/?share_source=copy_web&vd_source=9ee2521627a11b87c06e3907e194e1ab

你可能感兴趣的:(NLP&CV,人工智能)