如果把 近几年对比学习在视觉领域有代表性的工作做一下总结,那么对比学习的发展历程大概可以分为四个阶段:
- 百花齐放
这个阶段代表性工作有InstDisc(instance discrimination,)、CPC、CMC等。在这个阶段中,方法、模型、目标函数、代理任务都还没有统一,所以说是一个百花齐放的时代 - CV双雄
代表作有MoCo v1、SimCLR v1、MoCo v2、SimCLR v2;CPC、CMC的延伸工作、SwAV等。这个阶段发展非常迅速,有的工作间隔甚至不到一个月,ImageNet上的成绩基本上每个月都在被刷新。 - 不用负样本
BYOL及其改进工作、SimSiam(CNN在对比学习中的总结性工作) - transformer
MoCo v3、DINO。这个阶段,无论是对比学习还是最新的掩码学习,都是用Vision Transformer做的。
下面就简单介绍一下这14篇工作,重点是其研究动机。
第一阶段:百花齐放(2018-2019Mid)
InstDisc(instance discrimination)
这篇文章提出了个体判别任务(代理任务)以及memory bank ,非常经典,后人给它的方法起名为InstDisc。
研究动机
在有监督学习的分类模型中,如果给一张豹子图片进行分类,会发现排前几名的都是跟这张图很像的图片,而排名靠后的那些往往是跟豹子一点关系都没有的类别。
作者研究发现,让这些图片聚集在一起的原因并不是因为它们有相似的语义标签,而是因为这些照片里的物体都很相似。最后作者由此提出了个体判别(individual instances)任务:把每一个instance(实例,这里就是指每一张图)都看成是一个类别,目标是学一种特征,把每张图片都区分开来。

算法
- 模型结构
- 前向过程
- 训练细节
结论
Inst Disc 这篇论文也是一个里程碑式的工作:它不仅提出了个体判别这个代理任务,而且用这个代理任务和 NCE loss做对比学习,从而取得了不错的无监督表征学习的结果。同时它还提出了用别的数据结构存储这种大量的负样本,以及如何对特征进行动量的更新,所以真的是对后来对比学习的工作起到了至关重要的推进作用。
Inva Spread
前言
这是一篇 CVPR 19的论文,跟今天要说的其它论文相比,它的影响力可能不是那么大,之所以提一下这篇论文,是因为它可以被理解成是 SimCLR 的一个前身,它没有使用额外的数据结构去存储大量的负样本,它的正负样本就是来自于同一个 minibach,而且它只用一个编码器进行端到端的学习
本文的想法其实就是最基本的对比学习
这篇文章作者同样没有为自己的方法起名字,所以后面一般将其简称为Inva Spread。Inva Spread是一种端到端的训练方式,直接训练特征本身,无需额外的数据结构(比如上文的memory bank),提升了效率和准确度。作者还使用了新的采样方式,降低了计算复杂度。
如图1所示,同样的图片通过编码器以后,它的特征应该很类似,不同的图片,它的特征出来就应该不类似,这就是题目中说的invariant和 spreading,就是说对于相似的图片、相似的物体,特征应该保持不变性,但是对于不相似的物体或者完全不沾边的物体,特征应该尽可能的分散开

简单来说,本文中的正负样本都来自同一个mini_batch。比如对于图片 \(x_i\),其正样本就是数据增强后的图片 \({x_{i}}'\) ,而负样本就是这个mini_batch中除了 \((x_i,{x_{i}}')\) 之外的所有样本,而不是整个数据集中的所有其它样本。这样负样本数大大减少,可以不需要额外的数据结构来存储,就可以用一个编码器做端到端的训练了。
Inva Spread可以看做是SimCLR的前身,但由于数据增强策略不足以及负样本数量太少,也没有SimCLR提出的mlp projector ,使得最终的训练效果不好,没有太大的影响力。
Inva Spread的作者太穷,没有TPU,只能选择batch_size=256来训练。这样每次迭代的负样本只有255*2个,数量太少,对比学习的效果不够好(也就是在MOCO中说过的字典太小)。而SimCLR的作者来自谷歌,可以使用大量的TPU,最终训练的batch_size=8192,足以达到不错的训练效果。
方法

