英文题目:SimCSE: Simple Contrastive Learning of Sentence Embeddings
中文题目:SimSCE:用简单的对比学习提升句嵌入的质量
论文地址:https://export.arxiv.org/pdf/2104.08821.pdf
领域:自然语言处理,对比学习
发表时间:2021.04
作者:Tianyu Gao, 普林斯顿大学,清华大学
出处:EMNLP
被引量:83
代码和数据:https://github.com/princeton-nlp/SimCSE
阅读时间:2022.09.18
(周五同事分享,简单整理笔记)
主要用于提升句嵌入的质量。方法很简单,利用BERT模型本身的dropout性质,通过同一输入输出不同嵌入作为正例对,然后取同一batch下的反例对训练模型。
自监督学习主要包含:生成式,对比式,对抗式。其中的对比学习原理是:利用无监督数据,通过巧妙的方法构造正例/反例(一般是一个正例对应多个反例),训练模型,让正例距离足够近,反例距离足够远,以利用无监督数据,进行更好地表示(表征)。
一般设计包含三部分:构造正/负例;优化损失函数;调整模型编码器。
评价对比学习的质量有两个关键指标:alignment和uniformity。其中alignment指的是正例中数据对表示的一致性:
uniformity指的是嵌入空间分布的均匀性:
其中Pdata指空间中所有实例。也就是说正例距离越近越好,而随机采样的数据对的距离应该分布在超球体表面。
之前生成近似正例的方法有:随机增删,近义词替换,交换词序等。本文利用 BERT 模型本身包含 dropout,这样同一个句子两次送入模型,由于随机dropout,最终的编码也不同。用这种方法作为数据增强,生成对比学习中的正例对,使用同一batch中的其它实例作为反例。损失函数定义如下:
表-1对比了文中方法和其它常用方法(删词,剪切),在同义句子匹配STS-B任务中的效果:
图-2把损失拆分成alignment和uniformity,位置处于左下角时效果最好(两个loss都小);可以看到随着迭代训练损失的变化(箭头方向),其中红色线为SimSCE在两个评测方向的变化相对最好。
文中还研究了SimSCE对比学习如何利用有监督学习的数据来提升模型的表现力。具体使用自然语言推理任务(NLI)数据,NLI用以判断两个句子的关系是:蕴含、中性或矛盾。利用训练集中的标注信息产生对比学习中的正/负例。
选择标注数据
为对比 NLI 的提升效果,先探索了一些构造正例的方法:
将矛盾关系对作为硬负例
为了更好利用NLI数据集,利用标注为矛盾的实例,生成硬负例,并修改了损失函数,实验证明了它的有效性:
可以看到,这里硬负例被充分利用(被计入了N次),图-4展示了实验结果:
为了公正的对比,sample列只采样了134k正例来训练模型。可以看到不同任务训练的模型对 STS-B 效果的提升。
各向异性意思是所有向量都被映射在了一个“狭窄”的高维空间。而uniformity是评价所有实例在向量空间中是否均匀分布,SimCSE在uniformity方面提升,也改善了自然语言编码的各向异性问题。
图-3对比了目前各种流行模型的alignment和uniformity:
主实验使用句子相似度任务,在有监督和无监督两方面,对比了不同方法的效果:
可以看到SimSCE效果已超过了目前业界使用最为广泛SBERT(挛生网络)模型。