前言
MoCo V3是何凯明团队的新作,发表在ICCV 2021上,是一篇自监督文章,在MoCo V2的基础上做了一些小改动,同时report了ViT自监督训练过程中的“不稳定”现象,并给出了一个trick,用于减缓ViT自监督训练不稳定的现象。
凯明团队的文章还是一如既往的细致,本文主要总结MoCo V3的操作流程以及ViT自监督训练过程中的“不稳定”现象。MoCo V3相关的性能试验不会过多总结
本文为个人总结,如果错误,欢迎指出
本文默认读者知晓MoCo V2以及常见对比学习算法的做法,不会过多赘述细节。
MoCo V3
相比于MoCo V2
- MoCo V3摒弃了memory bank,负例由同一batch size中的其他样本组成,类似于simCLR。作者发现当batch size足够大时,从batch size中挑选负例和从memory bank中挑选负例的性能差别不大。
- 损失函数为InfoNCE,数学表达式如下
q 、 k + q、k^+ q、k+构成对比学习中的正例对、 q 、 k − q、k^- q、k−构成对比学习中的负例对,具体如何产生,可以查看深度学习(自监督:MoCo)——Momentum Contrast for Unsupervised Visual Representation Learning
算法伪代码如下
与MoCo v2、MoCo V2+(就是simsiam)在ImageNet上的线性分类性能对比如下图所示,backbone为ResNet50
ViT自监督训练过程中的“不稳定”现象
CNN模型自监督训练时,KNN分类器的准确率是平滑上升的,但是ViT不是,如下图所示
上图比对了不同batch size下,backbone为ViT情况下,MoCo V3的KNN性能变化曲线图,可以看到,batch size越大,训练的不稳定现象越明显,即KNN准确率震荡现象越明显,并且这种震荡现象会影响到模型的性能,batch size=6144时,震荡现象非常明显,并且线性分类准确率只有69.7。
那么能否通过调节学习率,来缓解训练不稳定呢?
从上图来看,使用较小的学习率的确可以减缓训练不稳定,但是这会影响到模型的性能,当学习率为0.5时,虽然训练不稳定现象有所减缓,却会影响到模型的性能。
是不是MoCo V3的对比学习算法导致ViT出现训练不稳定现象呢?作者发现BYOL、simCLR中也存在类似现象,如下图蓝线所示,这表明ViT的训练不稳定现象可能具有一定的普适性。
如何缓解ViT自监督训练的不稳定现象
作者注意到,当梯度发生较大改变时,会导致KNN的准确率出现“低谷”,比对了所有层的梯度后,作者发现梯度峰值在第一层出现的时机最早,并且过了几个epochs训练后,最后一层的梯度也会出现峰值,如下图所示
基于此,作者假设训练不稳定现象会较早出现在浅层,既然如此,那么就固定浅层的参数,使其不会出现训练不稳定现象,会不会改善训练不稳定现象呢?基于此,作者固定了ViT的patch projection layer,此时模型的性能变化如下图绿线所示
可以看到,即使使用较大的学习率,如1.5x
1
0
−
4
10^{-4}
10−4,此时模型训练依然稳定,并且此时模型的线性分类性能也和使用ResNet50作为backbone近似,可见缓解训练不稳定现象有助于提升模型的性能(没有缓解训练不稳定,学习率为1.5x
1
0
−
4
10^{-4}
10−4时,模型的线性分类准确率为71.7),并且这种做法不仅针对MoCo V3有效, simCLR、BYOL也仍有效。
思考
作者在原文中提到,固定ViT的patch projection layer,相当于减小了解空间大小,那么更小参数量的ViT是否仍会出现训练不稳定现象呢?固定了patch projection layer,相当于减小了网络的深度,训练不稳定现象是否和网络深度有关系(类似于CNN早期出现的梯度爆炸和梯度消失问题)?