论文阅读Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

论文信息

题目

Sentence Embeddings using Siamese BERT-Networks
使用孪生BERT网络结构的句子嵌入

作者

Nils Reimers, Iryna Gurevych

论文水平

EMNLP 2019

其它

论文下载地址:https://arxiv.org/abs/1908.10084
该论文的相关代码已开源,github链接:sentence-transformers,sentenc-tansformers文档:官方文档
sentenc-tansformers非常好用,封装的很好,使用简单


Abstract

虽然BERT和RoBERTa在很多句子对形式的回归任务(例如文本语义相似度)上达到了SOTA效果,但是它们还存在一些缺点:在这些任务中,它们均需要将比较的两个句子都传入到模型中计算,计算开销过大。BERT模型在一个1W句子集合中,找出最相近的一个句子对,需要5千万次推断计算(约65小时)才能完成,所以BERT并不适合语义相似度搜索等任务。

在该论文中,作者提出了一个新的模型,Sentence-BERT(简称SBERT)。SBERT采用双重或三重BERT网络结构,具体结构介绍会在后文中详细介绍。如果使用的是基于RoBERTa模型,则改造后的模型简称为SRoBERTa。

通过SBERT模型获取到的句子embedding,可以直接通过cos相似度计算两个句子的相似度,这样就大大减少了计算量。因为在使用BERT模型进行句子间相似度的判断时,需要从句子集合中,选出两个句子进行组合,传入BERT中进行计算,而使用SBERT模型,只需要将集合中每个句子单独传入到模型中,得到每个句子的embeding,计算相似度只需要使用cos函数计算两两embeding的cos距离即可。因此,使用BERT/RoBERTa模型需要65h才能完成的寻找最相似句子对任务,SBERT模型完成仅需5s。

作者在一些STS任务和迁移学习任务上评估SBERT模型,该模型达到了新的SOTA水平。


Introduction

SBERT模型可以很好的从语义上表征一个句子,这使得语义越相似的句子在向量空间中的embeding向量距离越近。
这使得SBERT模型可以很好的完成一些BERT不适合完成的任务,例如:大规模语义相似度比较、聚类、通过语义搜索的信息检索等任务。

我们上面提到过,BERT判断两个句子语义是否相似,需要将两个句子拼起来传入到model里,不适合多句子相似度判断。如果从句子数量为n的集合中,找出最近似的两个句子,则需要n*(n-1)/2次比较,并且每次比较均需要传入到BERT模型中进行计算,这个开销是很大的。

目前的一个通用的方法是将语义相近的句子,映射到同一向量空间中相近的位置,通过一个向量来表征整个句子。

BERT惯用的表征一个句子的方式是取第一个[CLS] token的输出或所有输出取平均来表示一个句子,经过试验证明,这些方式经常会产生质量很差的embedding。

为了解决问题,作者提出了SBERT模型,SBERT模型输出的sentence embedding,可直接通过cos距离、欧式距离或曼哈顿距离就可计算出句子间相似度。

与其他的句子表征模型相比,SBERT在很多任务上都取得了SOTA。


Related Work

首先介绍了BERT,然后讨论了一些其他的句子表征模型,例如InferSent、 SkipThought、Universal Sentence
Encoder等,在后面的实验部分,也会与这些模型进行比较。

SBERT基于预训练的BERT改进后的模型,大大减少了训练所需的时间,SBERT经过不到20分钟的微调后,就已超越了很多其他的sentence embedding模型。


Model

SBERT模型采用三种pooling策略:CLSMEANMAX,默认SBERT采用MEAN pooling 。

采用双重或三重网络结构对BERT/RoBERTa进行微调,更新模型参数,使得调整后的模型,产生的句子embedding可直接通过cos计算相似度。

实验的结构和目标函数:

  • 分类目标函数Classification Objective Function
    将句子向量 u u u v v v ∣ u − v ∣ |u-v| uv拼接起来并乘以训练得到的权重 w t ∈ R 3 n × k w_t∈R^{3n×k} wtR3n×k
### 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].
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值