对比学习发展历程

发展历程大概可以分为四个阶段

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

  • MoCo v3
  • DINO

对于自监督学习来说,无论是对比学习还是最新的掩码学习,都是用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_tCt​是对比学习的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主要包括

  • swap
  • assignment
  • views

核心思想: 给定同样一张图片,如果生成不同的视角,不同的 views 的话,希望可以用一个视角得到的特征去预测另外一个视角得到的特征,因为所有这些视角的特征按道理来说都应该是非常接近的

本文的具体的做法就是把对比学习和之前的聚类的方法合在了一起

  • 首先,聚类方法也是一种无监督的特征表示学习方式,而且呢它也是希望相似的物体都聚集在某一个聚类中心附近,不相似的物体尽量推开推到别的聚类中心,所以跟对比学习的目标和做法都比较接近
  • 另外,这篇文章的一作其实之前一直也是做聚类的,它之前就做过deep cluster这篇工作,也是一篇非常好的无监督学习的论文

网络架构

SwAV与之前架构的对比

  • 上图把之前对比学习的方法总结了一下画到了左边,然后把SwAV的方法画到了右边,这样就比较好对比
  • 左边当然很好理解了,就是同一个图片,做两次数据增强就得到了x_1、x_2x1​、x2​,然后所有的样本通过一个编码器,这个编码器有可能就是个 Res 50,也有可能是一个 Res 50加了一个 projection head,它这里没有明说,反正就是所有的这些都属于一个模型,最后这个模型输出一个特征,一旦有了这个特征,用它做一个对比学习的 loss 就可以了;
  • SwAV说,这么做虽然比较简单,但是直接拿所有图片的特征跟特征做对比有点原始而且有点费资源,因为所有的图片都是自己的类,所以其实像MoCo一样,取了6万个负样本,这还只是个近似,因为其实所有的数据集,所有的负样本理应是128万个图片;
  • SwAV的作者就想,能不能不去做近似,能不能借助一些先验信息不去跟大量的负样本比,而去跟一些更简洁的东西比,然后SwAV的作者就想出来了,可以去跟聚类的中心比(聚类中心就是右图里的c,也就是个prototype,它其实就是个矩阵,它的维度是d * kd∗k,d是特征的维度,这里的d和特征的 d 是一样的,比如说就是之前说的128维,这个k就是有多少个聚类中心,在这篇文章中它们选的是3,000,也就是说你有3,000个 cluster center,3,000这个数字也是之前的一些聚类方法在ImageNet数据集上常用的一个参数)

SwAV的前向过程

  • 前面还是都一样的:一个mini-batch的图片,做两次数据增强,得到x_1、x_2x1​、x2​分别通过编码器得到最后的特征z_1、z_2z1​、z2​
  • 有了z_1、z_2z1​、z2​之后并不是直接在这个特征上去做对比学习的loss,而是说先通过clustering让特征z和prototype c生成一个目标,也就是这里的q_1、q_2q1​、q2​
  • q_1、q_2q1​、q2​就相当于ground truth,那它真正要做的这个代理任务是什么呢?它的意思是说如果x_1、x_2x1​、x2​是正样本的话,那z_1、z_2z1​、z2​的特征就应该很相似,也就跟之前对比学习一样,z_1、z_2z1​、z2​要尽可能的相似
    • 那如果两个特征非常相似,或者说含有等量的信息的时候,按道理来说应该是可以互相去做预测的,也就是说,如果拿z_1z1​这个特征去跟c去做点乘,按道理来说也是可以去预测q_2q2​;反之亦然,z_2z2​和这个c去做点乘也可以预测q_1q1​,所以说点乘之后的结果就是预测,而ground truth就是之前按照clustering分类而得到的q_1和q_2q1​和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_2x1​、x2​两个图片,本来我们有一个图片,先把它resize 到256*256,然后随机crop两个224*224的图片当成x_1、x_2x1​、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上的准确度也逐渐逼近于有监督的基线模型

