当前位置: 首页 > article >正文

对比学习)

目录

概念

数据增强

损失函数

NCE(noise contrastive estimation)

Info NCE

CV上的发展

InstDisc

InvaSpread

CPC

CMC

MoCo

simCLR

MoCo v2

SimCLR v2

SwAV

BYOL

SimSiam

MoCo v3 

DiNO


概念

        通过利用样本之间的相似性和不相似性(正负样本),对比学习使模型能够在潜在空间中将相似的样本紧密联系在一起,不相似的样本分离开,从而获取数据的高阶信息。

        举个例子,从imagenet中抽出猫、猫、狗、飞机四张图,那么猫和猫的图片肯定是相似的,和狗不相似。但是和飞机比起来,猫和狗是相似的。所以对比学习就是对比着差异去学习,模型并不需要真的知道图片中代表的是什么,而只需要知道哪些图片是类似的,哪些图片是不一样的就可以了。

        训练目的:希望相似数据最终学到的特征是相似的,在特征空间(embedding space)中,特征向量尽量靠近;反之还希望不同的数据学到的特征向量尽量远离。

应用最广的代理任务:instance discrimination.
        简单说就是,从一堆图片中调出任意一张图片x_i,将其做一次转换(transformation ,比如随机裁剪等数据增广),得到新的图片x_{i1},x_{i2}。那么样本x_i叫做基准点(锚点),x_{i1},x_{i2}被认为是正样本(虽然看起来有差异,但语义信息不应该发生变化),数据集中其它所有图片都是负样本。

数据增强

        往往进行对比学习都会进行数据增强。

        1)提供正样本,多个不同版本的正样本可以增加模型的鲁棒性和泛化能力

        2)增加负样本的数量。数据量越大,模型越复杂,模型能够吸收的知识越多,对下游任务效果来说越好。

数据增强(Data Augmentation) - 知乎(图像)

NLP中数据增强的综述,快速的生成大量的训练数据 

 

损失函数

NCE(noise contrastive estimation)

        (基于信息论)核心思想是将多分类问题转化成二分类问题,一个类是数据类别 data sample,另一个类是噪声类别 noisy sample,通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是噪声对比(noise contrastive),从而发现数据中的一些特性。

        (交叉熵行不通:以ImageNet举例,在对比学习中,每个图片样本就是单独一类,那k就是128万类,使用softmax计算量非常大)

(一个正样本,k个负样本)

Info NCE

        NCE的变体,其实就是一个cross-entropy loss。相较于NCE,还是将其看做是多分类的问题,只不过这里的K是从负样本中采样的数量,而不是全部的数量。

        温度系数的作用:

        1)t 设的越大,logits分布里的数值都变小,且经过指数运算之后,就变得更小了,导致原来的logits分布变得更平滑。那么对比损失会对所有的负样本一视同仁,导致模型学习没有轻重。

        2)t 设的越小,所有的情况就会相反,logits分布的数值变大,使得这个分布变得更集中,更peak。模型会越关注特别困难的负样本(距离和正样本较近,但被模型误认为是负样本的样本。其实那些负样本很可能是潜在的正样本),这样会导致模型很难收敛或者泛化能力差

CV上的发展

对比学习论文综述【论文精读】_哔哩哔哩_bilibili

 

InstDisc

        判别式模型。受有监督学习的启发,比如给出一张豹子的图片,用一个训练好的分类器进行预测,会发现,预测分数前几的都是豹子的种类,而分数低的都是一些其他不相关的图片。因此,作者提出这些相似的图片被分到一起不是因为拥有相似的语义标签,而是这些图片长得非常的相似,所以被预测的豹子图片的预测结果中前几的都是豹子的种类,而不是其他什么图片。

        因此作者提出了个体判别的任务,我们将每张图片实例都看做事一个类别,目标就是学习一种特征,能将每一张图片都区分开来。正样本就是样本本身,用一个memoryBank存储负样本,然后用NCE loss更新对比函数。然后将更新的特征替换到memoryBank中原来的样本特征。

InvaSpread

        与InstDisc类似,不过不用memoryBank存储负样本,是端到端的学习。假设选取的batch中有N的样本,对batch中的每个样本进行数据增强后有2N个样本,对于其中某个样本而言,将数据增强的样本作为正样本,个数为1,batch中的其他图片作为负样本,个数是2×(N-1)。缺点:负样本不够多。

