参考视频对比学习论文综述第一阶段 百花齐放2018年~2019年中1、InstDiscInstance Discrimination主要贡献提出个体判别任务无监督的学习方式就是把按照类别走的有监督信号推到了极致。提出将每一张图片都看作是一个类别我们的目标是能学一种特征从而能把每一个图片都区分开来。用这个代理任务和 NCE loss去做对比学习从而取得了不错的无监督表征学习的结果。用别的数据结构字典去存这种大量的负样本。方法通过一个卷积神经网络把所有的图片都编码成一个特征希望这些特征在最后的特征空间里能够尽可能的分开。训练这个卷积神经网络需要使用对比学习——正样本这个图片本身数据增强负样本数据集里所有其它的图片用memory bank的形式存储前向过程batch size -- 编码器 (Res 50)降维降到128维 -- 为正样本从memory bank随机的抽一些 -- 为负样本2、Inva Spreadinvariant and spreading主要贡献对于相似的图片、相似的物体它的特征应该保持不变性但是对于不相似的物体或者完全不沾边的物体它的特征呢应该尽可能的分散开。方法代理任务个体判别对于x 1 x_1x1​这张图片来说正样本为 其数据增强后的x 1 ′ {x_1}^{}x1​′负样本为 所有剩下的这些图片原始的图片经过数据增强后的图片e.g. batch size256 256256正样本256 256256负样本( 256 − 1 ) ∗ 2 (256-1)*2(256−1)∗2前向过程样本 -- 编码器 -- 全连接层优点用一个编码器做端到端的训练3、CPCcontrastive predictive coding主要贡献是生成式的代理任务不光可以处理音频而且还可以处理图片、文字以及在强化学习里使用思路以一个音频的信号作为输入有x t − 3 x_{t-3}xt−3​、x t − 2 x_{t-2}xt−2​、x t − 1 x_{t-1}xt−1​、x xx输入 -- 编码器 -- 返回特征 -- 喂给一个自回归的模型gar -- 产生Ctcontext representation如果这个上下文的特征表示足够好即它真的包含了当前和之前所有的这些信息则可做出一些合理的预测预测未来时刻的特征输出正样本未来输入 -- 编码器 -- 得到的特征输出负样本任意选取输入进入编码器后得到的输出4、CMCcontrastive multiview coding主要贡献增大互信息不同视角下但对应同一张图应互为正样本在特征空间中很接近。反之则在特征空间中远离。思路正样本不同视角的同一张图负样本其他不是同一张的阶段总结早期进行多视角的对比学习并证明多视角、多模态的可行性。产生的问题不同视角要配不同的编码器计算代价上升第二阶段 CV双雄2019年~2020年1、MoCo主要贡献把之前对比学习的一些方法都归纳总结成了一个字典查询的问题提出了队列、动量编码器思路类似Inst Disc队列取代了memory bank存负样本动量编码器取代loss 约束项达到动量的更新编码器的目的不是动量的更新那个特征能得到更好的结果实现细节与Inst Disc高度一致残差网络基线模型Res 50每个图片的特征维度128维所有的特征L2 归一化目标函数infoNCEInst Disc 用 NCE优点1、改进真的是简单有效有很大的影响力的证明无监督特征学习比有监督特征学习的预训量模型好而且还能产生持续的影响力2、论文把之前所有的方法都总结成了一个字典查找的问题……2、SimCLR主要贡献1、加上projection headg gg函数能让模型训练的更好既不需要 memory bank也不需要队列也不需要动量编码器正负样本全都是从同一个 mini-batch 里来的整个前向过程非常的直接图片进入编码器编码 projector 降维 算对比学习的 loss非常符合大家对深度学习工作的期待2、更多的数据增强(最有用的–随机剪裁 随机颜色、更大的 batch size 且训练的时间更久能让网络学到的特征变得更好思路有mini-batch的图片x xx-- 两个不同方向的数据增强 --x i x_ixi​、x j x_jxj​-- 通过一个编码器f ff(两个编码器共享权重) --h i h_ihi​、h j h_jhj​--g gg函数(mlp层即 全连接层 relu 激活函数) -- 特征z i z_izi​、z j z_jzj​-- 衡量两者是否有一致性normalized temperature-scaled 交叉熵函数即进行L2归一化等e.g.batch size n nn, 正样本个数 n nn, 负样本个数 2 ( n − 1 ) 2(n-1)2(n−1)即 batch size剩下所有的样本,以及它们数据增强过后的样本结果在ImageNet数据集任务中直接提点将近10个点注g gg函数只有在训练的时候才用做下游任务的时候projection head 只用h hh特征去做下游任务 - 跟之前的工作公平对比3、MoCo v2主要贡献在MoCo上运用SimCLR 里的技术。用mlp projection head、使用更多的数据增强刷新ImageNet数据集上的最好成绩。思路加mlp层全连接层 relu加更多的数据增强用了cosine的learning rate schedule训练更长的epochs,200变800优点整个代码可以在可观时间、可观内存里完成4、 SimCLR v2主要贡献SimCLR 从v1到v2思路1、换了一个更大的模型换了152层的这个残差网络2、两层mlp层即fc relu fc relu证明出两层效果最好3、使用动量编码器但在SimCLR里面的提升并不大原因负样本已经相当多了字典的大小及字典特征移植性来说都足够好注对应论文不仅写了SimCLR v2并且也提到非常大的这种自监督训练出来的模型非常适合去做这种半监督学习。整个论文工作为1、怎样自监督或者说自监督的对比学习去训练一个大的模型出来2、一旦有一个好模型只需要一小部分的有标签的数据去做一下有监督的微调可以获得一个teacher模型3、可以用这个teacher模型去生成很多伪标签则可以在更多的无标签的数据上做自学习5、SwAV Swap assignment views主要贡献把对比学习和之前的聚类的方法合在了一起multi crop以前从一个图片中取两个大crop即抓住整个场景的特征SwAV也关注到局部物体即增加crop为保证计算复杂度不增加太多取两个160crop学整体特征取四个96crop学局部特征正样本数量就增加了解决的问题给定同样一张图片如果去生成不同的视角views希望可以用一个视角得到的特征去预测另外一个视角得到的特征因为所有这些视角的特征按道理来说都应该是非常接近的思路之前对比学习的方法同一个图片 -- 两次数据增强 --x 1 x_1x1​、x 2 x_2x2​--通过编码器(模型有可能有加projection head–z 1 z_1z1​、z 2 z_2z2​--进行对比SwAV思想不去做近似不去跟大量的负样本比而跟聚类的中心prototype比prototype是个矩阵维度d ∗ k d * kd∗kd dd特征的维度k kk聚类中心个数前向过程mini-batch 图片 -- 两次数据增强 --x 1 x_1x1​、x 2 x_2x2​-- 通过编码器 --z 1 z_1z1​、z 2 z_2z2​-- 通过clustering的方法,让z zz和prototype c生成一个目标 --q 1 q_1q1​、q 2 q_2q2​代理任务:z 1 ⋅ c z_1·cz1​⋅c结果可以预测q 2 q_2q2​反之亦然优点聚类的好处相比要跟很多的负样本做类比只是跟聚类中心去做对比数量更少、更方便聚类中心是有明确的寓意含义的相比较之前只是随机抽样负样本去做对比那些负样本有的可能还是正样的且有时抽出来的负样本类别不均衡所以不如使用聚类中心有效第三阶段 不用负样本1、BYOLBootstrap your own latent主要贡献自己跟自己学 没用任何的负样本之前不用负样本会出现模型躺平直接loss0的情况思路前向过程mini-batch的输入x xx-- 两次数据增强 --v vv、v ′ v^{}v′v vv-- 编码器f θ f_\thetafθ​参数随梯度更新而更新– projectorg θ g_\thetagθ​函数一个mlp -- 特征z θ z_\thetazθ​-- projectionq θ q_\thetaqθ​函数也是一个mlp --q θ ( z θ ) q_\theta (z_\theta)qθ​(zθ​)v ′ v^{}v′-- 编码器f ξ f_\xifξ​与MoCo一样用moving average更新,即用动量编码器– projectorg ξ g_\xigξ​函数与g θ g_\thetagθ​一样的网络结构但用动量的方式去更新 -- 特征z ξ z_\xizξ​代理任务想要这个预测q θ ( z θ ) q_\theta (z_\theta)qθ​(zθ​)与z ξ z_\xizξ​尽可能的一致此时就把原来一个匹配的问题换成了一个预测的问题注如何解释这样的现象batch norm把一个 batch 里所有样本的特征算它们的均值方差然后用它们去做归一化。则就意味着当在算某个正样本的这个 loss 的时候其实也看到了其它样本的这个特征也就是说这里面是有信息泄露的。MoCo中有Shuffling BN就是也是为了防止这种信息泄露的最后此说法也被原作者回应推翻batch norm的作用只是能帮助这个模型稳定训练能提高模型的这个训练稳健性。若一开始就能让这个模型初始化的比较好后面的训练即使离开了 batch norm 也没有问题用 group norm一种归一化方法 和 weight standardization一种模型初始化方法2、SimSiamsimple Siamese network主要贡献不要负样本不要大的 batch size、不需要动量编码器不仅不模型坍塌且能取得很好的结果。思路类似 BYOL但没用动量编码器注stop gradient 这个操作之后这一个训练过程或者说这一套模型参数就被人为的劈成了两份就相当于说在解决两个子问题一样。模型的更新其实也是在交替进行的。第四阶段 Transformer1、MoCo v3主要贡献卷积神经网络换成 Vision Transformer 是否可以获得一个好的结果思路相当于 MoCo v 2 SimSiam整体的框架还是有两个网络 一个是 query 编码器一个是 key 编码器动量编码器目标函数对比学习的 lossquery 编码器骨干网络 projection head prediction head目标函数一个对称项即它又计算query1到 key 2的也算从query2到 key1的骨干网络从一个残差网络换成了 ViT结果下降。– **改进**随机一个patch projection 层并让他整个训练过程中都不变不光是对MoCo v3有用对BYOL也有用2、DINOself distillation with no label主要贡献一个完全不用任何标签信息训练出来的这个 Vision Transformer其中自注意力图能非常准确的抓住每个物体的轮廓甚至能直接媲美对这些物体做分割思路延续BYOL为了这个避免模型坍塌做了另外一个额外的操作centering把整个batch里的样本都算一个均值然后减掉这个均值整体总结第一阶段使用外部数据结构从Inst Disc 开始它提出了这个个体判别的任务而且它提出用一个memory bank外部数据结构去存储负样本从而能达到一个又大又一致的字典去做对比学习。端到端的学习Inva Spread它只用了一个编码器从而可以端到端的学习但因为受限于这个 batch size 太小所以它的性能不够好。接下来 cpc v1提出了 infoNCE 这个 loss且是一个预测型的代理任务不仅可以做图像还可以去做音频、视频文字的加强学习是一个非常全能的结构。cmc 把两个视角的任务扩展到了多个视角从而给接下来多视角或者多模态的这个对比学习打下了铺垫。deep cluster是基于聚类学习的。第二阶段使用外部数据结构MoCo v1是Inst Disc的一个延伸性工作把 memory bank 变成了一个队列把动量更新特征变成了动量更新编码器从而能续续训练一个很好的模型也是第一个在很多视觉的这个下游任务上让一个无监督预训练的模型比有监督预训练模型表现好的方法。端到端的学习SimCLR v1跟 Inva Spread 方法是很像的但用了很多的技术如加大了 batch size、用更多的数据增强、加了一个projection head、训练的更长时间最后取得了非常好的在ImageNet的结果。CPC v2 将各个技术拿来用一遍直接比 cpc v1在 ImageNet 上高了30多个点。CMC把这些都分析一下提出了info Min的原则即两个样本或者两个视角之间的互信息要不多不少才是最好的 。MoCo v2把这些即插即用的技术拿过来用在 MoCo 上。SimCLR也对模型进行了一些改动得到了 SimCLR v2 但主要是去做半监督学习的。SwAV把聚类学习和对比学习结合起来的并取得了不错的结果。但它这个结果主要是来自于它提出的 multi crop的技术如果没有这个技术它其实跟SimCLR或者MoCo v2 结果呢都是差不多的。第三阶段BYOL 因为处理负样本实在是太过麻烦所以BYOL不要负样本、不去跟负样本做对比就自己跟自己学把一个对比任务变成一个预测任务。目标函数也很简单不再使用info NCE而是用一个简单的mse loss就可以训练出来。有人说是batch norm提供了一种隐式的负样本 所以BYOL 能够正常训练而不会模型坍塌。但是 BYOL 的作者很快就又发了另外一篇论文通过做了一系列实验最后表示batch norm只帮助了模型的训练。如果用另外一种方式能提供一个更好的模型初始化BYOL就不需要batch norm提供的batch的统计量。SimSiam把之前的工作都总结了一下因为它觉得之前的这些论文大家都在一点一点往上堆这个技术 那如果堆的太多了就不好分析了那这个领域也就不好再推进下去了所以SimSiam化繁为简又提出来一个很 简单的孪生网络的学习方法既不需要用大的 batch size也不需要用动量编码器也不需要负样本 照样能取得不错的结果。同时假设stop gradient是至关重要的因为有这个操作的存在所以 SimSiam可看成是一种EM 算法通过这种逐步更新的方式避免模型坍塌。第四阶段Vision Transformer主要两个工作是MoCo v3和DINO其实都是把骨干网络从残差换成了 ViT主要学习的方法没有改变但换成 Vision Transformer 以后面临的问题都是说训练不稳定或者不好训练。MoCo v3提出把patch projection layer 冻住。DINO 提出把teacher 网络的这个输出先做一下归一化即做一下centering。这2种方式都能有效的提高模型训练的这个稳健性防止模型坍塌让Vision Transformer用自监督的方式也能训练的很好。