赞
踩
1、百花齐放:在这个阶段中,方法、模型、目标函数、代理任务都还没有统一,所以说是一个百花齐放的时代。
2、CV双雄:这个阶段发展非常迅速,上述工作有的间隔一两个月,有的间隔甚至不到一个月,ImageNet上的成绩基本上每个月都在被刷新
3、不用负样本
4、transformer:对于自监督学习来说,无论是对比学习还是最新的掩码学习,都是用Vision Transformer做的
这里只是把最有联系的一些工作串到一起,讲述他们的相似之处和不同之处。
论文名称:Unsupervised Feature Learning via Non-Parametric Instance Discrimination
1、这篇论文提出了个体判别任务以及memory bank。
2、下图讲述了文章中的方法:
3、前向过程:
4、本文的方法还有很多细节都设计的非常巧妙
比如说 proximal regularization:它给模型的训练加了一个约束,从而能让 memory bank 里的那些特征进行动量式的更新,跟 MoCo 的想法是非常一致的
另外设置里面超参数的设定,比如说算 loss 的时候温度的设置是0.07,选了4,000个负样本,训练是200个epochs,batch size 是256,起始的 learning rate 是0.03,之后其它论文(尤其是 MoCo)所有的这些实验细节,MoCo 都是严格按照 Inst Disc 来的,这些超参数都没有进行更改。所以说 Inst Disc 这篇论文也是一个里程碑式的工作:它不仅提出了个体判别这个代理任务,而且用这个代理任务和 NCE loss做对比学习,从而取得了不错的无监督表征学习的结果,同时它还提出了用别的数据结构存储这种大量的负样本,以及如何对特征进行动量的更新,所以真的是对后来对比学习的工作起到了至关重要的推进作用。
这是一篇 CVPR 19的论文,跟今天要说的其它论文相比,它的影响力可能不是那么大,之所以提一下这篇论文,是因为它可以被理解成是 SimCLR 的一个前身,它没有使用额外的数据结构去存储大量的负样本,它的正负样本就是来自于同一个 minibach,而且它只用一个编码器进行端到端的学习
这篇文章也没有给自己起名字,所以就像 Inst Disc 一样就叫它 Inva Spread 好了,所以写论文的时候,最好还是给自己的方法起个名字,而不是叫 ours,这样方便别人记住也方便别人引用,也是一个双赢的事情。
如下图所示,同样的图片通过编码器以后,它的特征应该很类似,不同的图片,它的特征出来就应该不类似,这就是题目中说的invariant和 spreading,就是说对于相似的图片、相似的物体,特征应该保持不变性,但是对于不相似的物体或者完全不沾边的物体,特征应该尽可能的分散开。
1、具体做法:
代理任务也是选取了个体判别这个任务
2、 前向过程:
一般机器学习分为判别式模型和生成式模型,个体判别显然是属于判别式范畴的,那肯定就会有一些生成式的代理任务,比如最常见的预测型的任务。
CPC这篇论文其实非常厉害,因为它是一个很通用的结构
CPC是用预测的代理任务做对比学习,CMC这篇论文定义正样本的方式就更为广泛了:一个物体的很多个视角都可以被当做正样本。
1、CMC的摘要写的非常好:
2、方法:
这里之所以是双雄,其实主要想讲的是MoCo和SimCLR
这次主要就讲和其它工作的区别和联系:
MoCo 的主要贡献就是把之前对比学习的一些方法都归纳总结成了一个字典查询的问题,它提出了两个东西:队列和动量编码器,从而去形成一个又大又一致的字典,能帮助更好的对比学习。
MoCo跟Inst Disc是非常相似的:
但是整体的出发点以及一些实现的细节都是非常类似的:
MoCo 的这个实现细节:
所以,说MoCo是Inst Disc一个改进型工作也不为过,但是MoCo真正出色的地方其实有两点:
所以说MoCo这种自顶向下的写作方式也是非常值得借鉴的,但这个真的是需要功力,稍有把握不慎别人可能就看不懂了。
这个方法真的是够简单,这就是为什么很多博客在介绍对比学习的时候都用SimCLR当例子,因为它概念上更容易理解,方法上也很容易解释,只不过batch size太大,一般人不好上手。
和MoCo比起来确实很简单,这里只有一个编码器,既不需要memory bank,也不需要队列和动量编码器;正负样本全都是从同一个mini-batch里来的;整个前向过程非常的直接,就是图片进入编码器编码然后projector降维(原先MoCo等对比学习方法预训练时没有加这个projector降维,是直接在Resnet50这里面输出的特征为128维,而此处的SimCLR是ResNet50出来的是2048维,然后经过projector非线性层进行降维到128),最后算个对比学习的loss,非常符合大家对深度学习工作的期待。
前面说invariant spread可以看作是SimCLR的前身,为什么这么说呢?本文其实整体的这个思路和结构跟SimCLR是基本一致的,SimCLR跟Inva Spread的区别其实都写在SimCLR的贡献列表里了:
乍一看这些贡献有些读者可能就会觉得这些技术不都或多或少在之前的工作里被提出来过吗?所以说在这篇论文里,作者专门把相关工作放到了第七节,相当于文章的最后才去讲相关工作,它比较细致的跟之前手工的代理任务做了对比,然后跟最近的对比学习也做了对比,而且作者最后非常谦虚的写了这么一段话:就是说基本上所有的这些单个的这些贡献在之前的工作里都被提出来过了,虽然有的时候这个实现的形式可能不太一样,但是作者强调说SimCLR 的优越之处就是在于它的成功不是由任何一个单一的设计决定,而是把所有的这些技术结合起来而得到的一个结果,而且作者把详细的消融实验,以及它们的设计选择全都放到了附录里,所以说作者团队真的是非常贴心,而且非常谦虚了。
而事实上呢,SimCLR这篇文章中提出来的很多技术都对后续的工作产生了长远的影响力,比如说在编码器之后加这么一个mlp层,在之后的MoCo v2、BYOL这些工作里全都有使用;它使用的数据增强的策略在之后的工作里也是被广泛的使用;它使用lars这个优化器去做大batch size的这个模型训练,之后BYOL 也采用了同样的策略。总之SimCLR真的是够简单,而且为后续的很多研究铺平了道路。
最后稍微讲一下SimCLR这篇论文里的贡献:
1、第一个就是数据增强
2、另外一个就是说SimCLR这篇文章提出的非线性变换,也就是说在编码器后面加一层MLP+Relu层
如下图所示,如果h是一个res 50出来的特征,也就是2048维的话,那z就是经过了projector之后的维度,一般是128
然后会发现两个很有意思的现象
因为这里提升10个点实在是太过诡异,所以作者还做了很多实验去验证这个想法,比如说在表3里就做了一些实验,但是也仅仅是一些实验,并不一定能真的证明这个事,至今好像也没有一个理论上的解释。
因为MoCo和SimCLR的结果实在是太过惊艳,所以从2020年开始就掀起了一波对比学习的狂潮,基本上每天只要去刷arxiv,都会有对比学习的论文,这波热浪一直到20年年底Vision Transformer出来以后才逐渐消退。
MoCo v2其实是一个只有两页的技术报告,严格意义上不算是一篇论文了,但即使只有两页,信息量也是相当大
MoCo v2主要就是说,在看到SimCLR这个比较好的结果以后,它们发现SimCLR里的那些技术都是即插即用型的,所以说他们就把那些就拿过来了,它直接说,就在MoCo上面做很简单的改动,引入了mlp projection head以及使用更多的数据增强,就又刷新ImageNet 上的最好成绩,不仅比之前的MoCo高很多,而且比最新的SimCLR也要高很多。
注意,SimCLR是2月13号才放到arxiv上的,MoCo v2是3月9号就放到arxiv上了,所以说这个节奏是相当快的。MoCo v2 具体进行了哪些改进?如下表所示:
准确的说就四个方面:
ImageNet 上结果:
无监督学习真的是训练的越久或者模型越大,它的结果就会越好。
接下来作者主要跟SOTA进行了比较,其实也就是MoCov1和 SimCLR这些工作,如下表2所示:
接下来作者又再次强调了一下为什么要用MoCo以及MoCo相比于SimCLR的优越性如上图中表3所示:
如果想要端到端的这个学习走4096的这个batch size就是说让它的performance变好,变成66.6,虽然说还没有MoCo v2好,但也差不多,性能上比较相近,那它对硬件的要求就太高了。
因为这种端到端的学习方式,包括SimCLR、BYOL、SwAV默认都是用8台8卡机去做训练的,也就是有64张gpu,才能在一两天这个合理的时间内把训练完成,而MoCo只需要一台8卡机就可以在两天的时间内完成。
其实SimCLR v2,只是这篇论文一个很小的部分,它只是说怎么从v1变到v2,就是一个模型上的改进,而事实上都在讲如何去做半监督的学习。它主要想说的体现在它的这个标题里了:非常大的自监督训练出来的模型非常适合去做半监督学习
模型总览图如下图所示:
这篇文章分了三个部分
整个框架其实也是受启发于google的另外一篇工作(19年的一篇叫
noisy student 的工作)
作者其实就在第三页大概花了半页的篇幅来讲了一讲怎么把v1变成v2了,其实大概就是提高了这三个点:
总的来说就是三点改进:
如果不算半监督学习的内容的话,SimCLR v2也是一个2页的技术报告,而且不论是SimCLR v1还是v2,都只做了分类这个任务,但是MoCo就广泛的很多了,至少做了四五个下游的任务,而且刷了很多的数据集,所以MoCo系列工作就更cv friendly,所以它投的都是cv的会议,而SimCLR v1就是 ICML,而SimCLR v2就是 Neural IPS,所以说投对口的会议也很重要。
SwAV:Swap Assignment Views ,给定同样一张图片,如果生成不同的视角,不同的 views 的话,希望可以用一个视角得到的特征去预测另外一个视角得到的特征,因为所有这些视角的特征按道理来说都应该是非常接近的
本文的具体的做法就是把对比学习和之前的聚类的方法合在了一起,当然这么想也不是偶然
具体 SwAV 是怎么和聚类的方法融合起来的呢?
SwAV的前向过程:
用聚类的好处到底有哪些?
首先,就像SwAV 这篇论文里讲过的一样,如果要跟很多的负样本去做类比,可能就需要成千上万的负样本,而且即使如此也只是一个近似,而如果只是跟聚类中心做对比,则可以用几百或者最多3,000个聚类中心,就足以表示了,因为其实也并没有那么多类,ImageNet也就1,000类,COCO才80类,所以说 3,000个聚类中心就足够用了,这相对于几万个负样本来说还是小了很多的
第二,这些聚类中心是有明确的语意含义的,如果之前只是随机抽样抽取负样本去做对比的话,那些负样本有的可能还是正样的,而且有的时候抽出来的负样本类别也不均衡,所以不如使用聚类中心有效。其实这就是SwAV的基本思想。(如果对聚类算法比较感兴趣,以先去看deep cluster deep cluster two,然后再来看这篇 SwAV 的论文)
SwAV的结果非常好,它不仅比我们之前讲过的方法效果好,其实比之后要讲的BYOL、SimSiam这些都好,算是卷积神经网络里用Res 50分刷的最高的一篇工作,达到了75.3
下图表里的性能做的还是ImageNet的linear evaluation,也就之前说的提前预训练好一个模型以后,把这个模型的backbone冻住,只训练最后的那个全连接层
表中之前不是对比学习的方法都还比较低,可能都是在60以下,有了对比学习以后,从 MoCo 开始基本上就上60了,然后CPC v2刷到63.8,SimCLR刷到70,MoCo v2刷到71.1,之后要讲的BYOL其实74点几,SimSiam也是74点几
所以说75.3就算是最高的了,而且这个75.3是你把backbone冻住的情况下去做的,如果跟有监督的基线模型去比的话,这个有监督的基线模型是从头到尾都在ImageNet 上训练,最后的结果也就是76.5,所以说SwAV 已经是非常非常逼近这个结果
而且当使用更大的模型的时候,也就是像右图里说的一样,把一个Res 50变宽,而且就是这里的2倍、4倍、5倍这么宽的时候,SwAV的结果还能不停地涨
当用最大的模型(5倍的模型)的时候,SwAV已经跟有监督的模型,差距非常的小,而且SwAV也是要比SimCLR *2、SimCLR * 4要高的,所以说从性能上来讲,SwAV 是真的不错
但其实让SwAV有这么好的性能,不光是因为它和聚类的方法融合在了一起,它另外一个主要的性能提升点来自于一个叫multi crop的trick:
作者在下图中就做了一些实验:
这里简单提一下:
1、CPC v2其实也是融合了很多的技巧,它用了更大的模型、用了更大的图像块、做了更多方向上的预测任务,把batch norm 换成了 layer norm,而使用了更多的数据增强,所以这一系列操作下来,CPC v2直接就把CPC v1之前在 ImageNet 上40多的准确率一下就拔到70多。
2、informing其实是 cmc 的作者做的一个分析型的延伸性工作,它论文本身的名字叫 What Makes for Good Views for Contrastive Learning(我们到底选什么样的视角才能对对比学习最好?)
其实到了第二阶段很多细节都处于统一了,比如说:
其实第二阶段里讲的SwAV就已经有不用负样本的对比学习这个趋势了,它可以算是一个承上启下的工作,因为它也没有用负样本,它用的是聚类中心,但它毕竟还是有一个明确的对比的对象
接下来要讲的BYOL和SimSiam其实就是正样本自己在玩,已经没有负样本或者聚类中心这样明确的一个对比的东西去做对比了。
BYOL其实就是这句话的头几个字母
Bootstrap就是说如果已经有什么东西了,然后在它之上进行改造,
latent就是特征的意思(latent、hidden、feature、embedding其实都是特征的意思,就是各种花里胡哨的用法而已)
BYOL 的意思就是自己跟自己学,左脚踩右脚就上天了,所以说是一篇很有意思的论文,为什么作者很有自信说是a new approach to self supervised learning,因为它完全没有用任何形式的负样本。
为什么不用负样本就这么新奇、这么吸引人注意?
因为在对比学习中,负样本是一个约束,如果在算目标函数的时候只有正样本,其实目的就只有一个,那就是让所有相似的物体的特征也尽可能的相似,那这个时候就有一个很明显的捷径:如果一个模型不论给它什么输入,它都返回同样的输出,这样的话,它出来的所有的特征都是一模一样的,那拿这个去算对比学习的loss就都是零,意思就是模型直接就躺平了,它直接用这个捷径解就能完美解决问题loss永远是0模型根本都不用学。
只有加上负样本这个约束,就是说不光相似的物体要有相似的特征,然后不相似的物体也要有不相似的特征。这样模型才有动力去继续学,因为如果输出的所有特征都一样,那负样本的loss就无穷大,所以它必须想办法让正样本和负样本的loss都往下降,达到一个最优解。
所以说,负样本在对比学习里是个必须的东西,它能防止模型学到捷径,很多论文里也管这个叫model collapse或者learning collapse ,就是模型坍塌或者学习坍塌,说白了就是什么也没学到,负样本就是为了限制这种情况的发生
但BYOL之所以神奇就是它没有用负样本,正样本自己跟自己学最后在ImageNet上也达到了74.3的top-1准确率,也是相当高了。
因为BYOL是20年6月份出来的,跟SwAV是同期的工作,所以它不用跟SwAV去比,那在这之前74.3就是最高的
BYOL为什么能够做到不需要负样本?下图是模型总览图 :
BYOL的前向过程:
一个mini-batch的输入x经过两次数据增强以后,就得到了v和v’,然后图片通过编码器得到特征
上面这一支通过的编码器叫fθ,下面这个通过的编码器呢叫fε,两个编码器使用是同样的网络架构,但是它们的参数值不同
fθ是随着梯度更新而更新的,而这个fε跟MoCo一样是用moving average的形式去更新的,其实就是使用了动量编码器
这里得到的特征,如果是res 50的话就是2048维的一个特征
接下来跟SimCLR一样用了一个projection head,这里叫 projector,就是通过gθ这个函数得到zθ的特征,zθ在这里是256维,比之前的128大了一点,发现这个效果好一点
同样地,gε其实跟gθ是一样的网络结构,但是参数值不一样,也是通过动量的方式去更新的
之前对比学习的方法,当得到这两个特征zθ和zε以后,就像SimCLR一样需要让它们尽可能接近,需要达到maximum agreement,但是BYOL没有这么做,它又加了新一层的一个叫predictor的东西qθ,qθ跟gθ的网络结构是完全一样的,也是一个mlp,然后就得到了一个新的特征q(zθ),为了让这个预测跟下面的zε尽可能一致,就把原来的匹配问题换成了现在的预测问题。
这个跟SwAV也有点像,因为SwAV也是把配对问题换成了预测问题,但是SwAV还是借助了一个聚类中心来帮助做这个预测任务的,但是BYOL真的是什么都没有,就是自己去预测自己,然后这个模型就学起来了
sg就是stop gradient,这里是没有梯度的,跟MoCo就很像,上面一支相当于是个query编码器,下面一支相当于是key的编码器,key的编码器都是query编码器的动量更新,但不一样的是它的代理任务不一样,它相当于是用自己一个视角的特征去预测另外一个视角的特征,通过这种预测型的任务完成模型的训练。
这就是 BYOL 的训练过程,看起来相当简单,而且作者说跟别的工作一样,当训练完成以后只有这个编码器留下了,剩下所有的东西都被拿掉了,最后yθ,也就是这个2048维的特征去做下游任务
它训练网络的时候用的目标函数直接用的是mean square erro(mse los)
因为现在是两个向量,一个是预测的qθ(zθ),一个是target zε,现在是想让它们尽可能的接近,所以算一个mse loss就可以了
这个跟之前对比学习用的那些目标函数全都不一样,所以说BYOL虽然看起来有SimCLR的影子,也有MoCo的影子,比如说SimCLR的projection head、MoCo的动量编码器,但是它用的目标函数不一样,而且也没有用负样本,就用这种自己预测自己的方式学到了很好的特征表示。
所以说在它放到arxiv之后,reddit、twitter、知乎全都引起了剧烈的讨论,因为大家都觉得很不可思议,不用负样本,模型的学习怎么能不坍塌,其实作者也觉得很神奇,所以它后面也提供了一些解释,但是它的解释比较中规中矩没有什么意思 。
这篇博客的作者其实也是看到BYOL之后觉得非常有意思,所以就尝试复现了一下,结果在复现的时候遗漏了一个小细节,从而导致它的模型训练不动,出现了这个模型坍塌的现象
作者觉得毕竟这是在 DeepMind 的工作,可信度还是非常高的,应该不是论文的问题,肯定是它们自己复现的问题,所以自己就去仔细检查了
在讲这个发现之前,先来看一下batch norm带来了什么麻烦,因为之前没有好好说projection head 里面具体的结构,所以先来复习一下
下图所示是SimCLR的结构图:
SimCLR就是说一个图片进了编码器以后就得到了这个embedding,就是特征y(2048 维),然后把它扔给gθ,就是一个projection head,也就是图中右侧的mlp
这个mlp由一个全连接层、一个batch norm、一个ReLU 激活函数、一个全连接层、一个batch norm的结构组成。
第一个全连接层的维度是2048*2048
第二个全连接层的维度是2048*128,就把维度降下去了,这个128的特征就是最后用来做对比学习的特征
注意:这里面有两个batch norm 操作
接下来再看一下MoCo v2(MoCo v1没有用projection head),MoCo v2的模型结构如下图所示:
MoCo v2确实是用了projection head,就是gθ,但是它的 gθ 里面是没有batch norm的,就是直接全连接层、ReLU然后又全连接层
第一个全连接层还是2048*2048
第二个全连接层还是2048*128
再来看BYOL,模型结构如下图所示:
gθ、gε都是projection head
qθ是prediction head
这三个东西用的都是同样的结构,如图右侧紫色的mlp结构所示,这个结构里面是全连接层+batch norm+ReLU+全连接层 ,第二个全连接层后面没有 batch norm,但是第一个后面是有 batch norm
也就是因为这点小小的差别造成了这个发现
为什么呢?因为像MoCo v2的代码写的实在是太好了,而且又是基于 pytorch ,所以这篇博客的作者就是借鉴MoCo v2来复现的 BYOL ,但是因为MoCo v2里projection head没有batch norm,所以他们在复现BYOL的时候,这里也没有用batch norm,所以它的mlp就是全连接层+relu+全连接层,然后模型的学习就坍塌了,然后这篇博客的作者就觉得实在是太奇怪了,所以赶紧又做了一些额外的实验,如下表所示 :
第二列指的是projector里到底用不用batch norm,还是是用别的归一化方式
第三列指的是prediction里到底用不用batch norm,还是是用别的归一化方式
目标函数:对于对比学习的方式来说用的是交叉熵函数,对于 BYOL 来说都用的是 L2,也就是MSE loss
performance性能其实是在一个STL-10的数据集上做的,不是 ImageNet,但是衡量标准还是准确度。
上表做了哪些实验:
最后一行random是说有一个随机初始化的残差网络,然后拿这个残差网络去抽特征,然后在这个特征上训练一个全连接层,最后的结果是28.8,这个就是随机结果,就是根本没有学习的结果。
第二行表示如果做的是正确的 BYOL,就是说在projection head和prediction head 里头都用了batch norm ,最后的结果是57.7,这个就是最高,也就是正确的结果。
但其实刚开始做的实验做的是倒数第三行(no normalization),就是没有归一化,既没有在projection head的里头用batch norm ,也没有在predictor用batch norm ,最后的结果只有28.3,跟随机的结果一模一样,也就是说模型坍塌了什么都没有学到
然后作者就尝试了几种变体,做了消融实验:要么在projection head里用batch norm ,不在prediction里用,要么就是在projection里不用,在prediction里用,最后发现,只要哪块放一个batch norm,最后的结果就还行,就算48有点低,但至少说明模型在学习没有坍塌
作者这时候就强烈怀疑,肯定是batch norm惹的事了,正常的想法很自然,下一步就说换一个归一化式行不行,就换成layer norm,作者就在projection head和prediction head里面都用了layer norm,然后发现性能确实就又掉下去了,又变成29.4,就跟随机一样了,也就是说模型又坍塌了,又什么都没学到
所以,作者最后总结说BYOL训练的时候不坍塌,肯定是跟batch norm有一点关系
那有什么关系呢?作者说现在有一个简单的结论: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的作者很快就找到了另外一种方式去解释这个现象,迅速写了一篇论文(BYOL works even without batch statistics)来做回应,它的题目上来就说BYOL即使在没有batch norm的时候照样能工作,而且它甚至把这个even斜体了,真的就是用来回应上面提到的那篇博客。因为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提供的一个隐式的这个对比学习的项,就是说大家不要被那篇博客带跑偏了,赶紧来follow BYOL这个套路,这个套路没问题,别再去管负样本的事了
其实这篇论文也只有4页,因为它就是用来回应那个博客,也没想着说真的发论文,目的达到了就行
就是simple Siamese network,其实在BYOL放到 arxiv 上之后,就已经有很多研究者在做对对比学习的分析性工作了,因为大家发现,对比学习的成功好像是被很多很小的点堆起来的性能,比如说我们一路走来可以看到用了新的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
至于前向过程也跟上图中的一样,得到两个视角x1、x2以后,先过编码器去得到特征z1、z2,然后再通过predictor得到p1、p2的预测,因为有两个预测,所以这里也是一个对称性的loss,就是说,既可以做从p1预测z2,也可以做用p2预测z1的任务,但因为加了两次,所以说这里也要除以2
l就是最后的loss
梯度回传更新网络
作者还做了很多实验,比如说batch size对模型训练的影响、还有 batch norm对模型训练的影响,而这些都跟BYOL非常像,这里就不一一展开了,最后作者得到一个结论:之所以SimSiam能够成功训练,不会有模型坍塌,主要是因为有stop gradient这个操作的存在。
作者还提出了一个假设,而且在第五节里做了一个 hypothesis:因为有了stop gradient这个操作的存在,所以SimSiam这个结构是可以把它想象成一个EM的算法:
这里作者的意思是说因为有了stop gradient这个操作之后,这一个训练过程或者说这一套模型参数其实就被人为劈成了两份,就相当于在解决两个
子问题一样,模型的更新其实也是在交替进行的,作者接下来又做了一些推导,写的非常好,推荐大家可以去看一下,其实到最后应该可以把它理解成是一个k-means这个聚类问题
从这个角度来说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这么高了(其实我之前也有做过很多实验,发现动量编码器真的是很好用,也非常能提点的一个东西,所以可能这也是为什么BYOL能够训练的这么好)
当然作者在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当基线模型,因为真的是训练快、训练的稳,而且下游任务迁移的好
当然还有一篇论文叫Barlow Twins,是Yann LeCun组的一篇论文,因为宣传的很厉害,所以说很多人也都知道,那篇论文就是把目标函数给换掉了,它既不是在做对比也不是在做预测,它是生成了一个关联矩阵叫 cross correlation matrix,然后它希望这个矩阵能跟一个identity matrix(就是对角线是1,其它部分都是0的矩阵)尽量相似,其实说白了也是一样的意思,就是它希望正样本相似性尽量都逼近于1,然后跟别的样本尽量的不相似,相似性尽可能是0,所以说就是换了个目标函数,其它的网络结构、训练方式都大同小异,而且他们放arxiv的时间也比较晚,已经是 21年的3月份了,这个时候对于 cv 来说,早都已经是Vision Transformer的时代了,所以很快呢就被淹没了。
第四阶段主要是讲Transformer是怎么和对比学习有机结合起来的,在这个阶段主要就是简单的讲一下MoCo v3和DINO这两篇工作。
MoCo v3这篇论文虽然题目说的是自监督的Vision Transformer ,但其实MoCo v3只是一种架构,所以说卷积神经网络也可以用,Vision Transformer也可以用。
事实上MoCo v3怎么从v1、v 2变到v3,作者只用了一页去讲,大部分的篇幅都在讲自监督的训练、ViT有多不稳定、发现了一个什么样的问题以及怎样用一个小小的改进就能让这个训练变得更稳定、效果也更好,这个写法就跟SimCLR v2有点像。
SimCLR v1变到 v2,其实只用了半页的篇幅去写,剩下大部分的东西都是在讲这怎么做半监督学习
而MoCo v3大部分的篇幅都是在讲怎么样去提高ViT训练的稳定性,所以就是为什么这篇论文的题目叫做一个实验性的study
摘要还是一贯的直白,上来就写这篇论文并没有描述一个新的方法,接下来作者就说其实这篇论文就是做了一个很直接、很小的一个改动,让自监督的ViT训练的变得更稳定了,但是不得不写一篇论文来把这个发现告诉大家,因为自监督的训练Vision Transformer已经是大势所趋了,这里有很多有趣的发现,所以我们分享给大家看,所以这篇论文的影响力依旧很大,它是ICCV 21的一篇口头报告论文。
在讲训练稳定性之前,先看一下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阶段,结尾就是改目标函数
DINO这篇论文也说的是一种自监督训练Vision Transformer的方式,但这篇文章主要的卖点是:Vision Transformer在自监督训练的情况下会有一些非常有趣的特性,它把它效果最炸裂的这些图片放到了下图所示,放到了文章开头
这个图的意思就是说一个完全不用任何标签信息训练出来的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实在是太像了,尤其是前向过程不就是一模一样吗,就只有目标函数稍微有点不一样(KL散度损失),这里多了一个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这个方法,因为处理负样本实在是太过麻烦,所以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这波洪流之中
最后第四阶段就来到了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还是一个标准的目标函数,基本上所有的工作都有在用,而且对比学习它属于一个想法而不是具体的一个工作,它在几十年之前就已经提出来了,所以接下来我们应该还是会看到很多对比学习的工作的,我很期待对比学习跟其它方法的结合。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。