- 文献阅读:SimCSE:Simple Contrastive Learning of Sentence Embeddings
- 1. 文献内容简介
- 2. 主要方法介绍
- 3. 主要实验介绍
- 1. STS Experiment
- 2. Downsteam Experiment
- 4. 讨论
- 1. loss function考察
- 2. 其他正例构造方式考察
- 3. 消解实验
- 5. 结论 & 思考
文献链接:https://arxiv.org/abs/2104.08821v2
1. 文献内容简介
这篇文章将对比学习引入到了sentence embedding的学习过程当中。
主要思路感觉还是接着之前的SentenceBert一脉相承的(这部分内容我之前也写过一个小博客《文献阅读:Sentence-BERT:Sentence Embeddings using Siamese BERT-Networks》进行过介绍),主体还是使用的Bert或者Roberta模型,但是不同于sentence bert的截断迁移,这里采用的方式是通过引入对比学习来直接对sentence embedding进行学习,从而达到一个更好的效果。
2. 主要方法介绍
如前所述,这里的核心方法在于引入度量学习从而可以直接对sentence embedding进行学习。
不过这样的方法带来的问题在于说数据的准备,对比学习需要在数据上准备好正负例,但是这个缺乏直接的训练数据。
比较标准的范式就是自己去通过一些简单的方法来构造一些伪正负例,比如说删词、加词、换序、双向翻译这类比较常规的操作,但是这篇文章里面提出了一种新型的正负例构造的方式,也就是标题中所说的SimCSE方法。
其思路异常的简单,就是同一条数据过两次模型,由于dropout的随机性导致两个计算结果会有一定的不一致,然后将这两个结果作为正例对,而batch当中的其他所有的结果作为负例对,从而就完成了正负例的构建,然后就可以进行计算了。
3. 主要实验介绍
1. STS Experiment
这部分实验主要就是考察sentence embedding的直接表现。考察方式和之前几篇文献的方法一致,就是考察一下STS数据集在spear correlation的性能表现,得到结果如下:
可以看到,基本就是碾压局,而且提升的点还挺多的。
2. Downsteam Experiment
另一方面,SimCSE finetune之后得到的模型在下游分类任务当中的性能表达也不错。
该文献同样在下游一些分类任务当中的结果如下:
可以看到,即使放到下游任务当中,SimCSE依然可以得到很好的性能表现。
4. 讨论
但是,虽然上述实验结果显示SimCSE方法在结果上展现了很高的优越性,但是其何以如此优秀依然是一个值得讨论的问题。
对此,文献中也进行了一定的考察。
1. loss function考察
首先,考察文献中对于loss function的定义,其具体的表达式如下:
这个loss function的定义事实上就我所知算是现阶段对比学习比较惯用的一个定义了,文献中对于这个公式的有效性方面进行了一定的讨论。
具体而言,上述loss函数可以展开为:
其中,前者可以用于保证alignment,即正例之间的相似性,而后者则可以用于保证uniformity,即正例与负例之间的相异性以及在整个表示空间当中embedding的分布均匀性。
而实际在结果的表现当中,文献中也给出了不同方法在alignment以及uniformity的性能表达如下:
可以看到,SimCSE在alignment以及uniformity方面是比较均衡的。
2. 其他正例构造方式考察
但是,如前所述,这个loss函数的定义事实上算是对比学习的常用定义了,并不算什么新颖的东西,该文献最新颖的技术点还是在于两次dropout的正例对的定义方式,但是,这样的构造方式是否真的较之其他的实验方法会更有效呢?
文中同样给出了不同的正例构造方式下模型在STS数据集下的性能表达,具体如下表所示:
可以看到,较之其他的整理构造方式,SimCSE同样具有更好的性能表达。
3. 消解实验
最后,文献还做了一些消解实验来看一下一些基础的因子对实验结果的影响,具体如下两表所示:
不过整体而言,上述内容显示batch size、MLM以及sentence embedding的选择方面都会对结果产生一定的影响,但是影响事实上都不是特别显著,唯一值得一提的可能就是batch size,其大小选择需要保持适中,不要太大也不要太小。
5. 结论 & 思考
这篇文献对我而言最大的意义在于提供了一种新型的表征学习的方式,以及在缺乏优质的标注数据的情况下进行自监督学习的方式,在如今数据为王的时代下,能够有效的扩展并利用好数据无疑有着巨大的意义。
因此,我也是在推荐场景下借鉴上文的思路进行了一些实验,值得一提的是,在看文献的时候事实上我就存在着一个疑问,即我不奇怪SimCSE能够学到很好的uniformity,但是对于alignment的学习我始终抱有一定的疑惑,因为事实上他的正例对是通过dropout进行构建的,本质而言都是他自己,仅在参数上进行了生成靠近,但是这无法学习到跨输入的相似性,对于两个相似的句子,只能通过全局的loss最小化的方式进行间接的学习。
因此,我事实上对于上文能够在alignment方面获取较好的效果是比较惊讶的,实际进行实验之后发现,如果直接从0开始训练,上文的方式在alignment方面确实效果不佳,尽在uniformity方面获得了较好的性能表达,但是,如果基于已经pretrain之后的模型在进行finetune,上述问题看起来似乎是可以解决的,至少在我这边的实验结果,看起来无论是本身的embedding表达还是在下游的recall以及ranker模型当中,都超越了之前的baseline,似乎还是可以的。