目录
对比学习论文综述【论文精读】_哔哩哔哩_bilibili
1. 百花齐放
2.CV双雄
3. 不用负样本
4. Transformer
方法、模型、目标函数、代理任务都还没有统一。
(1)InstDisc:https://arxiv.org/abs/1805.01978 Unsupervised Feature Learning via Non-Parametric Instance Discrimination。 2018
个体判别任务,把每一个Instance看成一个类别。通过一个卷积神经网络把所有图片编码成一个特征,希望特征在最后的特征空间尽可能分开,因为每个图片都是一个自己的类,希望和其他腿片分开。正样本为图片本身,负样本是数据集中的其他图片。所有图片特征存到memory bank里,意味着特征维度不能太高,否则存储代价太大,这里选择的128维。
首先经过ResNet50,得到2048D的特征,降维到128D,batch size是256,所以256个正样本,从memory bank中抽4096个负样本,然后用NCE loss,更新网络。再把这个mini batch的特征更新到memory bank中。
巧妙设计如 proximal Regularization,给模型训练加了一个约束,从而使memory bank中的特征进行动量式更新,与Moco想法一致。
不仅提出了个体判别的代理任务,而且用这个代理任务和NCE loss去做对比学习,从而取得了不错的无监督表征学习结果,同时还提出了用别的数据结构存大量负样本,以及如何对特征进行动量更新。
(2)InvaSpread:https://arxiv.org/abs/1904.03436 Unsupervised Embedding Learning via Invariant and Spreading Instance Feature。CVPR2019,SimCLR的前身。
没有用额外的数据结构存储大量负样本,正负样本来自于同一个batch,只使用一个编码器进行端到端的学习。对于相似图片相似物体的特征应该保持不变性,不相似物体应该尽量分散开。
batch size是256,每张图片进行数据增强,增强后的图片为正样本,负样本是所有剩下的图片(原始及增强后的) ,这样就可以用一个编码器进行端到端的训练,不用借助外部的数据结构存储大量负样本。目标函数是NCE loss的变体。为什么没取得好结果,负样本越多越好,但是本文作者没有TPU,batch size只是256,所以没有大量负样本。
(3)CPC:https://arxiv.org/abs/1807.03748 Representation Learning with Contrastive Predictive Coding。2018
很通用的结构,可以处理音频、图片、文字,也能用于强化学习。用预测的代理任务去做对比学习。
时序序列,输入之前时刻给编码器, 返回的特征喂给自回归模型(图中gar,常见的为RNN,LSTM),得到ct,上下文的特征表示,如果这个表示足够好,应该可以进行合理的预测,预测未来的输出。对比学习的体现在于,正样本就是未来的输入通过编码器得到的未来的输出(zt+1...zt+4),负样本是任意选取输入得到的输出。
(4)CMC: https://arxiv.org/abs/1906.05849 Contrastive Multiview Coding。2019
定义正样本的方式更加广泛。人观察世界是通过很多传感器,比如眼睛、耳朵,来给大脑提供不同的信号。每个视角都有噪声,而且信息不完整,但是最重要的信息是在他们之间共享的。基于这个现象,想学特征,有视角不变性,增大互信息。
4个视角,原始图像、图像对应的深度信息(每个物体离观察者多远)、SwAV ace normal、物体的分割图像。不同模态互为正样本,随机挑一张图片,不配对的视角为负样本。不同视角、不同模态需要不同的编码器。
(1)MoCo:https://arxiv.org/abs/1911.05722 Momentum Contrast for Unsupervised Visual Representation Learning。 2019
把之前的对比学习方法归纳总结成了字典学习的问题。MoCo和InstDisc很像,用队列替代memory bank存负样本,用动量编码器取代原来loss的约束项,从而达到动量的更新编码器的目的,而不是动量的更新特征,从而得到更好的结果,采用InfoNCE,而非NCE。
(2)SimCLR:https://arxiv.org/abs/2002.05709 A Simple Framework for Contrastive Learning of Visual Representations。 ICML2020
加了一个projector层(即一层FC+Relu)。projector只在训练的时候使用,预测时不用。SimCLR和InvaSpread的区别就是,用了更多的数据增强,加了projector,用了更大的batchsize,训练的更久。
MoCo v2, SwAL,BYOL借鉴了projector,BYOL也借鉴了lars优化器。MoCo是直接拿Res50出来的特征做对比学习。
(3) MoCo v2: https://arxiv.org/abs/2003.04297 Improved Baselines with Momentum Contrastive Learning。 2020
把SimCLR的技术拿过来,MLP,更多的数据增强,训练的时候用了cosine的learning rate schedule,训练更多的epoch。
(4)SimCLR v2:https://arxiv.org/abs/2006.10029 Big Self-Supervised Models are Strong Semi-Supervised Learners。2020 NeurlPs
自监督的对比学习训练一个大的模型,再用一小部分有监督的数据做微调模型,就相当于有了一个teacher模型,就可以生成很多伪标签,就能在更多无标签数据上做自学习了。整个框架受启发于google的noisy student方法。
v1到v2:更大的模型,152层的ResNet;projector层由fc+relu变成fc relu fc relu,由1层MLP变成两层;使用动量编码器,但由于batch size已经很大了,负样本足够多了,所以动量编码器并没有带来很大的提升。
(1) SwAV:https://arxiv.org/abs/2006.09882 Unsupervised Learning of Visual Features by Contrasting Cluster Assignments。NeurlPs2020
用一个视角得到的特征预测另外一个视角得到的特征。把对比学习和聚类的方法合到一起。相似的物体都聚集到某一个聚类中心附近,不相似的物体推开到其他的聚类中心。
借助先验信息,不跟大量负样本比,跟聚类中心比。此处选择了3000个聚类中心,在Image Net数据集常用的参数。右图中c是聚类中心,维度为D*K,D即向量的维度,K即聚类中心的个数。
得到特征z1、z2之后,先通过clustering的方法让特征z和prototype c去生成一个目标,即右图中的Q1、Q2,Q1、Q2就相当于ground truth的东西。真正要做的代理任务是,如果x1,x2是正样本的话,z1和z2就会很相似,按道理来说是可以互相做预测的,如果拿z1跟c去做点乘,应该可以预测Q2,反之,z2和c点乘可以预测Q1。所以,点乘之后的结果就是我们的预测,ground truth就是按照之前clustering分类得到的Q1和Q2。所以通过换位预测的方法对模型进行训练。
multi-crop的trick,之前方法用的是两个crop,而且裁剪的图片比较大,重叠区域比较多,更倾向于学习全局的特征。如果想学习局部的特征,可以多crop一些较小的图片作为正样本,但是正样本增多会增加计算成本。此处方法是将2*224变成2*160+4*96的正样本,正样本增多,计算代价也差不多。如果不用multi-crop,效果和MoCo v2相差并不多,所以提点主要是multi-crop这个tirck,后续被借鉴的更多也是这个trick。
(2) CPC v2:用了更大的模型,用了更大的图像块,做了更多方向上的预测任务,把batch norm换成了layer norm,还使用了更多的数据增强。一系列操作下来,CPC v1在ImageNet上40多的百分点被提升到了70多的百分点。
(3) Informin:CMC的作者做的分析性的延伸工作,提出了最小化互信息。之前都是最大化互信息,但是如果最大化互信息之后比所需要的互信息要多也是一种浪费,而且有可能泛化做的不好,此处是想要不多不少的互信息。
(4) BYOL:https://arxiv.org/abs/2006.07733 Bootstrap your own latent: A new approach to self-supervised Learning。2020.06,和SwAV是同期的工作。
Bootstrap的意识就是如果你已经有什么东西了,在它之上进行改造;latent是特征的意思。BYOL的意思是自己跟自己学,完全没有用任何形式的负样本。因为负样本其实对于对比学习来说是一种约束,如果只用正样本,让相似物体相似,那么模型很容易找到捷径解,就是所有的输入都是同样的输出,loss永远是0。
两层编码器结构相同,参数不同,上面那层是正常的梯度更新,下面那层和MoCo类似,使用动量方式更新。z是256维。与SimCLR不同的是,又加了新的一层prediction,q和g的网络结构是一样的,也是一层MLP。然后目标是让上面预测的q(z)和下面的z'尽可能的一致。把原来的匹配问题换成了预测问题,和SwAV比较像,但是SwAV还是借助了一个聚类中心。相当于用自己一个视角的特征去预测另外一个视角的特征。BYOL用的损失函数是MSE loss。
SimCLR中的projection head是 Linear-BN-ReLU-Linear-BN,MoCo v2的是Linear-ReLU-Linear。BYOL里面是Linear-BN-ReLU-Linear。 如果BYOL没有BN的话,模型就坍塌了,因为有BN,所以可以把batch里的其他样本作为隐式负样本,相当于跟batch里的平均图片去做对比了。
作者又做了很多消融实验, 发现了两个特例,一个是当BYOL的Encoder为-、projector为BN、predictor为-时,即使有BN,还是训练失败了;一个是当SimCLR的Encoder和Projector都为-时,没有BN,即使有显式的负样本,还是训练失败了。所以作者和提出该问题的大佬达成一致,BN的作用就是提高模型的训练稳健性,从而导致模型不会坍塌。
然后进一步延伸,如果一开始模型能初始化的比较好,后面的训练离开了BN也没问题。于是做了一个实验,用group norm(归一化的一种方式)和weight standardization(模型初始化方式),是VIT的原班作者在BEiT提出来的,ResNet v2就是用这种方式训练的,换上这种方式,BYOL又能训练的比较好了。
(5) SimSiam:https://arxiv.org/abs/2011.10566 Exploring Simple Siamese Representation Learning。CVPR 2020
既不需要负样本,不需要大的batch size,不需要动量编码器。
negative cosine similarity loss,其实也就是MSE loss。因为又了stop gradient的存在,所以模型不会坍塌,可以理解为EM算法。
(1) MoCo v3:https://arxiv.org/abs/2104.02057 An Empirical Study of Training Self-Supervised Vision Transformers。ICCV 2021。
相当于MoCo v2和SimSiam的合体。整体框架还是两个网络,query编码器和key编码器,key编码器用了动量更新,最后的目标函数用的对比学习的loss。query编码器除了骨干网络还有projector和prediction,这个其实就是BYOL或者SimSiam。目标函数用的对称项,既算query1->key2,也算query2->key1,这个角度讲就是SimSiam。把骨干网络由ResNet换成了ViT。
(2)DINO:https://arxiv.org/abs/2104.14294 Emerging Properties in Self-Supervised Vision Transformers. CVPR2021
自监督训练Vision Transformer。完全不用任何标签信息训练出来的Vision Transformer,如果把它的自注意力图拿出来,会发现它能准确的抓住每个物体的轮廓,效果媲美做分割。
centering防止模型坍塌,整体和MocoV3非常像。
InstDisc提出个体判别的任务,提出memory bank存储负样本,从而达到又大又一致的字典。不用外部结构的话,端到端的学习,也就是InvaSpread只用一个编码器,但受限于batch size太小,性能不够好。接下来是 CPC v1提出了InfoNCE loss,而且CPC v1是一个预测型的代理任务,不仅可以做图像,也可以做音频、视频、加强学习等,是一个非常全能的结构。最后还有CMC的工作,把两个视角的任务扩展到了多视角,给多模态多视角的对比学习打下了铺垫。deep cluster是基于聚类学习的,当时还没有用对比学习。
然后是第二阶段,MoCo v1是InstDisc的一个延伸性工作,把memeory bank变成了队列,把动量更新特征变成了动量更新编码器,从而能预训练一个很好的模型,也是第一个在很多视觉的下游任务上,让无监督模型比有监督模型表现好的方法,是属于使用外部数据结构的。SimCLR v1和InvaSpread是很像的,但它用了很多技术,比如加大batch size,用了更多的数据增强,训练更长时间。CPC v2也把一些技术拿来用,直接比v1升了30多个点。CMC把这些分析了一下,提出了InfoMin的原则,即两个视角的互信息要不多不少才是最好的。MoCo发现SimCLR的技术都很管用,而且是即插即用的,就拿过来用在MoCo上,有了MoCo v2,SimCLR也做了一些改动有了SimCLR v2,但它主要做半监督学习。SwAV是把聚类学习和对比学习结合起来的工作,也取得了不错的结果,主要提升来自于multi crop的技术,如果没有multi crop,和MoCo v2或者SimCLR的结果是差不多的。
第三阶段,BYOL的方法不用负样本,自己跟自己学,把对比任务变成了预测任务,损失函数由InfoNCE变成了MSE loss。然后SimSiam把之前的工作都总结了一下,化繁为简,提出了一个简单的孪生网络的方法,不需要大的batch size,不需要负样本,不需要动量编码器,照样能取得不错的方法,提出stop gradient是至关重要的,因为有这个操作所有SimSiam可以看作是一种EM算法,通过逐步更新的方式避免模型坍塌。BarlosTwins主要更换了目标函数,把之前大家做的对比或者预测,变成了两个矩阵之间去比相似性,但很快淹没在Vision Transformer的洪流当中。
最后来到了Vision Transformer。其实就是把骨干网络从残差换成了ViT,主要学习的方法其实没有改变,但是换成ViT之后面临的问题是训练不稳定或者不好训练,所以就提出了各自的方法。MoCo v3就提出把patch projection layer冻住(即tokenizen层),DINO提出把teacher网络的输出先做归一化centering。这两种方式都能有效提高模型训练的稳健性,防止模型坍塌,让vision transformer用自监督的方法也能学习的比较好。
现在对比学习虽然没有Vision Transformer那么火,尤其是MAE火爆了之后,大家都去尝试y掩码学习了,所以对比学习又从火爆发展期变成了发展潜伏期。但是对比学习的前途还是很好的,毕竟多模态的对比学习还是一个主流,CLIP的效果就很好。