MoCo论文详解

作者: pdnbplus | 发布时间: 2024/06/18 | 阅读量: 418

MoCo论文详解 -- 潘登同学的深度学习笔记

前言

MoCo(Momentum Contrast for Unsupervised Visual Representation Learning): CVPR 2020 最佳论文提名,视觉 + 对比学习的里程碑式的工作

对比学习:

  • 简单、好用;
  • 19年以来,视觉领域乃至整个 ML 领域最火的方向之一;
  • 盘活了从17年很卷的CV领域,MoCo是其中的优秀工作之一 ;

对比学习是一种无监督学习的范式;

  • 假如有三幅图,图一、图二都是人,而图三是狗,对比学习要实现的就是使得三张图进入一个网络M中,得到特征$f_1,f_2,f_3$,在这个特征空间embedding space中,$f_1,f_2$的特征尽量相近,而他们与$f_3$的特征尽量远离;

但不是说对比学习是无监督学习吗? 要想知道两个图的物体很相似,还是要知道标签信息啊?

  • 在CV领域中,通过设置巧妙的代理任务,达到自监督的目的;
  • 最广为使用的是instance discrimination 个体判别, 就是将数据集中的一张图片抽出来,对其做随机裁剪及数据增强,这些图片间就是正例(或者属于同一类),这些图片与其他就是负例;
  • 只要定义好了正样本与负样本,通过一个模型得到特征,在特征上求NCE Loss就可以了(都是标准操作);

对比学习的正负样本定义可以有很多种,说几种常见的

  • 同一个视频里面的任意两帧是正样本;
  • 在NLP simCSE中两个forward间是正样本(因为同一句话进模型,其中的dropout是随机的);
  • CMC 一个物体的不同view都是正样本;

MoCo的主要贡献

  • MoCo构造了一个超大的字典(字典不是我们要的,模型才是),进行对比学习。 a dynamic dictionary with a queue and a moving-averaged encoder 动态字典;
  • MoCo (第一个)在 (分类、检测、分割)主流的 CV 任务证明 无监督学习 也不比 有监督学习 差 ;
  • MoCo填补了 CV 领域的无监督学习和有监督学习的 gap;

为什么无监督学习在CV领域不成功?

  • 原始信号不一样,NLP 的离散单词更具语义性,CV的连续、高维信号不好构建字典;
  • 无监督学习在 NLP 很成功, i.e., GPT, BERT;
    • NLP 原始信号是离散的,词、词根、词缀,容易构建 tokenized dictionaries 做无监督学习;
    • tokenized: 把一个词对应成某一个特征;
  • CV 原始信号是连续的、高维的,不像单词具有浓缩好的、简洁的语义信息,不适合构建一个字典,如果没有字典,无监督学习很难建模;

Why tokenized dictionaries 有助于无监督学习?

  • 把字典的 key 认为是一个类别,有类似标签的信息帮助学习
  • NLP 无监督学习很容易建模,建好的模型也好优化

站在对比学习角度,我们需要一个什么样的字典?

  • 大(large) + 一致性 (consistent)
    • 从连续高维空间做更多的采样。字典 key 越多,表示的视觉信息越丰富,匹配时更容易找到具有区分性的本质特征。
    • 如果 字典小、key 少,模型可能学到 shortcut 捷径,不能泛化
    • 字典里的 key $(k_0, k_1, k_2, \dots, k_N)$ 应该由相同的 or 相似的编码器生成
    • 如果字典的 key 是由不同的编码器得到的,query q 做字典查询时,很有可能 找到和 query 使用同一个 or 相似编码器生成的 key,而不是语义相似的 key。另一种形式的 shortcut solution

整体架构

MoCo不是在网络结构上做的创新,而是在训练方法上的创新,主要是对比学习的范式;

对比学习

先首先讲讲对比学习的常用记号,以MoCo为例

  • 将一张图片分别随机剪裁,得到两张图片,分别做数据增强;
  • 其中一张称为anchor, 另一张称为positive,其他所有都是negatives;
  • anchor也称为Query, positive与negatives都称为Key,所以衡量特征空间embedding space中,两个向量的相似程度,就与用Query去字典中查Key是类似的操作;
  • Query与positive的Key内积要尽可能大,与其他的要尽可能小;优化NCE loss;