不用负样本

其实第二阶段里讲的SwAV就已经有不用负样本的对比学习这个趋势了,它可以算是一个承上启下的工作,因为它也没有用负样本,它用的是聚类中心,但它毕竟还是有一个明确的对比的对象

BYOL

BYOL(Boostrap Your Own Latent:A New approach to Self-Supervised Learning)

  • Bootstrp: 提升的意思
  • Latent: 特征的意思

BYOL 的意思就是自己跟自己学,左脚踩右脚就上天了,所以说是一篇很有意思的论文

整体思路

为什么作者很有自信说是a new approach to self supervised learning,因为它完全没有用任何形式的负样本,那为什么不使用负样本就很新奇呢?

  • 因为在对比学习中,负样本是一个约束,如果在算目标函数的时候只有正样本,其实目的就只有一个,那就是让所有相似的物体的特征也尽可能的相似,那这个时候就有一个很明显的捷径:如果一个模型不论给它什么输入,它都返回同样的输出,这样的话,它出来的所有的特征都是一模一样的,那拿这个去算对比学习的loss就都是零,意思就是模型直接就躺平了,它直接用这个捷径解就能完美解决问题loss永远是0模型根本都不用学
  • 只有加上负样本这个约束,就是说不光相似的物体要有相似的特征,然后不相似的物体也要有不相似的特征。这样模型才有动力去继续学,因为如果输出的所有特征都一样,那负样本的loss就无穷大,所以它必须想办法让正样本和负样本的loss都往下降,达到一个最优解
  • 所以说,负样本在对比学习里是个必须的东西,它能防止模型学到捷径,很多论文里也管这个叫model collapse或者learning collapse ,就是模型坍塌或者学习坍塌,说白了就是什么也没学到,负样本就是为了限制这种情况的发生
  • 但BYOL之所以神奇就是它没有用负样本,正样本自己跟自己学最后在ImageNet上也达到了74.3的top-1准确率,也是相当高了

网络架构

BYOL的前向过程

  • 一张图片经过两次数据增强,得到了vv和v'v′,通过Encoder得到特征;两个编码器初始化一样,但是下面的编码器是采用动量更新的;
  • 经过一个project head(就是全连接层),得到256维的特征向量;同样地全连接层初始化一样,但是下方的全连接层采用动量更新;
  • 之前对比学习的方法,当得到这两个特征z_θzθ​和z_εzε​以后,就像SimCLR一样需要让它们尽可能接近,需要达到maximum agreement,但是BYOL没有这么做,它又加了新一层的一个叫predictor的东西;q_θqθ​,q_θqθ​跟g_θgθ​的网络结构是完全一样的,也是一个全连接层,然后就得到了一个新的特征q(z_θ)q(zθ​),为了让这个预测跟下面的z_εzε​尽可能一致,就把原来的匹配问题换成了现在的预测问题;
  • 这个跟SwAV也有点像,因为SwAV也是把配对问题换成了预测问题,但是SwAV还是借助了一个聚类中心来帮助做这个预测任务的,但是BYOL真的是什么都没有,就是自己去预测自己,然后这个模型就学起来了;
  • sg就是stop gradient,这里是没有梯度的,跟MoCo就很像,上面一支相当于是个query编码器,下面一支相当于是key的编码器,key的编码器都是query编码器的动量更新,但不一样的是它的代理任务不一样,它相当于是用自己一个视角的特征去预测另外一个视角的特征,通过这种预测型的任务完成模型的训练 ;

这就是 BYOL 的训练过程,看起来相当简单,而且作者说跟别的工作一样,当训练完成以后只有这个编码器留下了,剩下所有的东西都被拿掉了,最后yθ这个特征去做下游任务;

