关于【bootstrap使用】,Bootstrap基本使用,今天乾乾小编给您分享一下,如果对您有所帮助别忘了关注本站哦。
内容导航:1、bootstrap使用:Bootstrap基本使用2、一文读懂对比学习1、bootstrap使用:Bootstrap基本使用
Bootstrap是当前流行的前端框架。下面,我们来看看Bootstrap的基本使用吧。
操作方法
Bootstrap中文网在浏览器中输入【Bootstrap中文网】,然后点击相关的链接,如下图所示:
Bootstrap中文文档然后会进入相关的页面,点击【Bootstrap中文文档】按钮,如下图所示:
下载Bootstrap然后点击【下载Bootstrap】按钮,如下图所示:
Bootstrap教程下载相关文档之后就可以使用文档中的JS文件,然后在浏览器中输入【Bootstrap教程】,即可学习简单的Bootstrap使用方法。
声明:本篇经验系「www.coozhi.com」原创,转载请注明出处。
2、一文读懂对比学习
1.引言
近两年,对比学习(Contrastive Learning)在计算机视觉领域(CV)掀起了一波浪潮,MoCo[1]、SimCLR[2]、BYOL[3]、SimSiam[4]等基于对比学习思想的模型方法层出不穷,作为一种无监督表示学习方法,在CV的一些任务上的表现已经超过了有监督学习。同时,自然语言处理(NLP)领域近来也有了一些跟进的工作,例如ConSERT[5]、SimCSE[6]等模型利用对比学习思想进行句表示学习,在语义文本相似度匹配(STS)等任务上超过了SOTA。这篇笔记将带大家梳理一下对比学习的基本思想与方法,回顾一下CV领域对比学习的发展历程,并介绍几篇对比学习应用在NLP领域文本表示学习中的工作。
2.对比学习简介
2.1 基本思想
在介绍对比学习的具体方法之前,让我们先给对比学习下一个定义。对比学习是一种基于对比思想的判别式表示学习框架(或方法),主要用来做无监督(自监督)的表示学习(对比学习也可以用于有监督学习,但这不是对比学习的优势所在,故本文不再赘述)。可类比为NLP中Bert[7]应用的利用上下文重构遮盖词的遮盖语言模型(Masked Language Model),他不限于某一个或一类模型,而是一种利用无标签数据进行表示学习的思想。
那对比学习采用的具体思想是什么呢?顾名思义,即将样例与与它语义相似的例子(正样例)和与它语义不相似的例子(负样例)进行对比,希望通过设计模型结构和对比损失,使语义相近的例子对应的表示在表示空间更接近,语义不相近的例子对应的表示距离更远,以达到类似聚类的效果,见图1。
图1 对比学习中正负样例(黑球为正样例,白球为负样例)[8]
以图像为例,见图2,对比学习期望通过使同一类狗不同角度照片的表示相近,而不同种类动物对应的表示距离相远,使得学到的表示可以忽略掉角度(或光影等)变换带来的细节变动,进而学习到更高维度、更本质的特征(语义)信息。
图2 一张狗的图片对应的正负样例[9]
这里我们引入两个重要的概念,对齐性(alignment)和均匀性(uniformity)[10]。由于对比学习的表示一般都会正则化,因而会集中在一个超球面上。对齐性和均匀性指的是好的表示空间应该满足两个条件:一个是相近样例的表示尽量接近,即对齐性;而不相近样例的表示应该均匀的分布在超球面上,即均匀性。满足这样条件的表示空间是线性可分的,即一个线性分类器就足以用来分类,因而也是我们希望得到的,我们可以通过这两个特性来分析表示空间的好坏。
图3 对齐性与均匀性[10]
从上文的描述中我们可以轻易地发现对比学习有三个重要的组成部分:正负样例、对比损失以及模型结构。模型结构将在第三章介绍具体工作时详解介绍,这一章我们先来聊一聊正负样例和对比损失。
2.2 正负样例
如上所述,正样例指的是与给定样例语义相近的样例,而负样例指的是与给定样例语义不相近的样例。对于有监督的数据,正负样例很容易构造,同一标签下的例子互为正样例,不同标签下的例子互为负样例,但对于无标签的数据,我们如何得到正负样例呢?
目前的主流做法是对所有样例增加扰动,产生一些新的样例,同一个样例扰动产生的所有样例之间互为正样例,不同样例扰动产生的样例彼此之间互为负样例。现在的问题就变成了如何可以在保留原样例语义不变的情况下增加扰动,构造新样例。
图像领域中的扰动大致可分为两类:空间/几何扰动和外观/色彩扰动。空间/几何扰动的方式包括但不限于图片翻转(flip)、图片旋转(rotation)、图片挖剪(cutout)、图片剪切并放大(crop and resize)。外观扰动包括但不限于色彩失真、加高斯噪声等,见图4的例子。
图4 图像构造正样例方法[2]
自然语言领域的扰动也大致可分为两类:词级别(token-level)和表示级别(embedding-level)。词级别的扰动大致有句子剪裁(crop)、删除词/词块(span)、换序、同义词替换等。表示级别的扰动包括加高斯噪声、dropout等。见图5。
图5 自然语言中的一些增强方法[5]
但是不同于图像领域,对自然语言的扰动很容易改变语义,这就会引入错误正例(False Positive)从而对模型训练产生不好的影响。同时,错误负例(False Negative)也是一个不容忽视的问题,见图6。文献[9]的作者证实了错误负例会对对比学习产生负面影响,并提出了一种对比损失去抵消这种影响,这里不赘述,感兴趣的朋友可以看原文。
图6 错误负例的例子[9]
2.3 对比损失
在有了正负例之后,我们需要给模型信号,激励他们拉近正样例间的距离,拉远负样例间的距离,这就要通过设计对比损失来完成。给定一个样例和它对应的正样例以及负样例(可以为1,也可以很大),我们需要一个表示函数,以及一个距离的度量函数。表示函数即由我们定义的模型得到,第三章再细讲。至于度量函数,最简单的自然是欧几里得距离:。不过在对比学习中一般会将表示归一化为长度为1的向量,故欧几里得距离与向量内积就相差一常数项,为计算方便,通常就用内积作为距离度量,即:,也可叫做余弦距离。有了这些准备工作,我们就可以定义对比损失。
2.3.1 原始对比损失
其实对比思想并不是近来才兴起,05、06年就有工作用对比思想做度量学习和数据降维[8][11] 。给定一个样例对,我们有标签, 代表样例对互为正例,代表样例对互为负例。进而定义了对比损失:
其中,为距离度量函数,为一递增函数,为一递减函数。当互为正例时,距离越远损失越高;互为负例时,距离越近损失越高。文献[8]中,;文献[11]中,,是超参,控制负例的范围。用平方是因为他们的距离度量为欧几里得距离,平方可以规避开方操作。
2.3.2 三元组损失(triplet loss)
相信很多人对triplet loss 很熟悉了,最初是FaceNet[12]做人脸表示学习时提出的:给定一个三元组, 被称做锚点(Anchor), 为正例,为负例。triplet loss设计的初衷也是希望通过对比使得锚点与正例的距离更近,与负例更远,具体形式为:
其中为欧几里得距离,是用来控制正例负例距离间的偏离量,使模型不需要考虑优化过于简单的负例。论文还指出,挑选真正有挑战的负例对提升模型表现非常重要。
虽然triplet loss已经满足了对比学习的要求,但是他把一个样例限定在了一个三元组中,一个正例只与一个负例对比。实际操作中,对一个样例,我们能得到的负样例个数远远多于正样例,为了利用这些资源,近年来对比学习多用InfoNCE损失(还有其它类型的对比损失,这里只介绍主流做法)。
2.3.3 InfoNCE损失
NCE全称是噪声对比估计(Noise Contrastive Estimation),是文献[13]中提出的一种通过引入一个噪声分布,解决多分类问题softmax分母归一化中分母难以求值的问题。具体做法是把多分类问题通过引入一个噪音分布变成一个二元分类问题,将原来构造的多分类分类器(条件概率)转化为一个二元分类器,用于判别给定样例是来源于原始分布还是噪声分布,进而更新原来多元分类器的参数。听起来好像跟对比学习没什么关系,但如果把噪音分布的样本想成负样例,那这个二元分类问题就可以理解为让模型对比正负样例作出区分进而学习到正样例(原始分布)的分布特征,这是不是就跟对比学习的思想很像了?
而InfoNCE, 又称global NCE, 在文献[14]中提出。InfoNCE继承了NCE的基本思想,从一个新的分布引入负样例,构造了一个新的多元分类问题,并且证明了减小这个损失函数相当于增大互信息(mutual information)的下界,这也是名字infoNCE的由来。具体细节这里不再赘述,感兴趣的读者可以参考这篇文章:http://karlstratos.com/notes/nce.pdf,里面有比较清晰的介绍与推导。我们直接看一下目前对比学习中常见的infoNCE loss形式:
其中、、分别为原样例、正样例、负样例归一化后的表示,为温度超参。显而易见,infoNCE最后的形式就是多元分类任务常见的交叉熵(cross entropy)softmax 损失。因为表示已经归一化,据前所述,向量内积等价于向量间的距离度量。故由softmax的性质,上述损失就可以理解为,我们希望在拉近原样例与正样例距离的同时,拉远其与负样例间的距离,这正是对比学习的思想。温度超参是softmax中常见的超参,越小,softmax越接近真实的max函数,越大越接近一个均匀分布。因此,当很小时,只有难区分的负样例才会对损失函数产生影响,同时,对错分的样例(即与原样例距离比正样例与原样例距离近)有更大的惩罚。实验结果表明,对比学习对很敏感。下文对比损失若不特意提及,则默认为infoNCE loss。
3.计算机视觉领域的对比学习
这一章将介绍近几年图像领域对比学习有代表性的几篇工作。
3.1 Memory Bank
根据infoNCE loss的特性,一般希望能提供尽量多的负样例进行优化,这样不但可以增加负例的多样性,同时可以提供更多的hard negatives,提升最终表现。但运算能力是有限的,因而就有工作考虑设计机制规避大量的运算,以增加一个样例可以对比负样例的个数,Memory Bank[15]和MoCo[1]就是其中的代表性工作。
Memory Bank顾名思义,在开始训练之前,先将所有图片的表示计算好储存起来,叫做memory bank。Bank中的表示将作为负例的表示参与构建对比损失,每次迭代更新参数后,当前batch中样例对应的memory bank中的表示将会用更新后的参数更新,以这样的方式慢慢更新memory bank中的样例表示。这种方式就不需要对大量负样例做前馈和反向传播运算,大大降低了运算量。但是这种方式有两大缺点:1、当样例数目很大时,需要占用极大的内存。2、样例迭代太慢,由于不同步更新的表示对应的表示函数不同,第一步batch更新的表示和第10000步batch更新的表示对应的函数参数可能差别非常大,造成了不一致的情况,那这两种表示进行对比会有很大的噪声。MoCo则借鉴强化学习的一些工作,引入了动量更新来解决这一问题。
3.2 MoCo
与memory bank类似,MoCo也采用非对称结构,即两个编码器和,编码器都是用的ResNet[16]。其中编码原样例,编码正负样例。通过正常反向传播更新,则通过Exponential Moving Average(EMA)进行动量更新(Momentum update),见图7:
为超参,控制更新速度。
图7 端到端、memory bank和MoCo的基本对比模型结构[1]
同时,MoCo不再储存全部样例,而是保留了一个相对较短固定长度动态更新的队列(queue),每次迭代后,当前batch通过前馈得到的新的样例表示将加入队列,而最早加入队列的相同数目的样例表示被移出队列,以保持固定长度。通过这两种方式,首先降低了占用内存的大小,同时保证队列中最早和最新的表示差距不至于过大,保证了一致性,使得对比模型训练更加稳定。实验证明,当取0.999即以非常平缓的速度迭代时效果最好。具体算法见图8。
图8 MoCo算法[1]
相信有些读者肯定有疑问,这种的做法是否有必要,负样例是否越多越好?SimCLR[2]的答案是,负样例越多越好,但是上述做法并没有必要,只要你有钱!
3.3 SimCLR
作为Google的大作,SimCLR用了128核的TPU和最标准的对比学习结构使得对比学习在图像领域第一次超过了有监督学习。同时他们做了大量的实验,得到了很多有意思的结论。
SimCLR的结构非常简单,见图9,一个对称的孪生网络。
图9 SimCLR模型结构[2]
其中,代表一种随机的图片增强(扰动)方式,见2.2,编码器为ResNet,映射函数为单层的多层感知机(MLP)。每个样例会随机增强两次分别通过两侧网络得到表示和。同一个样例得到的与互为正样例,与其他样例得到的和互为负样例,一起计算InfoNCE损失,进行优化。但是并不用来作为最终图像表示,实验证明,作为表示输入下游任务效果更好。原文作者猜测这是因为映射头可以帮助抽象出更高层的信息使得更容易进行对比学习,同时在保存了对比学习特性的情况下又蕴含了更多的语义信息。
原文还进行了大量的实验,得到了很多有意思的结论:1、多种不同增强(扰动)方式的组合对提升表现很重要,见图10。如2.2所述,图像领域的扰动可以分为空间和色彩两类,图10的结果也表明,色彩扰动和空间扰动结合时效果最好。
图10 两种增强方式组合学习的表示在下游任务的表现[2]
2、非线性映射头对提升表示的质量非常重要,见图11。
图11 不同维度映射头对应的表现[2]
3、总的来说,batch size越大越好,训练时间越长越好,见图12。(这两个结论后来都被别的工作证实不总是正确的)
图12 不同batch size和训练轮次对表示效果的影响[2]
还有一些其他有意思的结论感兴趣的读者可以阅读原文。
但是并不是所有机构都有像谷歌一样的算力能够用128核的TPU进行运算,同时越大的batch size,就有越大的可能包含错误负例(False Negative);由于infoNCE损失的特性,这些错误负例会极大地影响损失函数进而提供错误信号影响模型学习,文献[9]也证实了这一现象。那我们能不能不对比负例,只通过对比正例进行对比学习,这样不就可以规避上述问题了吗?这直观上是不现实的,因为如果不拉远与负例的距离只拉近正例间的距离,那么模型很容易使所有样例的表示塌缩到同一个常数表示,这时损失为0,同时表示也失去了任何信息。神奇的是,有工作通过非对称结构避免了表示塌缩,实现了只用正例进行有效地对比学习,其中的典型工作就是接下来要介绍的BYOL[3]和SimSiam[4]。
3.4 BYOL与SimSiam
BYOL的结构非常简单,与MoCo非常相似,也应用了动量更新。见图13,BYOL用了非对称的孪生网络,原文分别称为在线网络(online network)和目标网络(target network)。
图13 BYOL模型结构[3]
目标网络与SimCLR类似,一个编码器连接一个非线性的映射头,在线网络前半部分与目标网络相同,之后再通过一个预测头,其结构与映射头相同,来增加非对称性。两支网络第二个不同是网络参数更新方式不同:在线网络顾名思义,通过对比损失反向传播更新参数,而目标网络则用动量更新的方式更新。假设在线网络的参数是,目标网络的参数是,则的更新方式为,原文取0.99。因为不用负例,故不使用InfoNCE loss,而使用最简单的内积来定义距离,最终的loss形式为:
可以看到两个正样例交换顺序通过了两次孪生网络以充分利用数据。
虽然BYOL强调动量更新对构造非对称结构避免表示塌缩非常重要,但SimSiam证明了真正重要的并不是动量更新,而是在于不求导操作。SimSiam的结构同BYOL基本一样,见图14,encoder由ResNet和一映射头组成。
图14 SimSiam 结构[4]
与BYOL不同的是,SimSiam左右两支共享参数,只是对对比损失求导时只计算左支的梯度,可以理解为BYOL动量更新时,具体的损失形式为:
其中为停止求导操作(stop gradient)。
那么为什么这样的作法可以规避表示塌缩,在没有负例的情况下也能学到有效表示呢?目前并没有一个广泛被接受的结论,SimSiam的作者尝试把这种非对称的结构解释为引入了一个类似EM算法的二步优化过程,具体细节感兴趣的同学可以看一下原文,这里不再赘述。但是我们可以确定的是,左支多出来的预测头和不求导操作这两者都对避免表示塌缩起到了关键性的作用,缺一不可,我们可以确定不对称结构是关键,但具体的理论原理还有待更多的工作。
介绍了这么多对比学习在图像领域的工作,接下来我们一起看一下自然语言处理领域的对比学习工作,篇幅有限,这里主要介绍两篇对比学习做句子表示学习的文章。
4.自然语言处理领域的对比学习
我们都知道,通过以Bert为代表的预训练模型得到的词表示在广泛的下游任务上都取得了非常不错的表现,但是句子表示(无论是用[CLS]特殊字符还是平均池化得到)的表现远不如词表示这么亮眼。文献[17]指出,通过Bert学到的词表示根据词频呈现不均匀分布,高频词离原点更近且彼此间距离更近,低频词离原点更远且更稀疏,因此平均后高频词对最终句表示的影响更大,导致Bert学到的句表示对语义变化不敏感,如图15,横坐标为文本语义匹配数据集中对句子相似度的人工评分,纵坐标为对应的Bert句向量得到的相似度评分,会发现Bert句向量并不能很好的区分语义相近和语义不相近的句子,而对比学习通过告诉模型拉远负例间的举例,很好的解决这个问题。
图15 bert句表示得到的相似度评分与人工打分的相关性表[5]
4.1 ConSERT
ConSERT[5]的模型结构非常简单,基本与SimCLR相同,只是把ResNet换成了Bert,并且去掉了映射头,见图16。
图16 ConSERT模型结构[5]
对比损失就是InfoNCE,数据增强方式见图5,包括词级别的词换序、删词,和表示级别的对抗扰动、删特征和输入dropout,作者还特意将Bert中原有的dropout率设为0,以保证正负样例对应的编码结构相同。实验结果表明学到的句表示可以很好的解决上文提到的问题,见图17。学到的句表示在语义匹配任务上的表现也远超之前方法。
图17 ConSERT表示与Bert表示对比图[5]
4.2 SimCSE
在模型结构和对比损失上,SimCSE与ConSERT基本相同,只是把映射头又加上了,最大的区别就是数据增强方式。SimCSE的增强方式只有一种,Dropout,不是ConSERT中对输入的表示做dropout,而是BERT里原本的Dropout,对你没有看错,就是ConSERT故意删去的最基本的Dropout!SimCSE的两个正例仅仅是同一个句子过两遍Bert,这样简单的增强配上对比学习就实现了文本语义匹配任务的SOTA!不得不让人惊叹对比学习在语义表示学习上的能力。
5.总结
本文粗略的介绍了一下对比学习的思想与方法,以及一系列在图像、文本上的工作。对比学习在语义表示学习上的能力有目共睹,但还有一些问题,比如在自然语言领域,复杂的数据增强方式反而不如简单的dropout,这有没有可能是由于自然语言对扰动语义鲁棒性不强导致的呢?同时,CV领域的对比学习已经可以不用负例,那在NLP领域是不是也会有相似的发展轨迹呢?让我们拭目以待!
参考资料
这就是关于《bootstrap使用,Bootstrap基本使用(一文读懂对比学习)》的所有内容,希望对您能有所帮助!