前面也说到,那个特定的图片自成一类,计算NCE loss本质也是交叉熵损失函数,其全称为Noise-Constrastive Estimation Loss,其他的各个图片都自成一类;于是产生两个问题:

  • 以ImageNet-1k数据集来说,有128M的图片,那么就得有128M类,这样算softmax显然是不行的;所以NCE loss采用的是二分类的形式,除了正例以外都当作一类,Noise就是表示负例的意思;
  • 一次计算正例与所有负例的Loss也是不现实的,因为图片数太多不能塞进一个batch中;所以选择从样本集中随机抽负例,进行计算,得到的是Loss的近似,Estimation就表示近似的意思;

而论文采用的是NCE的变体,称为infoNCE,是将NCE二分类变为有1个正例K个负例的(K+1)分类问题,简单粗暴的将其做二分类,可能效果不太好,我认为有以下原因

  • 负例与负例之间的差别可能很大,部分负例与正例的差别很小,他们可能是潜在的正例(都是人,只是不是同一幅图而已);
  • 正负样本失衡问题;
  • 除此之外, 还加入了一个$\tau$的温度超参,主要是使得分类间更平滑的

在这里插入图片描述

论文总结了之前的对比学习的常用框架,主要有两种,一种是End to End的模型,另一种是memory bank的模型;

在这里插入图片描述

以往的对比学习的Encoder q与encoder k基本上都是用相同的网络(这里的$x^q,x^k$就是输入图片),这里的Encoder网络就是一般的back blone主干网络(论文用的是ResNet50);所以MoCo也是使用同一个Encoder来做(当然可以使用不同的Encoder,最终留下的是Encoder q,但是我认为用同一个Encoder比较合理)

End to End的架构

  • 将一个query、一个positive与一个batch的negatives输入模型,更新Encoder;
  • 这样做的不足是字典的大小太小,在End to End中key所在的字典的大小与batch的大小是等价的;

memory bank的架构

  • memory bank解决了上面的难题,就是构造了一个大字典,每次输入的时候从字典里面找Key;
  • 其字典中每个Key都是128长度的特征向量,所以就算128M的图片,加起来也就600M的大小;而且这个Key是被梯度截断的;
  • 但是在每一个batch向前传播结束后(模型被更新了),只会更新字典中刚才被前向传播过的负例所对应的Key,而不是所有Key;
  • 假设1,3,8这三张图片在第一个epoch中的第一个batch被更新,5,7,11这三张图片在第一个epoch中的最后一个batch才被更新, 那么在下一个epoch中,随机抽取的负例是1,7,11那么这个Key就非常不一致,因为1与7、11的模型已经几乎隔了一个epoch;
    • 当然可以在每个epoch最后重新更新一次整个Key字典(这需要很多额外的计算),但是memory bank这篇论文没有这样做,所以导致了字典的不一致;

大而一致的字典

MoCo为了实现大而一致的字典,使用队列来解决

  • 在这里的'字典'就是队列,在每次向前传播结束后,模型更新完后,将负例更新后的Key入队,前面时刻(old-batch)计算得到的Key出队;(我认为与更新字典没有本质区别)
  • 这个队列的大小就与batch的大小分开了,解决了大的问题;
  • 而为了保证一致性,采用了momentum更新encoder k的方法(初始的时候encoder k与q是一样的)

在这里插入图片描述

而且在实验中,m设置的很大,为0.999,保证了字典更新的一致性;

实验

主要在ImageNet 1M和Facebook 1B的数据集上做了实验

Linear Classification Protocol

Linear Classification Protocol是将网络当作特征提取器(将back blone冻住),接分类头得到分类结果

在这里插入图片描述

其他下游任务

这是实验最重要的部分,因为做无监督的模型的优势就是将无监督的结果迁移到下游任务(如目标检测),能有好的效果(类似bert);

  • 目标检测PASCAL VOC数据集 在这里插入图片描述

  • 目标检测和语义分割 COCO数据集 在这里插入图片描述

  • 人体关键点检测,姿态检测,语义分割LVIS v0.5,Cityscapes 在这里插入图片描述

MoCo基本上在所有下游任务上达到有监督学习的水平,在个别任务上略显不足(可能是对比学习的样本设置问题),但总体填平了有监督与无监督之间的gap;