对比学习综述
一、基本介绍
1.背景
1.监督学习:技术相对成熟,但是对海量的数据进行标记需要花费大量的时间和资源。
2.度量学习。度量学习的基本思路是让正例特征编码内容距离拉近,负例编码结果距离推远。其中的正例一般是源自有监督数据。对比学习主体思路跟度量学习接近,最大的区别在于其正例是由自监督方式得来。
3.无监督学习:自主发现数据中潜在的结构,节省时间以及硬件资源。
主要思路:自主地从大量数据中学习同类数据的相同特性,并将其编码为高级表征,再根据不同任务进行微调即可。
4.自监督学习:
(1)自监督学习旨在自主发现数据中潜在的结构与知识,不仅节省时间以及人力标注资源,而且可以充分释放海量数据的潜力。对比学习可以看作是一种新型的自监督学习范式,具备广阔发展前景。
(2)Bert采用的自监督学习。Bert采用自监督学习,节约了大量的人工标注成本,可以有效发挥海量数据的潜力。对比学习借鉴了自监督学习的思路,旨在充分利用海量的无标注数据。
5.对比式学习
对比式学习着重于学习同类实例之间的共同特征,区分非同类实例之间的不同之处。
与生成式学习比较,对比式学习不需要关注实例上繁琐的细节,只需要在抽象语义级别的特征空间上学会对数据的区分即可,因此模型以及其优化变得更加简单,且泛化能力更强。
可以认为对比学习是一种自监督版本的度量学习
2.目标
对比学习的目标是学习一个编码器,此编码器对同类数据进行相似的编码,并使不同类的数据的编码结果尽可能的不同。
3.指导原则
通过自动构建相似实例和不相似实例,要求学习到一个表示学习模型。通过这个模型使得相似的实例在投影空间中比较接近,而不相似的实例在投影空间中距离比较远。
4.对比学习的两个特征
(1)Alignment(对齐):指的是相似的例子,也就是正例,映射到单位超球面后,应该有接近的特征,也即是说,在超球面上距离比较近
(2)Uniformity(均匀性):指的是系统应该倾向在特征里保留尽可能多的信息,这等价于使得映射到单位超球面的特征,尽可能均匀地分布在球面上,分布得越均匀,意味着保留的信息越充分。分布均匀意味着两两有差异,也意味着各自保有独有信息,这代表信息保留充分。
Collapse(模型坍塌):Uniformity特性的极端反例,是所有数据映射到单位超球面同一个点上,这极度违背了Uniformity原则,因为这代表所有数据的信息都被丢掉了,体现为数据极度不均匀得分布到了超球面同一个点上。也就是说,所有数据经过特征表示映射过程后,都收敛到了同一个常数解,一般将这种异常情况称为模型坍塌
5.要解决的三个问题
(1)正例和负例分别如何构造?这是对比学习和度量学习的主要区别。一般对比学习的负例大多可以通过随机抽取构造,所以对比学习中最核心的问题是如何构造正例。
(2)如果构造表示学习模型结构。
(3)损失函数如何设计?前文所说InfoNCE是一个具体损失函数,在实际应用时并非一成不变,应该根据使用场景灵活设计
6.CV:对比学习的三种框架
(1)基于负例的对比学习
①SimCLR系列
②MoCo系列
③SwAV系列
(2)基于非对称网络的对比学习
①stop-gradient
(3)基于特征去相关的对比学习
①Barlow Twins
7.NLP:对比学习算法
BERT-flow
bert-whitening
SBert
SimCse
ESimCse
R-drop
8.对比学习损失函数
一般是:InfoNCE(info Noise Contrastive Estimate) loss
写法一:
写法二:
写法三:
以上几种写法都是一样的,分子为:锚点和正样本距离(一般是余弦距离),让其距离尽可能近(越近余弦距离越接近1),然后取指数。分母为:锚点和所有样本距离(包含了正样本),让其距离负样本距离尽可能远,然后去指数。最后再取负对数。
结论:
1.对比损失函数是一个具备困难负样本自发现性质的损失函数,这一性质对于学习高质量的自监督表示是至关重要的,不具备这个性质的损失函数会大大恶化自监督学习的性能。关注困难样本的作用就是:对于那些已经远离的样本,不需要继续让其远离,而主要聚焦在如何使没有远离的那些的样本远离,从而使得到的表示空间更均匀(uniformity)。
2.温度系数的作用是调节对困难样本的关注程度:越小的温度系数越关注于将本样本和最相似的其他样本分开)。作者对温度系数进行了深入的分析和实验,并利用温度系数来解释对比学习是如何学到有用表征的。
3.对比损失存在一个均匀性-容忍性的Dilemma(Uniformity-Tolerance Dilemma)。小温度系数更关注于将与本样本相似的困难样本分开,因此往往可以得到更均匀的表示。然而困难样本往往是与本样本相似程度较高的,例如同一个类别的不同实例,即有很多困难负样本其实是潜在的正样本。过分强迫与困难样本分开会破坏学到的潜在语义结构。
二、CV领域对比学习
(1)基于负例的对比学习
①SimCLR系列
②MoCo系列
③SwAV系列
(2)基于非对称网络的对比学习
①stop-gradient
(3)基于特征去相关的对比学习
①Barlow Twins
1.SimCLR系列
SimCLR是facebook提出的对比学习模型。SimCLR本身是一个双塔结构,分为上下两部分。
(1)第一个问题:如何构造正例负例?取一个batch图像,对其中每个图像利用多种变换方式组合进行变换,形成正例,这是自动化构造的方式,所以说是自监督模式的;负例则是在该batch中通过随机抽取方式形成。
(2)第二个问题:特征映射函数如何构造?SimCLR的映射函数f包括两个子结构,分别为encoder和projector(MLP层,用来将四维降为三维),对应的作用分别为编码和映射。
(3)第三个问题:损失函数。SimCLR用损失函数InfoNCE来度量不同输入经过编码和映射之后在单位超球面中的距离,如果是正例则希望在空间中相似性越高越好,即距离越近越好,负例则反之。
缺点:是在做深度学习的时候,由于算力受限,batch不能太大,因此会限制负例数量,无法大量增加负例,影响模型效果。
SimCLR V2 将encoder变成更深更广的ResNet
2.MoCo系列
为增加负例数量,需要抛弃在batch内取负例的做法,典型模型为MoCo V2。MoCo V2主要结构跟SimCLR一样,也是双塔结构。
(1)与后者的核心不同之处在于:下面的分支结构不同;MoCo维护了一个负例队列以增加负例数量。
(2)下面的分支采用动量更新来进行模型参数更新,除了自身的参数更新外,还将上面分支的参数纳入考虑,综合来进行参数更新;
(3)同时负例改为从负例队列中选择,因为负例队列没有大小限制,减少了batch负例的大小限制。
MoCo V2借鉴SimCLR,引入projector,并且加入复合图像增强。
MoCo V3将encoder从ResNet换为Transformer
基于负例的对比学习方法:可以看到,基于负例的对比学习方法相互借鉴,互相拓广。总结下,目前研究达成了以下共识:网络结构采用双塔结构,映射函数F为Encoder+Projector,并且特征编码器Encoder越来越复杂。
三、NLP领域对比学习
(1)通过后处理
BERT-flow
bert-whitening
(2)对比学习
SBert
SimCse
ESimCse
R-drop
1.Bert-flow
BERT-flow的工作就是将原来的分布校准为高斯分布(正态分布)。标准的高斯分布就是各向同性的。
BERT-flow 既然 BERT 出来的 embedding 向量存在各向异性,进而也产生了分布不均匀问题,那我就采用一个变换,将 BERT encode 的句子表达转换到一个各向同性且分布较均匀的空间。而标准的高斯分布刚好是一个各向同性的空间,且是一个凸函数,语义分布也更平滑均匀。
2.bert-whitening
类似的还有whitening操作。大概流程就是根据SVD分解的结果,旋转缩放后得到一个标准正态分布
2021年初,苏剑林提出了一种简单有效的BERT-whitening模型,具备以下两个优点:
(1)提高BERT语义向量相似度计算方面的效果;
(2)降低BERT语义向量的维度;
3.Sbert
参考:SBert算法
4.SimCse
参考:SimCse算法
5.ESimCse
SimCSE遗留的两个问题:
1、SimCSE通过dropout构建的正例对包含相同长度的信息(原因:Transformer的Position Embedding),会使模型倾向于认为相同或相似长度的句子在语义上更相似(insight很合理);
2、更大的batch size会导致SimCSE性能下降(这点确实很困扰)
simsce的加强版:主要创新就是Word Repetition(单词重复)和Momentum Contrast(动量对比)解决了simsce的一些缺点
参考:
1.https://zhuanlan.zhihu.com/p/346686467
2.https://zhuanlan.zhihu.com/p/405570872