MoCo----引言
GPT和BERT已经证明了无监督的表征学习在NLP领域是非常成功的,但是在视觉领域有监督的预训练还是占主导地位
虽然也有很多出色的无监督工作,但是它们往往要比这些有监督的模型在效果上要差很多
作者认为原因有可能来源于原始的信号空间不同,对于自然语言处理的任务来说,它的信号空间是离散的(也就是说它原始的信号空间是由单词或者是词根词缀去表示的),从而可以很容易地建立一些Tokenize(Tokenize就是把某一个词对应成某一个特征)的字典,一旦有了这个字典,无监督学习也就可以基于它很容易地展开,因为可以简单地把这个字典里所有的key(就是所有的条目)想象成一个类别,这就变成了一个有监督学习的范式,还是有一个类似于标签一样的东西去辅助学习,所以在NLP中,无监督学习很容易建模,而且建好的模型相对比较容易优化
但是对于视觉来讲就完全不一样了,因为视觉的原始信号是在一个连续的而且高维的空间里,它并不像单词那样有很强的语义信息而且浓缩的非常好,没有那么简洁,所以导致它并不适合去建立一个这样的字典。但是如果没有这个字典,无监督学习就很难去建模,所以导致在视觉中无监督学习远不如有监督学习
最近有一些基于对比学习的无监督表征学习的方式取得了非常不错的效果,虽然这些方式的出发点或者具体的做法都不一样,但是它们都可以被归纳成一种方法:再构造一个动态的字典
一个数据集中有n张图片,随机选择一张图片x1,在这张图片上经过不同的变换以后得到x11和x12,这两张图片就组成了一个正样本对,一般将x11叫做anchor也就是锚点(基准点),将x12叫做positive(也就是相对于基准点来说,x12是x1的一个正样本),剩下的所有的图片,从x2到xn全都是负样本(negative)

有了正负样本这些概念,接下来将这些样本丢给编码器得到一些特征输出,比如说x11进入到编码器E11之后就会得到一个特征f11,x12进入到编码器E12之后就会得到一个特征f12,这两个编码器既可以是同一个模型,也可以是不同的模型,因为在MoCo这篇论文中选用的是不同的模型,所以这里就分开画了
至于剩下的负样本,其实应该使用E12这个编码器,因为所有的负样本和正样本f12都是相对于原来的锚点f11来说的,所以说这些负样本也应该和这个正样本使用同样的编码器,从而让它们的特征保持一致性,于是这些负样本也通过这个编码器从而得到了f2到fN的特征
对比学习的作用就是让这一个正样本对的特征在特征空间中尽可能相近,而让那些负样特征尽可能地远离f11(也就是锚点)
为什么本文的作者认为之前的对比学习都可以被归纳成在做一个动态的字典呢?
如果将f12、f2、f3一直到fN的这些特征当成字典,字典中的条目(key)是从数据中抽样出来的,然后用一个编码器去表示,也就是说这里的key其实对应的是特征而不是原来的图像。
如果将f1当成是一个query,所有这些字典中的其它特征都当成是key,那对比学习就转化成为了一个字典查询的问题了
具体来说,就是对比学习要去训练一些编码器,从而去进行一个字典的查找,查找的目的就是让一个已经编码好的query(特征f11)尽可能和它匹配的那个key的特征(也就是f12这个正样本特征)相似,然后和其他的key(也就是其他负样本的特征)远离,那么整个学习的过程就变成了一个对比学习的框架,从而只需要去最小化一个对比学习的目标函数就可以了
在MoCo这篇论文当中,因为作者已经把所有的对比学习的方法归纳成为了一个动态字典的问题,所以很少使用anchor或者正负样本这些词,用的都是query和key,所以x1一般用xq表示,x2一般用xk表示,也就是xquery和xkey,同样地,特征f11用的是q,代表query,剩下的特征用k0、k1等来进行表示
MoCo的作者是以一个自顶向下的方式来写这篇论文的,他假设读者已经对对比学习的前人的工作已经了如指掌了,假设读者能跟上他的节奏
从这个角度(把对比学习当成动态字典)来看,最后要有好的结果,这个字典应该具有两个特性
第一是必须要大。字典越大,就能更好地从这个连续的高维的视觉空间做抽样(字典里的key越多,所能表示的视觉信息、视觉特征就越丰富,当拿一个query去跟后面的key做对比的时候,就真的有可能学到那些把物体区分开的特征,也就是更本质的特征。如果字典很小,模型很有可能就学到了一个捷径shortcut solution,从而导致预训练好的模型不能很好地做泛化)
第二就是在训练的时候要尽可能地保持一致性。字典里的key都应该用相同或者说相似的编码器去产生得到,也就是说从k0一直到kN的这些key应该是用相同或者说相似的编码器抽取得到的,这样当和query做对比的时候,才能保证对比尽可能的一致,否则如果这些特征是由不同编码器得到的话,很有可能query就找到了和它使用相同或者相似编码器的key,而不是真的和它含有相同语义信息的key(这样其实也就是变相地引入了一个shortcut solution,也就是说引入了一条捷径从而让模型学不好)
作者说,现在已有的这些使用对比学习的方法,都至少被上述所说的两个方面中的一个所限制(其实这里说明一下现在已有的方法是怎么受限的会更有助于读者去理解,但是受限于篇幅,作者只能说接下来在该谈的时候会做介绍)
介绍完了研究动机、之前工作的局限性以及想要达到的目标,接下来就是作者提出自己的方法
提出MoCo是为了给无监督的对比学习构造一个大而且一致的字典,具体的模型总览图如下图所示