CPC

        生成式模型,用预测的代理任务做对比学习。假设有一个连续的序列,将某段通过一个编码器获得一些特征,然后将这些特征送入自回归模型,最后获得context representation(上下文的一个特征表示)。如果这个上下文特征足够好,那么就应该可以做出一些预测,去预测未来时刻的一些Z_{t+1}...未来时刻的特征输出。

        对比学习的体现:正样本:未来的输入通过编码器获得的未来时刻的特征输出Z_{t+1}...。可以理解为预测的Predictions只是一个query,真正的未来时刻的输出是由原本的输入决定的。因此,真正的Z_{t+1}...是Predictions的正样本。负样本:定义很广泛,比如可以任意选取一段输入经过编码器得到一段输出,这段输出应该跟Predictions是不相似的。

CMC

        摘要:人观察世界是通过多个传感器的,比如眼睛,耳朵等等,都充当着不同的传感器给大脑提供信号,但是每个视角都是有噪声的,并且可能是不完整的,但是这些不同传感器获取的最重要的那些信息是在这些视角中共享的。例如,一只狗,我们可以看到,也可以听到。因此作者提出:学习一种强大的特征,具有视角的不变形。意思就是不管从哪个视角去看,都能发现这只狗。所以CMC的目的就是增大不同视角相同内容之间的互信息。

        正样本:来自不同视角的相同图片;负样本:其他的图片。这里来自不同视角可以转换为不同模态。

        CMC是一个比较早的工作做多视角对比学习,证明了对比学习的灵活性,并且证明了多视角/多模态的可行性。所以接下来openai很快就提出了CLIP模型,有一个图片,和描述这个图片的文本,那么图像和文本就可以当做是一个正样本对,然后做多模态的对比学习。

        CMC的原班人马用对比学习的思想做了一篇蒸馏的工作,不论用什么网络,如果输入是同一张图片,那么输出的特征就应该尽可能的类似。也就是说想让teacher模型的输出和student模型的输出更可能的相似,此时,这两个输出就可以作为一个正样本对,从而做对比学习。

        局限性:处理不同模态可能就需要不同的编码器,计算代价可能就会很高。用transformer可以同时处理多个模态的数据(maclip:用一个transformer处理两个输入模态)。

MoCo

        主要贡献:把之前的一些对比学习方法归纳总结为字典查询的问题。

        提出两个东西:队列和动量编码器,从而形成一个又大又一致的字典,从而帮助更好的对比学习。

        MoCo和InstDisc是非常的相似的,MoCo用队列取代了原来的MemoryBank,作为一个额外的数据结构存储负样本;用动量编码器取代了loss中的约束项,从而达到动量更新编码器的目的,而不是动量的更新特征,从而达到更好的结果。

损失:

simCLR

        对一个图片做不同的数据增强,就会得到不同的图片。正样本:所有该样本数据增强后的样本。负样本:该batch中其他样本及其数据增强后的所有样本。和InvaSpread中是一样的。将样本通过编码器f,最重大的创新点是在编码后添加了project函数,其实就是一层MLP,但使结果提升了10%,然后就是对比学习。细节贡献:1)更多的数据增强更好,2)非线性变换MLP的提出,3)更大的batch-szie

MoCo v2

        (技术报告)MoCo+SimCLR。MoCo v1 + MLP + 数据增强 + 训练的时候使用cosine Learning rate schedule + 更长的epoch。

SimCLR v2

        大的自监督模型可以很好做半监督学习。SimCLR v2:在SimCLR的基础上+更大的ResNet模型 + 两层的MLP + 动量编码器。(重)如何做半监督:

SwAV

        对比学习+聚类(无监督,相似的目标)。给定同一张图片,如果我们有多个视角的特征,我们可以用一个视角的特征去预测另一个视角得到的特征。swapped prediction。普通的对比学习如图左所示,而SwAV如右图所示,添加了一个C即Cluster,是一个D×K的矩阵,D是维度,和Z特征的维度是一样的,K是聚类中心的个数。然后将Z与C进行点乘,生成一个目标Q,可以将Q作为一个ground truth。对于来自同一张图片数据增强的样本,那么计算出来的Q应该也是相似的,因此,我们可以用Z1·C可以去预测Q2,反之亦然,此时Q1就可以作为ground truth。Q有什么意义

        其实这里Q的作用和普通对比学习中的Z的作用是相同的,添加聚类的好处:1)一般情况下,进行对比学习,我们可能需要成千上万个负样本,但是添加了聚类之后,我们是对聚类中心做对比,最多用3000个聚类中心就可以表示了。2)用聚类中心去对比,是有具体含义的,之前只是随机抽样负样本,其中的负样本有可能还是正样的,类别可能也不均衡,不如使用聚类中心有效。

