对比学习:希望模型能分辨哪些图片类似,哪些图片不类似,即类似的图片特征空间拉近,不类似的拉远。
可以设计不同的代理任务提供监督信号。
代理任务例子:个体判别
Xi经过两种Ti变成两张不一样的照片,为正样本。其他都是负样本。
损失:NCE loss
找到一种方式定义正负样本
视频:同一视频的任意两帧都是正样本,其他视频负样本。
NLP:SimCSE,同样句子forward,dropout不同,也是正样本。
物体的正面背面,深度图像等等。
MOCO v1
momentum contrast for unsupervised visual representation learning
momentum:Yt=m·Yt-1+(1-m)Xt加权移动平均
Abstract
把对比学习看成字典查询任务,构造了动态的字典(两个部分:队列(样本不用做梯度回传),移动平均编码器(字典里特征尽量保持一致,训练过程中发现很大一致的字典对无监督对比学习有好处))
linear protocol:骨干网络预训练好了,用到其他数据集时backbone freeze,只学FC层,间接证明特征提取的好不好
全面的在视觉领域比有监督好。
Introduction
NLP:信号空间是离散的(单词,词根词缀等等),很容易构建Tokenize(词对应成特征)的字典
CV:原始信号连续,高维
构造一个动态的字典
X1->X11(anchor)->Encoder11->f11
X1->X21(Positive)->Encoder12->f12
Negative:X2,X3,X4,…Xn
Encoder11和Encoder12可以是不同模型
负样本用Encoder12编码器,获得f2,f3,f4,…,fn
x11:xq
x12:xk
f2,f3,f4,…,fn:k1,…
f12:k0
对比学习转化为字典查询问题:
query:f11
key: f12(特征尽量相似),f2,f3,f4,…,fn(特征空间尽量远离f11)
最小化对比学习目标函数
好的结果猜想:1.字典大2.字典再训练过程中保持一致性
- 字典越大,key越多,表示视觉信息越多越丰富,q泛化好,小的字典模型可能学shortcut,泛化不好
- k0,k1,…,kn相同或相似编码器得到,和q对比时保持一致,否则q找到使用相似编码器的k,学到shortcut
之前对比学习方法受限于上述两个问题。
MoCo:给无监督对比学习构造一个大又一致的字典
queue:表示字典,受限于显卡内存,字典大小和前向batchsize大小分开
当前的mini-batch入队,最早的mini-batch出队,字典大小可以很大,其中元素更新不频繁
当前的batch是由当前编码器得到的,不同时刻的encoder不同,特征不同:
momentum encoder:Θk=m·Θk+(1-m)Θq
Θq:现在的编码器
Θk:momentum encoder
尽最大可能保持字典k的一致性
代理任务:instance discrimination
q和k是同一个图片的不同视角(同一个图片不同的随机裁剪),qk能配上对。
直接迁移到7个下游任务上(检测,分割)都能超越有监督
Related Work
自监督是无监督学习的一种。
1.代理任务pretext:没有实际应用场景,用来学习好的特征
2.Loss functions:最常见的是衡量输出和固定目标的差别,L1,L2,生成式(mae),判别式(eight position,一张图分9块,给出5,随机给一块预测在那个位置)
对比学习目标函数:衡量相似性,相似特征拉近,不同特征拉远
对比学习目标函数和生成式,判别式区别:前面两个是固定目标,对比学习目标是不断改变的(目标是encoder抽出的特征,在变,上文的k)
对抗性目标函数:衡量的是两个概率分布之间的差异,做无监督数据生成,后来做特征学习
Pretext tasks:
- denoising auto-encoders:重建整张图
- context auto-encoders:重建某个patch
- colorization:图片上色当自监督信号
生成伪标签:
examplar image:同一张图做数据增广
patch oderings,tracking,聚类
**对比学习和不同代理任务关系:**代理任务可以配对某种目标函数使用。contrastive predictive coding (CPC)做预测性对比学习(context auto-encoding),contrastive multiview coding (CMC)用物体不同视角做对比和(图片上色很像,黑白和彩色)
对比有监督学习:
X->Y 和GT算loss
X->Y 代理任务充当GT,算loss
Method
Contrastive Learning as Dictionary Look-up
encoded query q
set of encoded samples{k0,k1,…},假设字典里只有一个k和q配对(理论上可以用多个)
对比学习目标函数要求:q和k0相似,loss低,q和其他所有k都不相似,loss也低(训练好了,不更新了)
为什么不能用cross entropy loss:k太大了算的多
NCE loss(noise contrastive estimation):之前类别太多不好算softmax不能算目标函数,简化为二分类,数据类别,噪声类别,做对比,计算复杂度还是很高,就选一些负样本取近似,选的样本少就不那么近似,选的多效果好。
InfoNCE:一个变体,噪声类别可能也有很多类。tao是温度超参数,类似知识蒸馏。K指的是负样本数量,sum是一个正样本和K个负样本上做的。就是cross entropy loss,做K+1分类。
代理任务不同时fq和fk可以完全相等、参数部分共享也可以不一样
Momentum Contrast
写作:第一段承上启下
如何把字典看成队列:队列里放key,每个minibatch新的入队,老的出队。可以用标准的minibatch size,字典可以很大。早的算的是过时的key,新的一致。
Momentum Update
key编码器没办法通过反向传播更新参数(梯度本来要更新队列中所有的k)。直接复制q的encoder的参数效果不好,更新太快参不一致。
提出动量更新:Θk=m·Θk+(1-m)Θq,虽然编码器不同,但区别不打,实验里m=0.999,更新非常缓慢,m=0.9效果比0.999效果不好
解释之前方法为何受限:
-
端到端:好处是encoder都可以通过梯度回传更新,字典一致性高,encoder可以不同以前工作用的都是同一个,实验都用res50,受限于字典大小(显存不够大),simCLR
-
memory bank:把数据集特征存到一起,高效,但是特征一致性不好,是在bank里随机抽样的,回传梯度更新encoder后在对应k的位置生成新的k,替换memory bank里旧的。这些特征都缺乏一致性,q和k计算时一个bank里的k是上一轮epoch更新的,非常不一致。
3.MoCo:
shuffle bn:多卡训练之前打乱样本再送
实验:
1.lr=30,有监督和无监督学到的分布是很不一样的
2.针对贡献的消融实验
3.下游任务数据集足够大可以直接随机初始化训练
Discussion and Conclusion
预训练数据集imagenet(100万)换到in-1m上,提升比较小,有没有可能和MAE结合起来用
he等人希望moco对其他contrastive learning的pretext任务有帮助,提供一个稳定自监督信号
MOCO v2
使用预测头
将 MoCo 网络结构中经过卷积层后的一层线性MLP扩展为两层非线性的MLP,使用ReLU激活函数。该方法在 SimCLR 中使用
数据增强策略
增加使用 Blur augmentation 来进行数据增光。但 color distortion 并未取得很好的效果
MOCO v3
还没看完,总的是使用transformer架构,backbone换成transformer encoder