Moco -Momentum Contrast for Unsupervised Visual Representation Learning

在这里插入图片描述
首先这是一篇来自2020年cvpr的一篇文章,MoCo: CVPR 2020 最佳论文,完成了视觉 + 对比学习的里程碑式的工作。填补了 CV 领域的无监督学习和有监督学习的 gap 。
作者是何凯明,来自FaceBookAi研究所。
这篇文章主要是提出来了简单又有效地方法去创建一个又大又可以在训练过程中保持一致的字典
其中字典使用了队列的数据结构,其次动量更新编码器。

在这里插入图片描述

如上图所示,有三张图片,图1、2为同一个人不同的表情的照片,图3为dog,在训练时不会为这三种图片去标注。将三种图片输入到模型中,模型会得到三张图片各自特征即 f1f2f3
。由于图1、2为同一个人、对比学习就是让特征 f_1,f_2 比较接近,而特征 f_3与另外两个特征在特征空间相距较远,这就是对比学习需要达到的目的。
在这里插入图片描述
虽然在对比学习中并不需要为图片进行标注,但是仍然需要知道哪些图片是相似的,哪些图片是不相似的,在计算机视觉中通常使用代理任务来完成。
举一个具体的例子 个体判别,假设有 n 张图片,选取一张图片 x_i ,经过裁剪和数据增强后得到两张新的图片 x_i^1和 x_i^2,则这两张图片和原来的图片就是相似的,也被称为正样本,其余图片即 j ≠ i ,则为负样本。
对比学习的灵活之处就在于正负样本的划分,例如同一张图片不同视角可看作为正样本,视频中同一段视频任意两帧可以看为正样本,RGB和深度图也可看作为正样本等等。
正是由于其灵活性,对比学习的应用才如此之广。
在这里插入图片描述
在这里插入图片描述
先是论文标题,论文标题的意思是:使用动量对比去做无监督视觉表征学习,MoCo 就来自于论文前两个单词前两个字幕。简单介绍什么是动量,动量在数学上就是加权移动平均。

例如 y t = m ∗ y t − 1 + ( 1 − m ) ∗ x t y_t = m * y_{t-1} + (1-m)*x_t yt=myt1+1mxt, y t − 1 y_{t-1} yt1为上一时刻的输出, x t x_t xt为当前输入, m 为动量参数;

当 m 很大时, y t y_t yt就取决于上一时刻输出,其更新就很缓慢;当 m 很小时, y t y_t yt就取决于当前时刻输入。
———————————————
在这里插入图片描述
这里假设有n张图片x1,x2…xn,如何构建一个字典。
首先x1经过不同的数据增强得到了图片 x11 x12
x11为锚点,x12为正样本,其余的图片x2。。。xn为负样本
x11经过编码器Eq生成特征query
因为 positive 和 negative 都是相对 anchor f_11 来说的。正负样本使用同样的编码器 ,经过编码器Ek生成特征keys
编码器 E_11 和 E_12 可以一样,可以不一样 ,在本文中编码器是不一样的。

这里就构建了一个字典 通过query来查询key。
对比学习怎么做?

f11 和 f12 相近,f11 和 f2, f3, …, fn 远离 ,构建一个满足这样的损失函数,最小化就完成了对比学习。

在这里插入图片描述
作者希望构建的词典是需要满足两个特征的:(i)大的,(ii)在训练过程中,保持一致。
字典中的 key 应该尽可能使用相同或相似的编码器来表示,这样它们和 quary 的比较才能一致。
我们提出了 MoCo 模型,如下图所示,通过比较 query 和 key 地相似性来训练编码器。我们用队列来存储字典数据,当前时刻数据编码后新的特征入队,最老的数据特征出队,这样字典大小和mini-batch大小就解耦了,就能保证构建一个大的字典;同时使用动量去更新编码器参数,能保证字典中的特征尽可能地一致。
在这里插入图片描述
这里存在一个假设:在字典中只有一个 key是跟 query 匹配的,两个互为正样本对,这个 key 叫做 key positive k + k_{+} k+)。定义好了正样本( k + k_{+} k+)和负样本,接下来就需要一个对比学习的目标函数,这个对比学习的目标函数最好能满足以下要求:

(1)当 q 和唯一的正样本$ k_{+}$相似的时候,它的loss 值应该比较低;
(2)当 q 和其他所有的 key 都不相似的时候,这个loss的值也应该比较低。

通过点积计算相似性,我们使用 InfoNCE 当作对比学习损失函数,形式为

τ 是一个温度超参数

之前在instDisc那篇论文提及到,大部分对比学习的代理任务看成个体判别,也就是每一个图片是一个类别,这样就会导致函数分母的n 过于大,然后下面的求和也难以计算,常规的softmax函数不能使用。然后instDisc将多分类任务转化为一系列二分类任务,二分类任务是判断样本是来自于真实数据还是噪声数据,然后其选择m张照片作为噪音作为近似。

