MoCo背景介绍----对比学习
MoCo这篇论文的写作是假定读者已经对对比学习有一定的了解了,如果对之前的工作不了解的话,这里就不理解为什么要做Momentum Contrast(动量对比学习),也无法体会到MoCo的精妙之处
什么是对比学习?(视频2:00处)

假如说有两张图,对比学习顾名思义就是对比着去学习,模型并不需要真的知道图片中代表的是什么,而只需要知道哪些图片是类似的,哪些图片是不一样的就可以了
假如将这三张图片都通过一个网络m,然后得到三个特征f1、f2、f3,分别对应的就是三张图片的特征
假如说最后学好的三个特征是embedding space(特征空间)里的三个点,就希望对比学习能够将两个类似图片的特征尽量拉近,而让另外一个并不类似的特征尽量的远离那两个相似的特征点。如果真的能够做到将所有的物体都在这个特征空间里相邻的区域,而不类似的物体都在不相邻的区域的话,那么其实目的就已经达到了,学到的特征就会是一个很好的特征

对比学习虽然不需要知道每张图里的标签信息,但是它还是需要知道哪些图片是类似的,也就意味着不还是需要标签信息去做这种有监督学习吗,也还是需要知道哪些图片是类似的,哪些图片不是类似的才能去做模型的训练,那么为什么对比学习在视觉领域一般被认为是无监督的训练方式呢?因为在视觉领域大家是通过设计一些巧妙的代理任务(pretext task),从而人为地定了一些规则,这些规则可以用来定义哪些图片是相似的,哪些图片不是相似的,从而可以提供一个监督信号去训练模型,这也就是所谓的自监督训练
例子:最广为应用的代理任务:instance discrimination
这个代理任务是说有一个没有标注的n张照片的数据集,x1、x2,一直到xn,那么该如何定义哪些图片是相似的,哪些图片不是相似的呢?
instance discrimination的做法是:
如果从这个数据集中选一张图片xi,现在在这张图片上最随机裁剪,从而得到另外两张图,一张是xi1,另一张是xi2(当然在裁剪之后,还做了很多的数据增广),这里把裁剪和增广都叫做transformation(xi1和xi2对应的裁剪和增广操作叫做T1和T2),最终可以得到两张看起来很不一样的照片,但是因为它们都是从同一张照片xi经过某些变化得到的,它们的语义信息不应该发生变化,这两张照片被称为正样本
至于和xi这张图片不相似的那些图片,instance discrimination这个代理任务认为这个数据集例剩下的所有照片都可以被当作不相似,也就是说xj(j≠i)这些样本相对于xi来说都是负样本
instance discrimination直译过来就是个体判别,因为在这个任务看来,每张图片都是自成一类的,剩下所有的图片都跟它不是一个类的,拿ImageNet举例的话,现在就不是有1000个类了,而是有100多万个类(1000*1000),因为每个图片都是它自己的类
一旦有了这个代理任务,就知道了怎么样去定义正样本,怎么样去定义负样本,接下来就是通过一个模型,再去得到一些特征,然后在这些特征上使用一些常见的对比学习的目标函数(比如说NCE loss)就可以了,基本上这样一种框架就是对比学习里常见的一种学习方式了
看起来好像平平无奇,但是对比学习最厉害的地方就在于它的灵活性,只要能够找到一种方式去定义正样本和负样本就足够了,剩下的操作都是比较标准的。这样可以打开脑洞去制定很多如何定义正样本和负样本的规则
比如说在视频领域,很多人就认为同一个视频中的任意两帧都可以认为是正样本,而其他视频中的所有帧都可以认为是负样本
在NLP领域里也可以这么使用,比如说SimSCE那篇论文就是把同样的句子扔给模型,但是做两次forward,每次forward使用不同的dropout,这样得到的两个特征作者认为是正样本,其它所有句子的特征就是负样本
还有在CMC这篇论文,作者认为一个物体的不同View(不同视角)也可以作为正样本,比如说一个物体的正面和背面、一个物体的RGB图像和一个物体的深度图像等这些都可以作为不同形式的正样本
以上也就说明了对比学习的灵活性,什么领域都能使用,自然而然后来也扩展到了多模态领域,也就造就了OpenAI的CLIP模型
----end----