MoCo自用笔记
Momentum Contrast for Unsupervised Visual Representation Learning
"用动量对比学习去做无监督的表征学习"
对比学习的通俗理解:以图片分类为例,对于没有标签的一群图片,好的对比学习的模型,能使得其中类似的图片,在通过模型后得到的特征空间中对应的点 尽可能地接近。而如何达到这一目标,或者说怎么去训练这样一个无监督任务的模型,这就是对比学习在做的一件事情。
视觉领域,可以人为的制定一些规则(pretext task),用来定义哪些图片应该是类似的···从而提供一个监督信号,来完成一个自监督训练。
涉及到的零散的知识点。
instance discrimination:一种比较典型的对比学习的代理任务,把一张图片做随机裁剪与数据增广得到的的一些样本视为正样本,其他的所有图片都是为负样本。即每个图片在最开始都属于自己的一个类。
重点:规则可以是多样的灵活的,例如在simCSE中同一个句子在模型中做两次forward,得到的两个特征视为正样本,其他的都作负样本;CMC中将一个物体的不同view,包括 不同的观察角度,侧面背面,深度图,rgb图,分割图···作为不同形式的正样本。
contrastive loss
为了更好的达到:相近的样本之间的距离越小越好;相远的样本之间的距离越大越好,这两个目的而设计出的一种损失函数,这个思维方式可以学习。大致思想是将不同类的样本的差异设置上限,以减少过度的将两个类别“推远”,同时还能大幅减少计算量。详情可以自己找点文章看。

NCE loss (noise contrastive estimation)
知道softmax吧,这个就是把softmax所有的类,分为两类,因为对于对比学习来说,有多少图片就有多少类,做softmax操作不现实,于是把除了自己类(data sample)外所有其他类视作一个大类(noisy sample),而对该大类做负样本采样,做估计,也正是NCE的E——estimation的意思,从而达到降低计算量的目的。
InfoNCE loss
和一般的NCE相比,更像一个能提升模型性能的小trick,可以在其它任务里尝试。加入了一个超参数,也称为温度系数。与NCE的操作不同,这里用做完点积后除以tau,达到控制logits分布平滑度的效果。

文章大致思路:
以前的对比学习,一个正样本和一个batchsize的负样本,去做训练,一个batzhsize如果是256那就是1比256的训练,但是对于现在随意一个数据集都是几百万张图片,几千类,batchsize显得很小,这样子模型能"看"到的就很少,学的少。怎么办呢,比较自然的想法就是去扩充batchsize的大小,但训练中使用一个几万张的batchsize是不现实的,这里就引入一个字典"查询"的概念,在这里使用一个在看(编码)图片时,先不进行反向传播去更新自己的Momentum Encoder,这样对队列里的元素只做一个forward操作的计算简化,使得模型能在一个step看完几万个样本,也就达成了多看些负样本的目的。
然而还有一个最重要的问题,那就是负样本的忘了Momentum Encoder如何进行更新呢,前面说了,如果需要达成“多看”这个目的,那么就不可以在训练的时候反向传播更新模型。MoCo在原文中尝试过直接使用共享Xq和Xk两个网络模型参数的方法,效果很差,所以这里就采用了一个 动量更新 的方。原文先讨论了,为什么和曾经一些的对比学习模型一样,在这里使用同一个模型去编码Xq和Xk的操作行不通了,这里解释为 caused by the rapidly changing encoder that reduces the key representations’ consistency。这里怎么理解呢,可以看下面的图,首先我们明白,网络是一个batchsize更新一次参数,就算queue再长,反向传播的时候也只是看着一个batch传播的,但如果使用一个不停在更新的模型去解读一个这么长的队列,那么Momentum Encoder 在一个step里得到的k0,k1,k2,k3那就不具备“一致性”,而这可能是导致结果变差得原因。所以MoCo就用了一个动量更新的方法(这里两个Encoder的初始参数相同),下式子意思是在每个batchsize中保留自己原来99.9%的参数。

“A na¨ıve solution is to copy the key encoder fk from the query encoder fq, ignoring this gradient. 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.”

论文链接:https://arxiv.org/pdf/1911.05722.pdf