它训练网络的时候用的目标函数直接用的是mean square MSE loss)

  • 因为现在是两个向量,一个是预测的q_θ(z_θ)qθ​(zθ​),一个是target z_εzε​,现在是想让它们尽可能的接近,所以算一个MSE loss就可以了
  • 这个跟之前对比学习用的那些目标函数全都不一样,所以说BYOL虽然看起来有SimCLR的影子,也有MoCo的影子,比如说SimCLR的projection head、MoCo的动量编码器,但是它用的目标函数不一样,而且也没有用负样本,就用这种自己预测自己的方式学到了很好的特征表示
  • 所以说在它放到arxiv之后,reddit、twitter、知乎全都引起了剧烈的讨论,因为大家都觉得很不可思议,不用负样本,模型的学习怎么能不坍塌,其实作者也觉得很神奇,所以它后面也提供了一些解释,但是它的解释比较中规中矩没有什么意思,看一篇与BN层有关的解释;

BN层知道了副样本

这是一篇blog,understanding self-supervised and contrasive learning with "Boostrap Your Own Latent"(BYOL)

这篇博客的作者其实也是看到BYOL之后觉得非常有意思,所以就尝试复现了一下,结果在复现的时候遗漏了一个小细节,从而导致它的模型训练不动,出现了这个模型坍塌的现象

  • 检查的时候发现一个小细节,这个细节与BN层有关;

先聊一下之前网络的MLP层

  • SimCLR

  • MoCO v2

  • BYOL

为了证明确实是BN层导致的模型学习坍塌,blog作者做了一些额外的实验

如果只做LN,那么跟什么都不做其实没有区别;然后作者给出了一个比较合理的解释:

  • batch norm这个操作是把一个batch里所有样本的特征拿过来算一下它们的均值方差,也就是running mean running variance,然后用整个batch算来的均值和方差做归一化,这也就意味着,当在算某个正样本的loss时,其实也看到了其它样本的特征,也就是说这里面是有信息泄露的,MoCo里有一个操作叫做 Shuffling BN ,也就是为了防止这种信息泄露的,博客的作者就说,因为有这种信息泄漏的存在,所以可以把这个batch里的其它样本想成是一种隐式的负样本;
  • 换句话说,当有了batch norm的时候,BYOL其实并不光是正样本在自己跟自己学,它其实也在做对比,它做的对比任务就是说当前的正样本这个图片跟平均图片有什么差别,而这个平均图片就是batch norm产生的,还有之前很多图片的总结量,这就跟SwAV很像了,因为 SwAV 就是没有跟负样本去比,而是找了个聚类中心去比,而这里batch norm生成的平均图片,其实就相当是一种聚类中心的意思,也就这篇作者说的mode(众数),就是中值的意思;

所以说,这篇博客的作者认为batch norm是BYOL能够成功的关键,其实是做了一种隐式的对比学习,这个观点很快就被大家所接受了,因为听起来确实很合理,而且它后面做了很多实验,也全都验证了它的观点,batch norm确实至关重要,拿掉batch norm以后模型就是不好训练,对超参数的设置非常的敏感,稍有不慎它就啥也不学了。

但是BYOL的作者看到这个以后就急了就觉得说如果真是这样的话,如果真的要用这种方式去解释的话,BYOL的创新性就大大降低了,因为它还是没有逃脱出对比学习的范畴,它还是找了一个东西去做对比,所以赶紧做实验看看能不能找到另外一种解释,为什么BYOL 能够不模型坍塌。

BYOL回应blog

因为BYOL 的作者不想让大家觉得BYOL 的成功是依赖于 batch norm,然后BYOL 的作者做了一系列非常详细的实验看看问题到底出在哪,实验结果如下表所示

  • 这个实验就是说在encoder编码器,就是Res50里到底用batch norm、layer norm,还是什么都不用,还有在projector里到底用batch norm、layer norm,还是什么都不用,或者说在predictor里到底用batch norm、layer norm,还是什么都不用
  • 虽然就这么一个小小的表格,但其实里面的跑的实验是相当多的,做了一个非常完整的消融实验,而且这里还和SimCLR去比了,因为其实BYOL就是基于SimCLR做的,它跟SimCLR非常像

