在文本和图像上的对比学习小综述~

点击下面卡片关注我呀,每天给你送来AI技术干货!


作者:李明达

来自:哈工大SCIR

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领域是不是也会有相似的发展轨迹呢?让我们拭目以待!

参考资料

[1]

Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie, and Ross B. Girshick. Momentum contrast for unsupervised visual representation learning. In 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition, CVPR 2020.

[2]

Ting Chen, Simon Kornblith, Mohammad Norouzi, and Geoffrey E. Hinton. A simple framework for contrastive learning of visual representations. In Proceedings of the 37th International Conference on Machine Learning, ICML 2020.

[3]

Jean-Bastien Grill, Florian Strub, Florent Altch´e, Corentin Tallec, Pierre H. Richemond, Elena Buchatskaya, Carl Doersch, Bernardo Avila´ Pires, Zhaohan Guo, Mohammad Gheshlaghi Azar, Bilal Piot, Koray Kavukcuoglu, R´emi Munos, and Michal Valko. Bootstrap your own latent - A new approach to self-supervised learning. Annual Conference on Neural Information Processing Systems 2020, NeurIPS 2020.

[4]

Xinlei Chen and Kaiming He. Exploring simple siamese representation learning. CoRR, abs/2011.10566, 2020.

[5]

Yuanmeng Yan, Rumei Li, Sirui Wang, Fuzheng Zhang, Wei Wu, and Weiran Xu. Consert: A contrastive framework for self-supervised sentence representation transfer. CoRR, abs/2105.11741, 2021.

[6]

Tianyu Gao, Xingcheng Yao, and Danqi Chen. Simcse: Simple contrastive learning of sentence embeddings. CoRR, abs/2104.08821, 2021.

[7]

Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. BERT: pre-training of deep bidirectional transformers for language understanding. In Jill Burstein, Christy Doran, and Thamar Solorio, editors, Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, NAACL-HLT 2019, Association for Computational Linguistics, 2019.

[8]

Raia Hadsell, Sumit Chopra, and Yann LeCun. Dimensionality reduction by learning an invariant mapping. In 2006 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR 2006). IEEE Computer Society, 2006.

[9]

Ching-Yao Chuang, Joshua Robinson, Yen-Chen Lin, Antonio Torralba, and Stefanie Jegelka. Debiased contrastive learning. In Hugo Larochelle, Marc’Aurelio Ranzato, Raia Hadsell, Maria-Florina Balcan, and Hsuan-Tien Lin, editors, Advances in Neural Information Processing Systems 33: Annual Conference on Neural Information Processing Systems 2020, NeurIPS 2020.

[10]

Tongzhou Wang and Phillip Isola. Understanding contrastive representation learning through alignment and uniformity on the hypersphere. In Proceedings of the 37th International Conference on Machine Learning, ICML 2020.

[11]

Sumit Chopra, Raia Hadsell, and Yann LeCun. Learning a similarity metric discriminatively, with application to face verification. In 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR 2005), IEEE Computer Society, 2005.

[12]

Florian Schroff, Dmitry Kalenichenko, and James Philbin. Facenet: A unified embedding for face recognition and clustering. In IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2015, IEEE Computer Society, 2015.

[13]

Michael Gutmann and Aapo Hyv¨arinen. Noise-contrastive estimation: A new estimation principle for unnormalized statistical models. In Yee Whye Teh and D. Mike Titterington, editors, Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, AISTATS 2010.

[14]

A¨aron van den Oord, Yazhe Li, and Oriol Vinyals. Representation learning with contrastive predictive coding. CoRR, 2018.

[15]

Zhirong Wu, Yuanjun Xiong, Stella X. Yu, and Dahua Lin. Unsupervised feature learning via nonparametric instance discrimination. In 2018 IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2018. IEEE Computer Society, 2018.

[16]

Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep residual learning for image recognition. In CVPR, 2016.

[17]

