读论文Momentum Contrast for Unsupervised Visual Representation Learning 简单总结

简介

我们提出了无监督视觉表示学习的动量对比(MoCo)。从对比学习作为词典查找的角度出发,我们构建了一个带有队列和momentum-based moving average编码器的动态词典。这使得能够快速构建一个大型且一致的词典,从而促进对比无监督学习。MoCo在ImageNet分类的共同线性协议下提供竞争性结果。更重要的是,MoCo学习到的表示可以很好地转移到下游任务。在PASCAL-VOC、COCO和其他数据集上,MoCo可以在7个检测/分割任务上取得很好地效果,有时甚至超过了有监督学习。这表明,在许多视觉任务中,无监督和有监督的表征学习之间的差距已经很大程度上缩小了。

什么是无监督问题

有监督问题就是利用监督信息(标注信息)去设计和训练模型,无监督问题就是不需要依赖于监督信息标注信息也能去设计和训练相应的模型。如本文关注的图片无监督问题,就是在只给了你图片数据的前提下没有任何图片标注信息,依然能训练得到一个很好的特征提取器。下游任务直接用我的这个特征提取器就可以了。

图片无监督问题的难点

文章中作者提到无监督学习在自然语言处理中非常成功了,因为NLP任务中的单词是离散的,因此可以构建单独的词典(dictionary)。而图像处理任务中的数据则分布在高维的连续空间中,没有办法构建图像词典。而词典结构作者认为是无监督学习方法的关键,因此缺乏词典结构阻碍了图像处理领域的无监督学习方法的发展

先总的介绍一下这个过程,通过encoder,得到这些图片的低维表示,希望q (也就是x query 经过 encoder 得到的表示)与 正样本经过 encoder 得到的表示 ki 相似,和其他 k不相似,然后就优化这个loss,去训练encoder,作为我们最后要留下来提取特征的东西。(其中上图中,两个图1是一张图片通过不同的数据增强得到的,图2图3则为不同图片通过数据增强得到的。)

contrastive loss

也就是说,当q与其k+相似且与所有其他k不同时,该函数的值较低。

Momentum Contrast (MoCo)

本文希望能构建一个large和consistent的dictionary:

large:希望dictionary的容量够大,才能更好地采样到更多信息。a queue of data samples

consistent:希望key的特征是通过相似或者相同的encoder得到的,使得在与query进行特征比较的时候,保持特征的一致性。a moving average encoder

本文作者还有simclr的作者都有说,想要得到好的结果,需要让负样本尽可能的大。作者这里采用了一种基于队列的采样更新规则(为了方便下述MoCo)。作者还与另外两种方式做了个对比,分别为end-to-end的方式和memory bank的方式。

  • end2end  它使用当前batch中的样本作为dictionary,因此key是一致编码的(通过相同的编码器参数,因为所有的样本都在batch)。其中1个可以匹配的key,K个不可以匹配的key。但是受限于GPU,batch不可能太大,dictionary也就大不了,想尽了办法使用了大batch,又会遇到大batch本身优化难的问题;
  • memory bankend-to-end问题的核心在于 dynamic dictionary size 和 batch size的耦合。因此,memory bank,把之前编码好的样本存储起来,每个batch的dictionary都是从memory bank中随机抽取,不进行反向传播,因此可以支持大的dictionary。但这样有个问题是存储好的编码都是之前的编码器计算的,而 左侧编码器一直在更新,会有两侧不一致的情况,影响目标优化。
  • MoCo改进方法

(1)dictionary队列化:

dictionary的大小不需要受batchsize的约束,可以设置成任意大小。MoCo,采用了时间管理的机制。就是说,在MoCo中,每一个batch都会淘汰掉 dynamic dictionary中最早被编码的那一批数据,然后把最新采样的数据加进去。删除最旧的bath可能是有好处的,因为他是最老的encoder参数得到的特征,与最新的encoder参数最不一致。在这里源代码用了一个很大的K,是六万五千多。如果是end to end将batch size 设为六万五千多,这是很难想象的。

(2)momentum-based moving average:

因为dictionary的key来自于不同的mini-batch,通过一种方式缓慢更新(slowly progressing)key的encoder,使得key的特征保持一致性。关于一致性,和memory bank的方法做对比。memory bank中,只有一个编码器,key和query,都是同一个编码器编码得到的。keys就和encoder的参数相关。这些key在不同的阶段进入memory bank中,对应的key值是有差别的,所以memory bank的一致性较差。而moco的办法,用更新公式更新key encoder参数。更新公式如上图所示,即每次梯度反向传播不向 key encoder 传播,而只更新query encoder的参数。key encoder的参数采用逐步向 query encoder 逼近的方式。具体而言,这里的\Theta是网络参数,m是动量系数。每一次迭代key encoder的参数变化很小,所以keys的变化也会较小,一致性较高。 好处在于:避免了因为encoder的剧烈变化导致特征丢失一致性,同时也保持encoder一直处于被更新的状态。

(文章中说通过实验发现,适当增加m会带来更好地效果,因此本文 m=0.999。 当m接近于1的时候,所以,虽然队列中的key由不同参数的编码器(以不同的小批量)编码,但是这些编码器之间的差异可以很小。\Theta k还是会和之前的 \Thetak很相像,并且加了一些\Theta q的信息进来。)

伪代码

首先将q encoder的参数赋值给 k encoder,x是batch的大小,对x进行两种不同的数据增强,分别通过q encoder、k encoder得到q和k,N是样本数量,C是维度。之后,k就不要再更新了。再分别计算正负样本的相似度。

q和k相乘作为正样本相似度,因为他们是同一张图片进行不同变换得到的,负样本相似度就是q和队列进行相乘得到的,这里的K就是那个队列的大小。之后计算这一批次的loss,用SGD更新q encoder的参数,通过更新\Theta k的公式,更新\Theta k。最后更新dictionary,将当前k,就是当前batch里通过k encoder得到的k进队列,再将老的batch出队列。

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

&刘仔很忙

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值