MoCo v1原理解析

Momentum Contrast for Unsupervised Visual Representation Learning论文阅读笔记

 首先需要明确的是无监督模型的正确使用姿势,即先在较大的、难以很好标注的数据集上利用无监督训练得到一个pre-trained模型,再根据下游具体的任务,在较小的、可以很好标注的数据集上,进行有监督的fine-tuning。

 很多DL Reseachers都认为深度学习的本质其实就是在做两类upstream tasksRepresentation Learning(表示学习)和Inductive Bias Learning(归纳偏好学习)。学好了样本的表示不涉及推理、逻辑等的downstream tasks上,DL能够给出一个不错的结果。例如:NLP领域中判断句子的情感方向,CV领域中进行图像检索、物体识别。而DL要想较好地完成一些更加高级的语义信息和复杂的逻辑活动,就需要设计一系列过程去分解这些复杂的任务。

 Unsupervised Representation Learning在NLP领域已经取得了重大的成果,而CV领域的Unsupervised Visual Representation Learning却被甩在了后面。有了以上的Motivations,论文从Contrastive Learning(对比学习)框架的角度出发提出了MoCo用于无监督的视觉表示学习。

Reference:
对比学习(Contrastive Learning)相关进展梳理
CV中的无监督学习方法:MoCo

1. Introduction

 论文基于contrastive learning框架提出了MoCo,其主要思想就是训练encoder,将图像编码为query vector和key vector,对于能够匹配的图像对,让query vector和key vector越相似,反之越疏远。一次图像查找的行为就类似于一次字典查找,即通过encoder将查询的图像编码为query vector去与字典中的key vectors进行对比,查找出与query vector最相似的key vector。

 由上述分析,在整个contrastive learning中,构建储存key vectors的字典十分重要。论文对一个好的字典需要满足的条件作出了以下归纳:large、consistent。现在所有基于constrastive learning的方法都只能顾及到这两个方面中的一个,所以论文提出了MoCo as a way of building a large and consistent dictionaries

2. MoCo

2.1. Contrastive Learning as Dictionary Look-up

 无监督学习方法主要用来学习好的特征以用于特定的下游任务,这类方法往往需要建立一个pretext task(代理任务),所谓代理任务指的是这个任务本身并不是学习目的,真正想要的是通过这个任务学习到好的数据特征或者表达。MoCo采用代理任务是instance discrimination task(被作者比作Dictionary Look-up),其contrastive loss function为InfoNCE(Info noise-contrastive estimation)公式如下:
L q = − l o g e x p ( q ∗ k + / τ ) ∑ i = 0 K e x p ( q ∗ k i / τ ) (1) L_q = -log\frac{exp(q * k_+/\tau)}{\sum_{i=0}^Kexp(q*k_i/\tau)} \tag{1} Lq=logi=0Kexp(qki/τ)exp(qk+/τ)(1)
 是 τ \tau τ温度超参数,样本中只有一个正例和K个负例,这个问题可以看成K+1分类问题,所以损失函数就是基于softmax的交叉熵。

2.2 Momentum Contrast

在这里插入图片描述
 如上图所示,主要有三种contrastive loss mechanisms:

 左边的是end-to-end的训练方式,它只是利用当前的mini-batch data去更新参数,由于当前batch data输入encoder之后得到的encoded keys dictionary都是由一套参数的encoder得到的,所以能够很好地保持consistency(一致性),但是这样也使得这个dictionary size也会受限制于bacth size

 右边是memory bank,就是将encoded keys存入memory bank之中,下一个train step的时候,在memory bank中sample出一些encoded keys和当前query计算loss,从而完成更新。这种方法虽然实现了dictionary size与batch size的解耦,但是由于memory bank中储存的encoded keys来自于不同阶段的train step,这就会导致整个dictionary难以保持很好的consistency(一致性)。

 中间是MoCo,它利用queue代替memory bank实现了dictionary size与batch size的解耦,又利用动量更新参数保证了平稳更新参数,从而使得dictionary可以保持较好地consistency(一致性)。

2.3 Formulation

 MoCo整个核心思想就分为两大部分:

 利用queue(队列)代替memory bank,当队列满了之后,用最新的batch data得到的batch encoded keys挤掉最老的batch encoded keys,这样既保证了batch size与dictionary size的解耦,又保证了queue中的encoded keys是由临近几代的encoder产生的。

 利用动量去更新key encoders的参数,公式如下:
θ k ⟵ m θ k + ( 1 − m ) θ q \theta_k \longleftarrow m \theta_k + (1 - m)\theta_q θkmθk+(1m)θq

PS:query encoder还是通过当前queries计算出的loss正常更新。

猜你喜欢

转载自blog.csdn.net/qq_42718887/article/details/113834840