MoCo v3(ICCV 2021)

news2024/11/29 4:28:07

paper:An Empirical Study of Training Self-Supervised Vision Transformers

official implementation:https://github.com/facebookresearch/moco-v3

出发点

本文并没有提出一种新的方法,而是对计算机视觉领域最近进展中的一个重要且基础的情况进行研究:即视觉Transformers(ViT)的自监督学习。尽管标准卷积网络的训练方法已经非常成熟和稳健,但ViT的训练方法尚未建立,尤其是在自监督学习场景中,训练变得更加具有挑战性。

解决了什么问题

论文解决了自监督学习中ViT训练的不稳定性问题。作者观察到,尽管在某些情况下训练结果看似不错,但实际上这种不稳定性会导致准确度下降,并且这种下降在没有更稳定对照组的情况下很难被察觉。论文通过实验揭示了这种不稳定性,并提出了改进稳定性的方法。

创新点

  1. 对ViT在自监督学习框架下的训练基础组件进行了深入研究,包括批量大小、学习率和优化器。
  2. 提出了一种简单的改进方法,即在ViT中冻结patch projection层,使用固定的随机patch projection来提高训练稳定性。
  3. 在多个自监督框架中对ViT进行了基准测试和消融研究,提供了不同架构设计的ViT结果,并探讨了其影响。

MoCo v3

本文提出了MoCo v3,它是对MoCo v1/2的增量改进版本,伪代码如Alg 1所示

具体来说,我们对同一张图片进行两次随机的数据增强,并取出两个crop。它们由两个编码器 \(f_k\) 和 \(f_k\) 进行编码,得到输出向量 \(q\) 和 \(k\),直觉上,\(q\) 的行为就像是一个“query”,而学习的目标是检索相应的“key”。这个过程表述为最小化一个对比损失函数,本文采用InfoNCE

 

这里 \(k^+\) 是 \(f_k\) 对 \(q\) 同一张图片的输出,作为 \(q\) 的正样本,集和 \(\{k^-\}\) 由 \(f_k\) 对其它图片的输出组成,作为 \(q\) 的负样本,\(\tau\) 是 \(\ell_2\) 归一化的 \(q,k\) 的温度超参。 

MoCo v3采用同一batch中那些自然共存的keys,作者放弃了memory queue,因为作者发现如果batch size足够大(例如4096)它的增益会变少。通过这种简化,式(1)中的对比损失可以通过几行代码实现:见Alg 1中的ctr(q, k)。本文采用了对称损失ctr(q1, k2) + ctr(q2, k1)

编码器 \(f_q\) 由一个backbone(例如ResNet、ViT)、一个projection head以及一个额外的prediction head组成。编码器 \(f_k\) 由backbone和projection head组成,但没有prediction head。\(f_k\) 根据 \(f_q\) 的移动平均值进行更新,不包括prediction head。

作者用ResNet-50来测试了MoCo v3的精度,下表对比了ImageNet上的linear probing精度

改进主要是因为额外的预测头和大批量(4096)训练。

Stability of Self-Supervised ViT Training

原则上,在contrastive/Siamese自监督框架中,可以直接用ViT主干替换ResNet主干。但在实践中,作者遇到的一个主要挑战是训练的不稳定性。

作者观察到,不稳定问题不能简单地用精度来反映。实际上,如实验结果展示的那样,训练是“相当好的”并且结果也不错,即使它可能是不稳定的。为了揭示这种不稳定性,作者在训练期间监测了KNN曲线。作者首先研究了基本要素如何影响稳定性,这些曲线表明,训练可以是“部分成功的”或者换句话说是“部分失败的”。然后又探索了一个可以提高稳定性的简单技巧,从而在各种情况下都提高了模型精度。

Empirical Observations on Basic Factors

Batch size

ViT模型本身的计算量就很大,因此大批量训练是大型ViT模型的理想解决方案。在最近的一些自监督方法中,大的batch也有利于模型的精度。图1展示了不同batch size下的训练曲线。

当batch size为1k和2k时曲线相当平滑,linear probing准确率分别为71.5%和72.6%。在这个范围内,由于有更多的负样本,更大的batch size提高了精度。4k的曲线变得明显的不稳定,它的linear probing精度为72.2%,尽管和2k的精度相比只有轻微的下降,但它的精度受到了不稳定性的影响。6k的曲线就更差了,作者假设是训练部分重启了,跳出了局部最优,然后寻找一个新的轨迹。因此训练不会发散,但精度取决于重启的效果。当这种部分的失败发生了,仍然能够得到一个还不错的结果(69.7%),但这对于研究是有害的:和那些容易发现的灾难性的失败不同,这种小的退化可能会被忽略。

