CV领域的对比学习综述(上) – 潘登同学的深度学习笔记
文章目录
-
- CV领域的对比学习综述(上) -- 潘登同学的深度学习笔记
- 对比学习发展历程
- 百花齐放
-
- InstDisc
-
- InvaSpread
- CPC
- CMC
-
- 第一阶段总结
- CV双雄
-
- MoCo
- SimCLP
- MoCo v2
- SimCLR v2
- SwAV
-
- CPC、CMC的延伸工作
- 第二阶段总结
对比学习发展历程
发展历程大概可以分为四个阶段
1、百花齐放
- InstDisc(instance discrimination)
- CPC
- CMC
在这个阶段中,方法、模型、目标函数、代理任务都还没有统一,所以说是一个百花齐放的时代
2、CV双雄
- MoCo v1
- SimCLR v1
- MoCo v2
- SimCLR v2
- CPC、CMC的延伸工作
- SwAV
这个阶段发展非常迅速,上述工作有的间隔一两个月,有的间隔甚至不到一个月,ImageNet上的成绩基本上每个月都在被刷新
3、不用负样本
- BYOL以及它后续的一些改进
- 最后SimSiam将所有的方法都归纳总结了一下,融入到了SimSiam的框架中,基本上是用卷积神经网络做对比学习的一个总结性工作
4、transformer
对于自监督学习来说,无论是对比学习还是最新的掩码学习,都是用Vision Transformer做的
百花齐放
InstDisc
InstDisc(instance discrimination)个体判别任务的提出以及memory bank,在MoCo论文中反复提到的文献[61],
研究动机
InstDisc提出的动机就是,一个豹子的图像经过那些经典的分类器(如ResNet50等)得到的分类结果大多都是与豹子相关的(猎豹、雪豹等),子所以得到这样的结果是因为豹子就是与豹子间很相似与别的不相似,然后就将这样的思路推演到极致,每个图片都与自己相似与别的不相似;
网络架构
- 输入一张图片,经过ResNet50,得到2048长度的向量,经过FC层,变为128长度的向量;
- 将所有图片的结果存在memory bank中,一个批次前向过程抽取4096个负例;
- 更新这个batch的memory bank;
InvaSpread
InvaSpread则是CVPR 19的一篇论文,核心思路是一个编码器的端到端对比学习,可以理解为SimCLR的前身;
- 取一个batch(原论文是256)的图片,对每一张做数据增强,每一张与其数据增强图片是正例,与其他所有都是负例;
- 经过CNN,得到特征向量;
- 所以说之所以讲这篇论文,是因为它刚好属于另一个流派,也就是端到端的学习,而且只用一个编码器,不需要借助外部的数据结构去存储大量的负样本,它的正负样本都来自于同一个 minibach
- 既然它跟 SimCLR 这么像,为什么它没有取得那么好的结果呢?就是之前在MoCo那篇论文里反复强调过的,就是这个字典必须足够大,也就是说在做对比学习的时候,负样本最好是足够多,而本文的作者是没有 TPU 的,所以说它的 batch size 就是256,也就意味着它的负样本只有500多个((256-1)*2=510),再加上它还缺少像 SimCLR 那样那么强大的数据增广以及最后提出的那个 mlp projector,所以说呢这篇论文的结果没有那么炸裂,自然也就没有吸引大量的关注,但事实上它是可以理解成 SimCLR 的前身;
CPC
CPC(contrastive predictive coding) 18年的一篇论文,对比预测编码,图像语音文本强化学习全都能做;
一般机器学习分为判别式模型和生成式模型,个体判别显然是属于判别式范畴的,那肯定就会有一些生成式的代理任务,比如最常见的预测型的任务,而CPC就是生成式的模型;
以音频任务为例
- 将之前时刻的音频信息传给编码器,得到特征输出;
- 将特征输出经过gar自回归模型(auto regressive),一般来说就是RNN,得到一个包含上下文的语义信息;
- 如果这个上下文语言表示地足够好(真的包含了当前和之前所有的这些信息),那么他应该能做一些预测,比如预测未来时刻的特征输出;
- 所以上下文向量 C t C_t Ct是对比学习的query,而真正的下一时刻经过encoder的特征作为正样本的Key,其他任意时刻的输入(或者噪音)经过Encoder得到的特征作为负样本的Key;
这套思想是很普适的,把输入序列换成一个句子,也可以说用前面的单词来预测后面的单词的特征输出;如果把这个序列想象成一个图片的patch块从左上到右下形成一个序列,就可以用上半部分的图片特征去预测后半部分的图片特征,总之是非常灵活;
CMC
CMC(Contrastive Multiview Coding) CVPR 19的一篇论文,多视角下的对比学习;
整体思路
CMC的摘要写的很好,也概括了核心思想
- 人观察这个世界是通过很多个传感器,比如说眼睛或者耳朵都充当着不同的传感器来给大脑提供不同的信号
- 每一个视角都是带有噪声的,而且有可能是不完整的,但是最重要的那些信息其实是在所有的这些视角中间共享,比如说基础的物理定律、几何形状或者说它们的语音信息都是共享的
- 在这里举了个很好的例子:比如一个狗既可以被看见,也可以被听到或者被感受到
- 基于这个现象作者就提出:他想要学一个非常强大的特征,它具有视角的不变性(不管看哪个视角,到底是看到了一只狗,还是听到了狗叫声,都能判断出这是个狗)
- cmc工作的目的就是去增大互信息(所有的视角之间的互信息)
- 如果能学到一种特征能够抓住所有视角下的关键的因素,那这个特征就很好了,至少解决分类问题不在话下
CMC的对比学习
-
选取的是 NYU RGBD 这个数据集(这个数据集有同时4个view,也就是有四个视角:原始的图像、这个图像对应的深度信息(每个物体离观察者到底有多远)、SwAV ace normal、这个物体的分割图像)
-
cmc 的意思是说,虽然这些不同的输入来自于不同的传感器或者说不同的模态,但是所有的这些输入其实对应的都是一整图片,都是一个东西,那它们就应该互为正样本,也就是说,当有一个特征空间的时候,比如图中圆圈所示的特征空间,这四个绿色的点在这个特征空间里就应该非常的接近。这时候如果随机再去挑一张图片,不论是用图片还是用风格的图像(总之属于一个不配对的视角)的话,这个特征就应该跟这些绿色的特征远离
-
这就是 cmc 定义正负样本的方式,它的正样本来自于多个视角,一旦定义好了正负样本,剩下的工作就大差不差了
-
cmc是第一个或者说比较早的工作去做这种多视角的对比学习,它不仅证明了对比学习的灵活性,而且证明了这种多视角、多模态的这种可行性。所以说接下来open AI,很快就出了clip模型:也就是说如果有一个图片,还有一个描述这个图片的文本,那这个图像和文本就可以当成是一个正样本对,就可以拿来做多模态的对比学习
-
cmc原班作者人马用对比学习的思想做了一篇蒸馏的工作:不论用什么网络,不论这个网络是好是坏是大是小,只要你的输入是同一张图片,那得到的这个特征就应该尽可能的类似,也就意味着想让 teacher 模型的输出跟 student 模型的输出尽可能的相似,它就通过这种方式把 teacher和student做成了一个正样本对,从而可以做对比学习
-
所以说让大家意识到对比学习如此灵活,可以应用到不同的领域,cmc功不可没
-
一个小小的局限性:当处理不同的视角或者说不同的模态时候,可能需要不同的编码器,因为不同的输入可能长得很不一样,这就有可能会导致使用几个视角,有可能就得配几个编码器,在训练的时候这个计算代价就有点高(比如说在 clip 这篇论文里,它的文本端就是用一个大型的语言模型,比如说 bert,它的图像端就是用一个 vit,就需要有两个编码器),这样其实又回到了刚开始讲ViT时候所说的说这个Transformer的好处–Transformer有可能能同时处理不同模态的数据
-
事实上现在已经有人这么做了,今年的ICLR就有一篇ma clip,它就用一个Transformer去同时处理两个输入模态,效果反而更好,所以说这可能才是 Transformer 真正吸引人的地方:一个网络能处理很多类型的数据,而不用做针对每个数据特有的改进
第一阶段总结
第一阶段大概讲了这几篇论文,可以看到
- 它们使用的代理任务是不一样的,有个体判别,有预测未来,还有多视角多模态
- 它们使用的目标函数也不尽相同,有 NCE,有infoNCE,还有NCE的其它变体
- 它们使用的模型也都不一样,比如说invariant spread用了一个编码器;Inst Disc用一个编码器和memory bank;cpc有一个编码器,还有一个自回归模型;cmc可能有两个甚至多个编码器
- 它们做的任务从图像到视频到音频到文字到强化学习,非常的丰富多彩
CV双雄
这里之所以是双雄,其实主要想讲的是MoCo和SimCLR
MoCo
MoCo之前已经说过了,主要讲讲MoCo与其他的联系与区别
MoCo 的主要贡献就是把之前对比学习的一些方法都归纳总结成了一个字典查询的问题,它提出了两个东西
从而去形成一个又大又一致的字典,能帮助更好的对比学习
SimCLP
- 与前面的InvaSpread类似,一个batch中每个图片有两个数据增强,得到2xbatch的图片,其中正样本1个,负样本2x(n-1)个;
- 与InvaSpread不同的点就在于,通过Encoder得到特征后,计算NCE loss前,要再经过一层FC层得到的两个特征进行算Loss,关键是加不加这一层FC层对结果的影响有10个点之多(ImageNet分类);
FC层在接下游任务的时候是不要的,留下的始终只有Encoder;
和MoCo比起来确实很简单,这里只有一个编码器,既不需要memory bank,也不需要队列和动量编码器;正负样本全都是从同一个mini-batch里来的;整个前向过程非常的直接,就是图片进入编码器编码然后projector降维,最后算个对比学习的loss,非常符合大家对深度学习工作的期待
本文其实整体的这个思路和结构跟SimCLR是基本一致的,SimCLR跟Inva Spread的区别其实都写在SimCLR的贡献列表里了
- 首先第一个就是它用了更多的数据增强,它发现对比学习真的是需要很强的数据增强的技术
- 第二就是它加了一个g函数(一个可以学习的分线性的变换,就是一个 mlp层)
- 第三就是它们用了更大的batch size ,而且训练的时间更久,它发现这两个策略都能让网络学到的特征变得更好
而事实上呢,SimCLR这篇文章中提出来的很多技术都对后续的工作产生了长远的影响力,比如说在编码器之后加这么一个mlp层,在之后的MoCo v2、BYOL这些工作里全都有使用;它使用的数据增强的策略在之后的工作里也是被广泛的使用;它使用lars这个优化器去做大batch size的这个模型训练,之后BYOL 也采用了同样的策略。总之SimCLR真的是够简单,而且为后续的很多研究铺平了道路
MoCo v2
因为MoCo和SimCLR的结果实在是太过惊艳,所以从2020年开始就掀起了一波对比学习的狂潮,基本上每天只要去刷arxiv,都会有对比学习的论文,这波热浪一直到20年年底Vision Transformer出来以后才逐渐消退
MoCo v2主要就是说,在看到SimCLR这个比较好的结果以后,它们发现SimCLR里的那些技术都是即插即用型的,所以说它们就把那些就拿过来了,它直接说,就在MoCo上面做很简单的改动,引入了mlp projection head以及使用更多的数据增强,就又刷新 ImageNet 上的最好成绩,不仅比之前的MoCo高很多,而且比最新的SimCLR也要高很多
注意,SimCLR是2月13号才放到arxiv上的,MoCo v2是3月9号就放到arxiv上了,所以说这个节奏是相当快的
总的来说有四个改进点
- 加了一个 mlp 层
- 加了更多的数据增强
- 训练的时候用了cosine的learning rate schedule
- 训练更长的 epoch,从200变到了800
除了准确率之外,还是那个优点,就是省内存,省时间,因为MoCo的字典与batch是分离的
SimCLR v2
其实SimCLR v2,只是这篇论文一个很小的部分,它只是说怎么从v1变到v2,就是一个模型上的改进,而事实上都在讲如何去做半监督的学习
它主要想说的体现在它的这个标题里了:非常大的自监督训练出来的模型非常适合去做半监督学习
这篇文章分了三个部分
- 第一部分就是SimCLR,怎样自监督或者说自监督的对比学习去训练一个大的模型出来
- 第二部分就是说,一旦有了这么好的一个模型,只需要一小部分有标签的数据,然后去做一下有监督的微调;
- 第三部分,一旦微调结束了,就相当于有一个 teacher 模型,就可以用这个teacher模型去生成很多伪标签,这样就可以在更多的无标签的数据上去做自学习了
而我们重点关心第一部分,SimCLR v2的三点改进
- 使用了更大的模型(换了个更大的残差网络)
- 加深了最后接的那个MLP层(从一层变为两层)
- 引入了动量编码器(效果没有想象中强,因为SimCLR本身的batch size很大)
SwAV
SwAV主要包括
核心思想: 给定同样一张图片,如果生成不同的视角,不同的 views 的话,希望可以用一个视角得到的特征去预测另外一个视角得到的特征,因为所有这些视角的特征按道理来说都应该是非常接近的
本文的具体的做法就是把对比学习和之前的聚类的方法合在了一起
- 首先,聚类方法也是一种无监督的特征表示学习方式,而且呢它也是希望相似的物体都聚集在某一个聚类中心附近,不相似的物体尽量推开推到别的聚类中心,所以跟对比学习的目标和做法都比较接近
- 另外,这篇文章的一作其实之前一直也是做聚类的,它之前就做过deep cluster这篇工作,也是一篇非常好的无监督学习的论文
网络架构
SwAV与之前架构的对比
- 上图把之前对比学习的方法总结了一下画到了左边,然后把SwAV的方法画到了右边,这样就比较好对比
- 左边当然很好理解了,就是同一个图片,做两次数据增强就得到了 x 1 、 x 2 x_1、x_2 x1、x2,然后所有的样本通过一个编码器,这个编码器有可能就是个 Res 50,也有可能是一个 Res 50加了一个 projection head,它这里没有明说,反正就是所有的这些都属于一个模型,最后这个模型输出一个特征,一旦有了这个特征,用它做一个对比学习的 loss 就可以了;
- SwAV说,这么做虽然比较简单,但是直接拿所有图片的特征跟特征做对比有点原始而且有点费资源,因为所有的图片都是自己的类,所以其实像MoCo一样,取了6万个负样本,这还只是个近似,因为其实所有的数据集,所有的负样本理应是128万个图片;
- SwAV的作者就想,能不能不去做近似,能不能借助一些先验信息不去跟大量的负样本比,而去跟一些更简洁的东西比,然后SwAV的作者就想出来了,可以去跟聚类的中心比(聚类中心就是右图里的c,也就是个prototype,它其实就是个矩阵,它的维度是 d ∗ k d * k d∗k,d是特征的维度,这里的d和特征的 d 是一样的,比如说就是之前说的128维,这个k就是有多少个聚类中心,在这篇文章中它们选的是3,000,也就是说你有3,000个 cluster center,3,000这个数字也是之前的一些聚类方法在ImageNet数据集上常用的一个参数)
SwAV的前向过程
- 前面还是都一样的:一个mini-batch的图片,做两次数据增强,得到 x 1 、 x 2 x_1、x_2 x1、x2分别通过编码器得到最后的特征 z 1 、 z 2 z_1、z_2 z1、z2
- 有了 z 1 、 z 2 z_1、z_2 z1、z2之后并不是直接在这个特征上去做对比学习的loss,而是说先通过clustering让特征z和prototype c生成一个目标,也就是这里的 q 1 、 q 2 q_1、q_2 q1、q2
- q 1 、 q 2 q_1、q_2 q1、q2就相当于ground truth,那它真正要做的这个代理任务是什么呢?它的意思是说如果 x 1 、 x 2 x_1、x_2 x1、x2是正样本的话,那 z 1 、 z 2 z_1、z_2 z1、z2的特征就应该很相似,也就跟之前对比学习一样, z 1 、 z 2 z_1、z_2 z1、z2要尽可能的相似
- 那如果两个特征非常相似,或者说含有等量的信息的时候,按道理来说应该是可以互相去做预测的,也就是说,如果拿 z 1 z_1 z1这个特征去跟c去做点乘,按道理来说也是可以去预测 q 2 q_2 q2;反之亦然, z 2 z_2 z2和这个c去做点乘也可以预测 q 1 q_1 q1,所以说点乘之后的结果就是预测,而ground truth就是之前按照clustering分类而得到的 q 1 和 q 2 q_1和q_2 q1和q2
- 所以通过这种Swapped prediction,也就是换位预测的方法,SwAV可以对模型进行训练
用聚类的好处到底有哪些
- 首先,就像SwAV 这篇论文里讲过的一样,如果要跟很多的负样本去做类比,可能就需要成千上万的负样本,而且即使如此也只是一个近似,而如果只是跟聚类中心做对比,则可以用几百或者最多3,000个聚类中心,就足以表示了,因为其实也并没有那么多类,ImageNet也就1,000类,COCO才80类,所以说 3,000个聚类中心就足够用了,这相对于几万个负样本来说还是小了很多的;
- 第二,这些聚类中心是有明确的语意含义的,如果之前只是随机抽样抽取负样本去做对比的话,那些负样本有的可能还是正样的,而且有的时候抽出来的负样本类别也不均衡,所以不如使用聚类中心有效。其实这就是SwAV的基本思想。
实验结果
- SwAV的结果非常好,它不仅比我们之前讲过的方法效果好,其实比之后要讲的BYOL、SimSiam这些都好,算是卷积神经网络里用Res 50分刷的最高的一篇工作,达到了75.3
- 上图表里的性能做的还是ImageNet的linear evaluation,也就之前说的提前预训练好一个模型以后,把这个模型的backbone冻住,只训练最后的那个全连接层
- 而且当使用更大的模型的时候,也就是像右图里说的一样,把一个Res 50变宽,而且就是这里的2倍、4倍、5倍这么宽的时候,SwAV的结果还能不停地涨
- 当用最大的模型(5倍的模型)的时候,SwAV已经跟有监督的模型,差距非常的小,而且SwAV也是要比SimCLR *2、SimCLR 4要高的,所以说从性能上来讲,SwAV 是真的不错
Muti crop
但其实让SwAV有这么好的性能,不光是因为它和聚类的方法融合在了一起,它另外一个主要的性能提升点来自于一个叫multi crop的trick:
- 之前的那些对比的学习方法都是用的两个crop,也就是说一个正样本对 x 1 、 x 2 x_1、x_2 x1、x2两个图片,本来我们有一个图片,先把它resize 到256*256,然后随机crop两个224*224的图片当成 x 1 、 x 2 x_1、x_2 x1、x2,因为这两张图片都非常大,所以它们重叠的区域也非常多,于是它们就应该代表一个正样本
- 但总之就是两个 crop,SwAV的作者就想:用这么大的crop明显抓住的是整个场景的特征,如果更想学习这些局部物体的特征,最好能多个 crop,去图片里crop一些区域,这样就能关注到一些局部的物体了
- 但是增加crop,也就是说增加view,会增加模型的计算复杂度,因为相当于使用了更多的正样本
那如何能同时使用更多的正样本,而又不增加太多的这个计算成本呢?作者就想到了另外一个办法,就是说做点取舍,原来是取了两个224*224的crop,现在把这个crop变得小一点,变成160 ,也就是说取2个160的crop去争取学全局的特征,然后为了增加正样本的数量,为了学一些局部的特征,再去随机选4个小一点crop,然而这4个crop的大小是96*96,这样的话,就意味着现在有6个视角了,而不是像原来一样只有2个视角,所以正样本的数量增多了,但是通过这么一种取舍,整体的计算代价还是差不多的
- 别看这个想法很简单,这个multi crop的技术真的很有用而且它不光是对SwAV有用,对其它的对比学习的方法也有用,下图是实验部分;
CPC、CMC的延伸工作
CPC v2其实也是融合了很多的技巧,它用了更大的模型、用了更大的图像块、做了更多方向上的预测任务,把batch norm 换成了 layer norm,而使用了更多的数据增强,所以这一系列操作下来,CPC v2直接就把CPC v1之前在 ImageNet 上40多的准确率一下就拔到70多
informing其实是 cmc 的作者做的一个分析型的延伸性工作,它论文本身的名字叫 What Makes for Good Views for Contrastive Learning(我们到底选什么样的视角才能对对比学习最好?)
- 它主要是提出了一个InfoMin的原则,就是最小化互信息minimi mutual information,那乍一听觉得可能有点奇怪,因为之前大家做的都是 maximize mutual information,都是想要两个视角之间的互信息达到最大,为什么作者这里就想让它达到最小呢?
- 其实这里也不是严格意义上的最小,作者其实想说的是,他想要不多不少的互信息,如果最大化互信息以后比所需要的互信息要多,也是一种浪费,而且有可能泛化做的不好,但如果互信息比所需求的这个互信息要少,有可能达不到最优的性能,所以这个才是作者的本意,就是不能一味的最大化这个互信息,而是要不多不少刚刚好
- 然后按照Info Min的原则选择合适的数据增强,然后拿到合适的对比学习的视角以后,作者发现对于很多的方法都有提升,它们最后在 ImageNet 上也有73,也是相当不错的
第二阶段总结
其实到了第二阶段很多细节都处于统一了,比如说
- 目标函数都是用infoNCE或者infoNCE类似的目标函数去算的
- 模型最后也都归一到用一个编码器后面加一个projection head
- 都采用了更强的数据增强
- 都想用这个动量编码器
- 都尝试着训练的更久
- 最后在ImageNet上的准确度也逐渐逼近于有监督的基线模型