- 代理任务也是选取了个体判别这个任务
- 前向过程:
CPC(contrastive Predictive coding)
一般机器学习分为判别式模型和生成式模型,个体判别显然是属于判别式范畴的,那肯定就会有一些生成式的代理任务,比如最常见的预测型的任务
cpc 这篇论文其实非常厉害,因为它是一个很通用的结构

- 图1中描述的是CPC不仅可以处理音频,还可以处理图片、文字以及在强化学习里使用, 这里为了简单,它用的是一个音频的信号作为输入
- 本文的想法:假如说有一个输入 x(一个持续的序列),t表示当前时刻,t-i表示过去的时刻,t+i表示未来的时刻。把之前时刻的输入全都扔给一个编码器,这个编码器就会返回一些特征,然后把这些特征喂给一个自回归的模型(gar,auto regressive),一般常见的自回归模型,就是 RNN 或者 LSTM的模型,所以每一步最后的输出,就会得到图中红色的方块(ct,context representation,代表上下文的一个特征表示),如果这个上下文的特征表示足够好(它真的包含了当前和之前所有的这些信息),那它应该可以做出一些合理的预测,所以就可以用ct预测未来时刻的这个zt +1、zt + 2(未来时刻的特征输出)
- 对比学习在哪里体现的呢?正样本其实就是未来的输入通过编码器以后得到的未来时刻的特征输出,这相当于做的预测是 query,而真正未来时刻的输出是由输入决定的,也就是说它们相对于预测来说是正样本;负样本的定义其实很广泛,比如可以任意选取输入通过这个编码器得到输出,它都应该跟预测是不相似的,这就是cpc定义正负样本的方式
这套思想是很朴实的,把输入序列换成一个句子,也可以说用前面的单词来预测后面的单词的特征输出;如果把这个序列想象成一个图片的patch块从左上到右下形成一个序列,就可以用上半部分的图片特征去预测后半部分的图片特征,总之是非常灵活 - 并且这篇文章也是提出了infoNCE 的loss, 详情可以查阅
CMC(contrastive multiview coding)
前言
CMC使用一个物体的多个视角来作为正样本。这个思想来自于人类对世界的感受、观察。
在摘要中,作者说人类观察这个世界是通过很多个不同视角的传感器,比如说眼睛或者耳朵,来给大脑提供不同的信号。每一个视角都是带有噪声的,而且有可能是不完整的。但是最重要的那些信息,比如物理性质,几何形状以及语义信息,在所有的这些视角中间共享。例如一只狗可以被看到、听到、感受到。
基于此,作者认为一个强大的特征,应该具有视角不变性(view-invariant)(不论是看到还是听到,都应该能判断出那是一只狗)。所以CMC目的,就是最大化同一个场景不同视角的互信息,并且可以扩展到任意数量的未知视角,且视角越多效果越好。
如果能学到一种特征能够抓住所有视角下的关键的因素,那这个特征就很好了,至少解决分类问题不在话下
算法

