对比学习总结
2024-12-16
| 2024-12-16
0  |  阅读时长 0 分钟
password
icon
AI summary
type
status
date
slug
summary
tags
category

1. CV

第一阶段:百花齐放

InstDisc

提出了个体判别任务memory bank(字典形式)。正样本为自己,负样本为所有其他图片,负样本的特征存放在memory bank中。loss使用的是NCE loss。
notion image
对于 ImageNet 数据集,一共有128万张图片,因此 Memory Bank 是一个 1280000*128 的数据矩阵。
主要贡献:
  • 提出 Instance Discrimination (个体判别) 代理任务
  • 使用代理任务和 NCE Loss 进行对比学习,从而取得了不错的无监督表征学习结果
  • 提出用 Memory Bank 这种数据结构来存储大量的负样本
  • 提出基于 Momentum (动量) 的模型参数更新方法 (Proximal Regularization:给模型的训练加了一个约束,后续的 MoCo 的想法与其一致)

InvaSpread

基本的对比学习,相似的物体特征应该保持不变性,不相似的物体特征应该尽量分散开。选取了个体判别任务。正样本为自己经过数据增强后的图片,负样本为batch size里其他图片(包括原始图片和其数据增强后的图片),这样的好处在于,可以只用一个编码器去做端到端的训练。使用的loss为NCE loss的变体。
特点:不需要借助额外的数据结构去存储大量的负样本,正负样本来自同一个 minibatch (可以理解为 SimCLR 的前身)
notion image
batchsize: 256, positive samples: 256, negative samples: (256-1)*2
代理任务:Instance Discrimination (个体判别)
从同一个 minibatch 中选择正负样本,是为了可以用一个编码器做 end-to-end 训练,但同时为了保证模型性能,batch size必须设置得足够大
结果不够好的原因在于:负样本的数量不够多,所维护的由负样本组成的字典不够大

CPC

notion image
代理任务:基于 Predictive (预测)的任务来做对比学习。
将当前时刻和之前时刻的 inputs 分别喂入 encoders ,将 encoders 输出的 features 喂入自回归模型 (如 RNN, LSTM 等),最终得到当前时刻的output (context representation)
如果所学到的 context representation 足够好,也即包含了当前和之前所有信息的话,那么它应该可以对未来时刻作出合理预测
positive samples: 未来时刻的特征输出, negative samples: 任意选择的时刻的特征输出
特点:通用的结构,适用于语音,文本,图像 (将序列想象成图片的 patch 块),非常灵活

CMC

多视角的对比学习,目的是增大所有视角之间的互信息,对于某个物体来说,正样本为其在其他视角(模态)下的信息,负样本为其他与物体
notion image

第二阶段-CV双雄

MocoV1 (无监督训练效果也很好)

notion image
将之前 Contrastive Learning 方法都归纳总结为字典查询问题
主要贡献:
  • 队列 queue,使得 batch size 与 queue size 解耦,可以维护一个又大又一致的字典
  • momentum encoder 解决这个字典特征不一致的问题

SimCLRV1 (数据增强+MLP head + 大batch训练久)

正负样本的构造方式与InvaSpread相同,正样本为数据增强后的样本,负样本为batch里其他及其数据增强后的样本,SimCLR与InvaSpread的区别在于使用了更多的数据增强方式,在encoder后面增加了一个g函数(MLP),用了更大的batch size(4096)。
  • 使用 Non-Linear,相比原来什么都不用,结果提升了十几个点,效果非常显著 (原因不明)
  • 最后的维度不论是 32, 64 还是 2048 其实都没太大区别 (为什么大多选择较低的特征维度,因为128就够了)
notion image

MoCoV2

在原来的moco上面做了一些简单的改动,借鉴了simclr里面的一些技术,使用了更多的数据增强方式,以及在编码器后面加了一个mlp层,同时模型的训练epoch数也增加了(由200增加到800)。通常来说,无监督模型或者大型模型,训练越久模型效果越好。
notion image

SimCLRV2

主要改进:
  • 将 backbone network 从 ResNet-50 换成 ResNet-152,并配备3倍宽度的 channels 和 selective kernels (SK) net
  • 将 projection head 从一层 MLP 换成两层 MLP
  • 使用 momentum encoder
notion image

SWaV (聚类对比学习)

将对比学习和聚类的方法融合在了一起,将样本跟负样本的聚类中心做对比。基本流程是样本通过数据增强得到,再通过一个编码器得到两个特征,接下来在于聚类中心进行计算得到groud truth ,对进行训练。
notion image

第三阶段-不用负样本

BYOL(不需要负样本的对比学习)

