MoCo 动量对比用于无监督视觉表征学习

目录

1.前言

2.代理任务

3.论文摘要

4.引言

 5.相关工作

6.具体方法(关于InfoNCEloss的详细介绍见另一篇博文)

7.总结


1.前言

 对比学习:将样本通过模型映射到特征空间,在特征空间中拉近同类的样本,并使得不同类的点排斥开。

2.代理任务

代理任务:学到一个好的数据表征,生成一个自监督的信号充当Ground Truth,作为标签。

个体判别,instance discrimination。

将一张图xi裁成两部分xi1与xi2,计算xi1与xi2、x2、x3所有样本的相似度,由于xi1与xi2来自同一张图片,因此均为正例,而其他样本为负例。即每张图片自成一类。

3.论文摘要

Abstract:MoCo从对比学习的角度出发,采用序列queue和移动平均编码器moving-average encoder构造了动态字典dynamic dictionary。并且MoCo在下游任务中取得了非常好的效果。

4.引言

Introduction:NLP任务中的原始信号空间与CV领域不同,NLP领域原始信号为离散的信号,对应词典,无监督学习可以基于此很好的学习。而计算机视觉领域,图片是连续的高维的信号,不适合构建字典。当前在无监督视觉表征学习的研究都是关于对比损失contrastive loss,都可看做构建动态字典dynamic dictionary。

要构建好的字典需要满足两点:一是足够大,能够使模型正在学到分类特征,而不是通过shortcut去做分类,可以增强模型的泛化性;二是一致性,即字典的key应该通过相似编码器得到,否则可能是与query相似的编码器的key获得了较高的相似度,而非真正还有相似的语义。

MoCo为解决以上两个问题,采取了queue(序列)和momentum encoder(动量编码器)的设计。

queue使得当前mini-batch的数据进入序列,并把最老的mini-batch挤出序列。

the current mini-batch enqueued and the oldest mini-batch dequeued.

有点类似堆栈的方式。

momentum encoder(动量编码器),计算编码器的公式如下:

Ekt = mEkt-1+(1-m)Eq

式中,Ekt为t时刻的key编码器,Ekt-1为t-1时刻的key编码器,Eq为t时刻的query编码器。当m比较大时,Ekt 与Ekt-1取得相似的结构,使得所有key的编码器都有相似的结构。

The keys are encoded by a slowly progressing encoder, driven by a momentum update with the query encoder.

这种大的、一致性的动态字典设计,使得学习到较好的视觉表征。

This method enables a large and consistent dictionary for learning visual representations.

无监督学习的主要目的在于:在大量的无标签的数据集上取得较好的预训练效果,使得预训练特征可以直接迁移到下游任务(stream task)中做微调(fine tuning)。MoCo使用无监督的预训练方式,已经在7个下游任务(语义分割、目标检测等)中效果好于ImageNet上有监督的预训练效果,有的甚至远超(surpass)有监督的预训练效果。

另外,在facebook的数据集Instagram image(10亿数据)上,也取得了很好的效果。由于Instagram image数据集并没有筛选的像ImageNet那么好,数据存在长尾分布以及不均衡等特征,因此MoCo能够更好的适应现实世界的任务。进一步,MoCo说明了无监督学习与有监督学习几乎没有差距了。无监督的预训练模型在中型数据集和大型数据集上都取得了很好的效果,或许我们真的不再需要有标签的数据集去做预训练。

 5.相关工作

论文对不同任务的损失函数做了介绍

(1)生成式,图片经过编码器解码器重构图片,将重构的图片与原始图片对比。

(2)判别式,八点,八分类。

(3)对比式,在特征空间中衡量样本对间的相似性,训练过程,目标(key)不断改变,MoCo中动态字典。

(4)对抗式,衡量两个分布间的差异,用于无监督数据生成和特征学习。

6.具体方法(关于InfoNCEloss的详细介绍见另一篇博文)

训练编码器,做字典查找任务。结构如下图,论文中代理任务是instance discrimination(个体判别),先将一个样本x分成两部分,分别为x11和x12,然后随机取mini-batch的样本x2、x3、…。然后将x11放进encoder,输出为q,x12放进momentum encoder,输出为k+,x2、x3、…同样放进momentum encoder,输出为key2、key3….。由于q与k+来自同一个样本x1,于是同属于正例,相似度最高,其余key2、key3…均为负例。

损失函数,目的学到q与k+的损失尽可能小,而q与其他key的损失尽可能大,也就是说,q与k+尽可能相似,而q与其他key尽可能远离。采用infoNCE作为目标函数,Noise Contrastive Estimation类似于交叉熵损失。

训练过程中,根据梯度反向传播不断更新encoder,直至encoder可以学到很好的表征。此时就可迁移至下游任务基于微调做分类等任务。

总的来看,CoMo的目的就是采用自监督的方式,学一个能够很好的提取特征的编码器,并使用这些编码器的参数为下游任务中微调初始化。伪代码如下: 

MoCo的关键就在于解决两个问题,一是采用queue的结构,使得动态字典尽可能大,字典大代表含有语义丰富的负样本,使得编码器能够学好特征。二是使用动量momentum,使得每次对应key的编码器变化很小,也就是说,每个key对应的编码器十分相似,这就很好的保持了key的一致性。另外,编码器是一个体征提取器。可以使用卷积网络。论文中使用的ResNet50。

7.总结

MoCo的关键点有两个,一是使用了先进先出(first in first out)的queue结构,使得中间段minni-batch的编码可以重复使用,而不是使用mini-batch作为字典,这就使得字典可以足够长,编码器学到足够好特征。原文如下:

At the core of our approach is maintaining the dictionary as a queue of data samples. This allows us to reuse the encoded keys from the immediate preceding mini-batches. The introduction of a queue decouples the dictionary size from the mini-batch size. Our dictionary size can be much larger than a typical mini-batch size, and can be flexibly and independently set as a hyper-parameter.

二是使用了动量更新编码器,由于queue的使用,使得key的编码器fk不能够反向传播来更新,一种方法是直接将q的编码器fq复制给key的编码器fk但效果并不好,原因是快速编码的key编码器fk使得key的一致性降低(每个mini-batch进去的key都由不同编码器fk生成)。因此采用动量编码器fk = mfk+(1-m) fq,当m较大时,基于自身更新,变化较小,保持了一致性。

Using a queue can make the dictionary large, but it also makes it intractable to update the key encoder by back-propagation (the gradient should propagate to all samples in the queue). A solution is to copy the key encoder fk from the query encoder fq, But this solution yields poor results in experiments (Sec. 4.1). We hypothesize that such failure is caused by the rapidly changing encoder that reduces the key representations’ consistency. We propose a momentum update to address this issue.

代码:GitHub - facebookresearch/moco: PyTorch implementation of MoCo: https://arxiv.org/abs/1911.05722https://github.com/facebookresearch/moco

参考沐神的课:

MoCo 论文逐段精读【论文精读】_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1C3411s7t9?spm_id_from=333.999.0.0

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山上的小酒馆

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值