sentence Bert解读及代码示例

news2025/1/15 20:35:19

0-前序

Bert已经是相当6了,但在STS(语义文本相似性)任务中,需要将两个句子都输入到网络中,也就是说要过模型,这样计算量就大了。如下是文本相似性,并不是语义。

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
inputs1 = tokenizer('今天的天气真好啊,暖和和的', return_tensors='pt')
inputs2 = tokenizer('今天天气真暖和啊', return_tensors='pt')
inputs3= tokenizer('今天天气真差劲啊', return_tensors='pt')
outputs1 = model(**inputs1)
outputs2 = model(**inputs2)
outputs3 = model(**inputs3)
outputs1 =outputs1.pooler_output
outputs2 =outputs2.pooler_output
outputs3 =outputs3.pooler_output
import torch
from sklearn.metrics.pairwise import cosine_similarity
torch.nn.functional.cosine_similarity(outputs2, outputs3, dim=-1)
cosine_similarity(outputs2.detach().numpy(), outputs3.detach().numpy())
#array([[0.98333544]], dtype=float32)

#277356808 Q group

为了简单说明问题,没有一个batch输入(一个batch需要设置padding,长度不一致),总之需要过模型。

Bert计算两两句子之间的相似性(STS-B)所用label是1~5,因此与上面稍微不同,需要将两个句子同时输入,然后得到score,如果是1w个句子呢?两两之间的相似度计算需要65h(paper说的),那么对此任务,可能就不是那么计算了。

因此本文提出sentence Bert也就是SBERT,使用暹罗siamese和三元组网络结构来得到语义上有意义的句子嵌入,可以使用余弦相似性进行比较。这就减少了时间,而且保持了acc。

semantically meaningful 是指语义相似的句子在向量空间是接近的。(而不是上面的文本最接近)

上述两个句子相似性,1w个,需要Bert推理1w*(1w-1)/2接近5kw了,同样对于QA问题更耗时,单个query可能需要50h。一个常见的处理聚类和语义搜索的方法是将每个句子映射到同一个向量空间。通用的方法是将Bert 输出层(也就是上面代码例子)取平均,或者使用CLS的输出。但此embedding相当差,(下面将逐步说明)

Siamese网络结构输入的sentence获得定长向量,然后使用余弦相似度即可计算相似性。上面的1w个句子之间的相似性可在5s解决(得到embedding,0.01s计算相似性),而QA缩短到一个请求几秒。在7个STS任务重SBERT取得最好的结果。Bert网络结构一个最大的缺点是没有独立的句子embedding得到,一个规避的方法是通过平均词向量,或者使用CLS的输出(上述代码就是这个,如下为证):并不是直接的输出,而是经过线性结构和tanh激活。

pooler_output :
Last layer hidden-state of the first token of the sequence (classification token) after further processing through the layers used for the auxiliary pretraining task. E.g. for BERT-family of models, this returns the classification token after processing through a linear layer and a tanh activation function.

1-SBERT模型

SBERT对Bert增加了一个pooling操作,这样就能得到固定长度的sentence embedding。pooling方法 1)CLS token输出;2)向量平均;3)向量最大  对比才能知道效果。为了微调Bert,构建Siamese和triplet 网络更新权重,使得语义近似的embedding相近,可以用余弦相似性来计算。

分类目标函数:拼接embedding u 和v 以及|u-v|并与W相乘,o = softmax(Wt(u, v, |u − v|)) 如下左图,下右目标函数为MSE

Siamese network structure 孪生网络结构,其实就一个网络,只不过两个输入而已,两个输入分别得到u和v,

Triplet Objective Function :给定锚点(anchor)句子a,一个正向句子p,一个负向句子n,triplet loss 调整网络损失使得a和p的距离小于a和n的距离,如下FaceNet论文中的图:

 数学上需要min(max(||sa − sp|| − ||sa − sn|| + ε, 0)), sa,sp,sn分别是a,p,n的embedding,||.||是距离,ε是边际margin,ε确保sp至少与sa更接近,相比于sn,距离可以用欧式距离,ε在实验中为1.

