对比学习

1,195 阅读13分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

SimCSE: Simple Contrastive Learning of Sentence Embeddings


论文作者: Tianyu Gao, Xingcheng Yao, Danqi Chen(陈丹琦)

论文链接: arxiv.org/abs/2104.08…

代码链接: github.com/princeton-n…

文本增广是什么牛马:我只需要两次dropout

该文将对比学习的思想引入了sentence embedding,刷爆了无监督与有监督语义相似度计算任务SOTA,是一篇非常难得的高水平论文。已有多方大佬进行解读,仅做简单笔记和其他大佬对该任务的探索,为自己的idea扩宽思路。

大佬解读记录:

夕小瑶:mp.weixin.qq.com/s/BpbI_S9lX…

本文提出了一个简单的对比学习的框架,SimCSE,用于学习句子表示。文中提出dropout+对比学习和NLI+对比学习,都非常有利于句子表示的学习。SimCSE大幅刷新STS任务榜单,取得了新一轮的SOTA。明明是我们习以为常的dropuout和早就熟悉透了的的NLI数据,但是本文的作者们却能从一个全新的角度看待它们,将它们与比学习建立联系,取得非常显著的提升,并合理地解释为什么work。

知乎解读:zhuanlan.zhihu.com/p/368353121

b站视频解读:www.bilibili.com/video/BV1oQ…

苏建林大佬在中文任务上的实验:www.spaces.ac.cn/archives/83…

先介绍一下对比学习,对比学习为什么work

对比学习

什么是对比学习

对比学习的入门资料参考中科院应用数学所管他叫大靖的知乎文章《对比学习入门 A Primer on Contrastive Learning》。

监督对比学习

监督对比学习是一种机器学习技术,通过同时教模型哪些数据点相似或不同,来学习数据集的一般特征。监督对比学习是一种监督学习方法,对样本质量要求较高。相比于一般监督学习,监督对比学习通常能获得更好的效果,下方视屏可视化了监督对比学习的过程。

此处为语雀视频卡片,点击链接查看:视频

在大多数实际场景中,我们没有为每个样本添加标签。以医学成像为例,获取样本的难度很大,为了创建标签,专业人士不得不花费无数的时间来手动分类、分割图像。虽然生成带有干净标签的数据集是昂贵的,但是我们时时刻刻都在生成大量的未标记的数据。自监督学习是让我们能够从这些未标记的数据中学习知识的一种方法。要利用这些大量的未标记数据,一种方法是适当地设定学习目标,以便从数据本身获得监督。

在NLP中,word2vec, Mask Language Model就是典型的自监督学习。在CV中也有很多自监督学习的例子,比如:将一张图片切成小的blocks,预测blocks之间的关系、将小的blocks拼图成原图等。

自监督学习

自监督对比学习和监督对比学习整体上是相似的,不同之处在于:自监督对比学习通过数据增强来构建有标签的样本,而监督对比学习的有人工标注的对比样本。

因此,自监督对比学习的核心和难点是构建优质的对比样本。在CV中,一般通过剪切、旋转、高斯噪声、遮掩、染色等操作生成正样本。在NLP中一般通过回译、对字符的增、删、改来添加噪声,从而生成正样本。由于文本的离散性质,一般较难生成好的标签不变的增强样本。

如何使用对比样本pair进行正确分类呢?这就要用到自监督对比损失函数

其中 是encoder函数,将样本映射到低维空间或低维球表面。 是正样本对, 是从样本分布 中采样的样本, 个负样本对。

对比损失会使学习的positive pair的特征相互靠近(pull),同时将来自随机采样的negative pair的特征推开(push)。在下面对齐性和均匀性那一节,我们会具体介绍contrastive loss的性质。

contrastive loss 和 softmax loss有什么关系呢? 从而有:

这不就是一个 的多分类问题么, 要从 个类别中识别出正确的那一个类别 ,即自己所在的类别。与softmax不同,对于每一个样本 这里的 都是不同的。

Alignment(对称性) : 一个正对的两个样本应该映射成近邻特征向量,并且特征对于噪声因子是不变的。

Uniformity(均匀性) : 特征向量应大致均匀地分布在单位超球面 上,并尽可能保留多的数据信息。

AlignmentUniformitysoftmax loss这篇文章中的intra-class compactness and inter-class separability是一致的,并不是一个新的概念,但这篇文章给了这两个概念更加数学化的表达,并证明了它们是可以实现的。

对比学习为什么work

关于对比学习为什么work可以参考ICML2020年的paper《Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere

