Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

Sentence-BERT(SBERT)改进了BERT模型,通过孪生网络和三胞胎网络结构,生成适用于计算余弦相似度的sentenceembedding。这种方法在保持高精度的同时,大幅减少了计算时间,从65小时缩短至5秒,特别适用于语义相似度查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接: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论文笔记 - 知乎

### Sentence-BERT概述 Sentence-BERT是一种基于BERT模型的改进方法,旨在高效生成句子级别的语义表示。传统的BERT模型虽然能够捕捉词和子句之间的复杂关系,但在实际应用中通常需要计算两个句子之间所有的token对齐相似度矩阵,这使得其时间复杂度较高[^1]。 为了降低这种计算开销并提高效率,Sentence-BERT引入了一种特殊的架构设计——即Siamese网络结构以及Triplet网络结构。这两种结构允许在训练过程中直接学习到适合于下游任务(如语义相似度比较)的句子嵌入向量[^2]。 具体来说,在Sentence-BERT框架下,输入的一组句子会分别经过同一个预训练好的BERT编码器处理得到各自的隐藏状态表示;随后这些隐藏状态会被进一步聚合成为固定长度的向量形式作为最终的sentence embedding输出[^3]。 ### 句子嵌入生成过程详解 当采用Siamese BERT-network来实现上述目标时,主要涉及以下几个方面: #### 数据准备阶段 对于每一对待比较或者分类标注过的正负样本组合(s₁, s₂),它们将被送入相同的神经网络分支当中共享参数权重wₜ从而获得对应的低维稠密特征表达f(s₁; wₜ), f(s₂ ;wt)[^4] #### 训练损失函数定义 常见的做法是利用余弦距离衡量两句话之间的接近程度,并结合交叉熵或其他对比学习专用的目标优化准则构建整体loss function用于指导整个端到端系统的调整完善工作流程如下所示: \[ L=\sum_{i=1}^{N}-\log \frac{\exp \left(\operatorname{sim}\left(f\left(s_i^+\right), f\left(s_i^-)\right)\right)}{\sum_j \exp \left(\operatorname{sim}\left(f\left(s_i^+\right), f\left(s_j^\prime\right)\right)\right)}} \][^5] 其中\( sim() \) 表达的是某种特定测量方式比如前面提到过的cosine similarity等等. #### 推理预测环节 一旦完成充分迭代后的收敛模型保存下来之后就可以方便快捷地针对新来的测试实例执行前馈操作获取相应高质量的结果了. ```python from sentence_transformers import SentenceTransformer, util # 加载预训练模型 model = SentenceTransformer('all-MiniLM-L6-v2') # 输入句子列表 sentences = ['This framework generates accurate sentence embeddings.', 'Sentence-BERT uses siamese networks to produce these embeddings.'] # 获取句子嵌入 embeddings = model.encode(sentences) print("Embedding shape:", embeddings.shape) ``` 以上代码片段展示了如何使用Hugging Face提供的`sentence-transformers`库加载一个预先训练好Sentence-BERT变体(all-MiniLM-L6-v2),并通过调用`.encode()`方法快速简便地取得给定文本集合相应的数值化描述信息[^6].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值