写在前面
大家好,我是刘聪NLP。
早上刷arxiv时,发现一篇通过**「软负样本」** 结合**「双向边际损失」** 的无监督句子嵌入对比学习方法-SNCSE。今天分享给大家,全名《SNCSE: Contrastive Learning for Unsupervised Sentence Embedding with Soft Negative Samples》。
paper:https://arxiv.org/pdf/2201.05979.pdf
介绍
句向量表征技术目前已经通过对比学习获取了很好的效果。而对比学习的宗旨就是拉近相似数据,推开不相似数据,有效地学习数据表征。目前大多数对比学习方法,均利用多种数据增强方法生成正样本,将Batch内其他独立的句子作为负样本,采用InfoNCE loss将正样本拉近,将负样本推开。但是由于目前的数据增强方法,获取的正样本均极为相似,导致模型存在特征抑制,即**「模型不能区分文本相似度和语义相似度,并更偏向具有相似文本,而不考虑它们之间的实际语义差异」** 。为了减轻特征抑制,该论文提出了通过软负样本结合双向边际损失的无监督句子嵌入对比学习方法-SNCSE。其中, 软负样本 ,即具有高度相似,但与原始样本在语义上存在明显的差异的样本。 双向边际损失 ,即通过扩大原始样本与正例和原始样本与软负例之间的距离,使模型更好地学习到句子之间的语义差别。
模型
软负样本的获取
在SNCSE中, 将原始样本的否定内容作为软负样本 。利用Spacy工具对句子进行句子解析,获取句子的句法树、词性标签并标记词干,然后据这些信息,将句子转化为句法正确、语义清晰的否定句。注意:这里的**「否定」** 是通过添加**「否定词」** 的显式否定,而不是词语反义的否定。因为添加否定词的否定,在文本相似度上,与原始样本更相似。
SNCSE结构
受到PromptBERT启发,SNCSE在获取句向量表征时,采用prompt技术,即通过三种不同的模板来表示原始样本、正样本和软负样本,
将特殊标记[MASK]的隐藏状态作为模型的输出向量,并在训练过程中,像SimCSE一样,增加了一个带有tanh激活函数的全连接层对进行变换,得到最终的句子向量,
损失的计算共包含两个部分,对比学习原始 InfoNCE损失 和 双向边际损失 ,如下图所示,利用InfoNCE损失来区分正例和负例,
其中,表示余弦相似度,表示温度因子,表示批次大小。计算原始样本与正例和原始样本与软负例之间的余弦相似差,
定义双向边际损失(bidirectional margin loss,BML)来模拟语义相似度差异,
BML损失的目标是将限制在区间内,其中和分别表示正例和软负例语义相似度的上、下差异。最终,总损失为InfoNCE损失和双向边际损失的加权求和,
实验结果
与SimCSE和ESimCSE的无监督学习保持一致,训练数据是从英语维基百科中随机抽取100万个句子,测试数据为STS12-16、STS-B和SICK-R数据集。通过下表,我们可以看出, SNCSE方法取得了较好地效果 。
总结
SNCSE方法提出来如何在无监督对比学习下,使用负例进行训练,提高模型效果。也就像SimCSE方法在有监督数据下,通过文本蕴含数据的矛盾数据作为难负例相似。
放假ing,但是也要学习。
请多多关注本人知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」**** 私聊,交个朋友吧,一起学习,一起进步** 。**
我们的口号是“生命不止,学习不停”。
往期推荐
ExtraPhrase:一种针对抽象式(生成式)摘要的数据增强方法
