Momentum Contrast for Unsupervised Visual Representation Learning论文理解

近日,何凯明团队挂出来了MoCo_V2(https://arxiv.org/abs/2003.04297),效果相对于V1(https://arxiv.org/abs/1911.05722)有了较大提升。整篇文章不算参考文献仅有两页,主要解决了两个问题:

1、MoCo_V1中提到的data augmentation方法;

2、用MLP head代替fc projection head。

在MoCo_V2中,主要对比了MoCo框架和SimCLR的效果。

可以看到,在MoCo_V1被SimCLR()大幅超越之后,凭借非框架性的手段,又重新获得了领先的地位。并且字典大小与minbatch的解耦,计算消耗上也相对于其他框架也是具有着优势的。

一句话概括MoCo_V2就是,没有改变MoCo_V1的框架,通过一些方法更深的挖掘出MoCo_V1的性能,大到目前start-of-art的效果。


下面正式介绍MoCo这篇文章。

无监督表示学习方法,是指在不存在人工标注信息的数据下,通过学习提取出图像内在的representation,这个representation又是什么呢?简单理解就是分类、分割、检测等任务Encoder后获取到feature map,类似于元学习和mutitask中学到的一个公有特征,只要学好了这个公有特征,那么根据具体的任务,具体的数据,只需要稍加迁移,就能够在目标数据目标任务中有着姣好的表现。所以说他的优势也体现在两点:

1、更快,具体的下游任务是在学习好的representation的基础上进行的,而不是从头开始训练。

2、更准,表示学习是在大数据集上进行的,能够从更多的数据学习到图像的representation,相对于目标域数据的规模,大数据是优势。

3、泛化性好,同样是由于表示学习的数据集由于没有人工标注,所以首先可以做到很大,其次类别也不受人工标注的限制,更接近从自然世界学习特征,任何目标域的数据都不存在严重的domain gap。

那么表示学习是如何实现的呢?

我们看MoCo这篇文章的方法,同样是两个关键步骤:

1、Pretext tasks,所谓Pretext tasks就表示,这个不一定是我们真正关心的任务,而是一种能够让模型学习到数据representation的task,这个task是什么无所谓,只要能够学习到数据的representation就行,比如文章中提到的,对图像的恢复,去噪自动编码,内容编码、或者通道间信息的编码,等等。这些任务有两个共同的特点,就是a)能够输入图像输出特征,b)利用图像自身的信息完成监督。MoCo采取的是instance discrimination方法,由于pretext task并不会影响到MoCo的框架,所以文章没有做更多的研究。

2、Contrastive learning,简单理解,就是输入图像以及输入图像自身的变化(data argumentation)作为正样本,其他随机采样作为负样本。然后计算经过编码之后的分类损失。这一部分是关键,因为如果想获取到较好的表示学习效果,那么负样本一定要足够的大,也就是要构建一个足够大的字典,让网络能够充分学习到正负样本的区别。但是此时就面临一个问题,收到minbatch的限制,字典无法做到很大,要不然性能消耗会爆炸。

所以何凯明通过构建了一个queue来存储字典的方式,实现字典和minibatch的解耦,具体而言就是我来一组负样本图像,经过一次编码,向字典中添加一批key。字典被填满之后,则新的key继续进入queue,旧的key则从queue中移除。以此实现字典和minibatch的解耦以及字典的动态更新。

那么这样做之后,又出现了新的问题。由于字典中的并不是同一批次的,那么对应encoder肯定也是不同的了,如何更新对应点编码器呢?所以MoCo在这里又给出一条约束,就是地点变化要足有平滑连续,不然key1是由旧的Encoder1编码得到,如果Encoder1和新的Encoder2相差较大,那么key1对应的损失是无法给Encoder提供参考信息的。

所以如何更新Encoder就成为一个至关重要的问题了,MoCo采取的方法是,也就是文章命名的关键Momentum。

可以看到key对应的encoder是由query对应的encoder来更新的,同时受到key对应的Encoder上一次的状态影响,所以其更新速率要慢与query对应的encoder。具体要有多慢呢?慢到字典中最旧key依然能够反映出最新的encoder信息。所以文章给出m=0.999,要远好于m=0.9。直观的的感受就是,key对应的encoder基本不动,非常缓慢的更新,字典中所有的key可以近似的看成由该encoder编码得到。

这样,以上难题就得到解决了,MoCo的框架也便完成了。

对于没有接触过表示学习的,可能看起来会有些费力,如果在这个领域有一定的知识积累的话, 这篇文章是一篇非常简单的文章,没有任何难以理解的逻辑。就算没有接触过表示学习也没有关系,多读几遍也就明白了。

Shuffling BN这个技巧我就不介绍了,可以说他不是MoCo框架的一部分,其他框架也可以用。

总结来看,就是要明白几点:

1、大数据集,除了query图像和他的同源图像(augmentation)之外,其他的图像都是负样本。利用大量负样本字典,去学习一个pretext task。

2、字典要足够到,但是受限于字典,minibatch无法足够大,所以构建queue把二者解耦。

3、为了能让queue的key真实反映当前的encoder,要保证足够的连续性。所以要动量更新encoder。

我也是最近才接触到的表示学习,一开始什么也看到不懂,完全不了解这个概念,但是无监督学习一定是人工智能的未来,而不像有监督学习一样,有多少人工就有多少智能。所以就反复的研究文章,现在自认为是看懂了MoCo,当然还有很多要看的,包括这个回答下面的就有很多优秀额学者,我也在fellow他们的研究,比如 @慕容腹黑 同学的CMC等一系列研究, @齐国君 AET系列研究,以及SimCLR方法,希望能够尽快跟上该领域优秀学者的最新动态。

大家如果也对这方面有兴趣,我们可以加入微信群互相帮助,共享资源和学习进展,有兴趣的私信我吧~~

转自知乎自己的回答。

  • 2
    点赞
  • 2
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值