作者发现了这样几个现象

  • batch norm确实是比较关键,因为只要是没有batch norm的地方,SimCLR都工作的很好,可能有一些性能下降,但是都还在学,BYOL全都没有再学了,模型坍塌了
  • 通过这个完整的消融实验,作者还发现了几个特例,正是这些特例帮助作者找到了另外一个可以解释的理由:即使当projector有 bn的时候,BYOL 还是训练失败了,这个就不能解释batch norm很关键了,因为如果batch norm真的很关键,如果真的能在这个隐式负样本提供对比学习的话,训练就不应该失败
  • 还有就是当编码器和project都没有用batch norm的时候,SimCLR也失败了,因为SimCLR没有predictor,所以说这里predictor就无所谓了,意思就是说当什么归一化都不用的时候,不光是BYOL,SimCLR 也不行,它即使用了负样本也训练不出来,所以这就再次证明了,batch norm不是提供了一个隐式的负样本,因为这里即使给它显式的负样本了,它还是训练不出来
  • 所以这时BYOL 的作者和原来博客的作者后来就达成了一个比较一致的结论,就是说batch norm跟它原来的设计初衷一样,它主要的作用就是能帮助这个模型稳定训练,它能提高模型的训练稳健性,从而不会导致模型坍塌,BYOL的作者又把这个结论进一步延伸,然后给出来了一个可以解释的理由,如果一开始就能让模型初始化的比较好,后面的训练即使离开了batch norm也没有问题
  • 于是作者就做了另外一个实验,就是用group norm和weight standardization,group norm就是一种归一化的方式,而weight standardization就是一种模型初始化的方式,这一套方法其实是vit的原班作者在他们之前的论文 BEiT 里提出来了,也就是现在很多人说的ResNet v2就是用这种方式做训练,然后换上这种初始化方式以后,BYOL 的作者发现又能训练74左右的top-1准确率了,跟原来论文里用batch norm的那个74.3的结果非常接近
  • 所以作者最后再次强调说group norm或者weight standardization都没有计算批统计量,所以说这个版本的 BYOL,也就是说这个73.9的 BYOL 是没有跟mini batch里其它的样本做对比的,意思就是说没有隐式的对比,也就意味着说BYOL 还是一个全新的方式,它就是很厉害,就是能自己跟自己学,模型就能学的很好,不需要这种假设batch norm提供的一个隐式的这个对比学习的项,就是说大家不要被那篇博客带跑偏了;

SimSiam

SimSiam(Exploring Simple Siamese Representation Learning), kaiming He团队将对比学习的所有技巧总结了一下,形成一个框架叫SimSiam;

因为大家发现,对比学习的成功好像是被很多很小的点堆起来的性能,比如说我们一路走来可以看到用了新的projection head、训练的时间更长、用了更多的数据增强或者用动量编码器、用更大的 batch size,总之好像都缺一不可,对比学习的性能好像是一点一点被这么堆上去的;

这样就不是很好,不方便分析,因为有太多点了,所以不知道从哪分析起,也不知道每个点到底带来了哪些贡献,所以凯明团队又再次出手,把整个过程化繁为简了一下,最后提出了SimSiam;

整体架构

这个结构有多简单,就是说不需要用负样本(因为它基本上是跟 BYOL是非常像的,所以说它不需要负样本)、不需要大的batch size,不需要动量编码器,然后即使在这种情况下,这个SimSiam不仅不模型坍塌而且还能取得很好的结果;

  • 之所以叫siamese network(孪生网络)是因为一般会有两个编码器,这两个编码器一般网络结构是一样的,而且一般是要共享参数的,所以才叫孪生网络
  • 整体架构是跟BYOL 非常一样的:一个图片变成 x1、x2,然后经过过两个编码器,有一个predictor,其实predictor出来的就是要去预测另外一个编码器出来的特征
  • 这里跟BYOL唯一的不一样就是它没有用动量编码器

