[论文阅读](对比学习系列)


第一阶段:百花齐放

[2018] (CVPR) INstDisc

在这里插入图片描述
这篇论文提出了个体判别任务以及memory bank

在这里插入图片描述

  • 图1:激励我们的非监督方法的监督学习结果。对于来自美洲豹类的图像,经过训练的神经网络分类器得到最高响应的类都是视觉相关的,例如美洲豹和猎豹。并不是语义标记,而是数据本身的明显相似性使某些类比其他类更接近。我们的无监督方法将类级监督发挥到了极致,并学习了一种能够区分个体实例的特征表示。*
  1. 图1:本文的方法是受到有监督学习结果的启发,如果将一张豹子的图片喂给一个已经用有监督学习方式训练好的分类器,会发现他给出来的分类结果排名前几的全都是跟豹子相关的,有猎豹、雪豹,总之从图片来看这些物体都是长非常相近的;而排名靠后的那些判断往往是跟豹子一点关系都没有的类别
  2. 通过很多这样的现象,作者觉得让这些图片聚集在一起的原因并不是因为它们有相似的语义标签,而是因为这些照片长得太像了,某一些 object 就是很相似,它们跟另外一些 object 的呢就是不相似,所以才会导致有些分类分数都很高,而有些分数非常低
  3. 最后作者根据这个观察提出了个体判别任务:无监督的学习方式就是把按照类别走的有监督信号推到了极致,现在把每一个 instance都看成是一个类别,也就是每一张图片都看作是一个类别,目标是能学一种特征能把每一个图片都区分开来
  4. 所以图一画的很好,起到了一石二鸟的作用:不仅很简单的介绍了研究动机,自然而然地引入了问题,而且用一句话的形式引入了个体判别这个代理任务
    在这里插入图片描述
  5. 图二讲述了文章中的方法
  6. 通过一个卷积神经网络把所有的图片都编码成一个特征(这些特征在最后的特征空间里能够尽可能的分开,因为对于个体判别任务来说每个图片都是自己的类,所以说每个图片都应该和别的图片尽量的分开
  7. 训练这个卷积神经网络使用的是对比学习,所以需要有正样本和负样本,根据个体判别这个任务,正样本就是这个图片本身(可能经过一些数据增强),负样本就是数据集里所有其它的图片
  8. 做对比学习,大量的负样本特征到底应该存在哪呢?本文用了 memory bank 的形式:就是说把所有图片的特征全都存到memory bank 里,也就是一个字典(ImageNet数据集有128万的图片,也就是说memory bank里要存128万行,也就意味着每个特征的维度不能太高,否则存储代价太大了,本文用的是128维)

前向过程:

  1. 假如batch size是256,也就是说有256个图片进入到编码器中,通过一个 Res 50,最后的特征维度是2048维,然后把它降维降到128维,这就是每个图片的特征大小
  2. batch size 是 256 的话也就意味着有256个正样本,那负样本从哪来呢?自然是从 memory bank 里随机地抽一些负样本出来。本文抽了4,096个负样本出来
  3. 有了正样本也有了负样本,就可以用NCE loss 计算对比学习的目标函数
  4. 一旦更新完这个网络,就可以把 mini batch里的数据样本所对应的那些特征,在 memory bank 里更换掉,这样 memory bank 就得到了更新
  5. 接下来就是反复这个过程,不停的去更新这个编码 t,不停的更新这个 memory bank,最后学到这个特征尽可能的有区分性

本文的方法还有很多细节都设计的非常巧妙

  1. 比如说 proximal regularization:它给模型的训练加了一个约束,从而能让 memory bank 里的那些特征进行动量式的更新,跟 MoCo 的想法是非常一致的
    在这里插入图片描述

  2. 另外设置里面超参数的设定,比如说算 loss 的时候温度的设置是0.07,选了4,000个负样本,训练是200个epochs,batch size 是256,起始的 learning rate 是0.03,之后其它论文(尤其是 MoCo)所有的这些实验细节,MoCo 都是严格按照 Inst Disc 来的,这些超参数都没有进行更改。所以说 Inst Disc 这篇论文也是一个里程碑式的工作:它不仅提出了个体判别这个代理任务,而且用这个代理任务和 NCE loss做对比学习,从而取得了不错的无监督表征学习的结果,同时它还提出了用别的数据结构存储这种大量的负样本,以及如何对特征进行动量的更新,所以真的是对后来对比学习的工作起到了至关重要的推进作用

[2019] (CVPR)Unsupervised Embedding Learning via Invariant and Spreading Instance Feature

在这里插入图片描述
这是一篇 CVPR 19的论文,跟今天要说的其它论文相比,它的影响力可能不是那么大,之所以提一下这篇论文,是因为它可以被理解成是 SimCLR 的一个前身,它没有使用额外的数据结构去存储大量的负样本,它的正负样本就是来自于同一个 minibach,而且它只用一个编码器进行端到端的学习

这篇文章也没有给自己起名字,所以就像 Inst Disc 一样就叫它 Inva Spread 好了,所以写论文的时候,最好还是给自己的方法起个名字,而不是叫 ours,这样方便别人记住也方便别人引用,也是一个双赢的事情

本文的想法其实就是最基本的对比学习
在这里插入图片描述

  1. 如图1所示,同样的图片通过编码器以后,它的特征应该很类似,不同的图片,它的特征出来就应该不类似,这就是题目中说的invariant和 spreading,就是说对于相似的图片、相似的物体,特征应该保持不变性,但是对于不相似的物体或者完全不沾边的物体,特征应该尽可能的分散开

具体做法:

在这里插入图片描述

  1. 代理任务也是选取了个体判别这个任务

前向过程:

  1. 如果 batch size 是256,也就是说一共有256个图片,经过数据增强,又得到了256张图片
  2. 对于 x1 这张图片来说, x1’ 就是它的正样本,它的负样本是所有剩下的这些图片(包括原始的图片以及经过数据增强后的图片),也就是说正样本是256,负样本是256减12,就是除去样本本身之外 mini-batch 剩下的所有样本以及它经过数据增强后的样本,也就是这里为什么要2,这些都是负样本
  3. 它和 Inst Disc d的区别:Inst Disc中,正样本虽然是256,它的负样本是从一个 memory bank 里抽出来的,它用的负样本是4096甚至还可以更大
  4. 本文为什么要从同一个 mini-batch 里去选正负样本?因为这样就可以用一个编码器做端到端的训练了,这也就是MoCo里讲过的端到端的学习方式
  5. 剩下的前向过程都是差不多的,就是过完编码器以后,再过一层全连接层就把这个特征的维度降的很低,就变成128了,正样本比如说上图中绿色的球在最后的特征空间上应该尽可能的接近,但是这个绿色的球跟别的颜色的特征应该尽可能的拉远
  6. 本文所用的目标函数也是 NCE loss 的一个变体
  7. 所以说之所以讲这篇论文,是因为它刚好属于另一个流派,也就是端到端的学习,而且只用一个编码器,不需要借助外部的数据结构去存储大量的负样本,它的正负样本都来自于同一个 minibach
  8. 既然它跟 SimCLR 这么像,为什么它没有取得那么好的结果呢?就是之前在MoCo那篇论文里反复强调过的,就是这个字典必须足够大,也就是说在做对比学习的时候,负样本最好是足够多,而本文的作者是没有 TPU 的,所以说它的 batch size 就是256,也就意味着它的负样本只有500多个,再加上它还缺少像 SimCLR 那样那么强大的数据增广以及最后提出的那个 mlp projector,所以说呢这篇论文的结果没有那么炸裂,自然也就没有吸引大量的关注,但事实上它是可以理解成 SimCLR 的前身

[2018] CPC

一般机器学习分为判别式模型和生成式模型,个体判别显然是属于判别式范畴的,那肯定就会有一些生成式的代理任务,比如最常见的预测型的任务

cpc 这篇论文其实非常厉害,因为它是一个很通用的结构

在这里插入图片描述

  1. 图1中描述的是CPC不仅可以处理音频,还可以处理图片、文字以及在强化学习里使用
  2. 这里为了简单,它用的是一个音频的信号作为输入
  3. 本文的想法:假如说有一个输入 x(一个持续的序列),t表示当前时刻,t-i表示过去的时刻,t+i表示未来的时刻。把之前时刻的输入全都扔给一个编码器,这个编码器就会返回一些特征,然后把这些特征喂给一个自回归的模型(gar,auto regressive),一般常见的自回归模型,就是 RNN 或者 LSTM的模型,所以每一步最后的输出,就会得到图中红色的方块(ct,context representation,代表上下文的一个特征表示),如果这个上下文的特征表示足够好(它真的包含了当前和之前所有的这些信息),那它应该可以做出一些合理的预测,所以就可以用ct预测未来时刻的这个zt +1、zt + 2(未来时刻的特征输出)
  4. 对比学习在哪里体现的呢?正样本其实就是未来的输入通过编码器以后得到的未来时刻的特征输出,这相当于做的预测是 query,而真正未来时刻的输出是由输入决定的,也就是说它们相对于预测来说是正样本;负样本的定义其实很广泛,比如可以任意选取输入通过这个编码器得到输出,它都应该跟预测是不相似的,这就是cpc定义正负样本的方式
  5. 这套思想是很朴实的,把输入序列换成一个句子,也可以说用前面的单词来预测后面的单词的特征输出;如果把这个序列想象成一个图片的patch块从左上到右下形成一个序列,就可以用上半部分的图片特征去预测后半部分的图片特征,总之是非常灵活

CMC

cpc是用预测的代理任务做对比学习

cmc这篇论文定义正样本的方式就更为广泛了:一个物体的很多个视角都可以被当做正样本

cmc 的摘要写的非常好:

  1. 人观察这个世界是通过很多个传感器,比如说眼睛或者耳朵都充当着不同的传感器来给大脑提供不同的信号
  2. 每一个视角都是带有噪声的,而且有可能是不完整的,但是最重要的那些信息其实是在所有的这些视角中间共享,比如说基础的物理定律、几何形状或者说它们的语音信息都是共享的
  3. 在这里举了个很好的例子:比如一个狗既可以被看见,也可以被听到或者被感受到
  4. 基于这个现象作者就提出:他想要学一个非常强大的特征,它具有视角的不变性(不管看哪个视角,到底是看到了一只狗,还是听到了狗叫声,都能判断出这是个狗)
  5. cmc工作的目的就是去增大互信息(所有的视角之间的互信息)
  6. 如果能学到一种特征能够抓住所有视角下的关键的因素,那这个特征就很好了,至少解决分类问题不在话下

在这里插入图片描述

  1. cmc到底是怎么样去形成正样本和负样本从而去做对比学习的呢?如图一所示,它选取的是 NYU RGBD 这个数据集(这个数据集有同时4个view,也就是有四个视角:原始的图像、这个图像对应的深度信息(每个物体离观察者到底有多远)、SwAV ace normal、这个物体的分割图像)
  2. cmc 的意思是说,虽然这些不同的输入来自于不同的传感器或者说不同的模态,但是所有的这些输入其实对应的都是一整图片,都是一个东西,那它们就应该互为正样本也就是说,当有一个特征空间的时候,比如图中圆圈所示的特征空间,这四个绿色的点在这个特征空间里就应该非常的接近。这时候如果随机再去挑一张图片,不论是用图片还是用风格的图像(总之属于一个不配对的视角)的话,这个特征就应该跟这些绿色的特征远离
  3. 这就是 cmc 定义正负样本的方式,它的正样本来自于多个视角,一旦定义好了正负样本,剩下的工作就大差不差了
    cmc是第一个或者说比较早的工作去做这种多视角的对比学习,它不仅证明了对比学习的灵活性,而且证明了这种多视角、多模态的这种可行性。所以说接下来open AI,很快就出了clip模型:也就是说如果有一个图片,还有一个描述这个图片的文本,那这个图像和文本就可以当成是一个正样本对,就可以拿来做多模态的对比学习
  4. cmc原班作者人马用对比学习的思想做了一篇蒸馏的工作:不论用什么网络,不论这个网络是好是坏是大是小,只要你的输入是同一张图片,那得到的这个特征就应该尽可能的类似,也就意味着想让 teacher 模型的输出跟 student 模型的输出尽可能的相似,它就通过这种方式把 teacher和student做成了一个正样本对,从而可以做对比学习
  5. 所以说让大家意识到对比学习如此灵活,可以应用到不同的领域,cmc功不可没
  6. 一个小小的局限性:当处理不同的视角或者说不同的模态时候,可能需要不同的编码器,因为不同的输入可能长得很不一样,这就有可能会导致使用几个视角,有可能就得配几个编码器,在训练的时候这个计算代价就有点高(比如说在 clip 这篇论文里,它的文本端就是用一个大型的语言模型,比如说 bert,它的图像端就是用一个 vit,就需要有两个编码器),这样其实又回到了刚开始讲ViT时候所说的说这个Transformer的好处–Transformer有可能能同时处理不同模态的数据
  7. 事实上现在已经有人这么做了,今年的ICLR就有一篇ma clip,它就用一个Transformer去同时处理两个输入模态,效果反而更好,所以说这可能才是 Transformer 真正吸引人的地方:一个网络能处理很多类型的数据,而不用做针对每个数据特有的改进

第一阶段大概讲了这四篇论文,可以看到

  1. 它们使用的代理任务是不一样的,有个体判别,有预测未来,还有多视角多模态
  2. 它们使用的目标函数也不尽相同,有 NCE,有infoNCE,还有NCE的其它变体
  3. 它们使用的模型也都不一样,比如说invariant spread用了一个编码器;Inst Disc用一个编码器和memory bank;cpc有一个编码器,还有一个自回归模型;cmc可能有两个甚至多个编码器
  4. 它们做的任务从图像到视频到音频到文字到强化学习,非常的丰富多彩

第二阶段:CV双雄

[2020] (CVPR)MoCo_v1

在这里插入图片描述
MoCo

Momentum Contrast for Unsupervised Visual Representation Learning

MoCo是CVPR2020的最佳论文提名,算是视觉领域中使用对比学习的一个里程碑式的工作

  1. 对比学习作为从19年开始一直到现在,视觉领域乃至整个机器学习领域最炙手可热的方向之一,它简单、好用、强大,以一己之力盘活了从2017年开始就卷的非常厉害的机器视觉领域,涌现了一大批优秀的工作,MoCo就是其中之一
  2. MoCo作为一个无监督的表征学习的工作,不仅在分类任务上逼近了有监督的基线模型,而且在很多主流的视觉任务(比如检测、分割、人体关键点检测)上,都超越了有监督预训练的模型,也就是ImageNet上预训练的模型,在有的数据集上甚至是大幅度超越
  3. 所以说MoCo的出现从某种意义上来说,是给视觉领域吃了一个定心丸:无监督学习是真的可以的,有可能真的不需要大规模的标好的数据去做预训练。这个结论也从侧面上证明了之前Yannn LeCun在NeurlPS 2016做演讲的时候用的一张图,如下图所示

在这里插入图片描述

  1. 它的意思是说如果将机器学习比做一个蛋糕的话,那强化学习只能算是这个蛋糕上的一个小樱桃,有监督学习最多就算这个蛋糕上的那层糖霜,只有无监督学习才是这块蛋糕的本质,才是我们真正想要的
  2. 而现在也确实是这样,不光是在自然语言处理里很多我们耳熟能详的大模型都是用自监督的预训练得到的,那么在视觉里也快了

标题和作者

Momentum Contrast for Unsupervised Visual Representation Learning

MoCo的名字来源于前两个单词的前两个字母

动量对比的方法去做无监督的表征学习

动量从数学上可以理解成一种加权移动平均:

  1. yt = m * y( t - 1 )+( 1 - m )* xt
  2. m就是动量的超参数
  3. y( t - 1 )是上一个时刻的输出
  4. yt是这一时刻想要改变的输出
  5. xt是当前时刻的输入
  6. 简单来说,就是不想让当前时刻的输出完全依赖于当前时刻的输入,所以这里引入了之前的输出,并且给了他一个权重
  7. 因为这里动量的超参数m是介于0和1之间的数,如果m很大(趋近于1)的时候,yt的改变是非常缓慢的,因为后面的1-m基本就趋近于0,也即是说不怎么依赖当前的输入;反过来说,如果m很小的话,那就是说当前的输出更多地依赖于当前的输入
  8. MoCo利用了动量的这种特性,从而缓慢地更新一个编码器,让中间学习的字典中的特征尽可能地保持一致

对比学习最广为应用的代理任务:个体判别
在这里插入图片描述

摘要

本文提出了MoCo去做无监督的表征学习,虽然是基于对比学习的,但是本文是从另外一个角度来看对比学习,也就是说把对比学习看作是一个字典查询的任务

具体来说,就是做一个动态的字典,这个动态的字典由两个部分组成

  1. 第一个部分是一个队列,因为队列中的样本不需要做梯度回传,所以就可以往队列中放很多负样本,从而使得这个字典变得很大
  2. 第二个部分是一个移动平均的编码器,使用这个移动平均的编码器的目的是想让字典中的特征尽量的保持一致。作者发现在训练的过程中,如果能有一个很大而且比较一致的字典,会对无监督的对比学习非常有好处

这篇论文主要的亮点在于它的结果,所以剩下大篇幅的摘要留给了结果:

分类:

  1. 在ImageNet数据集上,如果使用大家普遍采用的linear protocol去做测试的话,MoCo能够取得跟之前最好的无监督学习方式差不多或者更好一点的结果

  2. linear protocol:如果先预训练好一个骨干网络,当把它用到不同的数据集上的时候,将它的骨干网络冻住(backbone freeze),然后只去学习最后的那个全连接层,也就是分类头,这样就相当于把提前训练好的预训练模型当成了一个特征提取器,只用它来抽取特征,这样就可以间接证明之前预训练好的那个模型的特征到底好不好
    更重要的是MoCo学习到的特征能够很好地迁移到下游的任务,这才是整篇文章的精髓

  3. 之所以想做大规模的无监督预训练,就是想去学到一个很好的特征,然后这个特征拥有很好的迁移性,就可以在没有那么多标注数据的下游任务里获得很好的结果

MoCo作为一个无监督的预训练模型,能够在7个下游任务(分割、检测等)上,而且比如说在VOC、COCO这些数据集上超越之前的有监督的预训练模型,有时候甚至是大幅度超越

  1. 这里的counterpart是说模型使用的是一样的,比如说都是Res50,只是训练的方式不一样,一个是用有监督的带标签的数据去训练,一个是用无监督不带标签的数据去训练

最后作者总结说,这就意味着对于很多视觉任务来说,无监督和有监督的表征学习中间的鸿沟已经填上了

  1. 之前虽然有一些无监督的工作能够在某个数据集或者是某个任务上能够比它对应的有监督预训练模型好一点,但是MoCo是第一个能够在这么多主流视觉任务上,全面地让无监督训练的模型比有监督训练的模型表现要好

导论

最近的一些研究[61,46,36,66,35,56,2]提出了使用与对比损失[29]相关的方法进行无监督视觉表征学习的有前途的结果。尽管受到各种动机的驱动,但可以将这些方法视为构建动态字典。字典中的keys(tokens)从数据(例如,图像或补丁)中采样,并由编码器网络表示。无监督学习训练编码器执行字典查找:一个encoded “query"应该与它的matching key相似,而与其他查询不同。学习被定义为最小化对比损失[29]。
在这里插入图片描述
从这个角度来看,我们假设我们希望构建的词典是:(i)大的,(ii)在培训过程中,它们的演变是一致的。直观上,一个更大的字典可以更好地对底层的连续、高维视觉空间进行采样,而字典中的键应该由相同或类似的编码器表示,以便它们与查询的比较是一致的。然而,使用对比损失的现有方法可以限制在这两个方面之一(稍后在上下文中讨论)。
在这里插入图片描述

我们提出了动量对比(MoCo)作为一种构建具有对比损失的大型一致字典的方法(图1)。我们将字典维护为一个数据样本队列:当前小批量的编码表示被加入队列,而最老的被退出队列队列将字典大小与小批大小解耦,允许其较大。此外,由于字典关键字来自前几个小批量,提出了一种慢进度的关键字编码器,实现为一个基于动量的移动平均的查询编码器,以保持一致性
在这里插入图片描述

结论

MoCo的最后一部分不光是结论,主要的内容都围绕在了讨论上面,结论其实就是一句话,MoCo在一系列的方法和数据集上都取得了比较好的效果

接下来就是讨论了两个比较有趣的问题

1、通过实验,作者发现当预训练的数据集从ImageNet换到Instagram的时候,提升虽然是有的,但是都相对来说比较小,只有零点几个点或者一个点,但是数据集是从一百万增加到10亿了,扩大了一千倍,这样的提升着实是有点小,所以作者觉得是因为大规模的数据集没有被很好地利用起来,可能一个更好的代理任务有可能解决这个问题

2、除了这个简单的个体判别任务,有没有可能把MoCo和另外一个代理任务(Masked auto-encoding)结合起来用,就像NLP中的BERT一样,用masked language modeling完形填空去自监督地训练模型(MAE)

最后作者希望MoCo能够对其他那些使用对比学习的代理任务有帮助,之所以强调对比学习是因为MoCo设计的初衷就是去构造一个大的字典,从而让正负样本能够更有效地进行对比,提供一个稳定地自监督信号,最后去训练模型

相关工作

无监督或半监督学习通常包含两个方面的研究内容:pretext task和loss function。

  1. pretext task:表明真正要解决的并不是任务本身而是学习优秀的特征表示。

  2. loss function:MoCo的研究内容。
    2.1 Loss function
    定义损失函数的方式有两种:

  3. 常见的方式是比较模型预测结果与真实值的差异,例如cross-entropy loss或margin-based loss;

  4. Contrastive Loss是在特征表示空间测量样本对间的相似性

  5. Adversarial Loss衡量的是概率分布间的差异。
    2.2 Contrastive Learning vs Pretext Task
    很多前置任务可基于对比学习。

MoCo方法

Contrastive Learning as Dictionary Look-up

之前的对比学习以及最新的一些效果比较好的变体,它们都可以想象成是训练一个编码器,从而去做一个字典查找的任务

假设有一个编码好的query q,也就是特征,还有一系列已经编码好的样本,也就是k0、k1、k2等,这些可以看作是字典中的那些key

  1. 这里做了一个假设:在这个字典中只有一个key是跟query是配对的,也就是说它们两个互为正样本对,这个key叫做key positive
  2. 之所以有这个假设,前面在讲个体判别任务的时候也提到过,这个代理任务就是从一个图片经过两种变换得到两种图片,其中一个作为基准图片,另外一个作为正样本,所以就是只有一个正样本对。当然理论上是可以使用多个正样本对,之后也有工作证明使用多个正样本对有可能会提升任务的性能

一旦定义好了正样本和负样本,接下来就需要一个对比学习的目标函数,这个对比学习的目标函数最好能满足以下要求

  1. 当query q和唯一的正样本k plus相似的时候,它的loss值应该比较低
  2. 当query q和其他所有的key都不相似的时候,这个loss的值也应该比较低

这个也是训练模型的目标,如果已经能够达到这么一种状态,就说明模型差不多训练好了,当然希望目标函数的loss值尽可能的低,就不要再去更新模型了;反之,如果q和正样本key plus不相似,或者说query q和本来应该是负样本的那些key相似,那么这个目标函数的loss值就应该尽可能的大,从而去惩罚这个模型,让模型加速更新它的参数

在这里插入图片描述

在本文中,采取了一个叫做InfoNCE的对比学习函数来训练整个模型
对比学习损失(InfoNCE loss)与交叉熵损失的联系,以及温度系数的作用

  1. InfoNCE:先看下图中右边手写的式子,它是softmax的操作,那如果是在有监督学习的范式下,也就是有一个one-hot向量来当作ground truth
  2. 其实在前面加上一个-log,整个其实就是cross entry loss,也就是交叉熵目标函数,但是需要注意的是红色圆圈圈出来的k在有监督学习中指的是这个数据集有多少个类别(比如说ImageNet就是1000类,k就是1000,是一个固定的数)
  3. 回到对比学习,其实对比学习理论上来说是可以用上面这个公式去计算loss的,但是实际上行不通。如果说像大部分对比学习的工作一样,就使用instance discrimination这个代理任务去当自监督信号的话,那这里的类别数k将会是一个非常巨大的数字,就拿ImageNet数据集来举例,这里的k就不再是1000了,而是128万,就是有多少图片就有多少类
  4. softmax在有这么多类别的时候,它其实是工作不了的,同时因为这里还有exponential操作,当向量的维度是几百万的时候,计算复杂度是相当高的,如果每个训练的iteration都要这样去计算loss,那么训练的时间将会大大延长

所以就有了NCE loss(noise contrastive estimation的缩写),之前因为类别太多所以没办法计算softmax,从而没办法计算目标函数,NCE的做法是:将这么多的类简化成一个二分类问题,现在只有两个类别了

  1. 一个是数据类别data sample

  2. 一个是噪声类别noisy sample
    那么每次只需要拿数据样本和噪声样本做对比就可以了,也就是文中所说的noise contrastive。但是如果还是将整个数据集剩下的图片都当做负样本,那么其实noise contrastive estimatation解决了类别多的问题,但是计算复杂度还是没有降下来,那么该如何让loss计算的更快一点呢?没有别的办法,只有取近似了

  3. 意思就是说,与其在整个数据集上算loss,不如就从这个数据集中选一些负样本来算loss就可以了,这也是这里estimation的含义,它只是估计、近似

  4. 但是按照一般的规律,如果选取的样本很少,就没有那么近似了,结果自然就会比较差。选的样本越多,自然就跟使用整个数据集的图片的结果更加近似,效果自然也会更好,所以这也是MoCo一直强调的希望字典足够大,因为越大的字典,越能够提供更好的近似

总的来说,NCE这个loss就是把一个超级多类分类的问题变成了一系列的二分类的问题,从而让大家还是可以使用softmax操作

这里说的InfoNCE其实就是NCE的一个简单的变体,作者认为如果只把问题看作是一个二分类(只有数据样本和噪声样本)的话,可能对模型学习不是很友好,毕竟在那么多的噪声样本中,大家很有可能不是一个类,所以还是把它看成一个多分类的问题比较合理,于是NCE就变成了InfoNCE,公式如下图所示
在这里插入图片描述

  1. 公式中的q * k,其实就相当于是logit,也可以类比为上面softmax中的z,也是模型出来的logit

  2. 公式中的τ是一个温度的超参数,这个温度一般是用来控制分布的形状的τ的值越大,1/τ就越小,就相当于将分布中的数值都变小了,尤其是经过exponential之后就变得更小了,最后就会导致这个分布变得更平滑;相反,如果τ取得值越小,也就是1/τ越大,那么分布里的值也就相应的变大,经过exponential之后,原来大的值变得更大了,就使得这个分布更集中,也就变得更加peak了。
    在这里插入图片描述

  3. 所以说温度这个超参数的选择也是很有讲究的,如果温度设的越大,那么对比损失对所有的负样本都一视同仁,导致学习的模型没有轻重;如果温度的值设的过小,又会让模型只关注那些特别困难的样本,其实那些负样本很有可能是潜在的正样本,如果模型过度地关注这些特别困难的负样本,会导致模型很难收敛,或者学好的特征不好去泛化。

  4. 但是温度这个超参数终究只是一个标量,如果忽略掉它,就会发现,其实这个InfoNCE loss就是cross entropy loss,唯一的区别就在于在cross entropy loss中k指代的是数据集里类别的多少,但是在对比学习的InfoNCE loss中,k指的是负样本的数量

  5. 公式下面分母中的求和其实是在一个正样本和k个负样本上做的,因为是从0到k,所以是k+1个样本,也就指的是字典里所有的key

  6. 如果直观地想一下,InfoNCE loss就是一个cross entropy loss,它做的就是一个k+1类的分类任务,它的目的就是想把q这个图片分成k plus这个类。所以到这里可以发现,InfoNCE也不是那么难理解,和之前常用的cross entropy loss是有很大联系的

  7. 如果直接跳到后面MoCo的伪代码的话,也会发现MoCo这个loss的实现就是基于cross entropy loss实现的
    在这里插入图片描述

既然已经有了这个代理任务提供的正负样本,也有了可以用来训练模型的目标函数输入和模型大概是什么?(这里作者还是从一个自顶向下的方式去写的)

普遍来说,query q是一个输入xq通过一个编码器fq得到的,同理所有的k的表示也都是key的输入通过了一个key的编码器,输入和模型具体的实现是由具体的代理任务决定

  1. 在代理任务不一样的时候,输入xq和xk既可以是图片,也可以是图片块,或者是含有上下文的一系列的图片块
    对于模型,query的编码器和key的编码器既可以是相等的(就是说模型的架构一样,参数也是完全共享的),或者说它们的参数是部分共享的,也可以是彻底不一样的两个网络
Momentum Contrast

作者说从以上角度,对比学习是一种在高维的连续的输入信号上去构建字典的一种方式

  1. 这里的高维和连续其实指的就是图片

这个字典是动态的

  1. 之所以是动态的是因为这个字典中的key都是随机取样的,而且给这些key做编码的编码器在训练的过程中也是在不停的改变
  2. 这和之前所讲的无论是在有监督还是无监督的方法都不太一样,因为之前的那些工作最后学习的target都是一个固定的目标,所以作者认为,如果想学一个好的特征,这个字典就必须拥有两个特性(大,大的字典能够包含很多语义丰富的负样本,从而有助于学到更有判别性的特征一致性主要是为了模型的训练,能够便面学到一些trivial solution,也就是一些捷径解

所以基于以上的研究动机,作者就提出了momentum contrast

**文章的第一个贡献:如何把一个字典看成队列 **

作者说,方法的核心其实就是把一个字典用队列的形式表现出来
在这里插入图片描述

  1. 队列其实就是一种数据结构,如果有一个队列,里面有很多元素,假如新来的元素从下面进来,为了维持这个队列的大小,最老的数据会从队列中出去,所以说队列一般被称作是一个fifo(first in first out,先进先出)的数据结构
  2. 作者在这里是用一个队列去代表一个字典,也就是说整个的队列就是一个字典,里面的元素就是放进去的key
  3. 在模型训练的过程中,每一个mini-batch就会有新的一批key被送进来,同时也会有一批老的key移出去,所以用队列的好处是可以重复使用那些已经编码好的key,而这些key是从之前的那些mini-batch中得到的,比如说队尾指的是当前mini-batch送进来的新key,那么紧挨着它上面的那些key就是在它之前的那些mini-batch编码好送进来的
  4. 这样使用了队列之后,就可以把字典的大小和mini-batch的大小彻底剥离开了,就可以在模型的训练过程中使用一个比较标准的mini-batch size,一般是128或者是256,但是字典的大小可以变得非常大,它的大小非常灵活,而且可以当作一个超参数一样单独设置

这个字典一直都是所有数据的一个子集

  1. 在算对比学习目标函数的时候只是取一个近似,而不是在整个数据集上算loss

  2. 使用队列的数据结构,可以让维护这个字典的计算开销非常小

  3. 事实也是如此,如果把字典的大小从几百变到几千或者上万,整体的训练时间基本是不变的
    最后作者又强调了为什么要使用队列这个数据结构:因为队列有先进先出的特性,这样每次移出队列的都是最老的那些mini-batch,也就是最早计算的那些mini-batch,这样对于对比学习来说是很有利的,因为从一致性的角度来说,最早计算的那些mini-batch的key是最过时的,也就是说跟最新的这个mini-batch算的key是最不一致的

文章的第二个贡献:如何使用动量的思想去更新编码器

用队列的形式当然可以使这个字典变得更大,但是也因为使用了非常大的字典,也就是非常长的队列,就导致没办法给队列中所有的元素进行梯度回传了,也就是说,key的编码器无法通过反向传播的方式去更新它的参数

  1. 如果想更新这个key的编码器,其实有一个非常简单的方法:就是每个训练iteration结束之后,将更新好的编码器参数fq直接复制过来给key的编码器fk就可以了
  2. 这个想法简单确实是简单,但是作者紧接着说这种方式的结果并不好,原因是一个快速改变的编码器降低了这个队列中所有key的特征的一致性
    在这里插入图片描述
  3. 假如现在有一个队列如上图所示,新的元素从左边进来,旧的元素从右边出去,假设mini-batch size就是1,也就是说每次只更新一个key,k1、k2等这些所有的key都是由不同的编码器产生的,这样的话这些快速改变的编码器就会降低所有key之间的一致性

所以作者提出了动量更新的方式来解决这个问题

  1. 如果将key编码器fk参数设为θk,query编码器的参数fq设为θq,那θk就是以以下公式所示的动量改变方式进行更新的
    在这里插入图片描述
  2. 上式中m是动量参数,它是一个0到1之间的数
  3. θq,也就是query编码器,是通过梯度反向回传来更新它的模型参数的
  4. θk除了刚开始是用θq初始化以外,后面的更新大部分主要是靠自己,因为如果动量参数m设的很大,那么θk更新就非常缓慢,所以作者接下来说,因为使用了这种动量更新的方式,随意虽然在队列里的key都是由不同的编码器产生得到的,但是因为这些编码器之间的区别极小,所以产生的key的一致性都很强
  5. 为了强调这一观点,作者说,他们在实验中使用了一个相对比较大的动量0.999,意思就是每次θk更新的时候,99.9%都是来自原来的编码器参数,只有0.1%是从更新好的θq中借鉴过来的,自然而然的,θk的更新就非常缓慢了
  6. 作者还做了对比实验,当他把这个动量变小一点,变成0.9的时候(其实0.9也不算小了),作者说使用一个相对较大的动量0.999比0.9效果要好得多,所以就意味着,如果想充分利用好队列,一个缓慢更新的key编码器是至关重要的,因为它可以保证这个队列里所有的key是相对一致的

到这里,其实MoCo的主要贡献旧已经讲完了,但是如果对对比学习不是很熟的人来说可能还是不太理解MoCo的前向过程到底是什么样子的,可惜的是这篇论文并没有提供一个很直观、形象的模型总览图,取而代之的是伪代码,写得相当简洁明了,理解和复现都比较容易

Relations to previous mechanisms
作者在引言中提到过,之前的那些对比学习方法都可以看作是字典查找,但是它们都或多或少受限于字典的大小和字典的一致性的问题,这里作者将之前的方法总结了一下,归纳成了两种架构

1、第一种就是比较直接的端到端学习的方式

  1. 端到端学习,顾名思义就是编码器都是可以通过梯度回传来更新模型参数的
  2. 下图的标题中也写道编码器q和k可以是不同的网络,但是之前很多工作都用的是同样的网络,为了简单起见,MoCo实验中编码器q和k是同一个模型,也就是一个Res50

在这里插入图片描述

  1. 这里为什么可以使用同一个模型?因为模型的正负样本都是从同一个mini-batch里来的,也就是xq和xk都是从同一个batch中来的,它做一次forward就能得到所有样本的特征,而且这些样本是高度一致的,因为都是来自一个编码器
  2. 听起来确实很美好,编码器都能用反向回传学习了,特征也高度一致了,但是它的局限性就在于字典的大小因为在端到端的学习框架中,字典的大小和mini-batch size的大小是等价的,如果想要一个很大的字典,里面有成千上万个key的话,也就意味着mini-batch size的大小必须也是成千上万的,这个难度就比较高了。因为现在的GPU是塞不下这么大的batch-size的,而且就算有内存够大的硬件,能塞下这么大的batch-size,但是大的batch-size的优化也是一个难点,如果处理不得当,模型是很难收敛的
  3. 所以作者说这种端到端学习的方式受限于字典的大小,之所以选择读MoCo这篇论文而不是SimCLR,是因为SimCLR就是这种端到端的学习方式,它还用了更多的数据增强,而且提出了在编码器之后再用一个projector,会让学到的特征大大变好,但是总体来说SimCLR就是端到端的学习方式,之所以这么做,是因为google有TPU,TPU内存大,所以可以无脑上batch-size,SimCLR中选用了8192当作batch-size,这样最后就会有10000多个负样本,这个负样本的规模就足够对比学习了,所以SimCLR就可以用这么简单的方式直接去做端到端的学习
  4. 端到端学习的优点在于编码器是可以实时更新的,所以导致它字典里的那些key的一致性是非常高的,但是它的缺点在于因为它的字典大小(就是batch-size的大小),导致这个字典不能设置的过大,否则硬件内存吃不消

2、memory bank(更关注字典的大小,而牺牲一些一致性)

  1. 在memory bank中其实就只有一个编码,也就是query的编码器是可以通过梯度回传来进行更新学习的

  2. 但是对于字典中的key是没有一个单独的编码器的

  3. memory bank把整个数据集的特征都存到了一起,对于ImageNet来说,memory bank中就有128万个特征(看上去好像很大,但是memory bank的作者在论文中说,因为每一个特征只有128维,所以即使整个memory bank中有128万个key,最后也只需要600M的空间就能把所有的这些key存下来了,即使是对整个数据集的特征做一遍最近邻查询,在泰坦XGPU上也只需要20毫秒,所以是非常高效的)

  4. 一旦有了这个memory bank,在每次模型做训练的时候,只需要从memory bank中随机抽样很多的key出来当作字典就可以了,就相当于下图中红色圆圈圈出来的整个右边的那些操作都是在线下执行的,所以完全不用担心硬件内存的问题,也就是字典可以抽样抽的很大,但是有得必有舍,memory bank的做法在特征一致性上就处理的不是很好
    在这里插入图片描述

  5. 假如说有一个memory bank如下图所示,里面有128万个key,它在训练的时候是随机抽样很多样本出来当作字典,这里为了方便讲解,将它简化为顺序抽样而且字典的大小就是3,也就是说当在做对比学习的时候,当前用的mini-batch可以先把k1、k2、k3这三个key抽出来当作负样本,然后去和query计算loss
    在这里插入图片描述

  6. 算完这个loss,回传的梯度更新了左边的编码器encoder之后,memory bank的做法就是会用新的编码器在原来对应的位置上,也就是k1、k2、k3的位置上的那些样本去生成新的特征,也就是下图中蓝色的新的k1、k2、k3,然后把新的key放回到memory bank中就把memory bank更新了
    在这里插入图片描述

  7. 依此类推,下一次假如是将4、5、6这三个key抽出来做一次模型更新,然后再把新的key4、5、6放回去,那么4、5、6也就被更新了

  8. 这里也就有一个问题:因为这里的特征都是在不同时刻的编码器得到的,而且这些编码器都是通过梯度回传来进行快速更新的,这也就意味着这里得到的特征都缺乏一致性

  9. 而且memory bank还有另外一个问题,因为memory bank中存储了所有的图片,也就意味着模型训练了整整一个epoch才能把整个memory bank更新一遍,那也就意味着,当开始下一个epoch训练的时候,假如选了三个key,那这三个key的特征都是上一个epoch不知道哪个时间点算出来的特征了,这也就导致query的特征和key的特征差的特别远

  10. 所以总结一下,就是**memory bank的做法就是牺牲了特征的一致性,**从而获得了可以构造很大的字典的特权

显然,无论是端到端的学习还是memory bank的方法,都和作者说的一样,受限于字典大小和特征一致性这两方面中的至少一个,所以为了解决之前这两种做法的局限性,作者就提出了MoCo
在这里插入图片描述

  1. MoCo 采用队列的形式去实现字典 ,从而使得它不像端到端的学习一样受限于batch-size的大小
  2. 同时为了提高字典中特征的一致性,MoCo使用了动量编码器
  3. 其实从整体上来看,MoCo跟Memory bank的方法是更加接近的,它们都只有一个编码器(query的编码器,它是通过梯度回传来更新模型参数的),它们的字典都是采取了额外的数据结构进行存储从而和batch-size剥离开了,memory bank中使用了memory bank,而MoCo中使用了队列
  4. memory bank这篇论文(文献61)也意识到了特征不一致性所带来的坏处了,所以作者当时还加了另外一个loss(proximal optimization),目的就是为了让训练变得更加平滑,这其实和MoCo中的动量更新是有异曲同工之效的
  5. MoCo的作者也提到memory bank这篇论文中也提到了动量更新,只不过它的动量更新的是特征,而MoCo中动量更新的是编码器,而且MoCo的作者还补充说MoCo的扩展性很好,他可以在上亿级别的图像库上进行训练
  6. 但是对于特别大的数据集memory bank的方法就捉襟见肘了,因为它需要将所有的特征都存到一个memory bank中,对于ImageNet这种百万规模的数据集来说,存下的特征只需要600兆的空间,但是对于一个拥有亿级图片规模的数据,存储所有的特征就需要几十G甚至上百G的内存了,所以memory bank的扩展性不如MoCo好

总之,MoCo既简单又高效,而且扩展性还好,它能同时提供一个又大而且又一致的字典,从而进行对比学习

Pretext Task

作者为了简单起见,使用了个体判别的任务,个体判别任务的定义如下图所示 作
在这里插入图片描述

MoCo论文中的小trick:Shuffling BN

(这个操作在接下来很多论文里,甚至包括作者团队接下来的工作,比如SimSiam也没有再用Shuffling NB这个操作了)

因为用了BN以后,很有可能造成当前batch里的样本中间的信息的泄露,因为BN要计算这些样本的running mean和running variance,也就是说,它能通过这些泄露信息很容易地找到正样本,而不需要真正地去学一个好的模型(也就是作者所说的模型会走一条捷径)

如何解决这个问题?

  1. 因为BN这个操作大部分时候都是在当前GPU上计算的,所以作者在做多卡训练之前,先把样本的顺序打乱再送到所有的GPU上去,算完了特征之后再回复顺序去算最后的loss,这样的话对loss是没有任何影响的,但是每个GPU上的BN计算就不一样了,就不会再存在信息泄露的问题了

  2. 类似的BN操作还在后续BYOL那篇论文中引起了一段很有意思的乌龙事件,总之,BN操作让人又爱又恨,用的好威力无穷,但是90%的情况都是属于用的不好的,会带来各种莫名其妙的问题,而且很难去debug,所以现在换成transformer也好,这样直接就用layer norm,就能暂时不用理会BN了

实验

  1. 作者做了一个grid search,然后发现最佳的学习率是30.这个其实是很不可思议的,因为除了在神经网络搜索(NAS)的那些工作里可能会搜到一些比较夸张的学习率之外,过去几十年里用神经网络的工作,都没有用超过1的学习率,因为已经预训练好了一个网络,所以只需要做微调就可以了,所以学习率最大可能也就是设个0.1,然后0.01、0.001这样往下降,很少有人会设一个比1大的学习率,但是在这里竟然是30.所以说做无监督学习或者说是做对比学习可以看一下学习率,如果结果不好,很有可能是学习率没有设置对
  2. 基于这个现象,作者也做了总结,这个学习率确实比较诡异,它暗示了这种无监督对比学习学到的特征分布跟有监督学习学到的特征的分布是非常不同的
  3. 动量使用一个相对较大的值0.999或者0.9999的时候性能是最好的,差不多都是59,这就说明了一个变化非常缓慢的编码器是对对比学习有好处的,因为它能够提供一个一致性的特征
  4. 但是当把动量逐渐变小,变到0.99或者是0.9的时候,性能的下降就比较明显了,尤其是当直接去掉动量,直接将快速更新的query编码器拿过来当key编码器用的时候,就会发现不光是性能下降的问题,整个模型甚至都不能收敛,loss一直在震荡,从而导致训练失败
  5. 这个table非常有力地证明了作者的论点,就是要建立一个一致性的字典

迁移学习的效果:

文章的最后一个章节,也是全文的点睛之笔,作者就是想验证一下MoCo预训练模型得到的特征到底在下游任务上能不能有好的迁移学习效果

无监督学习最主要的目标就是学习一个可以迁移的特征

用ImageNet做有监督的预训练,它最有用、最有影响力的时候就是在当在下游任务上做微调,可以用这个预训练模型做模型的初始化,从而当下游任务只有很少的标注数据的时候也能获得很好的效果

作者用视觉领域中最常见、应用最广的检测任务来做无监督的MoCo预训练模型和ImageNet的有监督预训练模型之间的比较

归一化

  1. 如果拿MoCo学出来的模型直接当一个特征提取器的话,那它在做微调的时候的最佳学习率是30,也就说明MoCo学到的特征跟有监督学到的特征的分布是非常不一样的,但是现在需要拿这个特征去做下游的任务,不可能在每个下游任务上都去做一遍grid search找一下它最佳的学习率是多少,这个相对来讲比较麻烦,也失去了无监督预训练的意义,所以作者就想,如果可以拿之前有监督的预训练已经设置好的超参数来做微调的话,既可以做公平对比,而且也不用做grid search。
  2. 一般来说,当分布不一致的时候,最常想到的方法就是归一化,所以作者这里使用了特征归一化的方法,具体来说就是整个模型现在都在微调,而且尤其是BN层(作者用的是sync BN,也就是synchronized batch norm,就是将多级训练的所有GPU上的batch norm的统计量都合起来,算完running mean、running variance之后再做BN层的更新,这样就会让特征的规划做的更彻底一点,也会让模型的训练更稳定一些)。为了解决这个问题,我们在微调时采用了特征归一化的方法:我们用训练过的(并且在gpu[49]上同步的)BN进行微调,而不是用仿射层[33]冻结它
  3. 在新加的层中,比如说在做检测的时候都会用fbn的结构,作者在这里也用了BN,目的就是去调整一下值域的大小,从而便于做特征的归一化
  4. 一旦做完归一化之后,作者发现就可以拿这些有监督训练用的超参数来做微调了

schedule

  1. 作者之前有一篇论文(文献31)发现:当下游任务的数据集足够大的时候,可以不需要预训练,直接从随机初始化开始从头训练,最后的效果一样可以很好。有了这个结论,无论是有监督的预训练还是无监督的预训练就都无所谓了,反正已经不需要预训练的模型去做初始化了,这样就没办法体现MoCo的优越性了
  2. 但是在文献31中说的是当训练足够长的时候,也就是训练6或者9的学习时长的时候,如果训练的短的话,预训练模型还是有用的,那么就在预训练时长短的时候做比较就可以了
  3. 所以在本文中,作者说只用1或者2的学习时长,这个时候预训练还是非常有用的,就可以比较到底是MoCo预训练的好还是有监督的ImageNet的训练好了

总之,归一化和学习时长都是为了铺垫:当使用MoCo的预训练模型去做微调的时候,微调也是跟有监督预训练模型在微调时候的方式是一样的,这样做的好处是当在不同的数据集或者不同的任务上做微调的时候,就不用再去调参了,就用之前调好的参数就行了

总结

作者最后总结:MoCo在很多的下游任务上都超越了ImageNet的有监督预训练模型,但是在零零星星的几个任务上,MoCo稍微差了一点,主要是集中在实例分割和语义分割的任务上,所以接下来大家也都怀疑对比学习的方式是不是不太适合做dence prediction的task,就是这种每个像素点都要去预测的任务,所以后续也涌现了很多基于这个出发点的工作,比如dence contrast或者是pixel contrast之类

文章最后的结论:

MoCo在很多的视觉任务上,已经大幅度的把无监督和有监督之间的坑给填上了

[2020] (ICML)SimCLR_v1

在这里插入图片描述

摘要

本文介绍了一个简单的视觉表征对比学习框架SimCLR。我们简化了最近提出的对比自监督学习算法,而不需要专门的架构或存储库。为了理解是什么使得对比预测任务能够学习有用的表示,我们系统地研究了我们框架的主要组成部分。我们表明(1)数据增强的组成在定义有效的预测任务中起着至关重要的作用,(2)在表示和对比损失之间引入一个可学习的非线性转换( a learnable nonlinear transformation),大大提高了学习表示的质量,(3)对比学习比监督学习受益于更大的批处理规模和更多的训练步骤(larger batch sizes and more training steps)。通过结合这些发现,我们能够大大超过以前在ImageNet上进行自我监督和半监督学习的方法。一个由SimCLR学习的自我监督表示训练的线性分类器达到了76.5%的top-1准确率,这比以前的最先进水平相对提高了7%,与有监督的ResNet-50的性能匹配。当只对1%的标签进行微调时,我们实现了85.8%的top-5准确率,在减少100个标签的情况下优于AlexNet。

Introduction

  1. 在没有人类监督的情况下学习有效的视觉表示是一个长期存在的问题。大多数主流的方法可以分为两类:生成式的和判别式的

  2. 生成方法学习在输入空间中生成或建模像素(Hinton等人)。然而,像素级生成的计算成本很高,可能不是表示学习所必需的。 判别方法使用与监督学习类似的目标函数来学习表示,但训练网络执行借口任务(pretext tasks),其中输入和标签都来自于一个未标记的数据集。许多此类方法依赖启发式来设计借口任务,这可能会限制学习表征的普遍性。在潜在空间中,基于对比学习的判别方法最近显示出巨大的前景,取得了最新的成果
    在这里插入图片描述

  3. 在本研究中,我们介绍了一个简单的视觉表征对比学习框架,我们称之为SimCLR。SimCLR不仅优于以前的工作(图1),而且它也更简单,不需要专门的架构,也不是一个存储库。

  4. 为了理解是什么促成了良好的对比表征学习,我们系统地研究了我们的框架的主要组成部分,并展示了这一点:

  5. 在定义产生有效表示的对比预测任务时,多个数据增强操作的组合至关重要。此外,无监督对比学习得益于比监督学习更强的数据增强。

  6. 在表示和对比损失之间引入一个可学习的非线性转换,可以大大提高学习表示的质量。

  7. 具有对比交叉熵损失的表示学习受益于标准化嵌入(normalized embeddings)和适当调整的温度参数。

  8. **对比学习与监督式学习相比,更大的批处理规模和更长的培训时间有利于对比学习。**与监督学习一样,对比学习得益于更深入更广泛的网络。

方法

The Contrastive Learning Framework

在这里插入图片描述
培训结束后,我们丢弃投影头g(·),使用编码器f(·)和表示h来处理下游任务。

受最近的对比学习算法的启发(见第7节概述),SimCLR通过在隐空间中的对比损失最大化同一数据示例的不同增强视图之间的一致性来学习表示。如图2所示,该框架包含以下四个主要组件。
在这里插入图片描述

SimCLR框架,正如全文所示,非常简单。取一幅图像,对其进行随机变换,得到一对增广图像x_i和x_j。该对中的每个图像都通过编码器以获得图像的表示。然后用一个非线性全连通层来获得图像表示z,其任务是最大化相同图像的z_i和z_j两种表征之间的相似性。

  1. 一个随机data augmentation模块,它将任意给定的数据示例随机转换为同一个示例的两个相关视图,表示为xi和xj,我们认为它们是正对。在这项工作中,我们依次应用了三个简单的增强:随机裁剪,然后调整到原始大小,随机颜色扭曲random color distortions随机高斯模糊。如第3节所示,随机裁剪和颜色失真的结合是获得良好性能的关键。一种神经网络基编码器f(·),从扩充数据示例中提取表示向量。
  2. 我们的框架允许在没有任何限制的情况下选择各种网络架构。我们选择简单和采用常用的ResNet,得到hi = f(xi) = ResNet(xi),其中hi 是平均池化层后的输出。
  3. 一个小的神经网络投影头g(·),它将表示映射到应用对比损失的空间。我们使用一个隐含层的MLP得到zi = g(hi) = W(2)σ(W(1)hi),其中σ是一个ReLU非线性。如第4节所示,我们发现定义zi 而不是hi 上的对比损失是有益的。
  4. 为对比预测任务定义的对比损失函数。给定一个集合{x_k},其中包含一个正的例子xi和xj,对比预测任务的目的是分辨给定xi在{xk}(k!=i)中的xj。
    在这里插入图片描述

我们随机抽取了N个样本的minibatch,并定义了由这个minibatch衍生的增强样本对的对比预测任务,得到2N个数据点。We do not sample negative examples explicitly。相反,给定一个正对,类似于(Chen et al., 2017),我们将一个minibatch中的其他2(N-1)增例视为负例。设
在这里插入图片描述

表示标准化u和V之间的点积(即余弦相似度)。则正例对(i, j)的损失函数定义为

在这里插入图片描述
其中[k!=i]{0,1}是在k!=i时计算到1的指示函数,τ表示温度参数。最后的损失是在一个小批处理中所有正对(i, j)和(j, i)上计算的。这个损失在之前的工作中已经使用过(Sohn, 2016;吴等人,2018;Oord et al., 2018);为了方便起见,我们将其命名为NT-Xent(标准化的温度尺度交叉熵损失the normalized temperature-scaled cross entropy loss)。
在这里插入图片描述

Training with Large Batch Size

为了保持简单,我们不使用记忆库来训练模型(Wu et al., 2018;他等人,2019)。相反,我们将训练批大小N从256更改为8192。批处理大小为8192的两个增强视图中,每个正对给出16382个反例。当使用具有线性学习速率缩放的标准SGD/Momentum时,大批量的训练可能不稳定(Goyal等人,2017)。为了稳定培训,我们对所有批大小使用LARS优化器(You等人,2017年)。我们使用云tpu训练我们的模型,根据批大小使用32到128核.

除非另有规定,为数据增加我们用随机作物和调整(随机翻转),颜色失真,和高斯模糊(有关的细节,请参阅附录A)。我们使用ResNet-50作为基础网络编码器, 2-layer MLP投影表示到128 -维潜在空间。作为损失,我们使用NT-Xent,使用LARS进行优化,学习率为4.8 (= 0.3 BatchSize/256),权重衰减为10e- 6。我们以4096批次培训100个epoch此外,我们对前10个周期使用线性预热,并使用余弦衰减(cosine decay)计划来衰减学习速率而不重启(Loshchilov &Hutter, 2016)。

对比表征学习的数据增强

在这里插入图片描述
图3 实矩形是图像,虚线矩形是随机作物。通过随机裁剪图像,我们抽样对比预测任务,包括全局到局部视图(B ->A)或邻近视图(D ->C)预测。

我们展示了这种复杂性可以通过对目标图像进行简单的随机裁剪(调整大小)来避免,这将创建包含上述两项的一系列预测任务,如图3所示。这种简单的设计选择方便地将预测任务与神经网络体系结构等其他组件解耦。广义的对比预测任务可以通过扩展增广函数族并将其随机组合来定义

数据增强操作的组合对于学习良好的表示是至关重要的

在这里插入图片描述
图4 所研究的数据增强运算符的插图。每一种增强都可以随机地用一些内部参数(如旋转度、噪声等级)转换数据。注意,我们只在消融中测试这些操作符,用于训练模型的增强策略只包括随机裁剪(翻转和调整大小)、颜色失真和高斯模糊。

为了系统地研究数据增强的影响,我们在这里考虑几个常见的增强。一种类型的增强涉及数据的空间/几何变换,如裁剪和调整大小(水平翻转)、旋转。另一类增强涉及外观变换,如颜色失真(包括颜色下降、亮度、对比度、饱和度、色相)(Howard, 2013;Szegedy等人,2015),高斯模糊,Sobel滤波。图4显示了我们在这项工作中研究的扩展

SimCLR 对图片进行数据增强时不是采用单一的增强方式,而是会随机使用多种不同的增强方法进行结合,这样能够产生更好的表征向量。

作者也通过一个小实验,证明结合不同的增强方法能够产生更好的表征向量。实验采用 ImageNet 数据集,指标为 top-1 准确率,实验结果如下图所示。其中对角线的位置表示采用单一的数据增强方法,其他位置表示两种数据增强方法结合,最后一列表示每一行的平均值。可以看到结合后的效果会大大提升

在这里插入图片描述在这里插入图片描述

一种增强的组合很突出:随机裁剪和随机色彩失真。我们推测,当只使用随机裁剪作为数据增强时,一个严重的问题是,来自图像的大多数补丁共享相似的颜色分布。 图6显示,颜色直方图本身就足以区分图像。神经网络可以利用这一捷径来解决预测任务。因此,将裁剪与颜色失真相结合是学习广义特征的关键

对比学习比监督学习需要更强的数据增强

为了进一步说明颜色增强的重要性,我们将颜色增强的强度调整为shown in Table 1. 更强的颜色增强大大改善了学习无监督模型的线性评估。在这种情况下,使用监督学习发现的复杂增强策略AutoAugment (Cubuk等人,2019年)并不比简单的裁剪+(更强的)颜色失真效果好。当使用相同的增强集训练监督模型时,我们观察到较强的颜色增强并没有改善甚至损害它们的性能。 因此,我们的实验表明,无监督对比学习受益于更强的(颜色)数据增强比监督学习。尽管之前的工作已经报道了数据增强对于自我监督学习是有用的(Doersch等人,2015;Bachman等,2019;Hénaff等,2019;Asano等人,2019年)的研究表明,虽然数据增强不能为监督学习带来准确性优势,但仍然可以在对比学习中发挥很大的帮助作用。

Architectures for Encoder and Head

无监督对比学习(更多)受益于更大的模型

在这里插入图片描述
不同深度和宽度模型的线性评价。蓝点上的模型是我们训练了100个epoch的模型,红色星星上的模型是我们训练了1000个epoch的模型,绿色叉号上的模型是我们监督ResNets训练了90个epoch的模型7 (He et al., 2016)

图7显示,增加深度和宽度都可以提高性能,这一点也许并不令人意外。虽然监督学习也有类似的发现(He et al., 2016),但我们发现,随着模型规模的增加,监督模型和在非监督模型上训练的线性分类器之间的差距会缩小,这表明非监督学习从更大的模型中比监督模型获益更多。

非线性投影头提高了其前面层的表示质量

SimCLR 使用 ResNet-50 作为 Encoder,用于获取图像的表征向量 (Representation),同时 Encoder 也可用于后续的下游任务。但是 SimCLR 在训练时为了得到更好的效果,还需要在 Encoder 后增加非线性投影层 (Dense-Relu-Dense),注意非线性投影层只在训练时使用。
在这里插入图片描述
图8 具有不同投影头g(·)和z = g(h)的不同维数的表示的线性求值。这里的h(投影前)是2048维。

然后我们研究包含一个投影头的重要性,即g(h)。图8显示了使用三种不同架构的头部的线性评价结果:(1)身份映射;(2)线性投影,如以前几种方法所使用(Wu et al., 2018);(3)带有一个额外隐藏层的默认非线性投影(和ReLU激活),类似于Bachman等人(2019)。我们观察到非线性投影比线性投影(+3%)好,比没有投影(+ 10%)好得多。当使用投影头时,无论输出尺寸如何,都能观察到相似的结果。此外,即使采用非线性投影,投影头前的图层h仍然比投影头后的图层z = g(h)要好得多(>10%),这表明投影头前的隐藏层比投影头后的图层具有更好的表示效果

在这里插入图片描述
表3。在不同表示上训练额外MLPs以预测应用的转换的准确性。在对最后三行进行预训练时,除了剪裁和颜色增强外,我们还单独添加了旋转({0,90,180,270}之一)、高斯噪声和Sobel滤波变换。h和g(h)具有相同的维数,即2048

我们推测,在非线性投影之前使用表示的重要性是由于对比损失引起的信息损失特别地,z = g(h)被训练成对数据转换不变。因此,g可以删除对下游任务可能有用的信息,例如对象的颜色或方向。通过利用非线性变换g(·),可以在h中形成和维护更多的信息。 为了验证这一假设,我们进行了实验,使用h或g(h)学习预测在预训练过程中应用的变换。这里设g(h) = W(2)σ(W(1)h),输入输出维度相同(即2048)。表3显示了h包含更多关于应用转换的信息,而g(h)丢失了信息。进一步分析可以见附录B.4。

在这里插入图片描述在这里插入图片描述
图B.4。从验证集中随机选择10类图像的隐藏向量的t-SNE可视化。

图B.3是用于计算z = Wh的线性投影矩阵W R^2048 *2048的特征值分布。这个矩阵的大特征值相对较少,表明它近似是低秩的。图B.4显示了t-SNE (Maaten &Hinton, 2008) h和z = g(h)的可视化随机选择的10类由我们最好的ResNet-50(前1线性评价69.3%)。与z相比,用h表示的类的分离更好

总之,作者在原文里对非线性投影层的作用进行了一些解释,认为 Encoder 后的表征 h 包含更多的信息 (例如数据增强变换信息、颜色、方向)而非线性投影层的输出 z 可以去掉这些多余的信息,还原数据本质。Encoder 的输出信息丰富对于下游任务更有帮助,但并不适合对比学习任务,因此用非线性投影层对数据进行还原从而更好地训练。

Loss Functions

加粗样式
表2。负损失函数及其梯度。所有的输入向量,即u v+ v-,都是L2标准化的。NT-Xent是标准化温度尺度交叉熵的缩写。不同的损失函数对正反例的权重不同。

计算余弦相似性

现在,用余弦相似度计算图像的两个增强的图像之间的相似度。对于两个增强的图像x_i和x_j,在其投影表示z_i和z_j上计算余弦相似度。

在这里插入图片描述在这里插入图片描述在这里插入图片描述
使用上述公式计算batch中每个增强图像之间的两两余弦相似度。如图所示,在理想情况下,增强后的猫的图像之间的相似度会很高,而猫和大象图像之间的相似度会较低。

损失的计算

SimCLR使用了一种对比损失,称为**“NT-Xent损失”(归一化温度-尺度交叉熵损失)**。让我们直观地看看它是如何工作的。

首先,将batch的增强对逐个取出。
在这里插入图片描述
接下来,我们使用softmax函数来得到这两个图像相似的概率
在这里插入图片描述
这个softmax计算等价于第二个增强的猫图像与图像对中的第一个猫图像最相似的概率。这里,batch中所有剩余的图像都被采样为不相似的图像(负样本对)。

在这里插入图片描述
然后,通过取上述计算的对数的负数来计算这一对图像的损失。这个公式就是噪声对比估计(NCE)损失
在这里插入图片描述
在这里插入图片描述
在图像位置互换的情况下,我们再次计算同一对图像的损失。

在这里插入图片描述
最后,我们计算Batch size N=2的所有配对的损失并取平均值。

在这里插入图片描述在这里插入图片描述
基于这种损失,编码器和投影头表示法会随着时间的推移而改进,所获得的表示法会将相似的图像放在空间中更相近的位置。

[2020] MOCO_V2

在这里插入图片描述

因为MoCo和SimCLR的结果实在是太过惊艳,所以从2020年开始就掀起了一波对比学习的狂潮,基本上每天只要去刷arxiv,都会有对比学习的论文,这波热浪一直到20年年底Vision Transformer出来以后才逐渐消退

MoCo v2其实是一个只有两页的技术报告,严格意义上不算是一篇论文了,但即使只有两页,信息量也是相当大

MoCo v2主要就是说,在看到SimCLR这个比较好的结果以后,它们发现SimCLR里的那些技术都是即插即用型的,所以说它们就把那些就拿过来了,它直接说,就在MoCo上面做很简单的改动,引入了mlp projection head以及使用更多的数据增强,就又刷新ImageNet 上的最好成绩,不仅比之前的MoCo高很多,而且比最新的SimCLR也要高很多

注意,SimCLR是2月13号才放到arxiv上的,MoCo v2是3月9号就放到arxiv上了,所以说这个节奏是相当快的

MoCo v2 具体进行了哪些改进?如下表表1所示
在这里插入图片描述

准确的说就四个方面

  1. 加了一个 mlp 层
  2. 加了更多的数据增强
  3. 训练的时候用了cosine的learning rate schedule
  4. 训练更长的 epoch,从200变到了800

ImageNet 上结果:

  1. 灰色的结果76.5属于是有监督的这个基线模型
  2. MoCo v 1只能达到60.6,差的还是比较远的
  3. 就在上面加上这个projection head mlp层,一下准确率就提高到66.2,就长了6个点,所以说加projection head 不光是对 SimCLR 有用,对MoCo也有用,其实对其之后的很多方法都有用,像SwAV呢也用了,BYOL也用了
  4. 如果使用更强的数据增强,就是也能提三个点,从60到63,但是不如mlp提升的多
  5. 如果把这个mlp 和augmentation一起用就已经到67.3了,就非常高了
  6. 再加上这个cos的这个学习率,就到67.5还能再提0.2个点,那这个提升就很小了可以忽略不计
  7. 最后如果训练更长的时间,训练800 epochs,就能再提高到71.1,SimCLR结果也是这样,如果它训练更久的话,它的结果也会提升很多,一直到现在为止,就连凯明最新的MAE这个工作,也是训练了1,600个epochs,而且的这个效果还在继续往上涨

无监督学习真的是训练的越久或者模型越大,它的结果就会越好

接下来作者主要跟SOTA进行了比较,其实也就是MoCov1和 SimCLR这些工作,如下表表2所示
在这里插入图片描述

  1. 在只训练200epochs的情况下,MoCo v2比SimCLR高了大概一个点
  2. 如果训练更长的时间,在训练800个epochs的时候MoCo v2能到71.1,比SimCLR训练了1,000个epochs还要好将近2个点,所以就意味着MoCo v2能更好的利用数据,能在更短的时间内取得更好的结果

接下来作者又再次强调了一下为什么要用MoCo以及MoCo相比于SimCLR的优越性如上图中表3所示:

  1. 其实这个优越性就在于硬件:机器的内存以及训练的时长
  2. MoCo v2的作者使用的机器配置是8张v 100的显卡,MoCo在普通这个batch size 256的情况下就能训练,内存只消耗5个G,其实还有很多的剩余空间,还可以再加大batch size或者再增大模型都可以,它非常省内存,而且训练一个模型也只需要53个小时,在ImageNet这种规模的数据集上来说,两天多的时间已经算是很快了
  3. 如果这个时候换成end-to-end这种端到端的学习,也就之前说的invariant spread或者SimCLR,这里主要指的就是SimCLR 我们如果只用小batch size是256的时候,SimCLR在小 batch size的情况下只有61.9的结果
  4. 相对MoCo v2来说就差很多了,为什么呢?因为字典不够大、提供的负样本不够多,所以导致对比学习对比不是很有效,而且不光是效果低,它的内存占用7.4 G也明显高,训练的时长也多了十几个小时,就是全方位呢都不划算

如果想要端到端的这个学习走4096的这个batch size就是说让它的performance变好,变成66.6,虽然说还没有MoCo v2好,但也差不多,性能上比较相近,那它对硬件的要求就太高了

  1. 比如说对 gpu 的这个内存要求,它需要93个g的内存,这里画了个脚注,意思就是说这只是估计,因为现在也没有这么大内存的gpu,所以说它只能估计一下,训练时长当然也就不得而知了

因为这种端到端的学习方式,包括SimCLR、BYOL、SwAV默认都是用8台8卡机去做训练的,也就是有64张gpu,才能在一两天这个合理的时间内把训练完成,而MoCo只需要一台8卡机就可以在两天的时间内完成

[2020] (NIPS) simCLR_V2

在这里插入图片描述

其实SimCLR v2,只是这篇论文一个很小的部分,它只是说怎么从v1变到v2,就是一个模型上的改进,而事实上都在讲如何去做半监督的学习

它主要想说的体现在它的这个标题里了:非常大的自监督训练出来的模型非常适合去做半监督学习

模型总览图如下图中图3所示
在这里插入图片描述
图3:提出的半监督学习框架以两种方式利用非标记数据:(1)在无监督前训练中任务无关性使用,以及(2)在自我训练/蒸馏中任务特定性使用。

这篇文章分了三个部分

  1. 第一部分就是SimCLR,怎样自监督或者说自监督的对比学习去训练一个大的模型出来
  2. 第二部分就是说,一旦有了这么好的一个模型,只需要一小部分有标签的数据,然后去做一下有监督的微调,一旦微调结束了,就相当于有一个 teacher 模型,就可以用这个teacher模型去生成很多伪标签,这样就可以在更多的无标签的数据上去做自学习了

整个框架其实也是受启发于google的另外一篇工作(19年的一篇叫noisy student 的工作)

  1. 因为noisy student就是在ImageNet数据集上先训练了一个 teacher 模型,然后在JFT 300M那个数据集上生成了很多的伪标签,最后一起训练了一个student模型,而这个 student 的模型算是 ImageNet 上的SOTA,大概是88点多的准确率,霸占了ImageNet上这个sota很长时间,大概有一年的时间
  2. Vision Transformer就跟这个 noisy student 比过,因为截止到那个时候,noisy student还是ImageNet上的 SOTA

作者其实就在第三页大概花了半页的篇幅来讲了一讲怎么把v1变成v2了,其实大概就是提高了这三个点:

  1. 第一个就是大家其实都公认的一个事实,就是用更大的模型,无监督训练就会训练的更好,在这里就换了一个更大的模型,换了一个152层的残差网络,同时用了这个selective kernels,也就是SK net,这个骨干网络变得非常的强
  2. 第二点改进就是,之前SimCLR说protection head的mlp层特别有用,而且MoCo v2也证明了特别特别的有用,所以SimCLR的作者就想那一层都这么有用了,把它再变深点会不会更有用,所以它就试了试变成两层变成三层这个性能会不会继续提升,最后发现其实就是两层就够了,原来是 fc + relu,现在是 fc + relu fc + relu,一层变成两层的 mlp,这个效果呢就最好了,就是加深了这个projection head
  3. 第三点改进就是它们也使用了动量编码器(这里说 motivated by 29,就是MoCo v2 ,20就是 MoCo),就是SimCLR的作者发现MoCo 的这个动量编码器真的很管用,所以也想试一试,事实上动量编码器真的管用,后面BYOL 都用了动量编码器,但在这里作者说动量编码器在SimCLR 里的提升并不是很大可能就提了一个点,具体原因它们解释说,因为它们已经有非常大的这个mini-batch,要么是4096,要么是8192,所以它们的负样本已经相当多了,所以不论是从字典的大小,还是从字典里特征一致性来说,SimCLR v2 都已经做的很好了,所以说再加这种队列或者加这种动量编码器其实都不会带来很大的提升

总的来说就是三点改进:

  1. 使用了更大的模型
  2. 加深了projection head
  3. 引入了动量编码器

如果不算半监督学习的内容的话,SimCLR v2也是一个2页的技术报告,而且不论是SimCLR v1还是v2,都只做了分类这个任务,但是MoCo就广泛的很多了,至少做了四五个下游的任务,而且刷了很多的数据集,所以MoCo系列工作就更cv friendly,所以它投的都是cv的会议,而SimCLR v1就是 ICML,而SimCLR v2就是 Neural IPS,所以说投对口的会议也很重要

[2020] (NIPS) SwAV

在这里插入图片描述

  1. Swap
  2. assignment
  3. views
    给定同样一张图片,如果生成不同的视角,不同的 views 的话,希望可以用一个视角得到的特征去预测另外一个视角得到的特征,因为所有这些视角的特征按道理来说都应该是非常接近的

本文的具体的做法就是把对比学习和之前的聚类的方法合在了一起,当然这么想也不是偶然

  1. 首先,聚类方法也是一种无监督的特征表示学习方式,而且呢它也是希望相似的物体都聚集在某一个聚类中心附近,不相似的物体尽量推开推到别的聚类中心,所以跟对比学习的目标和做法都比较接近
  2. 另外,这篇文章的一作其实之前一直也是做聚类的,它之前就做过deep cluster这篇工作,也是一篇非常好的无监督学习的论文

具体 SwAV 是怎么和聚类的方法融合起来的呢?
在这里插入图片描述
图1:实例学习对比(左)和SwAV(右)。在应用于实例分类的对比学习方法中,将同一幅图像的不同变换后的特征直接进行比较。在swv中,我们首先通过向原型向量分配特征来获得编码。然后,我们解决了交换预测问题,其中从一个数据增强视图获得的编码使用另一个视图进行预测。因此,SwAV并不直接比较图像特征。通过反向传播学习原型向量和卷积神经网络参数。

  1. 上图图1把之前对比学习的方法总结了一下画到了左边,然后把SwAV的方法画到了右边,这样就比较好对比
  2. 左边当然很好理解了,就是同一个图片,做两次数据增强就得到了x1、x 2,然后所有的样本通过一个编码器,这个编码器有可能就是个 Res 50,也有可能是一个 Res 50加了一个 projection head,它这里没有明说,反正就是所有的这些都属于一个模型,最后这个模型输出一个特征,一旦有了这个特征,用它做一个对比学习的 loss 就可以了
  3. SwAV说,这么做虽然比较简单,但是直接拿所有图片的特征跟特征做对比有点原始而且有点费资源,因为所有的图片都是自己的类,所以其实像MoCo一样,取了6万个负样本,这还只是个近似,因为其实所有的数据集,所有的负样本理应是128万个图片
  4. SwAV的作者就想,能不能不去做近似,能不能借助一些先验信息不去跟大量的负样本比,而去跟一些更简洁的东西比,然后SwAV的作者就想出来了,可以去跟聚类的中心比(聚类中心就是右图里的c,也就是个prototype,它其实就是个矩阵,它的维度是d 乘以 k,d是特征的维度,这里的d和特征的d 是一样的,比如说就是之前说的128维,这个k就是有多少个聚类中心,在这篇文章中它们选的是3,000,也就是说你有3,000个 cluster center,3,000这个数字也是之前的一些聚类方法在ImageNet数据集上常用的一个参数)

SwAV的前向过程

  1. 前面还是都一样的:一个mini-batch的图片,做两次数据增强,得到x1、x2分别通过编码器得到最后的特征z1、z2
  2. 有了z1、z2之后并不是直接在这个特征上去做对比学习的loss,而是说先通过clustering让特征z和prototype c生成一个目标,也就是这里的q1、q 2
  3. q1、q2就相当于ground truth,那它真正要做的这个代理任务是什么呢?它的意思是说如果x1、x2是正样本的话,那z1 和 z 2的特征就应该很相似,也就跟之前对比学习一样,z1和z2要尽可能的相似
  4. 如果两个特征非常相似,或者说含有等量的信息的时候,按道理来说应该是可以互相去做预测的,也就是说,如果拿z1这个特征去跟c去做点乘,按道理来说也是可以去预测q2;反之亦然,z2和这个c去做点乘也可以预测q1,所以说点乘之后的结果就是预测,而ground truth就是之前按照clustering分类而得到的q1和q2
  5. 所以通过这种Swapped prediction,也就是换位预测的方法,SwAV可以对模型进行训练

用聚类的好处到底有哪些?

  1. 首先,就像SwAV 这篇论文里讲过的一样,如果要跟很多的负样本去做类比,可能就需要成千上万的负样本,而且即使如此也只是一个近似,而如果只是跟聚类中心做对比,则可以用几百或者最多3,000个聚类中心,就足以表示了,因为其实也并没有那么多类,ImageNet也就1,000类,COCO才80类,所以说 3,000个聚类中心就足够用了,这相对于几万个负样本来说还是小了很多的
  2. 第二,这些聚类中心是有明确的语意含义的,如果之前只是随机抽样抽取负样本去做对比的话,那些负样本有的可能还是正样的,而且有的时候抽出来的负样本类别也不均衡,所以不如使用聚类中心有效。其实这就是SwAV的基本思想。(如果对聚类算法比较感兴趣,以先去看deep cluster deep cluster two,然后再来看这篇 SwAV 的论文)

在这里插入图片描述

  1. SwAV的结果非常好,它不仅比我们之前讲过的方法效果好,其实比之后要讲的BYOL、SimSiam这些都好,算是卷积神经网络里用Res 50分刷的最高的一篇工作,达到了75.3
  2. 上图表里的性能做的还是ImageNet的linear evaluation,也就之前说的提前预训练好一个模型以后,把这个模型的backbone冻住,只训练最后的那个全连接层
  3. 表中之前不是对比学习的方法都还比较低,可能都是在60以下,有了对比学习以后,从 MoCo 开始基本上就上60了,然后CPC v2刷到63.8,SimCLR刷到70,MoCo v2刷到71.1,之后要讲的BYOL其实74点几,SimSiam也是74点几
  4. 所以说75.3就算是最高的了,而且这个75.3是你把backbone冻住的情况下去做的,如果跟有监督的基线模型去比的话,这个有监督的基线模型是从头到尾都在ImageNet 上训练,最后的结果也就是76.5,所以说SwAV 已经是非常非常逼近这个结果
  5. 而且当使用更大的模型的时候,也就是像右图里说的一样,把一个Res 50变宽,而且就是这里的2倍、4倍、5倍这么宽的时候,SwAV的结果还能不停地涨
  6. 当用最大的模型(5倍的模型)的时候,SwAV已经跟有监督的模型,差距非常的小,而且SwAV也是要比SimCLR *2、SimCLR 4要高的,所以说从性能上来讲,SwAV 是真的不错
    在这里插入图片描述

但其实让SwAV有这么好的性能,不光是因为它和聚类的方法融合在了一起,它另外一个主要的性能提升点来自于一个叫multi crop的trick:

  1. 之前的那些对比的学习方法都是用的两个crop,也就是说一个正样本对x1、x2两个图片,如上图左下角所示,本来我们有一个图片,先把它resize 到256256,然后随机crop两个224224的图片当成 x1 x2,因为这两张图片都非常大,所以它们重叠的区域也非常多,于是它们就应该代表一个正样本
  2. 但总之就是两个 crop,SwAV的作者就想:用这么大的crop明显抓住的是整个场景的特征,如果更想学习这些局部物体的特征,最好能多个 crop,去图片里crop一些区域,这样就能关注到一些局部的物体了
  3. 但是增加crop,也就是说增加view,会增加模型的计算复杂度,因为相当于使用了更多的正样本
  4. 那如何能同时使用更多的正样本,而又不增加太多的这个计算成本呢?作者就想到了另外一个办法,就是说做点取舍,原来是取了两个224224的crop,现在把这个crop变得小一点,变成160 ,也就是说**取2个160的crop去争取学全局的特征,然后为了增加正样本的数量,为了学一些局部的特征,再去随机选4个小一点crop,然而这4个crop的大小是9696,这样的话,就意味着现在有6个视角了,而不是像原来一样只有2个视角,所以正样本的数量增多了,但是通过这么一种取舍,整体的计算代价还是差不多的**
  5. 别看这个想法很简单,这个multi crop的技术真的很有用而且它不光是对SwAV有用,对其它的对比学习的方法也有用

作者在下图图3中就做了一些实验
在这里插入图片描述

  1. 基线模型就是2224,它用了 multi crop 的这个技术,就是2160加上4*96
  2. 如果现在把multi crop的技术用到SimCLR上会发现它涨了2.4个点,这个涨幅还是非常明显,所以说其实如果把 multi crop这个技术用到 BYOL 上有可能BYOL会比SwAV的效果高
  3. 接下来作者又对比了一些聚类的方法,对于聚类的这些方法用multi crop的方式提点就更多了,对于这几个方式来说都提了四个多点,更是非常显著
  4. 所以我们可以看到,如果没有这个multi crop的这个技术,把这四个点拿掉,其实SwAV的性能也就跟MoCo v2是差不多的,也就是说一个纯聚类的方法,或者说聚类和对比学习结合的方法其实也并没有什么优势,真正提点的是multi crop的技术
  5. multi crop这个技术其实非常朴实了,它其实就是一种思想,就是说全局的和这个局部的特征都要关注,所以说接下来的很多工作,也都借鉴是multi crop的这个技术,而不是 SwAV 这篇工作本身

这里简单提一下:

CPC v2其实也是融合了很多的技巧,它用了更大的模型、用了更大的图像块、做了更多方向上的预测任务,把batch norm 换成了 layer norm,而使用了更多的数据增强,所以这一系列操作下来,CPC v2直接就把CPC v1之前在 ImageNet 上40多的准确率一下就拔到70多

informing其实是 cmc 的作者做的一个分析型的延伸性工作,它论文本身的名字叫 What Makes for Good Views for Contrastive Learning(我们到底选什么样的视角才能对对比学习最好?)

  1. 它主要是提出了一个InfoMin的原则,就是最小化互信息minimi mutual information,那乍一听觉得可能有点奇怪,因为之前大家做的都是 maximize mutual information,都是想要两个视角之间的互信息达到最大,为什么作者这里就想让它达到最小呢?
  2. 其实这里也不是严格意义上的最小,作者其实想说的是,他想要不多不少的互信息如果最大化互信息以后比所需要的互信息要多,也是一种浪费,而且有可能泛化做的不好,但如果互信息比所需求的这个互信息要少,有可能达不到最优的性能,所以这个才是作者的本意,就是不能一味的最大化这个互信息,而是要不多不少刚刚好
  3. 然后按照Info Min的原则选择合适的数据增强,然后拿到合适的对比学习的视角以后,作者发现对于很多的方法都有提升,它们最后在 ImageNet 上也有73,也是相当不错的

总结:

其实到了第二阶段很多细节都处于统一了,比如说

  1. 目标函数都是用infoNCE或者infoNCE类似的目标函数去算的
  2. 模型最后也都归一到用一个编码器后面加一个projection head
  3. 都采用了更强的数据增强
  4. 都想用这个动量编码器
  5. 都尝试着训练的更久
  6. 最后在ImageNet上的准确度也逐渐逼近于有监督的基线模型

第三阶段:不用负样本

第四阶段:基于Transformer

[2021] MAE

在这里插入图片描述
在这里插入图片描述

与之前读的文章的关系

transformer

  1. 它是一个纯基于注意力机制的编码器和解码器
  2. 在机器翻译任务上,它比基于RNN的架构要更好一些

BERT

  1. 它使用一个transformer编码器,拓展到了更一般的NLP任务上
  2. 它使用了完形填空的自监督的训练机制,这样就不需要使用标号,而是通过预测一个句子里面哪些词不见了,从而获取对文本特征抽取的能力
  3. BERT极大地扩展了transformer的应用,可以在一个大规模的、没有标号的数据上训练出非常好的模型出来

ViT

  1. 这个模型可以认为就是将transformer用到CV上面
  2. 具体来讲,就是将整个图片分割成很多个16*16的小方块,然后每个方块做成一个次,然后放进transformer进行训练
  3. ViT这篇文章证明:假设训练数据足够大的时候比如说用1000万或者1亿的训练样本,它相对于CNN的架构来说,transformer的架构在精度上可能会更高一点

MAE

  1. 可以认为是BERT的CV版
  2. 它是基于ViT这篇文章,但是它把整个训练拓展到没有标号的数据上面,也就是跟BERT一样通过完形填空来获取对于图片的理解
  3. MAE并不是第一个将BERT拓展到CV上的工作,但是MAE很有可能是这一系列工作之中未来影响力最大的一篇(因为BERT这篇文章极大地加速了transformer这个架构在NLP里面的应用,所以MAE很有可能使得transformer在CV上的应用更加普及)

1、标题+作者

masked autoencoder are scalable vision learners

带掩码的自编码器一个可拓展的视觉学习器

  1. scalable:可拓展的
  2. vision learner:这里没有写成classifier或者其他的东西,因为它能够用到的地方相对广一些,他是一个backbone模型
  3. masked:在BERT的时候,masked language model就是一个带掩码的语言模型(完形填空),这里使用masked来源于BERT,每次挖掉一些东西然后去预测被挖掉的东西
  4. autoencoder:在transformer和BERT中,使用的都是encoder,前面没有加上auto,这里的auto不是自动的意思,而是“自”的意思。在机器学习中有一类模型叫做auto自模型,比如自回归模型,这一大类模型的特点是,标号和样本(y和x)来自于同一个东西(比如说在语言模型中,每一次用前面的次去预测下一个词,每一个词、标号、或者y都是来自同样的句子里面的词所以叫做auto)。在NLP中,语言模型是它的一大类模型,所以说不说auto,大家都是可以理解的,但是在计算机视觉中,这样的任务比较少,因为图片的标号很少来自图片本身,标号很多时候是文本而图片是像素,但是编码器、解码器在图片里面用的非常多,所以作者在这里加上了auto,意在指出和计算机视觉中其他的encoder相比,这里的标号也就是图片本身,这样能跟之前的很多工作区分开来

在写论文的时候假设算法特别快的话,就把标题放在efficient,假设做的东西比较大的话,就叫做scalable,二选一

2、摘要

这篇文章展示了masked autoencoder是一个scalable self-supervised learner for computer vision

  1. 这里是标题的拓展
  2. 同时写出了名字MAE

MAE的途径非常简单,随机地盖住图片中地一些块,然后再去重构这些被盖住的像素,这个思想来自于BERT中的带掩码的语言模型,但是不同之处在于patch是来自图片的一个小块,预测的是这个块中所有的像素

两个核心的设计

1、非对称的encoder-decoder架构

  1. 虽然是一个自编码器架构,但是实际上任何模型都有一个编码器和一个解码器,比如说在BERT中的解码器就是最后一个全连接输出层,因为BERT预测的东西相对来讲比较简单,所以它的解码器就是一个简单的全连接层就可以了,但是本文中可能相对复杂一点,因为需要预测一个块中所有的像素。
  2. 编码器之作用在可见的patch中,对于丢掉的patch,编码器不会对它进行编码,这样能够节省一定的计算时间
  3. 解码器是一个比较轻量的解码器,能够重构原始的图片
    2、如果发现遮住了大量的块(比如说把75%的块全部遮住),则会得到一个非显然的而且有意义的自监督任务。如果只是遮住几块的话,只需要进行插值就可以出来了,模型可能学不到特别的东西,但是如果将一大半都遮住的话,就会迫使模型去学习一些更好的特征

将上述两个设计放在一起,可以更有效地训练大的模型

  1. 大是说构造一个比较有挑战性的任务,他不是去学习一个很显然的解
  2. 快是说,对于被遮住的块就不看了,假设盖住了不去看的话,那么训练量就是之前的1/4,所以能加速3倍或者以上

结果:只使用ImageNet-1K(100万张图片)的数据,在一个最简单的ViT-Huge的模型中(模型来自ViT这篇文章)能够得到87.8%的准确率

在ViT这篇文章的最后一段有提到过怎样做自监督学习,作者说效果并不是很好,所以没有展开,作者当时的结论是:用有标号的模型和更大的训练集可以得到很好的效果
这里的挑战在于,只使用小的数据集(ImageNet-1k,100万张图片),而且是通过自监督,就能够做到跟之前可能效果一样好的模型了

这个模型主要是用来做迁移学习,它证明了在迁移学习的其他任务上表现也非常好

3、关键图

对于计算机视觉的文章来说,最重要的一张图就是放在第一页右上角的那张

在这里插入图片描述

  1. 图一讲的是MAE整个模型的架构
  2. 输入一张图,首先将它切成一个一个的小块,图中涂成灰色的那些小块就是被盖住的部分,从没有盖住的部分可以看出,原图应该是一只红色的鸟
  3. 去掉那些被盖住的块,剩下的小块已经不太多了,因为3/4的地方都已经被盖住了
  4. 将剩下的小块放进encoder(也就是vit)中,得到每一个块对应的特征,然后将其拉长,再把被盖住的那些块重新放回到原来的位置,也就是说这个被拉长的东西其实就是原始图片拉成的一条向量(其中没有盖住的部分就填上经过vit之后输出的特征,被盖住的地方依然是灰色的,这里其实就是一个位置信息,没有其他的可以表示的)
  5. 将得到的长向量输入到解码器中,解码器会尝试将里面的像素信息全部重构回来,使得最后的target训练出来就是原始的没有被掩码盖住的图片
  6. 这里的编码器画的稍微比解码器要高一点,这里的意思是说模型主要的计算来自于编码器,因为最重要的就是对图片的像素进行编码(编码器只需要处理没有被盖住的图片,也就是说一张图片其实只需要看到1/4的像素就行了,这样可以降低计算量,transformer的模型计算量都特别大,如果能够达到几倍的加速,其实也是很重要的事情),这是在预训练的时候所干的事情
  7. 如果想用这个模型来处理一个计算机任务的话,就只需要编码器就够了,解码器是不需要的,图片进来之后不需要对它做掩码,直接切成一个一个的小块,然后放进vit,就能得到所有块的特征的表示,这就可以当作是输入图片的特征表达,然后用来做所要处理的任务

在这里插入图片描述

  1. 图2演示的是在ImageNet的验证集上通过MAE构造出来的图片,因为这些图片是没有参与训练的,所以只是测试结果
  2. 每张图片中,左边一列演示的是将图片80%的块去掉,中间列演示的是MAE构造出来的图片效果,最右边一列演示的是原始的真实的ImageNet’的图片
  3. 第一行第一张图片里的时钟上的指针基本上被遮住了,但是还原的时候还是基本上将两个指针整个还原出来了
  4. 第二行第一张图片中车的两头都没有,但是还原的效果跟真实的车的效果还是非常一致
  5. 第三行第一张图中的狗也是基本上看不出来狗在什么地方,但是还是能够大概的还原出来
    这里的重构虽然在细节上比较模糊,因为原始图片的尺寸也不是很大,但是对图片内容的重构效果还是非常惊人的
  6. MAE不一定对所有图片的重构都有很好的效果,这里可能只是挑选出来了一些比较好的样例做了展示。如果想要将任意打码的图片还原出来,后续可能还需要很多工作进行改进

在这里插入图片描述

图三是在COCO数据集上,跟之前的处理完全一样,只是数据集不同,但是效果上来说也是非常惊人
在这里插入图片描述

  1. 图四演示的是对同一张图片遮盖不同比例的区域时的结果
  2. 最后一列是95%的区域被盖住的还原效果

4、结论

简单且拓展很好的算法是整个深度学习的核心

  1. 简单:在vit的基础上,本文所提出来的东西相对来说比较简单
  2. 拓展性很好:能够跑比较大的数据集
  3. 整个MAE是基于vit,vit是基于transformer,就整个模型来说当然是不简单的,每一个transformer块中就有很多的东西,然后还要用很多层的transformer堆叠起来,当然是一个比较复杂的算法
  4. 而且扩展性好是说在很有钱的时候,当然是可以无限地往里面加数据,因为毕竟不需要标号
  5. 所以说这里的简单和拓展性好只是针对一小群人的

自监督学习在最近几年是比较火的,但是在计算机视觉中,还是主要靠有标号的数据作为训练

这篇文章的工作通过在ImageNet数据集上通过自编码器学习到可以媲美有标号的时候的效果,所以是一个非常强有力的工作

需要注意到的是图片和语言之间的一些区别,因为本文可以认为是BERT在计算机视觉上的拓展

  1. 首先,对于语言来说,一个词是一个语义的单元,它里面所包含的语义信息比较多(这点在vit中已经被提出来了),在图片中虽然一个patch也含有一定的语义信息,但它不是语义的分割(也就是说这个patch中并不含有特定的物体,可能含有多个物体的一小块,或者是某一个物体重叠的一块),但是即使是在这样的情况下,MAE也能做很复杂的一些任务(作者认为MAE或者说是transformer确实能够学到隐藏的比较好的语义表达

最后一段讲的是broder impacts

  1. 就是说如果工作要被出圈的话,那么对整个社会的影响是什么
  2. 因为只用了图片本身的信息去进行学习,如果图片里面有bias(比如说倾向于某一些图片,或者是有一些不那么好的图片的话,就可呢个有一些负面的社会影响)
  3. 这个模型可以用来生成不存在的内容,因为它是一个生成模型,它可以用来生成原始的像素,所以它和GAN一样确实可能会有误导大家的前提,所以这个工作如果想用在更多的地方的时候,一定要去考虑这些潜在的影响

读到这里,对这个工作是在干什么、效果怎么样就有了一个比较清晰的了解了,这里可以停下来,如果对完整的故事感兴趣的话,也可以接着往下读

5、导言

深度学习在过去一些年里有飞快的进展,但是对于计算机视觉来讲,还是依赖于需要百万级别的、甚至是更多的带有标注的图片

在自然语言处理中,自监督学习已经做的非常好了

  1. 比如说GPT系列是一个标准的语言模型,BERT是一个带掩码的自编码模型,这些模型使得在NLP中可以使用没有标注的数据训练得到千亿级别的可学习参数的模型

在计算机视觉中,使用带掩码的自编码也不是那么新鲜,比如说大家用的比较多的denoising autoencoder(就是在一个图片中加入很多噪音,然后通过去噪来学习对这个图片的理解),至少在十几年前就已经有相关的文章了,这一块中,最新的工作就是基于BERT,最近有很多工作将BERT拓展到计算机视觉上面,但是BERT在计算机视觉上的应用是落后于NLP的

作者尝试回答了:是什么使得这种带掩码的自编码模型在计算机视觉和自然语言处理上不一样?

  1. 第一个观点是说:直到最近以前,计算机视觉都是使用卷积神经网路络(就是在一张图片上面,使用一个卷积窗口,不断地平滑它来汇聚这些像素上面的信息以及进行模式识别),卷积窗口使得不便于将这种mask的东西放进去,因为在transformer中,一个mask是一个词,而这个词是一个特定的词,它会一直保留下来,跟别的词区分开来。但是在卷积上面做掩码就是将一块图片给盖住(比如说就是将它的像素换成某一个特定的值),但是卷积窗口在图片上滑动的时候其实是无法区分这个边界的,因为它无法将被盖住的这一个特定的东西给拎出来,所以导致这个掩码信息在后面的时候难以还原出来到底是什么,因为不好加入位置编码(这里是比较奇怪的在transformer中加位置编码是因为注意力机制无法拥有位置信息,但是卷积是自带位置信息的,就是说在卷积窗口不断平移的时候,是没有必要加入位置信息进去的),作者说其实这一块现在也不是问题了,因为最近的vit的工作已经使得transformer能够很好地运用在计算机视觉上面了,所以这个问题应该是之前有的但是现在不会再有了
  2. 第二个观点是是说:信息的密度有点不太一样,在自然语言中,一个词就是一个语义的实体(比如说字典中一个词的解释就是很长的一片),所以一句话中很难去去掉几个词(比如完形填空也不是一件简单的事情)。但是在图片中会有所不同,因为图片中每个像素是比较冗余的,取决于相机的分辨率有多大,所以如果是简单地去掉一个块的话,去掉的这一块很有可能可以通过邻居的像素值进行插值还原出来。作者在这里提出了一个简单的想法:把非常高比率的一些随机的块去掉,这样的话极大地降低了图片的冗余性,因为一个块和它边上的很多块都被去掉了,那么在很远的地方的块跟这个块的关系就不那么冗余了,这样的话就创造了一个非常有挑战性的任务,而且使得整个模型会去看全局的信息,而不是仅仅关注于学一个局部的模型将这些像素的值进行插值好就可以了(在图2和图4中展示了在ImageNet和COCO数据集上MAE差值出来的图片的效果,它确实是可以通过一些局部的一些很稀疏的块得到全局图片的重构)
  3. 第三个观点是说:关于自编码器的解码器,在计算机视觉中,需要还原到输入,也就是原始的像素,它相对来说是一个比较低层次的一些表示。但是在NLP中,需要还原的是词,也就是说预测的内容是所缺失的词,词相对来说在语义层面上比较高一点,所以在NLP中,比如说在BERT中,使用一个最简单的全连接层就能还原出所要的那些词,也就是对标号进行预测。但是在机器视觉中,因为要还原的是比较低层次一点的像素,所以一个MLP可能是不够的(在图片分类、目标检测等任务上,输出层,也就是解码器,就是一个全连接层就够了,但是在一些比较复杂的任务,比如说语义分割当中,对每个像素做像素级别的输出的话,通常来说,就不是简单地使用一个全连接层了,而是很有可能就是使用一个卷积神经网络,而且是一个转置的神经网络来做一个比较大的解码器

基于以上这些分析,作者就提出了MAE,实际上是有这两个想法

第一个想法是随机遮住大量的输入的块,然后去重构这些被遮住的像素信息

第二个想法是使用一个非对称的编码器和解码器的机制

  1. 非对称是说编码器看到的和解码器看到的东西是不一样的,这里编码器**只看到那些可见的块,**解码器拿到编码器的输出之后,就去重构那些被遮挡住的块
  2. 为什么使用这些非对称的架构,因为大量的块都被遮住了,这样的话编码器只用看可见的那些块,可以极大地减轻计算的开销,也可以使得内存更大一点

6、相关工作

带掩码的语言模型

自编码器在视觉中的应用

  1. MAE其实也是一种形式上的带去噪的自编码,因为将图片中的某一块遮住,就等于是在图片中加入了很多噪音,但是它跟传统的DAE(Denoising autoencoder)不太一样,因为它毕竟是基于ViT,基于整个transformer架构

带掩码的编码器在计算机视觉中的应用

  1. 本文不是第一个做这个工作的,之前已经有很多工作了。比如说iGPT就是GPT在image上的应用;ViT的论文在最后一段也讲了怎样用BERT来训练模型;另外还有BEiT,它也是BERT在image上的应用,它和MAE的不同之处在于,它对每一个patch都给了一个离散标号,更接近于BERT,但是在MAE中直接还原的是原始的像素信息

自监督学习

  1. 比如最近一两年特别火的contrast learning,它在这一块主要使用的是数据增强,而MAE所用的和它不一样

相关工作中提到了四个领域,提到的文章还是比较多的,但是本文并没有特别地讲MAE跟它们的不同点是什么,特别是跟iGPT和BEiT这两篇文章的区别

  1. 写作时,建议在写相关工作的时候,尽量将那些特别相关的工作和自己工作的不同之处写出来,而不要让大家去猜

7MAE模型

MAE 是一个简单的 自编码器

  1. 看到了部分的观察的数据
  2. 用 观察到的部分数据 重构 完整的原始信号

所有自编码器的工作

  1. 将观察到的信号 映射到一个潜在 latent 表示里面
  2. 潜在表示:语义空间的一个表示
  3. 解码器 用 潜表示 latent 重构原始信号

MAE 的自编码器 和 经典自编码器的不同?

  1. asymmetric design 非对称结构
    编码器只看 可见块
    忽略不可见 masked 块,节省计算开销

掩码 mask 如何工作?

和 ViT 的一样图片 patches 化, i.e., 一张图片 九宫格分割,3 * 3,每一格 代表一个 patch,作为一个词 token

在这里插入图片描述

random sampling?

随机均匀采样块保留, 剩余块用 mask 掩码盖住。

MAE 的关键技术?

只采样少量的块,其余的块全覆盖,去掉图片 patches 之间的冗余度。–> 增加任务的复杂度

MAE 的编码器

  1. a ViT, 没有任何改动
  2. but applied only on visible, unmasked patches, 只作用于 可见块

MAE 编码器如何作用于可见块呢?

和 ViT 一样:

  1. 每一个 patch 块拿出来,做一个线性投影
  2. + 位置信息 --> token

和 ViT 不一样:

  1. masked 块不进入 MAE 编码器
  2. i.e., 随机采样概率 1 / 4, 25% 样本块进入 ViT,计算量减少

MAE 的解码器

重构 masked 块的像素信息,需要看到 可见块(编码器对可见块的潜表示)masked 块 (没有进入编码器)

a shared, learned vector 通过一个 共享的可以学到的向量来表示 each mask token

每一个被盖住的块都表示成同样一个向量,此向量值可学习

解码器是 another series of Transformer blocks 另外一个 transformer

  1. 需要位置信息,不然无法区分对应哪一个 掩码masked tokens

可见块的位置信息 question?

位置信息 要不要也对那些编码器过来的 潜在表示 也加上

因为可见块的潜表示其实本来已经加过一次了,那么这个地方要不要再加上一次?

解码器什么时候用?

pre-training;别的下游任务,解码器不需要,只需要编码器对图片编码得到潜表示 --》灵活,想用什么随便用

解码器的架构 大 吗?

相对小,计算开销不到编码器的 1 / 10

怎么样重构出原始的像素?

解码器的最后一层: a linear projection

  1. 一个 patch 是 16 * 16 像素的话,**线性层会投影到长为 256 的维度
  2. 再 reshape(16, 16), 还原原始像素信息**
  3. 损失函数: MSE,像素值相减,再平方和
    只作用于非可见块的损失,和 BERT 一样
    可见块的图片编码器已经看到了,看到答案就不算正确率了

也可以对要预测的像素值做一次normalization,就是说对每一个块里面的像素使它的均值变为0、方差变为1,使得在数值上更加稳定一点(这里并没有写清楚在预测的时候怎么办,在训练的时候当然知道标号的那些东西,当然可以把均值和方差算出来,但是预测的时候呢)

Simple implementation

  1. 首先生成了一些token列,token列就是一个一个的patch拿过来之后做一次线性的投影,再加上位置信息
  2. 接下来将这些序列随机打乱,然后将最后一块拿掉,因为随机打乱,把头部保存下来,就等价于是把头部均匀的、没有重置的将里面的东西采样出来,所以如果是采样25%的话就随机shuffle一下,然后将前25%留下来,后面的丢掉就行了,这样就完成了随机采样
  3. 解码的时候,要在后面附上跟以前长度一样的掩码的词源mask tokens,它就是一个可以学习的向量,当然也要加上位置信息,然后再把它重新unshuffle一下还原到原来的顺序,这样的话,在算误差的时候跟之前那个原始的没有被做过任何操作的patches是能够一一对应起来的
  4. 要加上位置信息(这里还是有一个疑惑:这个位置信息要不要对编码器那边来的也给加上,还是说从编码器出来的那些潜表达可以寄跳过加位置信息这个步骤)
  5. 这里主要是说通过这样的shuffle和unshuffle使得不需要任何的稀疏操作,在实现起来是非常快的,也不影响后面所有的vit的操作

相对于前面来说,这里面补充了一些细节

  1. 解码器
  2. 怎样还原出原始的像素信息
  3. 在实现上,随机采样是如何实现的

8、实验

在ImageNet-1K数据集(100万张数据集)上先做自监督的预训练,就是不用标号,只把图片拿过来,然后再在同样的数据集上做有标号的监督训练

这里有两种做法

  1. 一个是做end to end的微调:允许该整个模型所有的可学习的参数

  2. 第二个是linear probing:只允许改最后一层的线性输出层

9、评论

MAE的算法还是非常简单的,就是利用vit来做和BERT一样的自监督学习,vit已经做了类似的事情了,但是本文在此基础之上提出了两点

  1. 第一点是需要盖住更多的块,使得剩下的那些块,块与块之间的冗余度没有那么高,这样整个任务就变得复杂一点
  2. 第二个是使用一个transformer架构的解码器,直接还原原始的像素信息,使得整个流程更加简单一点
  3. 第三个是加上vit工作之后的各种技术,使得它的训练更加鲁棒一点
    以上三点加起来,使得MAE能够在ImageNet-1k数据集上使用自监督训练的效果超过了之前的工作

从写作上来说,这篇文章非常简单,但是故事性写的非常好。从前面导言中为什么MAE要这么做,以及后面非常详细的数据显示了整个MAE中所有可以调的超参数到底是什么意思

简单的想法、非常好的结果、详细的实验,共同决定了这是一个非常高质量的工作

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姬霓钛美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值