moco系列学习总结
MoCo系列学习总结
刚开始博客,写的不好请多多包含。如有错误,请指出,感谢。
- 原文链接
- MoCo-v1:https://arxiv.org/abs/1911.05722
- MoCo-v2:https://arxiv.org/abs/2003.04297
- MoCo-v3:https://arxiv.org/abs/2104.02057
- 源码链接
- MoCo-v1:https://github.com/facebookresearch/moco
- MoCo-v2:https://github.com/facebookresearch/moco
- MoCo-v3:https://github.com/facebookresearch/moco-v3
一、研究背景
- 当前存在两种自监督的训练策略,两者都存在较为明显的缺陷。
- 端到端训练策略
- 方法:每次对一个batch中的图像进行对比学习。
- 优点:端到端的训练速度快,正负样本的编码都随着模型的更新而更新,特征一致性好。
- 缺陷:每个step训练样本只能与同一个batch中的样本进行对比,这就非常依赖大的batch_size,更大的batch_size在计算loss时,能够使其与整个数据集上的loss更加接近,从而带来更好的训练效果。
- memory bank训练策略
- 方法:将数据集的特征提前使用预训练权重的模型提取好存下,作为memory bank。在训练时随机在memory bank中采样,该step结束后更新memory bank中对应的特征。
- 优点:memory bank可以直接存下整个imageNet的特征向量用于对比,能够在训练时拥有较好的样本多样性,解决了对大batch_size的依赖。
- 缺陷:每个step从memory bank中随机采样进行模型更新。但随着模型不断更新,memory bank中的特征更新速度比较缓慢,导致有一些特征要过很久才能被第一次采样到,完成更新。memory bank中许多特征都是被不同时期的模型更新的,其特征一致性相对较差。
- MoCo-v1,MoCo采用动量更新的模型和一个队列作为特征的字典解决该问题。
- 动量更新的模型,尽可能使图像特征保持一致性。
- 队列,先进先出的特性,总是优先提出模型早期提取的特征,同样是保持特征一致性。
- 每个step从队列中随机采样,类似于memory bank,能够解决对大batch_size的依赖。
- 端到端训练策略
二、MoCo-v1
模型原理
- encoder:backbone,表示常规更新的backbone。
- momentum encoder:其结构与encoder相同,其参数通过动量加权更新,相较于encoder更新速度更慢。
- xqueryx^{query}xquery:arg1(x)arg1(x)arg1(x),数据增广1。
- x0,1,...,nkeyx^{key}_{0,1,...,n}x0,1,...,nkey:arg2(x0,1,...,n)arg2(x_{0,1,...,n})arg2(x0,1,...,n),数据增广2。
- queue:使用momentum encoder对x0,1,...,nkeyx^{key}_{0,1,...,n}x0,1,...,nkey编码后的特征表征k0,k1,...,knk_0,k_1,...,k_nk0,k1,...,kn。
- 设batch_size = NNN
- l_pos:将一个batch中的q和对应的k相乘,得到一个N×1N\times 1N×1的特征相似度矩阵,由于q与k都是由同一个x生成,因此视为一组正样本。
- l_neg:将一个batch中的q和整个queue相乘,对于q而言,整个queue都视为负样本,结果为N×CN\times CN×C的相似度矩阵,K表示queue的长度。
- labels:是一个N×1N\times1N×1的全0向量,表示所有的分类结果都在第一位,即指向l_pos那一列
- loss:求一个交叉熵,做分类,分类至第1列,就是使logits的第一个数值最大,即正例的相似度最高。
- 动量更新:θk=m×θk+(1−m)×θq\theta _k=m\times \theta _k+(1-m)\times \theta _qθk=m×θk+(1−m)×θq
Loss函数(InfoNCEloss)
- l(i,j)=−logexp(si,j/τ)∑k=12N1k≠iexp(si,j/τ)l(i,j)=-log\frac{exp(s_{i,j}/τ)}{\sum_{k=1}^{2N}\mathbb{1}_{k\neq i}exp(s_{i,j}/τ)}l(i,j)=−log∑k=12N1k=iexp(si,j/τ)exp(si,j/τ)
- 实际上就是一个在局部样本中进行多分类的交叉熵loss。与传统分类网络不同之处在于
- 表示概率的向量元素,并非回归,而是通过余弦相似度计算所得。
- softmax的分类数量并非是整个数据集的种类量。与当前采样数量有关(局部)。
总结
- 特点:动量更新的编码器能够较为平滑的生成样本负例,产生一种近似同一个模型的特征编码,将其保存在一个内存队列queue中,一定程度上能够解决对大batch_size的需求,在小batch_size上也能有很好的效果,是我等的福音。
- shuffle BN:为了解决BN层信息泄露问题,作者提出了Shuffling BN的概念,而这个层必须在多GPU卡上才能进行。首先作者将不同GPU的sub mini batch进行汇聚,然后对汇聚后的batch进行打乱,并且记下打乱后的索引(便于恢复shuffle结果),在提取了Key编码特征后,通过之前记下的索引,恢复shuffle结果。注意到这个过程只对Key编码器进行,而不考虑Query编码器。(了解即可,后来用的不多)。
三、MoCo-v2
模型改进
- 在backbone后面增加投影层(project head):MLP
- 更强的图像增广操作
总结
特点:将SimClr的优势结合在MoCo-v1上
四、MoCo-v3
伪代码
- 自预测,通过predict head结果(query)=>project head的结果(key)
模型改进
- 采用vit作为自监督模型的backbone
- 结合了BYOL的自预测头的方法
- 保留了动量模型,但是却不再使用MoCo-v1,v2中的queue,而是直接采用大batch_size进行端到端的对比学习。
训练现象及解决技巧
作者花了大量的篇幅探讨了,在自监督对比学习中,以vit作为backbone,存在训练存在严重波动的问题,尤其是对于大batch_size。通过可视化各层梯度的情况,发现梯度变化的峰值发生在vit模型第一层,即patch project层,采用固定patch project层的参数的方法解决该问题。
总结
- 作者在摘要第一句就表示,本文没有提出新的方法。
- 主要工作:引入vit,并结合BYOL、SimSiam中的模块进行结构改进,并做了大量的实验。
- 探讨了vit带来的训练波动问题。
五、全文总结
- 通过这个系列的学习,能够对自监督训练的框架有一下几个问题有更清晰的认识。
- 采用大batch_size训练的深层原因。
- MoCo是如何在研究背景的两种架构中进行改进的。
- InfoNCEloss与多分类交叉熵的联系。
- 为何在交叉熵中的温度系数$\tau $是必须的,读者可以自行计算一下loss的上下限情况。
- 自监督对比学习框架的发展史:单层分类=>MLP(project head)=>project head+predict head。
- 亚马逊大佬表示,MoCo-v2在对比学习领域依旧是比较实用的存在,结构较新,而且使用queue来降低我们对大batch_size的依赖,比较推荐使用MoCo-v2做自己的项目。
参考视频
- https://www.bilibili.com/video/BV1C3411s7t9?spm_id_from=333.337.search-card.all.click
参考文献
[1] He K , Fan H , Wu Y , et al. Momentum Contrast for Unsupervised Visual Representation Learning[C]// 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2020.
[2] Chen, X., Fan, H., Girshick, R., and He, K., “Improved Baselines with Momentum Contrastive Learning”, 2020, arXiv:2003.04297.
[3] Chen, X., Xie, S., and He, K., “An Empirical Study of Training Self-Supervised Vision Transformers”, 2021, arXiv:2104.02057.
moco系列学习总结相关推荐
- 华人博士提出原型对比学习,非监督学习效果远超MoCo和SimCLR
点上方蓝字视学算法获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:新智元 继MoCo和SimCLR之后非监督学习的又一里程碑!Sales ...
- 再发力!Facebook AI何恺明等最新研究MoCo(动量对比学习)第二版,超越Hinton的SimCLR,刷新SOTA准确率...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]无监督学习再发力!Facebook AI 研究团队的陈鑫磊.樊昊棋.Ros ...
- 状态机系列学习笔记01
状态机系列学习笔记01 有限状态机(FSM)概念 定义 总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的.不重叠的.这样的系统在某一时刻一定会处于其所有状态中的一 ...
- MINA系列学习-IoAccpetor
MINA系列学习-IoAccpetor 其实在mina的源码中,IoService可以总结成五部分service责任.Processor线程处理.handler处理器.接收器和连接器,分别对应着IoS ...
- moco 搭建接口mock环境入门
为什么80%的码农都做不了架构师?>>> >>> git clone https://github.com/dreamhead/moco.git >&g ...
- 对比学习系列论文MoCo v1(二):Momentum Contrast for Unsupervised Visual Representation Learning
0.Abstract 0.1逐句翻译 We present Momentum Contrast (MoCo) for unsupervised visual representation learni ...
- CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram
喵~不知不觉到了CUDA系列学习第五讲,前几讲中我们主要介绍了基础GPU中的软硬件结构,内存管理,task类型等:这一讲中我们将介绍3个基础的GPU算法:reduce,scan,histogram,它 ...
- CUDA系列学习(四)Parallel Task类型 与 Memory Allocation
本文为CUDA系列学习第四讲,首先介绍了Parallel communication patterns的几种形式(map, gather, scatter, stencil, transpose), ...
- CUDA系列学习(三)GPU设计与结构QA coding练习
啥?你把CUDA系列学习(一),(二)都看完了还不知道為什麼要用GPU提速? 是啊..经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数,但是更多小伙伴应该是看了(一)就感觉离自己太远所以赶紧撤粉 ...
最新文章
- spring boot 文件上传工具类(bug 已修改)
- WiresShark 使用方法
- python话雷达图-Python 详解雷达图/蛛网图
- 在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则。
- 你会么?图形不正,角度是随机的
- 【NLP】 理解NLP中网红特征抽取器Tranformer
- 设计模式学习笔记--解释器模式
- 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )
- linux c之加入了加入原文件 math.h调用abs()函数出现implicit declaration of function错误
- 春天:注入列表,地图,可选对象和getBeansOfType()陷阱
- Execution Environment for Non-64-bit Modes 和 64-bit Modes
- 数据结构题集(c语言版)严蔚敏答案pdf
- 基于matlab人脸识别论文,基于MATLAB的人脸识别系统的设计
- linux 函数式编程,理解函数式编程_Linux编程_Linux公社-Linux系统门户网站
- 质数的java代码_java 代码求质数
- 编程语言之时下潮流与实用价值
- babylonjs 分部加载模型_基于babylon3D模型研究3D骨骼动画(1)
- [SSD固态硬盘技术 7] 主控核心设计
- 苹果应用中含有第三方支付怎么办?
- socket实现局域网语音通话 c++ winapi