文中指出,对比学习有用,主要是因为它优化了两个目标:

  1. 正例之间表示保持较近距离。
  2. 随机样本的表示应分散在超平面球上。

并提出这两个目标分别用alignmentuniformity来衡量。


alignment: 计算正例对之间的向量距离的期望

越相似的样例之间的alignment程度越高。因为alignment使用距离来衡量,所以距离越小,表示alignment的程度越高。


uniformity:评估所有数据的向量均匀分布的程度,越均匀,保留的信息越多

可以想象任意从表示空间中采样两个数据x和y, 希望他们的距离比较远。他们的距离越远,证明空间分布越uniform。所以uniformity的值也是越低越好。

SimCSE也采用这两个指标来衡量生成的句子向量,并证明了文本的语义空间也满足:alignment值越低且uniformity值越低,向量表示的质量越高,在STS任务上的Spearman相关系数越高

个人理解:SimCSE也满足语义空间,就和词向量/KGE一样都是通过一种抽象空间的距离期望来生成embedding,证明在语义空间上寻求距离和分布的想法是一种行之有效的可解释方式。

SimCSE

SimCSE有两个变体:Unsupervised SimCSESupervised SimCSE,主要不同在于对比学习的正负例的构造。下面详细介绍下他们的构造方式。

无监督SimCSE

Unsupervised SimCSE 引入dropout给输入加噪声,假设加噪后的输入仍与原始输入在语义空间距离相近。其正负例的构造方式如下:

正例:给定输入,用预训练语言模型编码两次得到的两个向量作为正例对。

负例:使用in-batch negatives的方式,即随机采样一个batch中另一个输入作为的负例。

训练目标函数:

下图展示了Unsupervised SimCSE的样例:

如何生成dropout mask?

对于Unsupervised SimCSE,核心在于如何生成dropout mask。刚开始读完一遍的时候,惊叹原来dropout可以这么用,效果提升还挺大。原文如下:

In other words, we pass the same input sentence to the pre-trained encoder twice and obtain two embeddings as “positive pairs”, by applying independently sampled dropout masks。

作者解释:因为BERT内部每次dropout都随机会生成一个不同的dropout mask。所以SimCSL不需要改变原始BERT,只需要将同一个句子喂给模型两次,得到的两个向量就是应用两次不同dropout mask的结果。然后将两个向量作为正例对。(真的simple)

有监督SimCSE

本文还提出Supervised SimCSE,利用标注数据来构造对比学习的正负例子。为探究哪种标注数据更有利于句子向量的学习,文中在多种数据集上做了实验,最后发现NLI数据最有利于学习句子表示。下面以NLI数据为例介绍Supervised SimCSE的流程。

Supervised SimCSE 引入了NLI任务来监督对比学习过程。该模型假设如果两个句子存在蕴含关系,那么它们之间的句子向量距离应该较近;如果两个句子存在矛盾关系,那么它们的距离应该较远。因此NLI中的蕴含句对和矛盾句对分别对应对比学习中的正例对和负例对。所以在Supervised SimCSE中,正负例的构造方式如下:

正例:NLI中entailment关系样例对。负例:a) in-batch negatives b)NLI中关系为contradiction的样例对。

训练目标:

实验结果

Dropout优于传统数据增强?

下图中对比了使用Unsupervised SimCSE (第一行None)和常见的数据增强方法在STS-B验证集上的Spearman's Correlation。其中crop k%表示随机减掉k%长度的span,word deletion表示随机删除k%的词,delete one word只删除一个词,MLM 15%表示用随机替换掉15%的词。上表中所有dropout的方法的dropout的比例都是0.1。(因为文中对比了不同比例的dropout,p=0.1效果最好。)

实验结果很明显的可以看出,SimCSE是远超其余数据增强方法的。小花的理解是传统数据增强的方法是对原始输入直接进行改变,在编码后,增强的数据与原始数据在语义空间的距离是不是要比直接用dropout的方式要远。

Dropout与对比学习的关系

为了理解dropout为什么work,作者可视化了不同方法下alignment和uniformity在训练过程中的变化趋势。

上图中对比了在不同数据增强/dropout方式下,在训练过程中的变化方向(每训练10步采样一次)。Fix 0.1表示p=0.1时,两次使用相同dropout mask。对于Fixed 0.1和No dropout来讲,正例对的句子表示是完全相同的,

可以看到随着训练步数增加,Unsup. SimCSE的平稳地递减。虽然降低的趋势却不明显,但其初始化的值就相对较低。上图进一步验证了SimCSE有效的原因是,它可以让alingnment和uniformity的值逐渐降低。