前向过程

  • D函数就是怎么去算loss,算的是一个 negative cosine similarities loss,说白了就是一个MSE losss
  • 至于前向过程也跟上图中的一样,得到两个视角x_1、x_2x1​、x2​以后,先过编码器去得到特征z_1、z_2z1​、z2​,然后再通过predictor得到p_1、p_2p1​、p2​的预测,因为有两个预测,所以这里也是一个对称性的loss,就是说,既可以做从p_1p1​预测z_2z2​,也可以做用p_2p2​预测z_1z1​的任务,但因为加了两次,所以说这里也要除以2
  • l就是最后的loss
  • 梯度回传更新网络

最后作者得到一个结论:之所以SimSiam能够成功训练,不会有模型坍塌,主要是因为有stop gradient这个操作的存在(因为这个网络中,Key的Encoder是被梯度截断的)

作者还提出了一个假设,而且在第五节里做了一个 hypothesis:因为有了stop gradient这个操作的存在,所以SimSiam这个结构是可以把它想象成 一个EM的算法;

从这个角度来说SimSiam又跟SwAV有点关系了,于是作者其实在最后还画了这么一张图如下图所示,这张图真的画的非常好,它把所有孪生网络的做法都归纳到在这里,然后做一下总结和对比

  • SimCLR:SimCLR因为是端到端的学习,所以说两边都有梯度回传,但是它还是做的一个对比任务
  • SwAV:做的也是一个对比任务,但它并没有跟负样本去比,而是跟聚类中心去比的,那聚类中心是通过SK算法得到的
  • BYOL:BYOL就有一个新的贡献(就是predictor,图中已经单独画出来了),它就不是一个对比任务,变成一个预测任务了,要用左边去预测右边,同时还使用了动量编码器
  • SimSiam: 整体跟BYOL非常像,左边其实就是一模一样,只不过右边没有用动量编码器,所以这个对比还是比较简洁明了的

实验结果

最后再看一下结果如下表所示,之前BYOL也没有看结果,鉴于SimSiam是一个总结性的工作,它跟之前里程碑式的工作都有对比,所以看这个表格就足够了

在 ImageNet 上linear classification的结果:这里比较的都是重量级工作,比如SimCLR、MoCo v2、BYOL

  • 从batch size来说,只有MoCo v2和SimSiam是可以用256的,其它工作都要用更大的batch size,所以说凯明大佬的工作真的是好follow
  • 前两项工作SimCLR和MoCo v2要用负样本,但是对于BYOL来说就完全没有用,SwAV用的是聚类中心
  • 对于动量编码器来说,SimCLR没有用,SimCLR v2用了,但是v1没有用,MoCo v2和 BYOL用了,SwAV没有用
  • 总的来说,SimSiam就是这些都没有用

看结果的话发现在训练100个epochs的时候,SimSiam的结果是最好的,所以说明它学的非常快,但是随着训练的推进慢慢就不行了,涨幅比较慢,到最后也是有71.3,但是这个时候BYOL已经有74.3这么高了(核心是动量编码器吧)

  • 当然作者在SimSiam这篇论文里,它只是想说把这些trick全拿掉照样能训练,所以说它没有用动量编码器
  • 再来看SwAV,SwAV只有71.8,这个应该是没有用multi crop的技术,所以这就跟之前讲SwAV的时候说的一样,就是如果不用multi crop,SwAV 就跟MoCo v2差不多,还不如MoCo v2,所以说只从分类来说,最强的方法就是BYOL;

在其他下游任务

前面几个做的是物体检测,最后做的是一个实例分割,就是cv人必做的两个下游任务

