本篇博文主要比较目前常用的Sentence Embedding方法,包括双塔模型SBERT,对比学习SimCSE、ConSERT、ESimCSE,这里谈谈论文里的细节,以及本人在中文语料(Chinese-SNLI、Chinese-STS-B)复现后的结果。
部分方法在半年前已复现过,但最近研究了sentence_transformers库的源码,发现竟然提供了对比学习的损失函数,在此基础上做二次开发,方便了不少,因此重新改了下代码,做了新的实验,使用用的base model均为macbert base。
论文链接:《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》
当损失函数是softmax时,论文里提到把u,v,|u-v|拼接起来后接分类层效果是最好的,其实sbert库SoftmaxLoss也是默认采用这种做法,但做inference的时候,sbert还是默认拿mean pooling后的向量做后续相似度计算
本人用中文语料复现,但只采用了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 |
论文链接:《SimCSE: Simple Contrastive Learning of Sentence Embeddings》
陈丹奇团队的作品,去年3月份挂在arxiv,被2021年EMNLP接受。
本人复现直接拿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数据集训练的,结果如下,本人没有复现这个。
论文链接:《ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer》
美团发表在2021年ACL会议的论文,这篇论文主要介绍对比学习应用在NLP语义计算中的通用框架,作为了解对比学习在语义向量中的应用是十分不错的入门文章。
在本人复现的过程,实现了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 |
论文链接:《ESimCSE: Enhanced Sample Building Method for Contrastive Learning of Unsupervised Sentence Embedding》
去年9月份挂在arvix上的一篇论文
为何采用repetition?起码它不会更改语义,如句子““I like this apple because it looks so fresh and I think it”
只有repetition没有改变语义。
本人复现时,batch_size=50,dup_rate=0.32,队列大小q=150
STS-B dev | STS-B test | |
---|---|---|
ESimCSE | 0.7882 | 0.7181 |
最后,用一张表把效果罗列一起,
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 |
个人体会是
复现参考:
实验代码全部汇总在:
https://github.com/zhoujx4/NLP-Series-sentence-embeddings
如果觉得有用,就请分享到朋友圈吧!
你好,我是对白,清华计算机硕士毕业,现大厂算法工程师,拿过8家大厂算法岗SSP offer(含特殊计划),薪资40+W-80+W不等。
高中荣获全国数学和化学竞赛二等奖。
本科独立创业五年,两家公司创始人,拿过三百多万元融资(已到账),项目入选南京321高层次创业人才引进计划。创业做过无人机、机器人和互联网教育,保研清华后退居股东。
我每周至少更新三篇原创,分享人工智能前沿算法、创业心得和人生感悟。