moco这篇文章中时看作多分类问题,从而变成了下面的公式,k代表了负样本的数量。公式下面是一个正样本和k个负样本求和,总共k+1个 样本,也就是字典中key的数量 k+1
在这里插入图片描述在模型训练的过程中,每一个 mini-batch 就会有新的一批 key 被送进来,同时也会有一批老的 key 移出去,所以用队列的好处是可以重复使用那些已经编码好的 key,而这些 key 是从之前的那些 mini-batch 中得到的。这样使用了队列之后,就可以把字典的大小和mini-batch的大小彻底剥离开了,就可以在模型的训练过程中使用一个比较标准的mini-batch size,一般是128或者是256,但是字典的大小可以变得非常大,它的大小非常灵活。同时在算对比学习目标函数的时候只是取一个近似,而不是在整个数据集上算loss,使用队列的数据结构,可以让维护这个字典的计算开销非常小。此外,删除最旧的mini-batch也是有益的,因为它编码的keys是最过时的,因此与最新的keys最不一致
在这里插入图片描述
.用队列的形式可以使这个字典变得很大,但是也因为使用了非常大的字典,也就是非常长的队列,导致没办法给队列中所有的元素进行梯度回传,也就是说,key 的编码器无法通过反向传播的方式去更新它的参数。如果想更新这个 key 的编码器,其实有一个非常简单的方法:就是每个训练迭代结束后,将更新好的 f q f_q fq编码器参数直接复制过来给 f k f_k fk编码器就可以了。这个想法简单确实是简单,但是这种方式的结果并不好,原因是一个快速改变的编码器降低了这个队列中所有 key 的特征的一致性。因此作者提出了动量更新的方法,如果将 key 编码器参数设为 θ k θ_k θk,q 编码器的参数设为 θ q θ_q θq,那 θ_k

就是以下面公式进行更新:

上式中 m 是动量参数,它是一个0到1之间的数。q 的编码器 ,是通过梯度反向回传来更新模型参数, θ_ k 除了刚开始是用 θ_q 初始化以外,后面的更新大部分主要是靠自己。如果动量参数 m 设的很大,那么 θ_k更新就非常缓慢,所以作者接下来说,因为使用了这种动量更新的方式,虽然在队列里的 key 都是由不同的编码器产生得到的,但是因为这些编码器之间的区别极小,所以产生的 key 的一致性都很强。在实验中,一个相对较大的动量(例如,m = 0.999,我们的默认值)比一个较小的值(例如,m = 0.9)工作得更好,这表明一个缓慢进化的key编码器是利用队列的核心,体现了key一致性的重要性。
在这里插入图片描述
第一种就是比较直接的端到端学习,如上图a所示编码器可以通过梯度回传来更新模型参数。

由于模型的正负样本都是从同一个 mini-batch 里来的,也就是 x q x^{q} xq x k x^{k} xk 都是从同一个 batch 中来的,它做一次前向传播就能得到所有样本的特征,而且这些样本是高度一致的,因为都是来自一个编码器。听起来确实很美好,编码器能用反向回传学习,特征也高度一致了,但是它的局限性就在于字典的大小,因为在端到端的学习框架中,字典的大小和 mini-batch size 的大小是等价的,如果想要一个很大的字典,里面有成千上万个 key 的话,也就意味着 mini-batch size 的大小必须也是成千上万的,这个难度就比较高了。端到端学习的优点在于编码器是可以实时更新的,所以导致它字典里的那些 key 的一致性是非常高的,但是它的缺点在于因为它的字典大小(就是batch-size的大小),导致这个字典不能设置的过大,否则硬件内存吃不消。

第二种是memory bank。在 memory bank 中其实就只有一个编码器,query 的编码器是可以通过梯度回传来进行更新学习。但是对于字典中的 key 是没有一个单独的编码器,memory bank 把整个数据集的特征都存到了一起,对于 ImageNet 来说,memory bank 中就有128万个特征(看上去好像很大,但是每一个特征只有128维,所以即使整个 memory bank 中有128万个 key ,最后也只需要600M的空间就能把所有的这些key存下来了)。一旦有了这个 memory bank,在每次模型做训练的时候,只需要从 memory bank 中随机抽样很多的 key 出来当作字典就可以了。这里也有一个问题:因为这里的特征都是在不同时刻的编码器得到的,而且这些编码器都是通过梯度回传来进行快速更新的,这也就意味着这里得到的特征都缺乏一致性。

显然,无论是端到端的学习还是 memory bank 的方法,都和作者说的一样,受限于字典大小和特征一致性这两方面中的至少一个,所以为了解决之前这两种做法的局限性,作者就提出了 MoCo。MoCo 采用队列的形式去实现字典,从而使得它不像端到端的学习一样受限于 batch-size 的大小,同时为了提高字典中特征的一致性,MoCo使用了动量编码器
在这里插入图片描述
三种对比学习机制使用同一代理任务。我们还使用与对比损失函数Eqn.(1)相同形式的InfoNCE。
end to end k值再大由于硬件限制无法实现了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值