这里可以看到有一个比较有趣的现象,就是说针对下游任务的transfer来说,MoCo v2和SimSiam其实是表现最好的,BYOL和SwAV也不错,但是跟MoCo v2和SimSiam比还都差了一到两个点,差距还是比较明显,所以说直到现在,如果想去尝试一些idea,或者说尝试去做一些对比学习的工作时,还是会用MoCo v2当基线模型,因为真的是训练快、训练的稳,而且下游任务迁移的好;

Transformer

MoCo v3

moco v3这篇论文虽然题目说的是自监督的Vision Transformer ,但其实MoCo v3只是一种架构,所以说卷积神经网络也可以用,Vision Transformer也可以用;

事实上MoCo v3怎么从v1、v 2变到v3,作者只用了一页去讲,大部分的篇幅都在讲自监督的训练、ViT有多不稳定、发现了一个什么样的问题以及怎样用一个小小的改进就能让这个训练变得更稳定、效果也更好,这个写法就跟SimCLR v2有点像;

  • MoCo v3其实就相当于是MoCo v2和SimSiam 的一个合体;
  • 整体的框架来说,它还是有两个网络,一个是query编码器,一个是key编码器,而且key的编码器是动量编码器,最后的目标函数用的是对比学习的loss,所以说从这个角度讲,它是个MoCo v2;
  • 但是如果仔细看细节就会发现,query编码器现在除了这个骨干网络之外,它还有projection head,还有prediction head,这个其实就是BYOL,或者说是SimSiam;
  • 而且它现在这个目标函数也用的是一个对称项,就是说它既算query1到 key2的,也算这个从query2到 key1的,从这个角度讲它又是SimSiam;

所以说,MoCo v3就是MoCo v2和SimSiam一个很自然的一个延伸工作

因为Vision Transformer的出现,所以说作者就很想把卷积神经网络换掉换成 Vision Transformer ,看看结果到底会变得如何,是不是自监督学习加上Vision Transformer就能取得像nlp那边的成功,然后就迅速试了一下,把骨干网络从一个残差网络换成了ViT,下图展示的是一个vit自监督训练的一个训练曲线;

  • 作者发现当batch size比较小的时候其实还好,这个曲线比较平滑,比如说图中的橘黄线和蓝线在当batch size比较小的时候就比较平滑,不会出什么问题,这个效果也还行
  • 但是当batch size变大了以后,作者就发现这个曲线会莫名出现这种情况:训练的时候突然准确度就掉下来一下,再训练一段时间后又掉下来一下,虽然说它每次还能很快的恢复上去,但是恢复上去就不如原来的那个准确度高了,最后这个准确度也会差很多
  • 按道理来说,一般大batch size会得到更好的结果,但是在这里大batch size反而得到了更差的结果,作者就觉得这是一个问题,这个问题得解决,如果能解决训练的这个问题,很有可能就能用更大的batch size去训练一个更大的Vision Transformer从而得到更好的结果
  • 针对这个问题,MoCo v3 的作者就提出来一个小trick,他是怎么想到这个解决方式的呢?他观察了一下训练的时候每一层回传梯度的情况,这个是比较常见的操作,一般如果网络训练的不好,而且不知道为什么的时候,一般首先就是要去查一下梯度,然后作者就发现,当每次loss有这种大幅的震动导致这个准确度大幅下降的时候,梯度也会有一个波峰,而这个波峰其实是发生在第一层,就是在做patch projection时候(就是那个768x768的那层linear层)
  • 其实就是一个可以训练的全连接层,能训练当然是好事,但是如果每次梯度都不正常,那还不如不训练,所以说作者就简单的尝试一下,如果不训练,直接冻住结果会怎样,所以就随机初始化了一个patch projection层,然后把它冻住,就是整个训练过程中都不变,结果发现问题就解决了,而且很神奇的是这个trick不光是对MoCo v3有用,它对BYOL也有用,如果用BYOL那套框架,把残差网络换成Vision Transformer,刚开始就把patch projection层冻住,一样能获得更平滑的训练曲线,获得更好的训练结果

