对比学习

  • 引言
  • bert在对比学习中起到的作用:
  • **对比学习的作用:**
  • 生成式自监督学习:
  • 判别式自监督学习
  • simCLR
  • SimCLR正负例构建
  • SimCLR表示学习系统构建
  • SimCLR上下分支
  • SimCLR损失函数
  • simCLR的两点贡献:


引言

  • 对比学习属于无监督或者自监督学习,目前多个模型的效果以及超过了有监督学习模型。
    对比学习(Contrastive Learning)最近一年比较火,各路大神比如Hinton、Yann LeCun、Kaiming He及一流研究机构比如Facebook、Google、DeepMind,都投入其中并快速提出各种改进模型:Moco系列、SimCLR系列、BYOL、SwAV……,各种方法相互借鉴,又各有创新,俨然一场机器学习领域的军备竞赛

bert在对比学习中起到的作用:

  • Bert预训练模型,通过MLM任务的自监督学习,充分挖掘出了模型从海量无标注文本中学习通用知识的能力。而在图像中的预训练通常是有监督的,也就是使用ImageNet来进行预训练,但是在下游中Fine-tune的效果,和bert下游任务中的性能提升是没法比的。
  • 既然在自然语言处理中,自监督无标注数据学习成功了,那么是不是就意味着在图像领域自监督是不是也有可能,从图像领域的有监督向自监督训练的曙光也就是对比学习。
  • 在有监督学习中,标注的数据总是有线的,我们不可能把所有数据都进行标注,这会消耗我们大量的成本,也就是偶像的数据标注。在NLP领域中吸取的经验就是:自监督使用的数据量越多,那么模型能够将会越复杂,这也就意味着相对而言模型学习到的知识是比较丰富的,这样的预训练模型对于夏有任务的效果也将会更好。

  • 基于此,我们的想法就是使用尽可能多的无标注数据来进行自监督学习,从中学习到更加丰富的先验知识,然后在下游任务中来进行微调fine-tune,将预训练学习到的知识迁移到下游任务中,提升下游任务的效果。

对比学习的作用:

  • 对比学习是自监督学习中的一种,依赖于无标注数据来进行知识学习,从无标注数据中来学习先验知识。
  • 自监督学习一般分为两类:生成式自监督学习和判别式自监督学习。

生成式自监督学习:

  • VAE和GAN属于生成式自监督学习中的两类典型方法,这种方法要求模型要重构图像或者图像的一部分,任务难度相对比较高,要求像素级别的重构,中间的图像编码包含很多细节信息。

判别式自监督学习

  • 对比学习属于典型的判别式自监督学习,相对于生成式自监督学习,判别式自监督学习难度要低一些。对比学习“无明确的定义、有指导原则”,指导原则为:通过构造一个相似实例和不相似实例来进行学习,得到一个表示学习模型,这个表示学习模型的特点为,相似的特征对象在投影空间内距离比较近,反之特征对象不相似的,距离越远。
  • 在表示学习模型中,如何构建相似实例与不相似实例,如何遵循原则来进行学习,如何反之模型坍塌,这几个点是其中的关键。
  • 目前出现的的对比学习方法有很多,从防止模型坍塌的不同角度,可以大致把现有的方法划分为:基于负例的对比学习方法,基于的对比聚类的方法、基于不对称网络结构的方法,以及基于冗余消除损失函数的的方法。

simCLR

基于负例对比学习:以SIMCLR为例

  • 在SimCLR之前,就提出了不少对比学习方法,包括:Mocov1,并且效果要比之前的方法好‘另一方面SimCLR采取大队成结构。整体结构比较清晰,比价容易说清楚。而且他奠定的结构,以及成为了对比学习模型的的标准构成结构首先了解SimCLR模型结构,但对于了解其他模型也会更加容易一些。

SimCLR正负例构建

  • 正例的构造:将原始图片通过特征增强,从可能的特征增强的集合T中,随机抽取两种:t1-T;t2-T,分别作用在原始图片上,形成两张经过增强的新图像(x1,x2),l两者互为正例。在训练时,batch内任意的其他图片均为负例。这样表示学习模型在学习的过程中就会拉进正例的距离,退远负例的距离,使得模型能够在一定程度上学习到对象之间的相似性。同时,通过这种方式,能够使模型能够忽略掉一些表面的因素,比如遮挡不变性、颜色不变形、旋转不变性,使得模型在判别是否为相似实例是能够忽略掉一些特征来进行学习。模型同通过融合多种图像增强方式,离开增强模型的表示学习能力,提升模型的对比学习的难度。

