第四阶段主要是讲Transformer是怎么和对比学习有机结合起来的,在这个阶段主要就是简单的讲一下MoCo v3和DINO这两篇工作
An Empirical Study of Training Self-Supervised Vision Transformers
moco v3这篇论文虽然题目说的是自监督的Vision Transformer ,但其实MoCo v3只是一种架构,所以说卷积神经网络也可以用,Vision Transformer也可以用
事实上MoCo v3怎么从v1、v 2变到v3,作者只用了一页去讲,大部分的篇幅都在讲自监督的训练、ViT有多不稳定、发现了一个什么样的问题以及怎样用一个小小的改进就能让这个训练变得更稳定、效果也更好,这个写法就跟SimCLR v2有点像
而MoCo v3大部分的篇幅都是在讲怎么样去提高ViT训练的稳定性,所以就是为什么这篇论文的题目叫做一个实验性的study
摘要还是一贯的直白,上来就写这篇论文并没有描述一个新的方法,接下来作者就说其实这篇论文就是做了一个很直接、很小的一个改动,让自监督的ViT训练的变得更稳定了,但是不得不写一篇论文来把这个发现告诉大家,因为自监督的训练Vision Transformer已经是大势所趋了,这里有很多有趣的发现,所以我们分享给大家看,所以这篇论文的影响力依旧很大,它是ICCV 21的一篇口头报告论文
在讲训练稳定性之前,先看一下MoCo v3的架构,因为没有模型总览图,所以直接看伪代码如下图所示
*MoCo V3伪代码*
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这篇论文以后也说,之前在训练别的任务的时候也遇到过类似的问题,有人也采用类似的方式解决了这个问题,有人也就没有管,所以说有的时候很小的一个问题,也可以是一个问题的很好的出发点
针对这个问题,MoCo v3 的作者就提出来一个小trick,他是怎么想到这个解决方式的呢?他观察了一下训练的时候每一层回传梯度的情况,这个是比较常见的操作,一般如果网络训练的不好,而且不知道为什么的时候,一般首先就是要去查一下梯度,然后作者就发现,当每次loss有这种大幅的震动导致这个准确度大幅下降的时候,梯度也会有一个波峰,而这个波峰其实是发生在第一层,就是在做patch projection时候
这个patch projection是什么呢?如果读过Vision Transformer的论文就知道,这个其实是属于模型的第一步,属于tokenization的那个阶段----就是如何把一个图片把打成 patch,然后给它一个特征。
这一步是怎么做的呢?其实就是一个可以训练的全连接层,能训练当然是好事,但是如果每次梯度都不正常,那还不如不训练,所以说作者就简单的尝试一下,如果不训练,直接冻住结果会怎样,所以就随机初始化了一个patch projection层,然后把它冻住,就是整个训练过程中都不变,结果发现问题就解决了,而且很神奇的是这个trick不光是对MoCo v3有用,它对BYOL也有用,如果用BYOL那套框架,把残差网络换成Vision Transformer,刚开始就把patch projection层冻住,一样能获得更平滑的训练曲线,获得更好的训练结果
在这篇论文之后也有很多研究者意识到了第一步tokenization阶段的重要性,所以也有很多后续的工作去改进
第一阶段说白了,如果不想改Transformer这个模型本身,因为它又简单扩展性越好,所以说如果中间这一块我们不动,那能改的除了开始就是结尾,那开始就是tokenization阶段,结尾就是改目标函数
Emerging Properties in Self-Supervised Vision Transformers
DINO这篇论文也说的是一种自监督训练Vision Transformer的方式,但这篇文章主要的卖点是:Vision Transformer在自监督训练的情况下会有一些非常有趣的特性,它把它效果最炸裂的这些图片放到了图一如下图所示,放到了文章开头
DINO 效果图
这个图的意思就是说一个完全不用任何标签信息训练出来的Vision Transformer ,如果把它的自注意力图拿出来进行可视化的话,会发现它能非常准确的抓住每个物体的轮廓,这个效果甚至能直接媲美对这物体做分割,比如说图中像牙刷还有长颈鹿,这些物体的边界抠的非常的精准,甚至比很多做无监督分割的工作都要做的好
DINO具体操作如下图所示
其实它的方法倒不是说多新,跟之前的一系列对比学习的工作都非常的相似,就是换了个方式来讲故事,至于DINO这个名字,来自于它的题目self distillation with no labels,就是distillation和no label
整个框架叫一个蒸馏的框架,至于为什么是自蒸馏,其实就跟BYOL一样,因为自己跟自己学或者自己预测自己,所以就是自蒸瘤
对于 MoCo 来说,左边的网络叫做 query 编码器,右边叫做key编码器,对于BYOL 来说,左边叫做online network,右边叫做target network,DINO其实就是延续的BYOL,它只不过是换了个名字,把左边叫成student网络,右边叫成teacher网络
因为student要预测teacher,所以可以把teacher网络的输出想成是ground truth
至于具体的前向过程,跟BYOL或者跟SimSiam都是非常类似的,同样就是当有同一个图片的两个视角以后,用x1、x2通过编码器得到了两个特征,这个编码器自然也是有projection head、prediction head
为了避免模型坍塌,DINO做了另外一个额外的操作,叫做centering,这个操作就是把整个batch里的样本都算一个均值,然后减掉这个均值,其实就算是centering,这个就很像是 BYOL对于 batch norm 的讨论,因为batch norm也是对整个batch里的样本做了一个均值和方差
最后有一个stop gradient的操作然后用p1去预测p2
再看伪代码如下图所示
它真的跟 MoCo v 3实在是太像了,尤其是前像过程不就是一模一样吗,就只有目标函数稍微有点不一样,这里多了一个centering的操作,防止模型坍塌
总结
MoCo v3和DINO这两篇工作,从方法和模型角度上来说,其实它们跟第三阶段基本是一模一样的,主要就是融合了Vision Transformer
到这里就把过去两三年比较有代表性的对比学习的工作都串了一遍,这里我们就再画一张大图如下图所示,整体再快速的把这些工作再过一遍,看一下它们之间的联系与不同
从最开始的Inst Disc开始,它提出了个体判别的任务,而且它提出用一个 memory bank的外部数据结构去存储负样本,从而能达到一个又大又一致的字典去做对比学习
如果不用外部结构的话,另外一条路就是端到端的学习,也就是Inva Spread这篇论文做的,它就只用了一个编码器,从而可以端到端的学习,但因为受限于batch size 太小,所以说它的性能不够好
CPC v1这篇论文提出了infoNCE这个loss,而且CPC v1是一个预测型的代理任务,不仅可以做图像,还可以去做音频、视频、文字和加强学习,是一个非常全能的结构
最后还有CMC这个工作,它就把两个视角的任务扩展到了多个视角,从而给接下来多视角或者多模态的这个对比学习打下了铺垫
另外还有一篇论文deep cluster并没有讲,它是基于聚类学习的,当时还没有用对比学习
第二阶段主要是MoCo v1开始,它算是Inst Disc的一个延伸性工作,它把memory bank变成了一个队列,然后把动量更新特征,变成了动量更新编码器,从而能预训练一个很好的模型
MoCo也是第一个能在很多视觉的下游任务上,让一个无监督预训练的模型比有监督预训练模型表现好的方法,它属于使用外部数据结构的
自然端到端的学习肯定也有延伸性的工作,也就是SimCLR v1,SimCLR v1跟Inva Spread方法是很像的,但是它用了很多的技术,比如说加大了batch size,用了更多的数据增强,加了一个projection head,训练的更长时间,总之所有的这些技术堆起来让SimCLR在ImageNet取得了非常好的的结果
然后CPC v1把这些技术也全都拿来用了一遍,CPC v2就直接比CPC v1在ImageNet 上高了30多个点
最后CMC把这些都分析一下,提出了一个info Min的这个原则,它说两个样本或者两个视角之间的互信息,要不多不少才是最好的
然后MoCo的作者看到SimCLR用的这些技术确实都很管用,所以就把这些即插即用的技术拿过来用在MoCo上,就有了MoCo v2,MoCo v2的效果就比MoCo v1和SimCLR v1都要好
然后SimCLR的作者也对模型进行了一些改动,得到了SimCLR v2,但SimCLR v2主要是去做半监督学习的
之前提deep cluster主要就是为了引出SwAV,SwAV就是把聚类学习和对比学习结合起来的一个工作,也取得了不错的结果,但它这个不错的结果主要是来自于它提出的multi crop的技术,如果没有这个技术,它其实跟SimCLR或者MoCo v2的结果都是差不多的
因为处理负样本实在是太过麻烦,所以BYOL就说能不能不要负样本,能不能不去跟负样本做对比,结果它们发现还真行,就自己跟自己学,把一个对比任务变成一个预测任务就可以了,而且目标函数也很简单,不再使用info NCE,而是用一个简单的mse loss就可以训练出来
但是大家都觉得很不可思议,所以立马就有一篇这个博文出来,它们就假设说BYOL能够工作主要是因为有batch norm,这个batch norm提供了一种隐式的负样本,所以BYOL 能够正常训练而不会模型坍塌
但是 BYOL 的作者很快就又发了另外一篇论文叫BYOL v2,通过做了一系列实验以后,最后说batch norm只是帮助了模型的训练,如果能用另外一种方式能提供一个更好的模型初始化,BYOL不需要batch norm提供的那些batch的统计量照样能工作,就把之前博客里提出来假设给打破了,但它们提出的其实也只是另外一个新的假设
紧跟着BYOL,SimSiam 就出来了,SimSiam就把之前的工作都总结了一下,因为它觉得之前的这些论文都在一点一点往上堆技术,那如果堆的太多了就不好分析了,这个领域也就不好再推进下去了,所以SimSiam就化繁为简,又提出来一个很简单的孪生网络的学习方法,它既不需要用大的batch size,也不需要用动量编码器,也不需要负样本,然后照样能取得不错的结果,SimSiam提出的假设就是说stop gradient这个操作是至关重要的,因为有这个操作的存在,所以SimSiam可以看成是一种EM算法,通过逐步更新的方式避免模型坍塌
另外还有一篇工作叫barlow twins,它主要就是更换了一个目标函数,把之前大家做的这种对比或者预测变成了两个矩阵之间去比相似性,因为它已经是21年3月提出来的,所以很快就淹没在了Vision Transformer这波洪流之中
主要讲的两个工作就是MoCo v3和DINO,其实都是把骨干网络从残差换成了ViT,主要学习的方法其实是没有改变的
但是换成Vision Transformer以后,面临的问题都是训练不稳定或者不好训练,所以他们就提出了各自的方法:MoCo v3提出来把patch projection layer冻住,DINO就提出把teacher网络的输出先做一下归一化,做一下centering。这2种方式都能有效的提高模型训练的稳健性,防止模型坍塌,让Vision Transformer用自监督的方式也能训练的很好
到此,又把所有的这些工作快速的串了一遍,现在对比学习还是一个很火的方向,虽然说可能没有Vision Transformer那么火,而且尤其是MAE火爆了以后,大家都去尝试掩码学习,而不是去尝试对比学习了,所以说对比学习又从一个火爆发展期变成了一个发展潜伏期
但是我对它的前途还是非常看好的,毕竟多模态的对比学习还是一个主流,CLIP的效果就很好,下次也会讲到CLIP这篇工作,而且在多模态里面,图像和文本对之间的对比学习loss还是一个标准的目标函数,基本上所有的工作都有在用,而且对比学习它属于一个想法而不是具体的一个工作,它在几十年之前就已经提出来了,所以接下来我们应该还是会看到很多对比学习的工作的,我很期待对比学习跟其它方法的结合
LIP这篇工作,而且在多模态里面,图像和文本对之间的对比学习loss还是一个标准的目标函数,基本上所有的工作都有在用,而且对比学习它属于一个想法而不是具体的一个工作,它在几十年之前就已经提出来了,所以接下来我们应该还是会看到很多对比学习的工作的,我很期待对比学习跟其它方法的结合