对比学习的大火🔥 越来越旺了,已然从CV蔓延到NLP了。今天给大家介绍的正是一篇将对比学习应用到文本聚类上的工作,NAACL21新鲜出炉的paper——《Supporting Clustering with Contrastive Learning》。该工作在8个短文本聚类数据集上取得了显著提升(比如正确率提升3%~11%)。
所谓对比学习,重点在于对比,那对比的对象是谁?
答曰:增强的数据。假设如果两个增强句子的原句子一样,那么拉近它们,否则推远它们。
在CV领域,对比学习是和携数据增强一起出道的。给定一张图片,生成不同的变体去增强它,然后用对比思想去学习。NLP领域也如法炮制。给一个句子,使用数据增强去生成和原句子语义相似的句子。比如下面的例子[1]:
如果两个增强句子来自同一个原句子,那么它们是同源的,否则是不同源的。本文发现,利用对比学习的特性,即拉近同源句子、拉远不同源句子,可以解决短文本聚类问题中一个令人头疼的问题——如果学习过程开始时,不同类别在表示空间中就彼此重叠,那么不管怎么学习都很难将各个类别区分开。
下图是原文中对比的原始数据的分布(Original) 和使用聚类(Clustering)模型学习后的分布。
可以看到,Clustering整体效果还不错,但相邻类别黏在一起、无法区分的现象仍然是存在。
而本文发现,使用对比学习(Instance-CL)可以很好地解决该问题。对比学习可以将各个重叠的类别分散开。
更进一步,本文发现将对Instance-CL和Clustering结合(SCCL),不仅可以可以更好地区分不同类别;而且通过显示地拉近同一类的数据的距离,可以促使类内分布更加紧凑,从而达到更优质的聚类效果。
简单讲,本文提出了一个训练框架SCCL,它结合了bottom-up的实例对比学习和top-down的聚类学习,收获了更好的类内距离和类间距离。
论文题目:
Supporting Clustering with Contrastive Learning
论文链接:
https://arxiv.org/pdf/2103.12953.pdf
Arxiv访问慢的小伙伴也可以在 【夕小瑶的卖萌屋】订阅号后台回复关键词 【0422】 下载论文PDF~
对比学习扫盲
对比学习的目标是区分两个实例是否是由同一个源数据采样/增强得来,如果是,让它们在表示空间中越接近;如果不是,让它们在表示空间中远离。 早在2006年,Hadsell等人[2]就提出了通过对比正负例来学习表示的思想,但其真正火起来是始于谷歌在19年提出的SimCLR[3]框架。下图展示了SimCLR中对比学习思想的示例图,可以更加直观理解整个流程。具体来说,对于一个源数据, 使用某种数据增强的方式,给它生成一对增强数据和,然后对它们哥俩进行编码、映射,接着最大化它们的相似度。
对比学习的一个关键点是如何生成增强数据。在CV中,数据增强依赖图片的空间不变性,通过旋转、缩放、裁剪等方式去给图片增强。在NLP领域中,数据增强主要依靠的是语义不变性,常用方法有词汇替换、回译、字面转换、随机噪声注入等等[3]。本文尝试了3种不同的替换方式,分别是:
-
WordNet Augmenter:使用WordNet中的同义词对输入进行替换。 -
Paraphrase via back translation:使用回译的方式生成输入的复述。 -
Contextual Augmenter:对于输入, 利用预训练Transformer找到其中N个候选位置,对其进行插入或替换。
说完了对比学习,接下来我们聊一聊本文是如何使用对比学习及它的效果如何。
SCCL的训练框架
上图展示了SCCL的训练框架,相比以前的聚类方法(蓝色部分),SCCL使用了数据增强,并利用了对比学习去优化增强的数据。相对应的,模型针对Clustering有一个损失函数对源数据进行优化,Instance-CL有一个损失函数对增强数据进行优化。
模型概念了解起来相对简单,就不放公式了。想看公式加深理解的朋友们可以去看原论文。下面看看实验结果如何。
简单的模型,大大的提升
文中使用 ACC(Accuracy)和 NMI(Normalized Mutual Information)两个评价指标来衡量聚类性能。下图展示了SCCL在8个短文本聚类的数据集上的实验结果(几乎完爆所有数据集):
除了大规模的SOTA外,文中还总结了SCCL相比其它模型的优点:
-
训练更简单:SCCL只需要端到端的训练,有的模型(STCC)却需要分多步训练,或者使用了垂直领域的特征进行增强(比如HAC-SD)。 -
对数据噪声更鲁棒:SCCL不需要任何的数据预处理,其它大部分模型都对数据进行了预处理,比如移除停用词、标点符号、小写化处理。
对比学习加在什么阶段?
SCCL模型包含了两个损失函数:一个负责Clustering的优化,一个负责Instance-CL的优化。那么对于有多个损失函数时,是选择pipeline的方式去一个一个训练呢?还是使用jointly训练的方式更好呢?
本文对比了两种方式的区别,并与单独使用其中一个进行对比。下图显示了使用Accuracy作为指标时各个模型的表现:
可以看出,相比单独使用Instance-CL或者Clustering,结合两者使用的两个模型在各个数据集上都取得了提升,而且jointly训练(SCCL)取得的提升一致优于pipeline训练(SCCL-Seq,先训练Instance-CL在训练Clustering)。
数据增强哪家好?
上文提到,本文使用了三种数据增强的方法,那么哪一种最优? 下图展示了三种方法在各个数据集上的实验结果:
整体来讲,Ctxt在各个数据集上的性能都是最好的,也就是说利用预训练Transformer作为增强器是最好的。同时也可看到,有一部分数据集在不同增强方法下表现差别很大,比如SearchSnippers和GooglenewsS,而有一部分的敏感度则较低,比如AgNews、Biomedical和GooglenewsTS。
说明在我们实际使用过程中,到底使用哪种增强方式有效还是需要做做对比实验才晓得。
这里我们接着问一个问题。要是我们使用多个增强器呢?效果会变得更好吗?文中对比了使用1个增强器和2个增强器的区别,以及当选择替换不同比例的源句子时的区别。
上图中蓝色表示使用1个增强器和橘色表示使用2个增强器。可以看出:
-
2个增强器在GoogleNewTS上有轻微的提升,并且没有随着增强数据中被替换词的比例上升而下降; -
stackoverflow上的表现却截然不同,随着替换比例的增高,使用两个增强器反而导致性能大幅度下降。
为了探究原因,文中对比了在不同替换比例和不同增强器下(1个或2个),原始文本和增强文本在训练之初时的cosine相似度:
可以看出,当使用2个增强器(橘色)时,增强文本与原始文本之间的相似度逐渐降低,从而解释了为什么使用2个增强器并不一定能使模型性能变好。
小结一下
本文提出了一种简单、有效的无监督聚类的模型SCCL,在基于距离的聚类方法上,使用逐例对比学习区分不同类别。通过联合优化逐例对比学习的损失和聚类的损失,使得模型在拉开距离的同时保证类内距离更近。SCCL在8个短文本聚类数据集上进行测试,大部分实验结果都取得了SOTA,Accuracy提升了3% ~ 11%,NMI提升了4%~15%,证明了模型的有效性。
最后的最后,大家不妨思考下,为什么聚类+对比学习可以带来如此大的提升呢?小花的理解是,聚类关注高层级的语义概念,而实例对比的研究对象往下渗透了一层,它的目标是让相似的实例距离更近,不同的实例距离更远。将它们结合起来,可以:
-
增加细粒度的对比。 -
数据增强带来了更多的数据,将更多先验知识告诉了模型。 -
顶层抽象和底层细节的结合,就像我们人学习的时候既需要具体案例的学习,又需要抽象理解。二者搭配,效果更佳。
有趣的是,在CV中,对比学习是为了让模型不关注像素细节,学习高级特征来区分不同对象。但是在NLP中却是反过来了,希望模型学习实例级别的特征。
[1].A Visual Survey of Data Augmentation in NLP https://amitness.com/2020/05/data-augmentation-for-nlp/
[2].Dimensionality Reduction by Learning an Invariant Mapping https://cs.nyu.edu/~sumit/research/assets/cvpr06.pdf
[3].A Simple Framework for Contrastive Learning of Visual Representations. https://arxiv.org/pdf/2002.05709.pdf
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Github上这款目标检测神器震撼来袭,真香!08/10
- ♥ 思考 | 深度学习之后会是啥?06/30
- ♥ 深度学习的多个loss如何平衡?05/26
- ♥ 你的模型真的陷入局部最优点了吗?01/03
- ♥ GitHub率先消灭了cookies:与烦人的用户条款说再见07/21
- ♥ 为什么神经网络参数不能全部初始化为全0?05/14
内容反馈