Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

news2024/11/30 6:35:32

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11、17、20的内存管理-指针、智能指针和内存池从基础到实战(中)

C11、17、20的内存管理-指针、智能指针和内存池从基础到实战(中)第三章 分配器allocator和new重载1、重载operator的new和delete包括数组如果我们访问的是一个数组2、类成员操作符new重载和放置placement_newplacement new(放置内存&#xff…

并发编程(三)原子性(1)

【认识原子性】: 一个小程序认识原子性: package T05_YuanZiXing;import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class T00_00_IPlusPlus {private …

Android源码相关面试专题

Android源码相关面试专题 1、Android属性动画实现原理 工作原理:在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。 正在上传…重新上传取消 1)ValueAnimato…

Do Transformers Really Perform Bad for Graph Representation?

Do Transformers Really Perform Bad for Graph Representation? 论文中提出了Graphormer,它建立在标准的Transformer架构之上,并且在广泛地图表示学习任务重获得了优异的成绩。同时,作者也提出了一些简单但是有效的结构编码方法来帮助Grap…

【支付宝生态质量验收与检测技术】

如何验收和检测海量的支付宝生态小程序的质量,是一个很重要的课题。本次分享会简单介绍如何通过平台化的方式在小程序入驻环节进行准入验收,以及使用前端自动化测试技术和智能化算法对小程序质量进行检测。希望能对小程序质量的验收和测试提供参考。讲师…

计算机网络-应用层(应用层概述,网络应用模型(C/S模型,P2P模型),DNS域名协议)

文章目录1. 应用层概述2. 网络应用模型3. 域名系统(DNS)1. 应用层概述 应用层概述:应用层对应用程序的通信提供服务。 应用层协议定义: 应用进程交换的报文类型,请求还是响应各种报文类型的语法,如报文中…

分布式锁-简单入门

状态不是很好,记一下以前学过的分布式锁吧。 样例简介 不谈大概念,就是简单入门以及使用。 为什么要用分布式锁呢? 假设我需要一个定时操作,每天在某个点,我要处理一批数据,要先从数据库中查询出来&…

云计算-Hadoop-2.7.7 最小化集群的搭建(3台)

云计算-Hadoop-2.7.7 最小化集群的搭建(3台) 文章目录云计算-Hadoop-2.7.7 最小化集群的搭建(3台)一、环境依赖下载二、部署概要三、hadoop101模板机配置1. 更新 & 升级2. 安装好用的vim VimForCpp3. 安装必要依赖4. 关闭防火…

nginx配置https访问 生成ssl自签名证书,浏览器直接访问

问题 nginx配置自签名ssl证书,来支持https访问nginx,在浏览器中访问nginx时,提示有风险。而访问其他各大网站时,也是使用了https协议,为什么可以直接访问,而不提示有风险呢? 解疑 先从ssl证书…

MyBatis--动态SQL

Emp类 1.if标签 通过test属性中的表达式判断标签中的内容是否有效 (是否会拼接到SQL中) 接口 映射 测试 2.Where标签 where标签的三个作用 若where标签中有条件成立 , 会自动生成where关键字会自动将where标签中内容前多余的and去掉 , 但是其中内容后多余的and无法去掉若where标…

mysql explain和DESC性能分析

mysql explain和DESC 根据执行时间去只可以粗略的判断sql的性能,我们如果想去查看一条sql语句的性能还需要explain去查看sql的执行计划。 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的…

如何做好供应商绩效管理?

供应商绩效管理是一种商业行为,用于衡量、分析和管理供应商的绩效。供应商管理专业人员寻求削减成本,减轻风险并推动持续改进。企业可使用供应商管理系统来监测供应商的绩效水平。 供应商绩效管理最佳实践 所有企业都必须发展核心竞争力,有…

【Linux 网络编程 】

Linux 网络编程背景知识:主机字节序列和网络字节序列IP地址的转换API网络编程接口网络节序与主机节序转换函数IP地址转换函数数据读写TCP编程编程步骤:客户端链接服务端成功的条件多线程实现服务端并发多进程实现服务端并发注意:UDP编程编程步…

自动化测试基础简介(本质)

目录 前言 1.自动化基础 2.分层的自动化测试 2.1 单元自动化测试 2.2 接口自动化测试 2.3 UI自动化测试 3.适合自动化的项目 4.自动化测试模型 4.1线性测试 4.2模块化与类库 4.3数据驱动测试 4.4关键字驱动测试 5.POM设计模式 总结 前言 随着软件系统规模的日益…

应对Redis缓存污染问题,你应该知道这些内容

前言 我们在使用Redis做为缓存时,能加速我们对于热点数据的查询。但是如果缓存中有大量的数据不再热门了,从而占据着大量的内存空间,那么我们的Redis性能就会收到很大影响。该如何解决这个问题呢?本文给你答案。 什么是缓存污染…

kafka开发环境搭建

1 kafka开发环境 1.1 安装Java环境 1.1.1 下载linux下的安装包 登陆网址https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载完成后,Linux默认下载位置在当前目录下的Download或下载文件夹下,通过命令cd ~/…

轻松学习string类常用接口(附模拟实现)

目录 String的常用接口说明(最常用的) string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 string类非成员函数 深浅拷贝 简介:Cstring 是C中的字符串。 字符串对象是一种特殊类型的容器,专门设计来操作的字符序列。 不像…

MySQL 全文检索的实现

微信搜「古时的风筝」,还有更多技术干货 这有朋友聊到他们的系统中要接入全文检索,这让我想起了很久以前为一个很古老的项目添加搜索功能的事儿。 一提到全文检索,我们首先就会想到搜索引擎。也就是用一个词、一段文本搜索出匹配的内容。一般…

Vue3中的组合Api与响应函数

文章目录1. 组合Api介绍setup2. 响应函数2.1 ref2.2 reactive2.3 toRef和toRefs2.4 readonly2.5 customRef1. 组合Api介绍 组合Api其实时用于解决功能、数据和业务逻辑分散的问题,使项目更益于模块化开发以及后期维护。 vue2.x — optionsApi 配置式Api — react类…

STM32 定时器定时计算

STM32 定时器定时计算STM32 定时器频率例子公式referenceSTM32 定时器频率 定时时间 定时器频率 / 倍频 /装载周期 htim1.Init.Prescaler 72-1;htim1.Init.CounterMode TIM_COUNTERMODE_UP;htim1.Init.Period 1*1000*1000;tim 72x10^6 / (72-1)/ 110001000 1us 根据定时…