Learning rate

作者研究了学习率的影响,如图2所示。学习率越小,训练越稳定,但可能会导致欠拟合。如图2所示,学习率lr=0.5e-4比lr=1.0e-4的精度低了1.8%(70.4% vs. 72.2%)。当学习率变大时,训练会变得不稳定,当lr=1.5e-4时曲线有更多的抖动,精度也降低了。

Optimizer

默认情况下,训练ViT采用AdamW优化器,但最近的自监督方法都采用LARS优化器进行large-batch的训练。图3作者研究了LAMB优化器,它是LARS的AdamW版本。

如图3所示,当学习率合适时(lr=5e-4),LAMB的精度比AdamW稍好(72.5%)。但当lr大于最优值时精度迅速下降,有趣的是,训练曲线仍然是平滑的,但在中间部分开始逐渐下降。由于对lr较为敏感当网络结构不同时,LAMB需要额外的lr search,因此作者在本文中还是采用AdamW。

A Trick for Improving Stability

如图4所示,作者发现训练过程中梯度的突然变化会导致训练曲线的下降。通过比较所有层的梯度,作者发现梯度的峰值发生到第一层(patch projection),并通过若干迭代后传递到网络后面的层。因此作者探索了冻结patch projection层,即随机初始化后,就通过stop-gradient不再更新权重了。

 

图5展示了patch projection的参数可学习和随机初始化并冻结两种情况的结果,可以看到random patch projection稳定了训练,训练曲线更加平滑。这种稳定性对精度也有帮助,当lr=1.5e-4时,精度提高了1.7%达到了73.4%。这一实验证明了训练的不稳定性是影响精度的一个主要问题。

此外,作者还发现其它自监督方法可能也是不稳定的。图6展示了SimCLR和BYOL使用ViT的训练曲线,随机patch projection提高了两者的稳定性,精度也分别提高了0.8%和1.3%。SwAV也存在不稳定性,但当它不稳定时损失会发散(NaN),当使用一个较大的学习率并用random patch projection可以帮助SwAV收敛,并在使用最大的稳定学习率时将精度从65.8%提升到66.4%。总之,这一技巧在所有自监督框架中都是有效的。

实验结果

表4展示了不同四种不同的自监督框架使用ViT的性能对比,为了公平比较,每个框架的wd和lr都是单独搜索出来的,可以看到MoCo v3的效果是最好的。

下面是一些消融实验的结果

位置编码sin-cos的效果最好

当不用class token精度从76.5%下降到了69.7%,ViT在最后一个block的后面额外有一个LN层,如果把这层LN也去掉,精度又涨到了76.3%。

 

ViT中没有BN,只在MLP head中有BN,去掉BN时必须将batch size设为2048否则模型不收敛,此时精度下降了2.1%,这表明BN对于对比学习 不是必要的,但可以提升精度。

 

去掉prediction head会导致性能轻微的下降,表明预测头不是必须的。

 

动量m=0.99时精度最高,m=0类似SimCLR的做法(加上prediction head并停止keys上的梯度传播),使用动量编码器精度提升了2.2%。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1825113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript-函数

学习目标: 掌握函数 学习内容: 为什么需要函数函数使用函数传参函数返回值函数细节补充函数作用域匿名函数案例 为什么需要函数: 函数:function 是被设计为执行特定任务的代码块。说明:函数可以把具有相同或相似逻辑…

Spring Aop及事务管理

5 Spring AOP AOP概述 AOP:全称是 Aspect Oriented Programming 即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有…

CinemachineFreelook相机鬼畜抖动的解决方法

又是培训机构的出品。。。。。。 2020.3.27 发现跟随时抖动的原因了,其实应该按照传统相机的跟随逻辑放在late update里执行,但是由于开发cinemachine的开发组很坑地把cinemachine freelook里的三个轨道Damping值默认给了3,于是相机会以每0.7…

【Windows】DNG Converter(DNG格式转换器)软件介绍

软件介绍 DNG Converter是一款免费软件,用于将数码相机原始RAW图像文件转换为DNG格式(数字负片)文件。DNG格式是一种数字负片格式,它旨在成为一种行业标准,以便摄影师可以使用一个统一的格式来存储其相机拍摄的原始图…

探索高效存储与快速查找: 深入了解B树数据结构

探索高效存储与快速查找: 深入了解B树数据结构 一、什么是B树二、B树的实现2.1 节点的定义2.2 插入关键字2.3 删除关键字2.4 查找关键字2.5 遍历B树 一、什么是B树 B树,也称为B-tree,是一种多路平衡查找树。它被广泛用于文件系统和数据库之中&#xff0c…