Bohan Li, Hao Zhou, Junxian He, Mingxuan Wang, Yiming Yang, and Lei Li. On the sentence embeddings from pre-trained language models. Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing, EMNLP 2020, Online.Association for Computational Linguistics, 2020.

本期责任编辑:冯骁骋

本期编辑:朱文轩


投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

点击上面卡片,关注我呀,每天推送AI技术干货~

整理不易,还望给个在看!
  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》结合了很多工作中的实际案例,图文并茂,既适合渴望了解性能测试的新人,也适合对性能测试有一定认识和经验的中、高级测试工程师。同时,《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》也可以作为高校开展性能测试课程的参考教材,让在校学生能对性能测试的本质和价值有一定的认识。 《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》是一本基于HP LoadRunner 11工具的指导用书,从性能测试原理到工具使用再到项目实施,全面介绍了性能测试的各个方面,其内容基本主线说明如下。 第一步(了解理论):磨刀不误砍柴工,打下基础;第二步(掌握工具):深入介绍LoadRunner 11工具三大部分(Virtual User Generator、Controller、Analysis)如何实现用户行为的模拟、性能指标的监控、负载的生成及后期的数据分析;第三步(项目实施):理论联系实际,介绍性能测试项目实施的流程和性能测试部门的组织管理;第四步(进阶提升):对一些当下流行的或比较特殊的协议和开发技巧通过真实案例进行介绍。 基础篇 第1章 性能测试基础 1.1 性能测试工程师的标准及挑战 1.1.1 性能测试工程师的考评指标 1.1.2 性能测试工程师的挑战 1.2 性能测试基础 1.2.1 性能定义 1.2.2 性能指标 1.2.3 单机与网络性能测试 1.2.4 性能测试的流程 1.2.5 性能测试招聘要求 1.2.6 性能测试学习阶段 1.3 性能分析与调优 1.3.1 性能分析及调优原理 1.3.2 常见系统性能瓶颈 1.3.3 性能测试的注意要点 1.4 小结 工具篇 第2章 LoadRunner综述 2.1 LoadRunner简介 2.2 LoadRunner工具组成 2.3 性能测试原理 2.4 自动化测试工具和性能测试工具的区别 2.5 协议分析 2.5.1 HTTP详细介绍 2.5.2 HTTP报文结构 2.5.3 HTTP请求 2.5.4 HTTP应答 2.5.5 HTTP捕获 2.5.6 HTTP回放 2.6 安装 2.6.1 在Windows下安装LoadRunner 2.6.2 安装Load Generator 2.6.3 附加组件 2.6.4 LoadRunner License 2.7 LoadRunner性能测试操作流程预览 2.8 小结 第3章 用户行为模拟 3.1 VuGen界面介绍 3.1.1 Tree图形化模式 3.1.2 脚本模式 3.1.3 Output Window 3.2 录制用户行为 3.2.1 录制流程 3.2.2 协议选择 3.2.3 录制选项 3.2.4 开始录制 3.2.5 插入命令 3.2.6 结束录制 3.2.7 回放验证 3.2.8 录制回放常见问题 3.3 脚本开发 3.3.1 Action简介 3.3.2 脚本如何注释 3.3.3 语言规则 3.3.4 如何使用模板 3.3.5 脚本的导入导出 3.3.6 脚本调试 3.4 通用选项(General Options) 3.4.1 Parameterization标签 3.4.2 Replay标签 3.4.3 Environment标签 3.4.4 Display标签 3.4.5 Correlation标签 3.5 运行设置(Run-Time Setting) 3.5.1 Run Logic 3.5.2 Pacing 3.5.3 Log 3.5.4 Think Time 3.5.5 Additional attributes 3.5.6 Miscellaneous 3.5.7 Speed Simulation 3.5.8 Browser Emulation 3.5.9 Preferences 3.5.10 Download Filters 3.5.11 Data Format Extensions 3.6 参数化 3.6.1 参数化的操作 3.6.2 Parameter List界面介绍 3.6.3 VuGen中的参数 3.6.4 Controller中的参数 3.6.5 同行取值(Same line as) 3.6.6 参数类型 3.6.7 数据向导(Data Wizard) 3.6.8 参数和变量 3.7 关联 3.7.1 关联原理 3.7.2 自动关联 3.7.3 手动关联 3.7.4 一边录制一边关联 3.7.5 关联函数web_reg_save_param_ex详解 3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 响应时间 3.9.2 添加事务 3.9.3 事务时间 3.9.4 手工事务 3.10 集合点 3.11 小结 第4章 负载生成及监控Controller 4.1 设计场景 4.1.1 新建场景 4.1.2 负载生成器管理 4.1.3 用户管理 4.1.4 运行设置 4.1.5 IP虚拟 4.1.6 场景运行原理 4.1.7 Service Level Agreement(服务品质保障) 4.2 系统监控 4.2.1 Scenario Groups(场景用户状态) 4.2.2 Scenario Status(场景运行状态) 4.2.3 计数器原理 4.2.4 计数器管理 4.2.5 SiteScope 4.3 场景运行 4.4 QTP脚本在场景中的运行 4.5 场景数据 4.6 小结 第5章 数据收集分析Analysis 5.1 新建Analysis分析 5.2 Analysis Summary 5.2.1 Analysis Summary(场景的摘要) 5.2.2 Statistics Summary(场景状态的统计说明) 5.2.3 5 Worst Transaction(SLA失败事务) 5.2.4 Scenario Behavior Over Time(场景行为综述) 5.2.5 Transaction Summary(事务摘要) 5.2.6 HTTP Responses Summary(HTTP响应摘要) 5.3 Graphs(数据图) 5.3.1 Vusers(虚拟用户状态) 5.3.2 Errors(错误统计) 5.3.3 Transactions(事务) 5.3.4 Web Resources(网页资源信息) 5.3.5 Web Page Diagnostics(网页分析) 5.3.6 Network Monitor(网络监控) 5.3.7 Resources(资源监控) 5.4 图设置与操作 5.4.1 Merge Graphs(合并图) 5.4.2 Auto Correlate(自动定位瓶颈) 5.5 Transaction Report(事务报告) 5.6 SLA Report(系统阈值监控报告) 5.7 External Monitor(外部监控数据导入) 5.8 Cross with result(跨脚本横向比较) 5.9 生成测试报告 5.9.1 New Report(新建报告) 5.9.2 Reprt Templates(报告模板) 5.9.3 HTML报告 5.10 小结 实战篇 第6章 性能测试实战 6.1 计划测试 6.1.1 分析系统阶段 6.1.2 定义测试目标 6.1.3 明确定义概念 6.1.4 编写性能测试计划 6.1.5 编写性能测试方案 6.1.6 编写性能测试用例 6.2 搭建测试环境 6.2.1 测试平台评估 6.2.2 数据生成 6.2.3 测试环境搭建手册 6.3 创建脚本 6.3.1 用户注册 6.3.2 用户查询 6.3.3 用户看帖 6.3.4 用户回帖 6.4 创建场景 6.4.1 场景设计 6.4.2 负载监控 6.5 运行场景 6.5.1 场景运行Checklist 6.5.2 场景运行记录 6.6 分析性能数据 6.6.1 性能调优原理 6.6.2 前端性能分析 6.6.3 后端性能分析 6.7 性能测试报告 6.7.1 平台对比性能测试报告 6.7.2 Phpwind85性能分析报告 6.7.3 DiscuzX2 VS Phpwind85性能对比报告 6.7.4 Phpwind85验收指标性能测试报告 6.7.5 Phpwind85压力测试报告 6.8 小结 第7章 性能测试组织 7.1 性能测试团队 7.2 性能测试流程分工 7.3 配置管理 7.4 性能测试自动化 7.5 小结 第8章 高级脚本开发 8.1 AJAX
