当前位置:网站首页>深度学习(自监督:MoCo V3):An Empirical Study of Training Self-Supervised Vision Transformers
深度学习(自监督:MoCo V3):An Empirical Study of Training Self-Supervised Vision Transformers
2022-07-28 05:22:00 【菜到怀疑人生】
前言
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早期出现的梯度爆炸和梯度消失问题)?
边栏推荐
- Manually create a simple RPC (< - < -)
- 小程序开发要多少钱?两种开发方法分析!
- 服务可靠性保障-watchdog
- xml解析实体工具类
- Alpine, Debian replacement source
- Bert的使用方法
- 分布式集群架构场景优化解决方案:分布式ID解决方案
- Distributed cluster architecture scenario optimization solution: session sharing problem
- 区分实时数据、离线数据、流式数据以及批量数据的区别
- Create a virtual environment using pycharm
猜你喜欢

分布式集群架构场景优化解决方案:分布式ID解决方案

Spark中的Structured Streaming

Distributed cluster architecture scenario optimization solution: distributed ID solution

微信小程序制作模板套用时需要注意什么呢?

Linux(centOs7) 下安装redis

深度学习——MetaFormer Is Actually What You Need for Vision

小程序开发要多少钱?两种开发方法分析!

Regular verification rules of wechat applet mobile number

【四】redis持久化(RDB与AOF)

微信小程序开发语言一般有哪些?
随机推荐
Kotlin语言现在怎么不火了?你怎么看?
self-attention学习笔记
【二】redis基础命令与使用场景
Data warehouse tool superset installation (fully available)
word2vec+回归模型实现分类任务
3: MySQL master-slave replication setup
Svn incoming content cannot be updated, and submission error: svn: e155015: aborting commit: XXX remains in conflict
raise RuntimeError(‘DataLoader worker (pid(s) {}) exited unexpectedly‘.format(pids_str))RuntimeErro
Phoenix
Briefly understand MVC and three-tier architecture
flutter webivew input唤起相机相册
matplotlib数据可视化
Sorting and paging, multi table query after class exercise
Dataset类分批加载数据集
微信小程序开发费用制作费用是多少?
分布式集群架构场景优化解决方案:Session共享问题
字节Android岗4轮面试,收到 50k*18 Offer,裁员风口下成功破局
The business of digital collections is not so easy to do
速查表之各种编程语言小数|时间|base64等操作
1: Enable slow query log and find slow SQL