SringBoot 如何使用HTTPS请求及Nginx配置Https

SringBoot 如何使用HTTPS请求及Nginx配置Https SringBoot 如何使用HTTPS请求生成证书导入证书及配制创建配置类将pfx转成.key和.pem Nginx 安装SSL依赖./configure 安装依赖编译安装完openssl后报了新错 Nginx配置 SringBoot 如何使用HTTPS请求 生成证书 由于业务数据在传输过…

Python保姆级教程 数据类型—新手小白入门必看

python学习资料,下方已打包好 一、基本数据类型与变量(上) 2.1 注释 优点: 代码说明 没注释的代码 有注释的代码 不让解释器执行注释的那句话 2.2 单行注释 单行注释快捷键:ctrl ? 2.3多行注释 …

服务器如何有效解决源IP暴露问题

在现代互联网环境中,服务器的安全性至关重要。源IP暴露不仅增加了服务器遭受DDoS攻击、恶意扫描和数据泄露的风险,还可能影响业务的正常运行。本文将探讨如何利用技术手段,尤其是CDN和防火墙策略,来有效地解决服务器源IP暴露的问题…

redis+lua实现分布式限流

redislua实现分布式限流 文章目录 redislua实现分布式限流为什么使用redislua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现依赖lua脚本yaml代码实现 Jmeter压测 为什么使用redislua实现分布式限流 原子性:通过Lua脚本执行限流逻辑&am…

融合心血管系统(CVS)多视角信号的新架构新策略

随着深度学习的发展和传感器的广泛采用,自动多视角融合(MVF)在心血管系统(CVS)信号处理方面取得了进展。然而,普遍的MVF模型架构通常将同一时间步骤但不同视角的CVS信号混合成统一的表示形式,忽…

RFID技术在农产品管理中的应用

使用RFID技术对农产品生产、加工、存储和销售的全过程进行跟踪,追溯食品的生产和加工过程,能够有效加强农产品的管理,如图7—10所示。 将RFID技术应用于农业食品安全,首先是建立完整、准确的食品供应链信息记录。借助RFID 对物体…

unity简单数字拼图小游戏(源码)

代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.SceneManagement;public class DragImage : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {pub…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前,我们要知道linux是一个操作系统。 那操作系统是什么呢?(这里只做大概了解) 操作系统就是一个管理软硬件的软件。 它对上提供良好(稳定、高效、安…

大模型Prompt-Tuning技术入门

Prompt-Tuning方法 1 NLP任务四种范式 目前学术界一般将NLP任务的发展分为四个阶段,即NLP四范式: 第一范式:基于「传统机器学习模型」的范式,如TF-IDF特征朴素贝叶斯等机器算法;第二范式:基于「深度学习模…

Echarts图表: 矩形树图都有哪些配置项,一文告诉你

Hello,本期和大家分享矩形树图的配置项,欢迎评论区和贝格前端工场互动交流。 一、矩形树图是什么 矩形树图是ECharts中的一种图表类型,用于展示树形结构的数据。矩形树图通过矩形的大小和位置来表示树形结构中节点的层次关系和数据的大小。…

C端设计师去做B端界面设计易犯哪些?要不要给他提个醒。

2024-03-29 17:03大美B端工场 很多C端设计师初涉B端设计,思路转变不过来,还用C端思想指导B端设计,结果就是总感觉不舒服,大美B端工场,为大家详细解读一下。 当C端设计师去设计B端界面时,可能会经常犯以下…

【Spine学习08】之短飘,人物头发动效制作思路

上一节说完了跑步的, 这节说头发发型。 基础过程总结: 1.创建骨骼(头发需要在上方加一个总骨骼) 2.创建网格(并绑定黄线) 3.绑定权重(发根位置的顶点赋予更多总骨骼的权重) 4.切换到…

使用星鸾云GPU云服务器搭配Jupyter Lab,创建个人AI大模型

最近我们公司IT部门宣布了一个大事情,他们开发了一款内部用的大模型,叫作一号AI员工(其实就是一个聊天机器人),这个一号员工可以回答所有关于公司财务、人事、制度、产品方面的问题。 我问了句:公司加班有…

【服务器硬件由 CPU、RAM、硬盘等组成,选购时需考虑应用需求、预算等。散热、安全、监控与维护亦重要,未来发展趋势包括高性能、低能耗和智能化。】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

蚁剑webshell实验

GitHub - AntSwordProject/AwesomeScript: AntSword Shell 脚本分享/示例 命令行和文件管理 https 基本上请求一次响应一次就断开。