语义文本相似效果如何?

SimCSE在STS(语义文本相似)任务上进行了评估。评价指标是 Spearman's correlation。

表格中对比了各种建模句子向量的方法,包括简单的对Glove向量取平均,到前不久的SOTA:BERT-Flow和BERT-Whitening。可以看到,在各种编码器和有无监督模式下,SimCSE都取得了显著的提升。比如无监督时,BERT-base 和RoBETa-Base与BERT-Whitening相比,Avg. 分别提升了7.96%和14.77%。

此外,作者还对比了不同句子表示模型下与他们在STS任务上的结果:

可以看出:

  • Avg.BERT模型的较低,但较高;
  • 相反,对BERT表示进行后处理的BERT-flow和BERT-whitening的较低,但是却很高;
  • Unsup.SimCSE和SimCSE的两个值都是较低的,他们的STS的结果也更好。

说明需要结合使用,只有当二者的值都比较低时,模型学习到的句子向量表示才最适合STS任务。


迁移学习效果

除了STS任务上的评估外,本文还将训练好的句子向量迁移到7个任务上。

迁移学习上的SimCSE并没有展现出明显的优势。作者的解释是句子级别的训练目标并不能直接有利于迁移学习。为了让迁移学习效果更好,文中还是尝试将MLM损失和对比学习损失一起训练,取得了少量的提升(上表中标有w/MLM的行)。

开源情况

代码链接: github.com/princeton-n…

文中的预训练语言模型已经整合到了HuggingFace中,可以像BERT模型那样,直接通过API调用模型。

from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")
model = AutoModel.from_pretrained("princeton-nlp/sup-simcse-bert-base-uncased")

苏神在中文任务上的实验

以下内容来源苏神博客:kexue.fm/archives/83…

苏神 受到BERT-flow的启发,构思了成为“BERT-whitening”的方法,并一度成为了语义相似度的新SOTA,Arxiv上出现了至少有两篇结果明显优于BERT-whitening的新论文。第一篇是《Generating Datasets with Pretrained Language Models》,这篇借助模板从GPT2_XL中无监督地构造了数据对来训练相似度模型,个人认为虽然有一定的启发而且效果还可以,但是复现的成本和变数都太大。另一篇则是本文的主角《SimCSE: Simple Contrastive Learning of Sentence Embeddings》,它提出的SimCSE在英文数据上显著超过了BERT-flow和BERT-whitening,并且方法特别简单~

那么,SimCSE在中文上同样有效吗?能大幅提高中文语义相似度的效果吗?苏神做了补充实验。开源地址: https://github.com/bojone/SimCSE

苏神实验结果:

其中每个单元的数据是"a/b/c"的形式,a是不加任何处理的原始结果,b是BERT-whitening的结果(没有降维),c则是SimCSE的结果,如果c > b,那么c显示为绿色,否则为红色,也就是说 绿色越多 ,说明 SimCSE比BERT-whitening好得越多

从实验结果可以看出,除了PAWSX这个“异类”外,SimCSE相比BERT-whitening确实有压倒性优势,有些任务还能好10个点以上,在BQ上SimCSE还比有监督训练过的SimBERT要好,而且像SimBERT这种已经经过监督训练的模型还能获得进一步的提升,这些都说明确实强大。(至于PAWSX为什么“异”,文章《无监督语义相似度哪家强?我们做了个比较全面的评测》已经做过简单分析。)

同时,我们还可以看出在SimCSE之下,在BERT-flow和BERT-whitening中表现较好的first-last-avg这种Pooling方式已经没有任何优势了,反而较好的是直接取[CLS]向量,但让人意外的是,Pooler(取[CLS]的基础上再加个Dense)的表现又比较差,真让人迷惘~

由于BERT-whiteing只是一个线性变换,所以笔者还实验了单靠SimCSE是否能复现这个线性变换的效果。具体来说,就是固定Encoder的权重,然后接一个不加激活函数的Dense层,然后以SimCSE为目标,只训练最后接的Dense层。结果发现这种情况下的SimCSE并不如BERT-whitening。那就意味着,SimCSE要有效必须要把Encoder微调才行,同时也说明BERT-whitening可能包含了SimCSE所没有东西的,也许两者以某种方式进行结合会取得更好的效果

在学习对比学习的过程中又看到了苏神的新文章:
苏神新工作: SimBERTv2来了!融合检索和生成的RoFormer-Sim模型
SimBERT=BERT+UniLM+对比学习
RoFormer-Sim=RoFormer+UniLM+对比学习+BART+蒸馏