采用57w句子对SNLI进行预训练,label为contradiction, eintailment ,neural,微调 3-way softmax- classifier objective function for one epoch ,batch size 16,Adam优化器,lr=2e-5

Avg Bert embedding 54.81,CLS-token 29.19, 前者是直接平均,而不是SBERT,SBERT 70+

pooling策略,也就是上面左图中的pooling,取MEAN效果最好,而不是MAX,也不是CLS

concat策略,证实(u,v,|u-v|)效果最好。

 2-实际代码

from sentence_transformers import SentenceTransformer
model=SentenceTransformer("distiluse-base-multilingual-cased-v1")
sentence_embeddings =model.encode(["今天的天气真好啊,暖和和的","今天天气真暖和啊","今天天气真差劲啊"]
cosine_similarity(sentence_embeddings[0].reshape(1, -1), sentence_embeddings[1].reshape(1, -1))
#array([[0.9464222]], dtype=float32)
cosine_similarity(sentence_embeddings[0].reshape(1, -1), sentence_embeddings[2].reshape(1, -1))
#array([[0.8281469]], dtype=float32)#这个差距就明显了,而上面Bert CLS差距不明显
##Q Group 277356808

总结:本文创新点引用了triplet学习方法,使语义近似的词向量也相近。 孪生网络不算创新。concat只能算作trick。pooling是仍旧是词向量的平均,这点与Avg bert embedding一样,但目标函数不同(loss不同),是用的triplet,这是核心关键。

时间点节约在上面代码中的encode方法可以同时输入多个inputs

愿我们终有重逢之时,而你还记得我们曾经讨论的话题 

 

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

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

相关文章

RabbitMQ、RocketMQ、Kafka 三大组件详细教程,一文带你学完全部知识

RabbitMQ RabbitMQ各组件的功能 Broker :一个RabbitMQ实例就是一个BrokerVirtual Host :虚拟主机。相当于MySQL的DataBase,一个Broker上可以存在多个vhost,vhost之间相互隔离。每个vhost都拥有自己的队列、交换机、绑定和权限机…

项目执行管理的8个步骤

常言道:说起来容易,做起来难。在项目执行过程中,许多事情可能会出错。这就是为什么执行过程中的监控和跟踪很重要。 项目执行,如同项目管理一样,被分解成若干步骤,以确保你不会忽视任何关键的东西。八个项…

如何查看Chrome浏览器的页面缓存内容【详细教程】

如何查看浏览器页面缓存内容——代码&控制台知识调用前言引入控制台输入代码查看在控制台application查看知识调用 文章可能需要用到的知识🔥🔥🔥浏览器缓存有哪些(通用缓存有哪些) 前言引入 浏览器有多种缓存&a…

C++/Qt编程规范

文章目录一、头文件规范二、变量命名三、信号和槽四、注释一、头文件规范 在编码中对头文件的引用,建议按照以下顺序进行: 1)类定义头文件 2)其他库头文件 a)Qt模块头文件 b)XTAL平台框架模块头文件 c)第三方库头文件 d)自定义公共库头文件 二、变量命…

Linux7层负载均衡-Haproxy

Linux7层负载均衡 概述: 是一款高性能的负载均衡软件。 因为其专注于负载均衡这一些事情, 因此与nginx比起来在负载均衡这件事情上做更好,更专业。 特点: •支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能…

【KNN分类】基于模拟退火优化KNN、蝗虫算法优化KNN实现数据分类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

