对比学习在语义表征中的应用:SBERT/SimCSE/ConSERT/ESimCSE复现

本篇博文主要比较目前常用的Sentence Embedding方法,包括双塔模型SBERT,对比学习SimCSE、ConSERT、ESimCSE,这里谈谈论文里的细节,以及本人在中文语料(Chinese-SNLI、Chinese-STS-B)复现后的结果。

 

部分方法在半年前已复现过,但最近研究了sentence_transformers库的源码,发现竟然提供了对比学习的损失函数,在此基础上做二次开发,方便了不少,因此重新改了下代码,做了新的实验,使用用的base model均为macbert base。

1. SBERT

论文链接:《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》

当损失函数是softmax时,论文里提到把u,v,|u-v|拼接起来后接分类层效果是最好的,其实sbert库SoftmaxLoss也是默认采用这种做法,但做inference的时候,sbert还是默认拿mean pooling后的向量做后续相似度计算

  • SBERT采用哪种Pooling策略,论文实现过,MEAN效果是最好的

  • 论文中,Unsupervised STS指用NLI数据集(包括SNLI和MultiNLI)做softmax有监督训练后,在STS中的测试效果,论文中效果如下,下表显示的是在STS test集中的表现

本人用中文语料复现,但只采用了Chinese-SNLI,然后在中文的STS-B上测效果,训练参数为max_len=64,batch_size=64, learning rate=2e-5,保存dev集上表现最好的模型,再用test集做测试。

STS-B devSTS-B test
SBERT(SNLI)0.74400.7241

论文中,Supervised STS,是采用NLI和STSb做有监督训练,其中NLI用softmax损失,STSb用regression损失,然后在STSb test集的效果如下

本人复现只用了STS-B训练集做训练,效果如下

STS-B devSTS-B test
SBERT(STS-B)0.82100.7769

2. SimCSE

论文链接:《SimCSE: Simple Contrastive Learning of Sentence Embeddings》

陈丹奇团队的作品,去年3月份挂在arxiv,被2021年EMNLP接受。

  • alignment和uniformity,SimCSE能在提高uniformity的同时,通过dropout构建的正样本对来避免alignment的下降

  • 论文中,Unsupervised SimCSE是用wiki百科的100W个句子做的,下图是效果,展示的是STS test集

本人复现直接拿STS的数据作为训练语料,试验发现dropout取为0.1、0.2、0.3效果都差不多(最后还是沿用论文里,里,采用0.1),不同于SBERT的mean pooling,用CLS token作为向量更好(论文里是说训练时CLS后接MLM,预测时用CLS的输出作为向量,不过感觉相差不了太多,所以这里实验直接用CLS)

STS-B devSTS-B test
SimCSE0.76550.7191

论文中的Supervised SimCSE是用改造后的NLI数据集训练的,结果如下,本人没有复现这个。

3. ConSERT

论文链接:《ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer》

美团发表在2021年ACL会议的论文,这篇论文主要介绍对比学习应用在NLP语义计算中的通用框架,作为了解对比学习在语义向量中的应用是十分不错的入门文章。

  • 提出四种做positive pair的方式,其中adversarial attack需要结合有监督训练,无监督部分,论文里发现feature cutoff与token shuffling结合是最好的

  • Unsupervised部分如下,不同于SimCSE用wiki百度的语料做无监督,这里的ConSERT直接用STS的语料做无监督训练

在本人复现的过程,实现了shuffle和token cutoff,其中token cutoff用一种近似的方法来实现,原论文代码是在transofrmers库上做的二次开发,cutoff作用在embedding层,而本人复现的时候对某些position的attention mask取为0来近似代替token cutoff,其中cutoff rate=0.15,训练时关闭dropout,复现结果如下

STS-B devSTS-B test
ConSERT0.78350.7248

  • Supervised部分如下,作者发现先joint联合训练(论文中用NLI有监督和STS无监督),然后用Unsupervised微调是效果最好的。

4. ESimCSE

论文链接:《ESimCSE: Enhanced Sample Building Method for Contrastive Learning of Unsupervised Sentence Embedding》

去年9月份挂在arvix上的一篇论文

  • 论文里,首先指出Unsup-SimCSE的一个缺点,模型会倾向认为同样长度的句子对相似度更高,因此,论文提出采用repetition的方式来生成positive pair

为何采用repetition?起码它不会更改语义,如句子““I like this apple because it looks so fresh and I think it”

  • insertion:“I don’t like this apple because but it looks so not fresh and I think it should be dog delicious.”

  • deletion:“I this apple be- cause it looks so and I think it should be.”

  • repetitiion:“I like like this apple because it looks so so fresh and and I think it should be delicious.”

只有repetition没有改变语义。

  • 引入momentum contrast机制,让每个step的负样本能尽可能多,具体的,维护一个队列,这个队列会存储上几个step中出现过的sentence embedding作为当前step的负样本,此外,这个队列中的embedding都用一个momentum encoder来生成,而这个momentum encoder的参数是通过动量更新的,这样的好处是,每轮新加入队列的embedding差异都尽可能少?

  • 论文结果如下,dup_rate=0.32效果最好,队列大小也不能太大,取为batch_size的2.5倍是最好的

本人复现时,batch_size=50,dup_rate=0.32,队列大小q=150

STS-B devSTS-B test
ESimCSE0.78820.7181

5. 总结

最后,用一张表把效果罗列一起,

STS-B devSTS-B test
SBERT(SNLI)0.74400.7241
SBERT(STS-B)0.82100.7769
SimCSE0.76550.7191
ConSERT0.78350.7248
EsimCSE0.78820.7181

个人体会是

  • 实质上,没有一种对比学习的方法能超过SBERT直接用sbs数据集做fine tuning的效果,那些说超过supervised SBERT的论文其实只是跟用NLI数据集做训练的SBERT来比较的。因此可以看到,有监督训练还是王道呢~

  • 最后,没有所谓的SOTA,要明白论文及复现里的测试集都是STS,而落到实际业务中,每一个场景都有自己的特点,应该根据场景的特点去制作positive pair和思考怎么做hard negative样本,以及选择何种训练方法,当制作的数据集和训练方法越接近任务时,模型的效果自然越好。

复现参考:

  1. https://github.com/UKPLab/sentence-transformers

  2. https://github.com/yym6472/ConSERT

  3. https://github.com/xianghuisun/nlp-basictasks/blob/main/STS-B.ipynb

  实验代码全部汇总在:

           https://github.com/zhoujx4/NLP-Series-sentence-embeddings

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值