是一种不需要负样本的对比学习方法,其中下面的编码器和projector采用的是动量更新(类似于MoCo)。主要流程如下:
  • 输入图像x通过两种不同的数据增强t和t'得到两个视图v和v'
  • 这两个视图分别通过编码器得到表征
  • 然后通过投影头得到投影向量
  • 最后通过预测头预测,并与经过stop-gradient的计算相似度损失
其中θ是训练权重,ξ是θ的指数移动平均。训练结束后,只保留用于提取图像表征。
这个架构的特点是不需要显式的负样本,而是通过预测任务来学习有意义的表征。
notion image
注:论文中使用的mlp层结构如下:
若去掉mlp层中的BatchNorm部分,模型效果会大大降低,原因在于去掉后会影像模型的初始化参数。

SimSiam (化繁为简的孪生表征学习)

没有使用 (i) negative sample pairs, (ii) large batches, (iii) momentum encoders
猜测 stop gradient 机制是至关重要的
notion image
SimSiam与其他模型的对比如下:
notion image

第四阶段 基于Transformer

MoCoV3 (如何更稳定的自监督训练ViT)

模型网络结构融合了MoCo V2和SimSiam
notion image
trick:MoCo V3将编码器由原来的resnet换成了VIT,且在训练时将VIT 的patch projection层冻住(batchsize变大效果反而变差的问题在于patch projection层在训练时梯度过大)。

DINO (transformer加自监督在视觉也很香)

思路和训练过程跟MoCo V3类似。
notion image

CLIP

将文本信息和图片信息相结合。训练时,配对的图片和描述文本为正样本,不配对的图片和文本描述为负样本,然后利用对比学习来训练。预测时,通过prompt来构造文本描述,然后计算每个选项的置信度。论文的创新点在于:1.对于分类或检测任务,训练时不用再指定类别,只要在训练数据中出现过的类别,模型都可以通过prompt的形式来预测出来;2.打通了文本和图像的限制,文本编码器和图像编码器都可以使用transformer结构,为后续多模态模型的发展提供了统一框架的可能。
notion image

总结

notion image

2. NLP

SimCSE

SimCSE论文中介绍了无监督和有监督两种训练方式。无监督训练时,作者将每个batch内的句子dropout两次,自己和自己为正样本,和batch内的其他句子为负样本,使用的loss为NSE loss
其中为样本经过两次dropout后的结果。
有监督训练时,对于样本对,使用的loss如下:
notion image
trick: 作者使用dropout作为数据增强的方式,实现时每个batch内放两次同一个句子即可,又简单又有效果,可谓大道至简了。
另外作者还提出了用Alignment(对齐性)和Uniformity(均匀性)来衡量一个模型的好坏,一个好的对比学习模型,应该是将相似的样本映射到尽可能聚拢的空间上,即具有对齐性;将不相似的样本映射到尽可能发散的空间上,即具有均匀性。

ESimCSE

ESimCSE为SimCSE的增强版。SimCSE直接通过dropout两次来构造正样本,这样会导致正例对具有相同的长度,而负例对通常包含不同的长度信息,模型有可能会通过这一特征来区分正负样本。针对这一点,作者提出了Word Repetition的方法,即随机复制句子中的一些单词来使正例对的长度不同。另外作者还使用了动量编码器,动量编码器最早在MoCo中就有使用。
notion image

ConSERT

作者也是在SimCSE的基础上进行了改进,主要改进点如下:
  • 一个数据增强模块,作用于Embedding层,为同一个句子生成两个不同的增强版本(View);
  • 一个共享的BERT编码器,为输入的句子生成句向量。
  • 一个对比损失层,用于在一个Batch的样本中计算对比损失,其思想是最大化同一个样本不同增强版本句向量的相似度,同时使得不同样本的句向量相互远离。
notion image
作者探索了不同的数据增强方式,包括对抗攻击打乱词序裁剪Dropout,其中裁剪包括Token Cutoff(随机选取Token,将对应Token的Embedding整行置为零)和Feature Cutoff(随机选取Embedding的Feature,将选取的Feature维度整列置为零)。作者的结果显示打乱词序和Feature Cutoff的组合取得了最优性能。此外,就单种数据增强方法而言,打乱词序 > Token Cutoff » Feature Cutoff ≈ Dropout » None。
 

参考资料

  1. 本文CV部分总结自李沐老师(朱老师)的视频github
  1. ESimCSE:无监督语义新SOTA,引入动量对比学习扩展负样本,效果远超SimCSE ↩︎
  1. ACL 2021|美团提出基于对比学习的文本表示模型,效果相比BERT-flow提升8% ↩︎
 
  • 对比学习
  • 加锁文章 前端三件套:vue,tailwindcss和element-plus
    Loading...