论文:Momentum Contrast for Unsupervised Visual Representation Learning
代码:https://github.com/facebookresearch/moco
出处:FAIR | 何凯明 | CVPR2020
时间:2020.03
无监督表达学习在自然语言处理方面已经有了很成功的应用,如 GPT 和 BERT,但当时(2020年左右)在计算机视觉中还是监督学习占主流。其主要原因在于两者的特征信号不同,语言任务的数据是在离散数字空间(如单词),但视觉任务的数据是在连续的高维空间。
当时的主流方法是怎么做的:
作者提出了 MoCo(Momentum Contrast),来构建一个大且连续的字典,用于支持使用 contrastive loss 训练的无监督学习,如图 1 所示
如何建立字典:
为什么是 momentum contrast:
MOCO 的主要特点:
什么是对比学习:
对比学习可以被看做为了字典查表任务训练一个 encoder 的任务:
假设一个 encoded query q q q 和一系列 encoded samples { k 0 , k 1 , k 2 , . . . } \{k_0, k_1, k_2, ...\} {k0,k1,k2,...}(即字典的 key)
假设字典中只有一个 key k + k_+ k+ 是和 q q q 匹配的
当 q q q 和 k + k_+ k+ 非常近似且和其他 key (即 negative key)远离时,contrastive loss 就会很小。
当使用内积来衡量相似程度时,contrastive loss 函数的形式如下,也叫 InfoNCE[46]:
作者之所以提出动量对比是因为作者认为使用大的字典能够引入更丰富的负样本,但大的字典中不同 batch 提取特征的模型参数是一直在更新的,这样就难以使用梯度反传的方式来更新 key encoder,之前有些方法使用 query encoder 的参数来当做 key encoder 的参数,但这样就会导致特征不连续。
1、Dictionary as a queue
本文思想的核心在于将字典当做数据的队列,这样就能够对前面 batch 的编码特征进行重复使用,可以将字典大小和 batch 大小解耦开来,字典的大小可以远远大于 batch 的大小,且大小可以设置为可调节的超参数。
字典中的样本可以被逐步的替代,当前 batch 的特征入队,最老的 batch 的特征出队
2、momentum update
使用队列可以使得字典变大,但不同 batch 提取特征的模型参数是一直在更新的,这样就难以使用梯度反传的方式来更新 key encoder,因为需要给队列中的所有 samples 传递梯度。
一个简单的做法是直接从 query encoder 来复制得到 key encoder,但效果不好
作者猜测这不好的效果来源于 encoder 剧烈的变化会降低 key 表达特征的连续性,所以提出了动量更新的方法。
所以,动量 encoder 更新 θ k \theta_k θk 的公式如下:
3、Relations to previous mechanisms
MoCo 和之前两种方法的对比见图 2,主要的差别就在于字典的尺寸和参数更新的一致性。
pretext task 也叫前置任务或代理任务,也就是该任务不是目标任务,但执行该目标可以更好的执行目标任务,本质就是迁移学习。
参考论文 [61],作者也将来源于同一张图像的 query 和 key 当做一组 positive pair,其他都是 negative pair
query 和 key 都被其各自的 encoder 进行编码 f q f_q fq 和 f k f_k fk,编码器可以是卷积神经网络。
Algorithm 1 展示了 MoCo 的伪代码
1、ImageNet-1M(IN-1M)
约有 1.28 million 数据,共 1000 个类别
2、Instagram-1B (IG-1B)
约有 1 billion 数据,来源于 Instagram
优化器:SGD
IN-1M :
IG-1B:
1、不同 loss 的对比
作者冻结训练好的特征(在 IN-1M 上无监督预训练),在后面接了一个 linear classification,只训练这个分类器,也表现的较好。表明 MOCO 可以很好的迁移到下游任务,有效的弥补了有监督和无监督的鸿沟。
对比不同对比学习 loss 的结果见图 3,这三个 loss 都得益于大的 K
2、Momentum 的效果
K=4096
检测器:Faster RCNN
4、在 COCO 上的检测和分割
模型:Mask RCNN(with FPN)
下游任务: