本篇博文主要比较目前常用的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集做测试。
论文中,Supervised STS,是采用NLI和STSb做有监督训练,其中NLI用softmax损失,STSb用regression损失,然后在STSb test集的效果如下
本人复现只用了STS-B训练集做训练,效果如下
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)
论文中的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,复现结果如下
- Supervised部分如下,作者发现先joint联合训练(论文中用NLI有监督和STS无监督),然后用Unsupervised微调是效果最好的。