如上图所示,CMC选用 NYU RGBD 数据集进行 训练。数据集中每张图有4个视角(view):原始的图像、原图对应的深度信息(每个物体离观察者到底有多远)、SwAV ace normal以及原图的分割图像。
在CMC中,一张图的四个视角就是互为正样本,因为其代表的是同一个东西;其它的图片就是负样本。在上图表示,就是特征空间中四个绿色的点互相靠近,而都和红色的点远离。
这就是 cmc 定义正负样本的方式,它的正样本来自于多个视角,一旦定义好了正负样本,剩下的工作就大差不差了
cmc是第一个或者说比较早的工作去做这种多视角的对比学习,它不仅证明了对比学习的灵活性,而且证明了这种多视角、多模态的这种可行性。所以说接下来open AI,很快就出了clip模型:也就是说如果有一个图片,还有一个描述这个图片的文本,那这个图像和文本就可以当成是一个正样本对,就可以拿来做多模态的对比学习
结论
- CMC正负样本确定的方式由个体升级成了个体的不同的视角(如色彩模型)。
- 它同样使用了NCE,但将其扩展以适应不同的视角。CMC采用多视角对比学习,证明了对比学习的灵活性,也同时证明了多视角多模态的可行性,为之后的CLIP工作(图文配对的多模态对比学习)打下了基础。
- 但是本文也有一个局限,即处理不同的视角(模态)时,可能需要不同的编码器,因为不同的输入特点不一样。 如果每个视角都有一个编码器,那么训练的成本就有点高(比如在CLIP里,文本编码器是BERT,图片编码器是ResNet或者ViT)。
- 所以这也是现在Transformer最吸引人的地方,这个结构可以同时处理文本和图片,那么就可以用一个解码器处理两种模态,而不用做针对每种数据去做特有的改进, 在2022ICLR上发表的MA-CLIP,就是用一个Transformer去同时处理两个输入模态,效果反而更好。
小结
第一阶段大概讲了这四篇论文,可以看到
- 它们使用的代理任务是不一样的,有个体判别,有预测未来,还有多视角多模态
- 它们使用的目标函数也不尽相同,有 NCE,有infoNCE,还有NCE的其它变体
- 它们使用的模型也都不一样,比如说invariant spread用了一个编码器;Inst Disc用一个编码器和memory bank;cpc有一个编码器,还有一个自回归模型;cmc可能有两个甚至多个编码器
- 它们做的任务从图像到视频到音频到文字到强化学习,非常的丰富多彩
第二阶段:CV双雄(MoCo和SimCLR)
MoCo
详细见这里:
这里主要就罗列和其它工作的区别和联系
MoCo 的主要贡献就是把之前对比学习的一些方法都归纳总结成了一个字典查询的问题,它提出了两个东西
- 队列
- 动量编码器
从而去形成一个又大又一致的字典,能帮助更好的对比学习
MoCo跟Inst Disc是非常相似的
- 它用队列取代了原来的memory bank作为一个额外的数据结构去存储负样本
- 它用动量编码器去取代了原来loss里的约束项,从而能达到动量的更新编码器的目的,而不是动量的去更新特征,从而能得到更好的结果
但是整体的出发点以及一些实现的细节都是非常类似的
SimCLR
详细见这里:

这里稍微做下总结,
- 本文其实整体的这个思路和结构跟invariant spread 是基本一致的,SimCLR跟Inva Spread的区别其实都写在SimCLR的贡献列表里了
MoCoV2
MoCov2主要是借鉴了SimCLR而做的优化,比如引入了mlp projection head以及使用更多的数据增强。MoCov2刷新了ImageNet 上的最好成绩,比之前的MoCo以及最新的SimCLR都高很多 。其上传的日期是3月9日,离SimCLR的发布还不到一个月。
MoCov2对比MoCo主要有4个改动:
改进策略
- 添加 projection head
- 使用更多的数据增强
- 训练时使用cosine的learning rate schedule
- 训练的epoch,从200增加到800
SimCLR V2
模型结构

整个模型分为三个部分:
- 第一部分就是SimCLR,怎样自监督或者说自监督的对比学习去训练一个大的模型出来
- 第二部分就是说,一旦有了这么好的一个模型,只需要一小部分有标签的数据,然后去做一下有监督的微调,一旦微调结束了,就相当于有一个 teacher 模型
- 第三部分是可以用这个teacher模型去生成很多伪标签,这样就可以在更多的无标签的数据上去做自学习了
改进策略
SimCLRv2相比SimCLRv1有三处改进:
- 大模型:backbone从ResNet50替换为ResNet152+SK net (selective kernels)
- 加深protection head :从一层加到两层。
protection head在SimCLRv1和MOCOv2中都被证明很有用,所以作者考虑多家几层。最后发现加到两层效果就够了 - 引入了动量编码器:使用了类似MOCO的动量编码器,效果提升了一个点。
作者解释是,SimCLR模型的 batch_size已经够大了,也就是字典的大小和字典里特征一致性,SimCLR v2 都已经做的很好了。换成MOCO这种队列结构的动量编码器,虽然可训练的负样本更多,但是提升没有那么明显了。
微调
SimCLRv1在微调时,是去掉\(g(\cdot )\)(projector层),只保留编码器$ f(\cdot )$ 进行微调,即\(f^{task}(x_{i})=W^{task}f(x_{i})\)
SimCLRv2在微调时,是保留 \(g(\cdot )\) 的第一层 ,即\(f^{task}(x_{i})=W^{task}\cdot \sigma (W^{MLP}\cdot f(x_{i}))\)