《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》结合了很多工作中的实际案例,图文并茂,既适合渴望了解性能测试的新人,也适合对性能测试有一定认识和经验的中、高级测试工程师。同时,《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》也可以作为高校开展性能测试课程的参考教材,让在校学生能对性能测试的本质和价值有一定的认识。 《测试实践丛书:性能测试进阶指南·LoadRunner 11实战》是一本基于HP LoadRunner 11工具的指导用书,从性能测试原理到工具使用再到项目实施,全面介绍了性能测试的各个方面,其内容基本主线说明如下。 第一步(了解理论):磨刀不误砍柴工,打下基础;第二步(掌握工具):深入介绍LoadRunner 11工具三大部分(Virtual User Generator、Controller、Analysis)如何实现用户行为的模拟、性能指标的监控、负载的生成及后期的数据分析;第三步(项目实施):理论联系实际,介绍性能测试项目实施的流程和性能测试部门的组织管理;第四步(进阶提升):对一些当下流行的或比较特殊的协议和开发技巧通过真实案例进行介绍。 基础篇 第1章 性能测试基础 1.1 性能测试工程师的标准及挑战 1.1.1 性能测试工程师的考评指标 1.1.2 性能测试工程师的挑战 1.2 性能测试基础 1.2.1 性能定义 1.2.2 性能指标 1.2.3 单机与网络性能测试 1.2.4 性能测试的流程 1.2.5 性能测试招聘要求 1.2.6 性能测试学习阶段 1.3 性能分析与调优 1.3.1 性能分析及调优原理 1.3.2 常见系统性能瓶颈 1.3.3 性能测试的注意要点 1.4 小结 工具篇 第2章 LoadRunner综述 2.1 LoadRunner简介 2.2 LoadRunner工具组成 2.3 性能测试原理 2.4 自动化测试工具和性能测试工具的区别 2.5 协议分析 2.5.1 HTTP详细介绍 2.5.2 HTTP报文结构 2.5.3 HTTP请求 2.5.4 HTTP应答 2.5.5 HTTP捕获 2.5.6 HTTP回放 2.6 安装 2.6.1 在Windows下安装LoadRunner 2.6.2 安装Load Generator 2.6.3 附加组件 2.6.4 LoadRunner License 2.7 LoadRunner性能测试操作流程预览 2.8 小结 第3章 用户行为模拟 3.1 VuGen界面介绍 3.1.1 Tree图形化模式 3.1.2 脚本模式 3.1.3 Output Window 3.2 录制用户行为 3.2.1 录制流程 3.2.2 协议选择 3.2.3 录制选项 3.2.4 开始录制 3.2.5 插入命令 3.2.6 结束录制 3.2.7 回放验证 3.2.8 录制回放常见问题 3.3 脚本开发 3.3.1 Action简介 3.3.2 脚本如何注释 3.3.3 语言规则 3.3.4 如何使用模板 3.3.5 脚本的导入导出 3.3.6 脚本调试 3.4 通用选项(General Options) 3.4.1 Parameterization标签 3.4.2 Replay标签 3.4.3 Environment标签 3.4.4 Display标签 3.4.5 Correlation标签 3.5 运行设置(Run-Time Setting) 3.5.1 Run Logic 3.5.2 Pacing 3.5.3 Log 3.5.4 Think Time 3.5.5 Additional attributes 3.5.6 Miscellaneous 3.5.7 Speed Simulation 3.5.8 Browser Emulation 3.5.9 Preferences 3.5.10 Download Filters 3.5.11 Data Format Extensions 3.6 参数化 3.6.1 参数化的操作 3.6.2 Parameter List界面介绍 3.6.3 VuGen中的参数 3.6.4 Controller中的参数 3.6.5 同行取值(Same line as) 3.6.6 参数类型 3.6.7 数据向导(Data Wizard) 3.6.8 参数和变量 3.7 关联 3.7.1 关联原理 3.7.2 自动关联 3.7.3 手动关联 3.7.4 一边录制一边关联 3.7.5 关联函数web_reg_save_param_ex详解 3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值