Bryanyzhu对比学习串烧
对比学习在CV的发展
原视频 https://www.bilibili.com/video/BV19S4y1M7hm?spm_id_from=333.1007.top_right_bar_window_history.content.click
前言
18年到21年一个简单的对比学习总结性工作,串接了一些有联系的工作内容。
提示:以下是本篇文章正文内容,下面案例可供参考
Phase 1. 百花齐放
示例:InstDisc,CPC,CMC
特点:方法模型,目标函数,代理任务都还没有统一
1.1. Inst Disc
受到有监督学习的启发,将豹子图片喂给分类器之后排名前几的都是豹子相关图片。因为他们照片长得相似,而与标签无关,进而提出了个体辨别的任务。
无监督方式是按照类别走的有监督信号走到了极致,将每个图片都看成一个类别。
通过卷积神经网络将图片编码成特征,这些特征在最后的特征空间中,可以被尽可能的分开。即每个图片都应该与其他图片尽量的分开。
训练:对比学习。正样本即图片本身,其余为负样本,将负样本存在memory bank中。
负样本随机抽一些,使用NCE loss,更新完后放回memory bank中。
缺点:内存占用大。
1.2. Inva Spread
对于相似的图片,特征应该保持不变性,不相似的物体特征应该尽量分散开
正样本:原图片和一个经过data augmentation的样本。
负样本:该mini-batch中除去正样本本身之外的其他样本
目标:可以通过一个编码器做端到端学习。
特点:只用一个编码器。不需要外部数据结构存储大量的负样本。
缺点:字典不够大,负样本较少,效果较差。
1.3. CPC
生成式代理任务。
将之前的输入扔进编码器,将输出的特征放入自回归模型,得到输出CT。可以用CT来预测未来的输入。
正样本:真实的未来时刻的输入
负样本:其他。
优点:具有普适性,可以运用在各个方面(图片,文字,语音等)。
1.4. CMC
通过多视角做对比学习。学习一个足够强大的特征,增大所有视角之间的互信息。
即使输入不同,但对应图片一样,输入之间互为正样本。
多模态处理输入时需要使用不同的编码器。后来可以用transformer来处理不同模态的输入。
Phase 2. CV双雄
示例:MoCo v1, SimCLR v1, MoCo v2, SimCLR v2, CPC, CMC的延伸工作 以及SWaV
特点:发展迅速,不足一月就会被刷榜。
2.1. MoCo v1
- 队列
- 动量编码器,绝大部分依靠自己上一时刻的状态(即使是队列更新,编码器之间区别很小)
通过以上两点来改进Inst Disc,可以构造一个又大又一致的字典。
2.2. SimCLR
原图进行不同的数据增强,正样本为输出的图片,负样本为该batch中其他的图片以及其生成图。
特点:
- 使用更多的数据增强(颜色和裁剪效果影响最大)
- 加入projector head(训练时使用)。直接在特征后加入一个MLP(Linear,BN,ReLU,Linear,BN),得到10个点的提升。用经过MLP之后的特征进行对比。
- 使用更大batchsize
- 训练时间更久
2.3. MoCo v2
2.16 SimCLR发表。3.9号MoCo v2 发表。
借鉴了SimCLR的技术,介入了MLP(Linear,ReLU,Linear),数据增强,训练了更多的epoch。
Moco使用更小的内存和训练时长,也可以达到较好的效果。
2.4. SimCLR v2
在v1上进行了改进,使用更大的模型进行无监督训练;加入了projection head; 动量编码器。
2.5. SwAV
借助先验信息,和聚类中心比。
通过将特征(BD)与Prototype(DK)进行点乘,得到新维度的特征(BK),用新特征进行对比。
multi crop:使用多个小的size的crop 从2个224224变为2个160160和4个9696
优点:不需要和很多的负样本进行对比,只需要和聚类中心进行对比。
4. CPC v2
- 使用更大的模型
- 使用更大的图像块
- 更多方向上的预测任务
- 使用layer norm代替了 batch norm
- 更多的data augmentation
5. Info Min
最小化互信息,即不多不少的互信息。选择合适的数据增强和视角。
Phase 3. 不用负样本
示例:BYOL及其改进,SimSiam 总结并精简。
特点:卷积神经网络做对比学习
3.1 BYOL
不用负样本可以正常训练模型?Yes!
正样本自己跟自己学,左脚踩右脚 ↑。.
又加了一层MLP(prediction head)(Linear,BN,ReLU,Linear),将匹配问题变为预测问题。
上面相当于query 编码器,下面是key编码器。key编码器都是query编码器的动量更新,但是代理任务不同。相当于用自己一个视角的特征去预测另一个视角的特征,通过预测型的任务来完成模型训练。
目标函数loss为MSE。
3.1.1 BYOL blog
通过测试怀疑是batch norm提供一种隐式的负样本,导致模型不会坍塌。
3.1.2 BYOL v2
作者做了很多实验证明batch norm没有提供隐式的负样本。Batch Norm主要提高模型的稳健性。
提出使用group norm 和weight standardization,不计算batch中其他样本。
证明BYOL就是可以自己和自己学。
3.2 SimSiam
化繁为简,提出孪生网络
没有使用动量编码器。
输入两个视角过编码器得到两个特征,接着得到两个特征的预测。两个预测都可以做 loss。
Stop gradient 保证模型不会坍塌。相当于在解决两个子问题。可以理解为一个k-means问题,先分配在更新。
3.3 对比
- SimCLR 端到端学习,两个方向都有梯度回传。
- SwAV 和聚类中心对比。
- BYOL predictor使得对比任务变为预测任务,增加了动量编码器
- SimSiam 去掉了动量编码器。
动量编码器还是很好用的!
MoCo v2 迁移任务效果好一些。
Phase 4. Transformer
示例:MoCo v3, DINO
特点:使用vision transformer
4.1. MoCo v3
将vit替换resnet自监督vit问题------模型训练不稳定,在batch size变大时,曲线会突然降低。
trick:将第一层冻住。
4.2. DINO
用student来预测teacher的输出
加入了centering,减去均值。
加入stop gradient。
总结
近年来对比学习研究成果的联系与不同
Phase 1
- InstDisc 提出个体判别的任务,使用memory bank外部数据结构存储负样本,获得又大又一致的的字典。
- Inva Spread (端到端的学习)只用一个编码器。缺点:受限于batchsize大小的限制,性能不够好。
- CPCv1 提出infoNCE loss。 它为预测型的代理任务,可以做图像,音频,视频文字和加强学习等。
- CMC 将两个视角的任务拓展到多视角,铺垫了多模态我的对比学习。
- DeepCluster 基于聚类学习
Phase 2
- MoCo v1 延伸于InstDisc。将memory bank变为队列,加入了动量更新编码器。一个比有监督预训练模型变现更好的无监督预训练模型。
- SimCLR v1:延伸于Inva Spread。改进:加大batchsize,使用更多数据增强,加入projection head,增加训练时间。
- CPC v2 :借鉴前者的技术,性能提升30多个点
- CMC 分析近期技术,提出info Min原则(两个样本或者两个视角之间的互信息,要不多不少才是最好的)
- Moco v2. 将SimCLR v1技术用在 moco v1上,提出Moco v3。
- SimCLR v2 主要做半监督学习。
- SwAV 结合聚类和对比学习。 使用了multi crop技术。
Phase 3
- BYOL:不要负样本,自己学自己,左脚踩右脚。使用mse loss。
有博客BN Blog质疑BYOL可以工作是因为batch norm提供一种隐式的负样本,导致模型不会坍塌。
新论文BYOL v2,通过消融实验证明BYOL不需要batch norm也可以正常训练。 - SimSiam:化繁为简,总结最近技术,提出简单的孪生网络学习方法,不需要大batch size,也不需要动量编码器和负样本。
加入了Stop gradient 操作,使得SimSiam可以被看做EM算法,通过逐步更新的方法,避免模型坍塌。 - barlow twins改变了目标函数,使用两个矩阵比较相似性。
Phase 4
- MocoV3:将backbone网络从ResNet改为Vision Transformer,将patch projection layer冻住。
- DINO:同上,方法为把teacher 网络输出做归一化。目的都是使得模型可以稳定训练,防止模型坍塌。
Notes
几个改进模型的方法:
增加batch size;增加训练时长; 加入动量编码器;使用data augmentation;
对比学习还有可能会和其他方法进行结合。
未来NLP和CV大一统的时代就要到来。
transformer简单又好用,扩展性也好,可参考方向:tokenization和目标函数。