在这篇论文之后也有很多研究者意识到了第一步tokenization阶段的重要性,所以也有很多后续的工作去改进

DINO

DINO这篇论文也说的是一种自监督训练Vision Transformer的方式,但这篇文章主要的卖点是:Vision Transformer在自监督训练的情况下会有一些非常有趣的特性,它把它效果最炸裂的这些图片放到了文章开头;

这个图的意思就是说一个完全不用任何标签信息训练出来的Vision Transformer ,如果把它的自注意力图拿出来进行可视化的话,会发现它能非常准确的抓住每个物体的轮廓,这个效果甚至能直接媲美对这物体做分割,比如说图中像牙刷还有长颈鹿,这些物体的边界抠的非常的精准,甚至比很多做无监督分割的工作都要做的好;

整体框架

其实它的方法倒不是说多新,跟之前的一系列对比学习的工作都非常的相似,就是换了个方式来讲故事,至于DINO这个名字,来自于它的题目self distillation with no labels,就是distillation和no labe;(self distillation自蒸馏)

  • 对于 MoCo 来说,左边的网络叫做 query 编码器,右边叫做key编码器,对于BYOL 来说,左边叫做online network,右边叫做target network,DINO其实就是延续的BYOL,它只不过是换了个名字,把左边叫成student网络,右边叫成teacher网络
  • 因为student要预测teacher,所以可以把teacher网络的输出想成是ground truth
  • 至于具体的前向过程,跟BYOL或者跟SimSiam都是非常类似的,同样就是当有同一个图片的两个视角以后,用x_1、x_2x1​、x2​通过编码器得到了两个特征,这个编码器自然也是有projection head、prediction head
  • 为了避免模型坍塌,DINO做了另外一个额外的操作,叫做centering,这个操作就是把整个batch里的样本都算一个均值,然后减掉这个均值,其实就算是centering,这个就很像是 BYOL对于 batch norm 的讨论,因为batch norm也是对整个batch里的样本做了一个均值和方差
  • 最后有一个stop gradient的操作然后用p_1p1​去预测p_2p2​

再看看伪代码

它真的跟 MoCo v 3实在是太像了,尤其是前像过程不就是一模一样吗,就只有目标函数稍微有点不一样,这里多了一个centering的操作,防止模型坍塌

第四阶段总结

MoCo v3和DINO这两篇工作,从方法和模型角度上来说,其实它们跟第三阶段基本是一模一样的,主要就是融合了Vision Transformer;

CV领域的对比学习总结

CV领域的对比学习综述(上)

CV领域的对比学习综述(下)

