simcse实战再思考
最近使用simcse在自己的关键词抽取任务上实战,得到一些新的感悟和问题,暂时记录如下
前言
众所周知,直接用BERT句向量做无监督语义相似度计算效果会很差,任意两个句子的BERT句向量的相似度都相当高,其中一个原因是向量分布的非线性和奇异性,前不久的BERT-flow通过normalizing flow将向量分布映射到规整的高斯分布上,更近一点的BERT-whitening对向量分布做了PCA降维消除冗余信息,但是标准化流的表达能力太差,而白化操作又没法解决非线性的问题,有更好的方法提升表示空间的质量吗?
丹琦女神的simcse论文提供了解决方案。而本篇论文就将对比学习的思想引入了SBERT,大幅刷新了有监督和无监督语义匹配SOTA,更让人惊叹的是,无监督SimCSE的表现在STS基准任务上甚至超越了包括SBERT在内的所有有监督模型。
关于simcse的更多细节,可以参考下面的链接
- 文本表达进击:从Bert-flow到Bert-white、SimCSE。
- SimCSE: Simple Contrastive Learning of Sentence Embeddings
- 超细节的对比学习和SimCSE知识点
- SimCSE论文解读
实战中的感悟
最近做的关键词抽取任务,大致思路如下图所示
主要步骤如下
- 文档分词并标记词性
- 将文档送进预训练模型(如bert)中学习嵌入向量
- 根据词性规则抽取候选关键词。候选关键词采用每个token的向量平均获得候选关键词的向量
- 分别做全局和局部相似度,然后计算得分
在面对短文本时,发现bert比simcse的效果更好
因为bert最大编码是512个token,而有些单词可能算两三个token,所以bert最大编码在420个左右的单词。因此在面对长文本时。我采取了分段的操作,即将前面一段和后面一段分别送进预训练模型中。这时发现采用simcse比bert好了4个点左右。这是一个非常大的提升。
思考
- 为什么分段时用simcse更好,难道就是因为simcse尽量解决了bert向量分布的非线性和奇异性
更好,难道就是因为simcse尽量解决了bert向量分布的非线性和奇异性 - 但是在短文本,也就是一个bert可以编码的范围内,采用bert比simcse效果更好一点点