原文链接:https://aclanthology.org/D19-1410.pdf
概述
问题:
BERT和RoBERT模型在进行语义匹配的时候,需要将每个可能的组合都输入到模型中,会带来大量的计算(因为BERT模型对于句子对的输入,使用[SEP]来标记句子间的分隔,然后作为一个句子输入模型)。比如在10000个句子中找到与每个句子最相似的句子对,需要进行5千万次运算,大约65个小时。因此,BERT就不太适合做语义相似查询和一些无监督的任务。
IDEA:
本文作者提出了Sentence-BERT(SBERT),使用孪生网络和三胞胎网络结构来对BERT进行修改,得到可用于计算余弦相似度的sentence embedding。在将相似度匹配精度不变的情况下将其运算时间由65h缩短到5s。(其实这里是因为提前将这10000个句子过完BERT后存储起来,匹配时再将query经过BERT后的向量和这些向量做比较得到相似的结果,可以看作一个离线的效果,实际上两者的运算都是一样的。)
介绍
解决聚类和语义匹配的常见方法是将每个句子map到一个向量空间,使得语义相似的句子靠得更近。将输入句子输入到BERT中得到一个合适的sentence embedding,一般有两种方法:1)对BERT的输出层做一个average;2)使用CLS这个token的embedding。但作者后面实验表示,直接使用这样的结果作为sentence embedding ,效果会比平均GloVe embedding要差。
方法
作者提出的SBERT结构如下,左部分是训练时的结构,右部分是在推理时的结构。
分类目标函数
将sentence embedding u和v以及其差值|u-v|进行concatenate,然后和一个可学习的矩阵Wt进行相乘后进入softmax得到输出,如下所示。这里使用交叉墒损失函数进行优化。
回归目标函数
如上图右部分所示,对sentence embedding u和v直接计算余弦相似度,这里使用均方误差作为目标函数进行优化。
三胞胎目标函数
给定一个句子a(anchor sentence),正例p,负例n。使得a和p之间的距离小于a和n之间的距离,即正例之间的距离越小,负例之间的距离越大。在数学上等价于最小化以下损失函数:
其中S表示sentence embedding,||.||表示距离公示,文中使用欧几里得距离并且偏移量为1
实验
STS上的无监督
STS上的有监督
AFS任务
Wikipedia
使用SentEval进行提升
消融实验
总结
总的来说这个模型其实创新点不大,就是把BERT输出进入一个pooling后计算余弦相似度,文中提到的速度由50h减少到秒级别,也是因为离线的原因(这里其实我也是看别人博客知道的,好像论文正文里面没有提到这个问题?我就寻思明明都是过BERT,咋就快这么多),提前将那10000个句子的embedding存储好,用的时候只需要计算一个query的sentence embedding,然后和那10000个计算相似度,实际运算量并没有减少。(不过大家说这个模型在工业上用处还挺大?而且作者做了很多实验进行对比。)
作者在文中提到一个smart batching strategy,就是将句子长度相似的放到一起,这样padding tokens就能更少一些,计算量就稍稍小一些。
参考文章
Sentence-Bert论文笔记 - 知乎