CV领域的对比学习综述相关推荐

  1. CV领域的对比学习综述(下)

    CV领域的对比学习综述(下) – 潘登同学的深度学习笔记 文章目录 CV领域的对比学习综述(下) -- 潘登同学的深度学习笔记 对比学习发展历程 不用负样本 BYOL 整体思路 网络架构 BN层知道了 ...

  2. 一点就分享系列(理解篇3)—Cv任务“新世代”之Transformer(下篇)提前“cv领域展开”——快速学习“视觉transformer的理解”+“一些吐槽”

    一点就分享系列(理解篇3)Cv任务"新世代"之Transformer(下篇)--"cv领域展开" 提示:本篇内容为下篇,如感兴趣可翻阅上和中篇! 理解篇3 上 ...

  3. 对比学习有多火?文本聚类都被刷爆了…

    文 | 花小花Posy 大家好,我是小花. 对比学习的大火???? 越来越旺了,已然从CV蔓延到NLP了.今天给大家介绍的正是一篇将对比学习应用到文本聚类上的工作,NAACL21新鲜出炉的paper- ...

  4. 论文浅尝 | DeCLUTR: 无监督文本表示的深度对比学习

    Giorgi, J. M., O. Nitski, G. D. Bader and B. Wang (2020). "DeCLUTR: Deep Contrastive Learning f ...

  5. TensorFlow 2学习和工业CV领域应用 心得分享

    我是一名来自苏州的机器视觉开发者,从事传统的机器视觉算法开发有11年了,从2018年开始,因为一些复杂微弱的瑕疵检测项目遇到的传统算法瓶颈,开始接触到了深度学习,并选择了使用TensorFlow,期间 ...

  6. 技术动态 | 图对比学习的最新进展

    转载公众号 | DataFunSummit 分享嘉宾:朱彦樵 中国科学院自动化研究所 编辑整理:吴祺尧 加州大学圣地亚哥分校 出品平台:DataFunSummit 导读:本文跟大家分享下图自监督学习中 ...

  7. MATLAB算法实战应用案例精讲-【人工智能】对比学习(概念篇)

    目录 前言 几个高频面试题目 推荐领域的对比学习在设计代理任务时与CV和NLP领域有什么不同?

  8. 图表示学习+对比学习入门必看:DGI

    来源:投稿 作者:kon 编辑:学姐 前言 众所周知,火热的对比学习不仅在CV取得了很多成果,也在NLP.推荐等领域大放异彩.自然的,有人将对比学习引入了图表示学习领域,利用图本身的结构与结点自身的特 ...

  9. 对比学习学到了什么?(交流帖)

    前言:前段时间在某厂进行算法实习,主要内容是如何将对比学习引入到推荐算法中去.再次期间我们调研了大量的cv领域的对比学习方法以及少数的对比学习应用在推荐中的文章,虽然也在前人的经验上提出了一些新的东西 ...

最新文章

  1. html判断数字数据的大小写,判断一个字符是否是数字、还是大小写字母
  2. 《Web 标准实战》——Web开发人员必读的一本书
  3. 关于产品版本英语缩写
  4. mongodb-查询
  5. matlab file(i).name,求大佬帮忙备注一下,有点看不懂,详细一点
  6. YVU420PackedSemiPlanar32m4ka与YUV420PackedSemiPlanar64x32Tile2m8ka
  7. Alfred中使用技巧:不要迷失在翻译中,在Alfred中使用Google翻译
  8. 合并传闻是真是假?ofo摩拜之争是否继续?(产品)
  9. matlab图像处理Lena大作业
  10. 机器学习-百度笔试题
  11. .net快速开发框架源码分享
  12. matlab偏导数方程,利用Matlab求解不同类型的偏微分方程
  13. 手把手教你运用JAVA爬虫技术爬取小说
  14. 关于计算机学院的毕业论文致谢,计算机学院毕业生论文致谢范文
  15. 干货 | 如何做一档好节目?
  16. 内网外网服务器时间同步解决方案
  17. leetcode189 python旋转数组
  18. jq onclick 定义_jquery onclick函数未定义(jquery onclick function not defined)
  19. vue中的 vxe-table表格插件 实现树形数据表
  20. FCF中文指南-第三章--FusionCharts Free我的第一个图形

热门文章

  1. Mac(2) Parallels Desktop 安装 CentOS7
  2. TCP/IP知识点总结
  3. dataframe数据筛选后求和
  4. php实现dota天梯、wow竞技场、lol排位赛匹配加分算法ELO
  5. 在过去有关电信版iPhone4S的上市传闻中
  6. 解决 Win10 热点无法上网及与 Hyper-V 虚拟网卡冲突问题
  7. 了解全角和半角,以及全角和半角的相互转换
  8. 华为手机这么强大的相机功能,你只用来拍照?也太浪费了
  9. Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement
  10. matlab三角波的傅立叶变换,观察三角波和反三角波序列的时域和幅频特性comma;用Nequals;8点FFT...