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=12N​1k​=i​exp(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系列学习总结相关推荐

  1. 华人博士提出原型对比学习,非监督学习效果远超MoCo和SimCLR

    点上方蓝字视学算法获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:新智元 继MoCo和SimCLR之后非监督学习的又一里程碑!Sales ...

  2. 再发力!Facebook AI何恺明等最新研究MoCo(动量对比学习)第二版,超越Hinton的SimCLR,刷新SOTA准确率...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]无监督学习再发力!Facebook AI 研究团队的陈鑫磊.樊昊棋.Ros ...

  3. 状态机系列学习笔记01

    状态机系列学习笔记01 有限状态机(FSM)概念 定义 总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的.不重叠的.这样的系统在某一时刻一定会处于其所有状态中的一 ...

  4. MINA系列学习-IoAccpetor

    MINA系列学习-IoAccpetor 其实在mina的源码中,IoService可以总结成五部分service责任.Processor线程处理.handler处理器.接收器和连接器,分别对应着IoS ...

  5. moco 搭建接口mock环境入门

    为什么80%的码农都做不了架构师?>>>    >>> git clone https://github.com/dreamhead/moco.git >&g ...

  6. 对比学习系列论文MoCo v1(二):Momentum Contrast for Unsupervised Visual Representation Learning

    0.Abstract 0.1逐句翻译 We present Momentum Contrast (MoCo) for unsupervised visual representation learni ...

  7. CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram

    喵~不知不觉到了CUDA系列学习第五讲,前几讲中我们主要介绍了基础GPU中的软硬件结构,内存管理,task类型等:这一讲中我们将介绍3个基础的GPU算法:reduce,scan,histogram,它 ...

  8. CUDA系列学习(四)Parallel Task类型 与 Memory Allocation

    本文为CUDA系列学习第四讲,首先介绍了Parallel communication patterns的几种形式(map, gather, scatter, stencil, transpose), ...

  9. CUDA系列学习(三)GPU设计与结构QA coding练习

    啥?你把CUDA系列学习(一),(二)都看完了还不知道為什麼要用GPU提速? 是啊..经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数,但是更多小伙伴应该是看了(一)就感觉离自己太远所以赶紧撤粉 ...

最新文章

  1. spring boot 文件上传工具类(bug 已修改)
  2. WiresShark 使用方法
  3. python话雷达图-Python 详解雷达图/蛛网图
  4. 在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则。
  5. 你会么?图形不正,角度是随机的
  6. 【NLP】 理解NLP中网红特征抽取器Tranformer
  7. 设计模式学习笔记--解释器模式
  8. 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )
  9. linux c之加入了加入原文件 math.h调用abs()函数出现implicit declaration of function错误
  10. 春天:注入列表,地图,可选对象和getBeansOfType()陷阱
  11. Execution Environment for Non-64-bit Modes 和 64-bit Modes
  12. 数据结构题集(c语言版)严蔚敏答案pdf
  13. 基于matlab人脸识别论文,基于MATLAB的人脸识别系统的设计
  14. linux 函数式编程,理解函数式编程_Linux编程_Linux公社-Linux系统门户网站
  15. 质数的java代码_java 代码求质数
  16. 编程语言之时下潮流与实用价值
  17. babylonjs 分部加载模型_基于babylon3D模型研究3D骨骼动画(1)
  18. [SSD固态硬盘技术 7] 主控核心设计
  19. 苹果应用中含有第三方支付怎么办?
  20. socket实现局域网语音通话 c++ winapi

热门文章

  1. 常用测试用例设计方法之边界值分析法
  2. AMD与Intel展开四核拉锯战
  3. 学计算机人都很自私,心理学:总有一天你会明白,那些选择丁克的人,都是自私的...
  4. USB ISO传输带宽计算
  5. 启发式算法详解——遗传算法
  6. 软件测试面试题:什么是灰度测试?
  7. 女性创业家的“自白”
  8. 温度计:不用水银,或者不用易碎玻璃,难道就不行?
  9. MobileNetV3代码和网络
  10. 紫光展锐T310/T610/T618安卓手机平台功能介绍