deep Cluster->deep cluster 2->SwAV

Multi-Crop:裁剪更多的图片(全局特征->局部的特征)

最小化互信息(合适的视角信息)

不用负样本:

BYOL

        在对比学习中,负样本是一个约束。如果在算目标函数的时候,只有正样本,那么目的就是让所有相似的样本的特征更加的相似。ex:给一个模型同样的输入,那么模型给出同样的输出。

        与普通的不同的是,在projection之后,原来的会直接利用两个样本特征,让他们尽可能的接近,达到maximum agreement。但BYOL对于zθ来说,继续经过了一个qθ,qθ的网络结构和gθ是一样的,然后获得了新的特征qθ(zθ),想要用这个预测跟Zξ更可能的一致,将匹配的问题转化为预测的问题,和SaWV的方式是类似的,但SaWV也是借用了一个预测中心做预测任务,BYOL直接利用自己预测自己(用一个视角的特征去预测另一个视角的特征)。上面紫色部分可以看做一个query编码器,下面部分看做key的编码器。key编码器都是query编码器的这个动量更新。loss直接用mean squared error计算。

        MLP中的batch norm,如果不添加,可能会导致模型坍塌。batch norm计算了batch的均值和方差,然后再进行归一化,在算loss的时候其实不光是自己样本的特征,其实也学习到了其他样本的特征,所以其实是有信息泄露的,所以可以把batch中的其他样本想成一个隐式的负样本,这里正样本跟一个平均样本去比较,类似与SwAV,相当于是利用聚类中心。(作者解释了)

SimSiam

        以前的工作看起来是一点一点堆叠起来的,比如project,数据增强,动量编码器等等,这样难以分析每个点到底带来了那些贡献。因此提出了SimSiam,不需要负样本,不需要大的batch size,不需要动量编码器。

        孪生网络:encoder是一样的,并且共享参数。与BYOL不一样的唯一不一样的就是没有用动量编码器。作者提出:之所以SimSiam能够成功训练,没有模型坍塌,是因为有stop gradient这个操作存在。

transformer:

MoCo v3 

如何提高自监督的vit(Vision Transformer)的稳定性。架构:MoCo v2+projection+prediction(Transformer+自监督)。将batch projection冻住

DiNO


http://www.kler.cn/news/361890.html

相关文章:

  • 写一个 qq自动回话的程序
  • 禁止VMware Service进程开机自动启动
  • 群晖通过 Docker 安装 MySQL
  • envoyFilter导致的webSockets协议无法正常工作
  • 机器人学 目录
  • Gin框架操作指南01:开山篇
  • C++ 标准库:功能与应用解析
  • 考研408考试科目之计算机数据结构在科技应用——未来之窗学习通
  • 安卓設備上怎麼設置HTTP代理?
  • IIS不能使用Delete方法
  • Spring事务底层源码解析(二)
  • 大数据分析案例-基于随机森林模型的机器学习工程师岗位薪资预测
  • SQLI LABS | Less-3 GET-Error based-Single quotes with twist-String
  • 11种经典时间序列预测方法:理论、Python实现与应用
  • Linux云计算 |【第五阶段】ARCHITECTURE-DAY4
  • LabVIEW水质监测系统
  • leetcode 3191. 使二进制数组全部等于 1 的最少操作次数 I 中等
  • 计算机的错误计算(一百三十一)
  • EasyOCR——超强超便捷的OCR开源算法介绍与文本检测模型CRAFT微调方法
  • 『完整代码』坐骑召唤
  • 【数据结构】顺序表与链表的区别和各自特点
  • 数据结构-贪心算法笔记
  • MAC电脑的JDK、MAVEN配置及IDEA激活
  • Vehicle Spy3.9如何新建工程—Setup network Database
  • 基于SpringBoot中药材进存销管理系统【附源码】
  • C++基础(10. map_set 的使用)