这个图和之前所画的对比学习的一般框架很相似
有query的图片,还有key的图片,这些图片通过一些编码器得到最后的特征,然后query的特征去跟所有的key的特征做类比,最后用对比学习的loss去训练整个模型
它和之前的那个框架有什么不同?queue和momentum encoder,这也是MoCo这篇论文的贡献所在
为什么要用一个队列去表示字典?主要还是受限于显卡的内存,如果字典太大,也就意味着要输入很多很多的图片,如果字典的大小是几千甚至上万的话,显卡的内存肯定是吃不消的,所以需要想一个办法,能让字典的大小跟每次模型去做前向过程时的batch size大小剥离开,于是作者想到了一个巧妙的办法:用队列的数据结构来完成这项任务。具体来说,就是这个队列可以很大,但是每次更新这个队列是一点一点进行的,也就是说当用一个很小的batch size的时候,现在这个batch抽得的特征进入队列,然后把最老的也就是最早的那个mini-batch移除队列,这样一下就把训练时用的mini batch的大小和队列的大小直接分开了,最后这个队列的大小,也就是字典的大小可以设的非常大,因为它大部分的元素都不是每个iteration都需要更新的,这样只用普通的GPU也能训练一个很好的模型
但是这个字典中的key最好要保持一致性,也就是说他们最好是用同一个或者说相似的编码器差生得到的。如果只有一小部分(也就是当前的batch)是从当前的编码器得到的,而之前的key都是用不同时刻的编码去抽取特征,就不一致了,所以作者又提出了一个改进:momentum(动量编码器)。
如果用上面的动量的概念来写一下数学表达式,如果现在的编码器用θq(θquery)代替,momentum encoder用θk(θkey)表示,那么θk的更新就可以表示为θk = m * θ(k-1) + ( 1 - m ) * θq ,也就是说,虽然动量编码器刚开始是由旁边的编码器θq初始化而来的,但是模型的训练中选择了一个很大的动量,那么这个动量编码器θk其实是更新的非常缓慢的,而不会跟着θq快速地改变,从而保证了字典中所有的key都是由相似的编码器抽取得到的,尽最大可能地保持了他们的一致性
所以基于这两点贡献,MoCo可以构建一个又大又一致的字典,从而去无监督地学习一个视觉的表征
选用什么代理任务去充当这个自监督信号,从而进行模型的训练?
因为MoCo只是建立中间模型的方式,它只是为对比学习提供了一个动态的字典,那么具体选择什么样的代理任务去做自监督学习?其实MoCo是非常灵活的,它可以跟很多代理任务合起来使用
在这篇论文中,作者选择了一个比较简单的instance discrimination任务(个体判别任务),选择它的原因不仅仅是因为它简单,也是因为它的效果确实非常好。
这个任务简单来说就是如果一个query和一个key是同一个图片不同的视角(比如说不同的随即裁剪得到的),那么就说这个query和这个key能配对,也就是说能在这个字典中查找到query对应的key,用了这个代理任务,MoCo在ImageNet数据集上做Linear Classification的时候,能跟之前最好的方法打个平手或者是有更好的表现
结果
无监督的表征学习最主要的目的就是当在一个没有标注的数据集上做完预训练之后,预训练好的特征是能够直接迁移到下游任务的,MoCo就做到了这一点:
在七个下游任务(既有检测也有分割)上,MoCo这种无监督的预训练方式都能超越用ImageNet去做有监督的预训练方式,有的时候甚至还是大幅度的超越。因此重要性不言而喻,MoCo是第一个做到这么好结果的
大家对无监督学习还有另外一个期待:就像在NLP中,如果用更多的数据,用更大的模型,希望这个模型的提升是永无止境的,最好不要有性能饱和的现象。所以作者这里为了实验的完整性又做了另外一组实验,作者除了把MoCo在ImageNet做预训练之外,还在facebook自己的10亿的Instagram数据集上也做了预训练,最后的结果还能提升,所以这也就证明了MoCo是可以在一个更偏向于真实世界而且有亿级规模图片的数据集上工作的很好

relatively uncurated scenario:因为这个数据集并不是像ImageNet一样是精心挑选过、而且大部分图片都是只有一个物体在中间的,Instagram的图片的场景是相当丰富的,而且也会展示出真实世界中数据有的一些特性(比如说数据分类不均衡*******,或者说一张图片可能含有多个物体),所以和ImageNet比起来,可能从数据的挑选和标注上都没有那么严格
因为MoCo不论是在中型数据集上做预训练还是在大型数据集上做预训练都能取得很好的结果,所以作者最后说,这些结果证实了MoCo可以在很多视觉任务上把无监督学习和有监督学习的坑填平,而且甚至可以在一些真实的任务上去取代之前大家一直使用的在ImageNet预训练的模型
MoCo的影响力就在于几乎所有的应用都可以换成使用MoCo无监督的训练方式训练好的模型,说不定效果还会更好
----end----