MoCo
Title
- 动量对比学习对于无监督视觉表征
2. 在视觉领域,人们通过设计一些巧妙地代理任务,设置一些规则,定义那些图片是相似的,那些是不相似的,提供监督信号,自监督任务
3. 由于代理任务划分正样本的方式有很多,所有自监督训练十分灵活。
eg NLP:通过两层forword用不同dropout得到的结果
视频领域:连续的两帧是正样本
图片:不同视角、 RGB与深度图像
Abstract
- 将对比学习看成字典查询角度,构造了一个动态查找的字典,有一个队列和移动平均编码器
- 队列-->保证字典是大的,可以放很多负样本,增加更多的差异
- 移动平均编码器-->保证队列中的样本是一致的
- 验证:使用动量对比学习进行预训练,将预训练的模型放到Image中进行验证,只改变最后的分类头,前面的用于提取特征的backbone不变 突出效果:可以迁移到不同的下游任务之中,结果堪比有监督学习,甚至大幅超过
Introduction
- GPT、Bert证明了无监督学习在NLP领域是可以的,但在视觉方面的应用却存在一些问题
- 产生不同的原因在于他们的信号空间的差异
- 视觉领域无监督对比学习都可以被归纳为一个构建动态字典查询的过程
- 一致性:Ki要求使用相同或者相似的编码器得到,不然给出一个q,我可能选择跟我同用一个编码器得到的结果了,而不是选出一个真正的正样本k
- 对于之前的模型,在字典大与一致性方面可能或多或少都有问题
- 提出将MoCo作为建立又大又一致的字典的方法用队列来表示字典,队列要大,如果一次性1个batch将队列填满(这里是将队列大小与batch大小进行了关联),这样显卡可能吃不消,一次 处理不了这么多的数据,尽管这一次的处理都是通过一个编码器得到的。
- 这里提出的方法是:一次我只更新队列中的mini-batch大小的数据,将最早进入队列的mini-batch大小的数据从队列中剔除,但这样队列中的的 数据并不是同一批次进来的,可能来自不同的编码器,这里就提出了动量更新的策略,我假设更新编码器的时候,我0.99的参数都是来自上一个编码器,只有0.01来自新更新的参数,保证前后key编码器的相似性与一致性.MoCo选择的代理任务是instance discrimination ,q与k+是不同视角的图片(如随机裁剪得到的)
- MoCo的效果:在有分类与分割的7个下游任务中超过了使用ImageNet有监督训练的模型
- MoCo在更大更贴近真实世界的数据集上的效果还可以有提升
-
Discussion and Conclusion
- 提出展望:因为更换了数据集,大小翻了1000倍,但效果只提升了1个点左右,可能是代理任务不够好导致的,这里提出了一个新的代理任务,关于图像的的MAE ( Mask auto encoding)图像的完形填空
Related Work
1.主要介绍了目标函数与代理任务,代理任务是指那些人们不怎么感兴趣的任务(不是像分类、分割一样的有实际运用场景的任务),人们主 要通过代理任务来学习特征的表示
2. 损失函数:生成式损失函数,衡量生成的结果与真实结果的区别(生成整张图);判别式损失函数
-
对比损失函数:与其他损失函数不同,对比学习的目标是在不断变化的,是通过一张图片经过一个可以梯度回传的编码器得到的特征来决定的 对抗损失函数:用来衡量分布之间的差异,用于无监督的数据生成,以及特征表示(既然已经能产生很好的图片,说明已经学到了底层的特征
3.代理任务:恢复输入:重建整张图、重建patch
生成伪标签:数据增广、九宫格
Method
Contrastive Learning as Dictionary Look-up
- 有一个编码好的query q,以及编码好的一系列key k1、k2...
- 假设只有一个正样本k+与q是配对的,其他的都是负样本,对损失函数的要求是:当q与k+相近时,以及q与ki距离很远时, loss都要尽可能小
Momentum Contrast
Dictionary as a queue
- 使用队列来建立字典,可以将队列设的很大,使用队列,可以将字典大小与mini_batch的大小完全分离开来。
- 由于队列具有先进先出的特性,每一次出去的都是距离此时进来的mini_batch最远的,也就是最不一致的
Momentum update
- 使用队列确实可以让字典变得很大,但由于队列过大,造成key的编码器的参数更新很难通过梯度回传得到,因为梯度回传需要考虑队列中的 所有样本,于是我们蚕蛹动量更新的方法来对key编码器来进行更新,一部分用自己之前的,一部分用q这一次通过梯度回传得到的新参数经过 复制的一部分,为了保证来不同的编码器的key的一致性,我们采用很大的动量来保持原来的参数,只有很小的一部分来自新更
Relations to previous mechanisms
- end-to-end
端到端学习,一个batch_size就是字典的大小,整个字典都可以进行梯度回传,因为有性能足够好的tpu,可以一次处理这么多的数据。但归根 结底,端到端的架构还是受限于字典大小这个因素。但由于key与编码器是实时更新的,所以key的一致性很好
2. memery bank
-