SimCLR表示学习系统构建

  • 构造好正负例之后,模型需要来进行表示学习系统构建。
    通过将巡礼哦按数据映射到某个空间上,并且采取一定的方法,使得模型中正例之间距离比较近,负例之间距离比较远。构建过程如图所示:

双塔模型 relu torch 双塔模型 bert_深度学习

  • simCLR模型结构由上下两层双塔构成,也叫做Branch。
    我们随机从数据集中选取n个branch,然后通过上述方法图像增强方法来构造两个图像增强视图,aug1 和aug1,aug1和aug2中分别包含n个增强数据,并且分别经过上下两个分支,对增强数据进行非线性变换,其中两个分支就是上下投影函数,需要将图像数据投影到某个表示空间。

SimCLR上下分支

  • 由于上下两个分支是对称的,因此只需要介绍一个分支即可。介绍AUG1经过上分支来介绍投影过程。AUg1经过特征编码encoder(一般使用Resnet来作为模型结构,这里在图中以f(x)来表示),经过CNN编码后得到特征表示hi。紧随其后,进行另一个非线性变换结构projector,其中projector由FC-BN-RLU-fc两层MLP构成,在图中由函数g(x)来进行表示,通过g函数将特征h进行非线性变换为z。总而言之,数据通过增强变换后,经过两层非线性变换,将特征映射到相应的表示空间中。
    这两个上下分支就是图像数据进行映射所需要的投影函数。

疑问:为什么在表示空间映射时,需要经过两次线性变换,一次线性变换不行吗?



我们在构建好正负例之后,期望的是模型能否将正例之间的距离拉的尽可能的近,对于负例之间的距离推的尽可能的远。这里需要一个度量函数来进行距离的判断,一般使用相似度函数来作为度量函数。一般需要对l2正则后,向量之间的点积或者向量之间cosine相似性,计算公式如下所示:

疑问:为什么一定要做l2正则后再计算相似性?

双塔模型 relu torch 双塔模型 bert_监督学习_02

SimCLR损失函数

  • SImCLR模型采用的损失函数为:InfoNCE Loss,某个例子对应的InfoNCE Loss损失函数如下所示,其中zi表示正例在表示空间的特征向量,分子部分中,两个正例之间的距离越近函数损失函数越小,也就是正例之间的距离越近越好,分母部分则表示负例之间的距离越远越好,距离越远损失函数越小。通过设定损失函数来指引模型的训练方向,使得模型越来越接近预期目标。
  • 在模型中,需要注意:
  • SImCLR其实就是标准的预训练过程,通过海量的无标注数据,通过对比学习原则作为指导,学习到好的特征表示,需要学习到好的encorder模型以及它对应的特征表示。也就是,对于输入一个数据图像,它能够抽取到关键信息,忽略无关信息,与bert的mlp自监督学习的预训练基本是一致的,只是做法方式不太一致。通过学习到好的encorder编码层后,来欧晓解决下游任务,用学习到的参数来初始化encorder模型中的Resnet模型,下游通过微调的形式来进行模型参数调整,希望预训练的模型参数对于下游任务具有一定的迁移学习作用。simCLR中的组件包括:encorder、projector、图像增强、infoNCE损失函数,在进行模型与训练我们最后需要的是encorder部分,希望得到尽可能质量高的encorder部分。需要注意的是,所有的对比学习都是这样的。

疑问:为什么在表示空间映射时,需要经过两次线性变换,一次线性变换不行吗?
为什么要进行两次进行线性变换?在最初的特征映射过程中,只有基于Resnet的Encorder编码层,而加入projector之后,模型的效果提升显著。

simCLR的两点贡献:

simCLR最大的贡献在于:1、使用复合图像增强,表明了复合图像增强的重要性;2、在encorder的基础上加入了project实现了两次非线性变换,进一步提取了深层语义信息。通过将以上两点的结合使得对比学习的效果超过了有监督模型效果。
核心思路:
对同一item构建两个表示,使得batch内同一个item距离更近,负样本距离更远。