对比学习综述
latent hidden embedding feature 都是特征的意思
第一阶段
InstDisc(2018,Memory Bank)
Unsupervised Feature Learning via Non-Parametric Instance Discrimination
Contributions:
-
提出代理任务:个体
-
判别(每张图片都看成一个类别,正:图片本身,负:其他图片)
-
memory bank存负样本,每张图最后存在mb的特征为128维(维度太大存不下)
对于 ImageNet 数据集,一共有128万张图片,Memory Bank 是一个 1280000*128 的数据矩阵,随机抽4096负样本
假设batch size 256,就是有256正样本,抽4096个负样本,NCEloss算损失,算完之后可以把这个batch的特征更换 Memory Bank的特征
-
提出基于 Momentum (动量) 的模型参数更新方法 (Proximal Regularization:给模型的训练加了一个约束,后续的 MoCo 的想法与其一致)
Experimental Settings:
后续的MoCo实验设置和InstDisc是一样的
InvaSpread(CVPR,2019, 端到端,batch size太小)
Unsupervised Embedding Learning via Invariant and Spreading Instance Feature
相似的的图通过encoder之后feature相似(Invariant),不相似的图feature不相似(spreading)
代理任务:个体判别
Contributions:
- batchsize256,如上图所示数据增强后x1,x2,X3^,正样本:256,负样本:(256-1)*2,就可以用一个编码器做端到端学习
- 不需要外部数据提供正样本
结果不够好的原因在于:字典不够大导致负样本不够多,数据增广不够多,没有mlp projector
CPCv1(2019,InfoNCE loss)
Representation Learning with Contrastive Predictive Coding
不光可以处理音频也可以处理文本图像,以及在强化学习里使用
gar:auto regressive,RNN,LSTM
可以用Ct(context representation)预测未来时刻输出(Zt+1等)
代理任务:
正样本: 未来时刻的genc特征输出,和ct的预测(query)是相似的
负样本: 可以任意选取时刻genc的特征输出,和ct的预测是不相似的
CMC(多视角多模态)
Contrastive Multiview Coding
一个 object 的 multi-view 都可以当做是正样本
缺点是所需要的 encoders 过多
很早做多视角的工作,不仅证明了对比学习的灵活性,而且证明了这种多视角、多模态的可行性
Abstract:
人观察这个世界是通过很多个传感器,比如说眼睛或者耳朵都充当着不同的传感器来给大脑提供不同的信号。每一个视角都是带有噪声的,而且有可能是不完整的,但是最重要的那些信息其实是在所有的这些视角中间共享,比如说基础的物理定律、几何形状或者说它们的语音信息都是共享的,比如一个狗既可以被看见,也可以被听到或者被感受到。
学一个一个非常强大的特征,它具有视角的不变性(不管看哪个视角,到底是看到了一只狗,还是听到了狗叫声,都能判断出这是个狗)。
学习目标:增大所有的视角之间的互信息
选取数据集:NYU RGBD,四个view:原始图像,深度信息,surface normal,分割图像
所有的输入对应一张图片,互为正样本
可能需要多个encoder处理多种类型的输入(CLIP)
蒸馏方面:teacher和student做成正样本对
总结:
代理任务:Instance Discrimination, predictive, multi-view, multi-modal
目标函数:NCE, InfoNCE, 和其他变体
模型架构:
- 一个 encoder + memory bank (Inst Disc);
- 一个 encoder (Invariant Spread);
- 一个 encoder + 一个 auto regressive (CPC);
- 多个 encoders (CMC)
任务类型:图像,音频,文字,强化学习等
第二阶段:
MoCov1(CVPR2020)
Momentum Contrast for Unsupervised Visual Representation Learning
我之前的博客:https://blog.youkuaiyun.com/qq_52038588/article/details/130857141?spm=1001.2014.3001.5502
写作方法:归纳问题,扩大scope,自顶(大)向下的写作方式,写的普适一点
SimCLRv1(ICML,2020.2.13)
A Simple Framework for Contrastive Learning of Visual Representations
训练流程:
x->xi,xj(数据增强,互为正样本)->encoder f ( ⋅ ) f(\cdot) f(⋅) ->projector g ( ⋅ ) g(\cdot) g(⋅)->特征z
正样本: 2, 负样本: 2*(batch size-1)
encoder f ( ⋅ ) f(\cdot) f(⋅) 共享权重
normalized temperature-scaled,和InfoNCE loss类似
Contributions:(tricks)
-
更强的数据增强
针对数据增强的消融实验如下,crop和color有用
-
MLP head降维(2048->128),即增加了 projection head g ( ⋅ ) g(\cdot) g(⋅),只用于 training,不用于 downstream tasks
g ( ⋅ ) g(\cdot) g(⋅):一个全连接层和一个ReLu激活函数
Linear: projection head without ReLU
Non-Linear: the whole projection head
None: without projection head
-
大batch训练久
MoCov2(2020.3.9,技术报告)
Improved Baselines with Momentum Contrastive Learning
改进:
-
加mlp
-
加aug
-
加cosine learning rate schedule(根据上表,提升0.2,不多)
cosine learning rate schedule:
初始学习率为lr=10^-3
如果是总的100个epoch,只使用后60个应用余弦学习率衰减,那么前40个不作cosine计算,前40个epoch的学习率为:lr1=epoch/40*lr, 那么后60个epoch适用0.5 * (math.cos(40/100) * math.pi) + 1)。
计算得到最末尾的学习率为2.5x10^-4.
-
epoch更长(200->800,MAE用了1600epoch)
8张V100
SimCLRv2(Nerual IPS,2020)
Big Self-Supervised Models are Strong Semi-Supervised Learners
受启发与 google 的 noisy student 的工作 (先训练teacher模型,数据集生成伪标签,一起在更多无标签数据上训练student模型,当时SOTA)
主要改进:
- 更大的模型(无监督更好),将 backbone network 从 ResNet-50 换成 ResNet-152,并配备3倍宽度的 channels 和 selective kernels (SK) net
- 将 projection head 从一层 MLP 换成两层 MLP,3层提升不大
- motivated by mocov2,使用 momentum encoder,它们batch4096已经很大了,字典够大
SwAV
Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
swap assignment views
建议先看完deep cluster,一作之前的工作
左边优点原始并且费资源
SwAV不用负样本,借助先验信息,用聚类中心c(prototypes)对比
D:特征维度,K:多少个聚类中心(3000个)
z1,z2先通过clustering方法让z和c生成目标q1和q2(GT)
代理任务:
z1,z2应该是相似的可以相互做预测,z1和c点乘预测Q2或者z2和c点乘预测Q1
使用聚类的好处:
- 如果与每一个 instance-like 的负样本去做对比,则需要成千上万个负样本,而且即使如此也只是近似;相反,如果是与 cluster centers 做对比,在 ImageNet 上使用几百或者最多3000个 cluster centers 足矣
- cluster centers 具有明确的语义含义,相比较于在 instance-like 的负样本中 random sampling 会碰到如某些正样本也会被 sampling 和样本类别不均衡等问题,不如使用 cluster centers 有效
重要trick:多crop
原来256* 256的图取两个224* 224图,学的全局特征
改进2 *160 * 160+4 * 96 * 96,6个视角
CPCV2(ICML 2020)
Data-Efficient Image Recognition with Contrastive Predictive Coding
- 使用更大的模型,CPC v1只使用了ResNet-101中的前三个residual stack,CPC v2将模型加深为ResNet-161(ImageNet top-1准确率提升5%),同时提高了输入图像块的分辨率(从60x60变为80x80,ImageNet top-1准确率提升2%)。
- 由于CPC v1的预测只和若干个patch有关,而BN会引入其他patch的信息,类似于图像生成,BN算法会损害CPC v1的性能,用LN替换BN,ImageNet top-1准确率提升2%。
- 由于大模型更容易过拟合,作者提升了自监督任务的难度,预测一个patch,CPC v2用到了上下左右四个方向的feature vector,而CPC v1只用到了上方的feature vector。由于CPC v2接触的语义信息更多,提取出与下方patch相关的语义信息的难度也会增大。ImageNet top-1准确率提升2.5%。
- 使用更好的数据增强,首先随机取出rgb三通道中的两个通道,ImageNet top-1准确率提升3%,接着施加一些几何、颜色、弹性变形等数据增强,ImageNet top-1准确率提升4.5%,可见数据增强对自监督影响很大。
InfoMin (NeurIPS,2020)
What Makes for Good Views for Contrastive Learning
主要为分析型延伸工作,Minimize Mutual Information。主要观点是合适的 Mutual Information 很重要
提出了一个新的 InfoMin Principle,其目的是使特征表示在学到不同 view 之间共享的信息之外,尽量去除与下游任务无关的冗余信息来保证学习到的特征表示具有好的泛化能力。
第三阶段:不用负样本
BYOL(2020)-不需要负样本就能学
Bootstrap your own latent: A new approach to self-supervised Learning
x->v,v^->encoder架构相同,参数不同,ftheta随梯度更新而更新下面一个用momentum encoder->projector->qtheta prediction预测和target尽量相似
不同视角的特征预测另一个视角的特征,只留下encoder
目标函数:MSE LOSS
针对博客(BN提供BYOL隐式负样本)的回应:
- 只有Projector有BN也训练不出来
- 没有用任何的归一化SimCLR用了负样本也训练不出来
BYOL作者认为BN稳定训练,提出初始化比较好没有BN也能训练,用GN(group norm)和WS(weight standardization),这个版本的BYOL也能学的很好
SimSiam(CVPR2021, 总结性工作,无大batch size,无动量编码器,无负样本)
Exploring Simple Siamese Representation Learning
encoder架构一样共享参数
伪代码里有两个predictor,分别预测z1,z2,和图不一致
D里算的是MSEloss
stop gradient很重要,可以看作EM算法,逐步更新参数避免坍塌
所有孪生网络:
可以看到没有multi crop,SWAV还不如MoCov2
Barlow Twins (ICML 2021)
Barlow Twins: Self-Supervised Learning via Redundancy Reduction
既没有作对比,也没有作预测,本质上是换了一个目标函数。
具体而言,是生成 Cross Correlation Matrix (关联矩阵),希望该矩阵与 Identity Matrix 尽可能相似
第四阶段:基于Transformer
MoCov3(CVPR,2021)
An Empirical Study of Training Self-Supervised Vision Transformers
batch size变大VIT训练不稳定,如下:
trick:
随机初始化patch projection layer冻住,也就是随机初始化一个MLP并冻住,对BYOL也有用
DINO
Emerging Properties in Self-Supervised Vision Transformers
teacher网络输出做归一(centering,减去均值)
伪代码和MoCoV3差不多,目标函数有一个center的操作
后面就是MAE了
总结
参考:
1.博客.https://www.bilibili.com/read/cv24218439?spm_id_from=333.999.0.0&jump_opus=1
2.视频.https://www.bilibili.com/video/BV19S4y1M7hm/?spm_id_from=333.999.0.0&vd_source=4e2df178682eb78a7ad1cc398e6e154d
3.博客.https://blog.youkuaiyun.com/dhaiuda/article/details/117870030