本篇博文主要比较目前常用的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》
- SBERT采用哪种Pooling策略,论文实现过,MEAN效果是最好的
当损失函数是softmax时,论文里提到把u,v,|u-v|拼接起来后接分类层效果是最好的,其实sbert库SoftmaxLoss也是默认采用这种做法,但做inference的时候,sbert还是默认拿mean pooling后的向量做后续相似度计算
- 论文中,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 dev | STS-B test | |
---|---|---|
SBERT(SNLI) | 0.7440 | 0.7241 |
论文中,Supervised STS,是采用NLI和STSb做有监督训练,其中NLI用softmax损失,STSb用regression损失,然后在STSb test集的效果如下
本人复现只用了STS-B训练集做训练,效果如下
STS-B dev | STS-B test | |
---|---|---|
SBERT(STS-B) | 0.8210 | 0.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 dev | STS-B test | |
---|---|---|
SimCSE | 0.7655 | 0.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 dev | STS-B test | |
---|---|---|
ConSERT | 0.7835 | 0.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 dev | STS-B test | |
---|---|---|
ESimCSE | 0.7882 | 0.7181 |
5. 总结
最后,用一张表把效果罗列一起,
STS-B dev | STS-B test | |
---|---|---|
SBERT(SNLI) | 0.7440 | 0.7241 |
SBERT(STS-B) | 0.8210 | 0.7769 |
SimCSE | 0.7655 | 0.7191 |
ConSERT | 0.7835 | 0.7248 |
EsimCSE | 0.7882 | 0.7181 |
个人体会是
- 实质上,没有一种对比学习的方法能超过SBERT直接用sbs数据集做fine tuning的效果,那些说超过supervised SBERT的论文其实只是跟用NLI数据集做训练的SBERT来比较的。因此可以看到,有监督训练还是王道呢~
- 最后,没有所谓的SOTA,要明白论文及复现里的测试集都是STS,而落到实际业务中,每一个场景都有自己的特点,应该根据场景的特点去制作positive pair和思考怎么做hard negative样本,以及选择何种训练方法,当制作的数据集和训练方法越接近任务时,模型的效果自然越好。
复现参考:
- https://github.com/UKPLab/sentence-transformers
- https://github.com/yym6472/ConSERT
- https://github.com/xianghuisun/nlp-basictasks/blob/main/STS-B.ipynb
实验代码全部汇总在:
https://github.com/zhoujx4/NLP-Series-sentence-embeddings
如果觉得有用,就请分享到朋友圈吧!
你好,我是对白,清华计算机硕士毕业,现大厂算法工程师,拿过8家大厂算法岗SSP offer(含特殊计划),薪资40 W-80 W不等。
高中荣获全国数学和化学竞赛二等奖。
本科独立创业五年,两家公司创始人,拿过三百多万元融资(已到账),项目入选南京321高层次创业人才引进计划。创业做过无人机、机器人和互联网教育,保研清华后退居股东。
我每周至少更新三篇原创,分享人工智能前沿算法、创业心得和人生感悟。