web课程设计网页制作:基于html实现传统文化壁画手工艺带psd设计图(15页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【Day3】每日学Java--》详解java中的static成员

大家好,我是良辰丫,今天我和大家分享的是java中的static成员,static说难不难,说简单也不简单,主要是细节,很多情况下,你使用了static,却不知道为什么会报错,嘿嘿嘿&#…

【推免攻略】五.2022年北交计算机学院夏令营、预推免保研经验

欢迎订阅本专栏:《北交计算机保研经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_10779337.html 【推免攻略】一.北交计算机学院夏令营、预推免攻略【推免攻略】二.联系导师的前期准备及注意事项【推免攻略】三.2020年北交计算机学院夏令营、预推免保研经验【推…

Java之网络编程

目录 1.1 概述 1.2 网络通信的要素 1.3 IP 1.4 端口 1.5 通信协议 1.6 TCP (1)消息发送 (2)文件上传 1.7 UDP (1)发短信 (2)聊天(循环发送-循环接收)…

ftp共享盘挂载——curlftpfs挂载FTP服务器

通过curlftpfs来将远程ftp某个目录映射到本地目录,可以达到多台机器共享同一目录的效果。我们是用它来共享脚本的。curlftpfs是通过yum本地源安装的,需要epel支持,需要提前弄好。 一、 安装FTP服务 在联网环境下安装epel yum -y install epel…

唯亚威FI-60光纤识别器

光纤识别器可以轻松地识别光信号,而无需断开光缆或中断网络交通。也可以转换为光功率计(OPM)。VIAVI FI-60 LFI能够使用户轻松检测光信号,而无需断开光缆或中断网络交通。FI-60 LFI还包括了独特的VIAVI SafeChekTM ,以…

精华推荐 |【深入浅出Spring原理及实战】「原理分析专题」从源码和架构设计角度深入剖析BeanPostProcessor的原理和运作机制

🍃 前提概要 Spring具有很好的扩展性,但是这个扩展它的这个扩展性体现在哪里呢?而我们要说的BeanPostProcessor就是对Spring扩展性优秀的表现之一。 🍃 BeanPostProcessor的作用 简单的说就是BeanPostProcessor提供了初始化前后回…

Qt扫盲-QString使用总结

QString使用总结一、概述二、初始化字符串1、极速版2、原理版三、操作字符串1、极速版1. 增加2. 删除3. 修改4. 插入5. 转换2、原理版四、查询字符串五、字符串格式转换六、Null 字符串和 Empty 字符串的区别七、字符串参数格式化八、更高效的字符串构造九、最大大小和出现内存…

疫情之下逆势进阶高级测试拿下20k,看我教你打一场翻盘局...

偶然跟同事交流工作、学习的时候,聊起了近况以及行业的变化,如果说回到三年前,疫情还未影响太深的时候,你会做什么? 本来当时是当玩笑话来问了,以为回答会是一注决定命运的彩票,正当我这样想时…

夏季出汗多中医如何调理

夏季出汗多是什么原因身体哪些方面出了问题?出汗多怎么办呢如何调理?夏季出汗看似是一种很正常的现象,但是如果说出汗过于多可能是身体出现了异常。夏季出汗多的主要原因是气虚,主要是补气固表。在夏天,由于天气炎热,人体出汗过…

随着多点 DMALL 全面 To B 转型

随着多点 DMALL 全面 To B 转型,为越来越多的 B 端客户提供零售全渠道解决方案,需要具备在多云部署环境下提供更具性价比、可复用的大数据底层基座和平台工具链。我们也终于等到了一个契机,彻底甩开历史包袱,设计搭建存算分离、轻…

Git安装和使用

1.工具:Git,下载链接:Releases git-for-windows/git GitHub 下载完成了之后可以看到再程序处可以或者鼠标右击可以看到三个东西,分别是: Git Bash:推荐使用,使用命令风格类似于Linux命令&am…

PyOpenGL安装

PyOpenGL安装 学校图形学大作业, 之前要求是MFC和C , 但是vs mfc c opengl的环境实在是配置的吐血了… 于是润来搞PyOpenGL玩一玩 参考网上经验贴做的 我新建了一个虚拟环境 下载whl文件 我的虚拟环境是python3.7,于是下载下面指出来的两个…