大型语言模型:SBERT — 句子BERT

news2024/11/22 19:40:38

了解 siamese BERT 网络如何准确地将句子转换为嵌入

简介

Transformer 在 NLP 领域取得了进化性的进步,这已不是什么秘密。基于 Transformer,还发展出了许多其他机器学习模型。其中之一是 BERT,它主要由几个堆叠的 Transformer 编码器组成。除了用于一系列不同的问题(例如情感分析或问答)之外,BERT 在构建词嵌入(表示单词语义的数字向量)方面变得越来越流行。

以嵌入的形式表示单词具有巨大的优势,因为机器学习算法无法处理原始文本,但可以对向量的向量进行操作。这允许使用欧几里得距离或余弦距离等标准度量来比较不同单词的相似性。

问题在于,在实践中,我们经常需要为整个句子而不是单个单词构建嵌入。然而,基本的 BERT 版本仅在单词级别构建嵌入。因此,后来开发了几种类似 BERT 的方法来解决这个问题,本文[1]将对此进行讨论。通过逐步讨论它们,我们将达到称为 SBERT 的最先进模型。

BERT

首先,让我们回顾一下 BERT 是如何处理信息的。作为输入,它需要一个 [CLS] 标记和由特殊 [SEP] 标记分隔的两个句子。根据模型配置,该信息由多头注意力模块处理 12 或 24 次。然后,输出被聚合并传递到一个简单的回归模型以获得最终标签。

alt

交叉编码器架构

可以使用 BERT 来计算一对文档之间的相似度。考虑在一个大集合中找到最相似的一对句子的目标。为了解决这个问题,每个可能的对都被放入 BERT 模型中。这会导致推理过程中出现二次复杂度。例如,处理 n = 10 000 个句子需要 n * (n — 1) / 2 = 49 995 000 次推理 BERT 计算,这并不是真正可扩展的。

其他方法

分析交叉编码器架构的低效率,为每个句子独立地预先计算嵌入似乎是合乎逻辑的。之后,我们可以直接计算所有文档对上选定的距离度量,这比将平方数的句子对输入 BERT 要快得多。

不幸的是,这种方法对于 BERT 来说是不可能的:BERT 的核心问题是,每次同时传递和处理两个句子时,很难获得仅独立表示单个句子的嵌入。

研究人员试图通过使用 [CLS] 令牌嵌入的输出来消除这个问题,希望它包含足够的信息来表示一个句子。然而,事实证明 [CLS] 对于这项任务根本没有用,因为它最初是在 BERT 中针对下一句预测进行预训练的。

另一种方法是将单个句子传递给 BERT,然后对输出标记嵌入进行平均。然而,获得的结果甚至比简单平均 GLoVe 嵌入还要糟糕。

推导独立句子嵌入是 BERT 的主要问题之一。为了缓解这个问题,开发了 SBERT。

SBERT

SBERT 引入了 Siamese 网络概念,这意味着每次两个句子都通过相同的 BERT 模型独立传递。在讨论 SBERT 架构之前,让我们先参考一下 Siamese 网络的一个微妙注释:

  • 大多数时候,在科学论文中,暹罗网络架构都是用多个接收如此多输入的模型来描述的。实际上,它可以被认为是具有相同配置和在多个并行输入之间共享权重的单个模型。每当更新单个输入的模型权重时,它们也会同样更新其他输入。
alt

回到 SBERT,在将一个句子传递给 BERT 后,池化层被应用于 BERT 嵌入以获得其较低维度的表示:初始 512 768 维向量被转换为单个 768 维向量。对于池化层,SBERT 作者建议选择平均池化层作为默认层,尽管他们也提到可以使用最大池化策略或简单地采用 [CLS] 令牌的输出。

当两个句子都通过池化层时,我们有两个 768 维向量 u 和 v。通过使用这两个向量,作者提出了三种优化不同目标的方法,这将在下面讨论。

分类目标函数

该问题的目标是将给定的一对句子正确分类为几个类别之一。

生成嵌入 u 和 v 后,研究人员发现从这两个向量派生出另一个向量作为元素绝对差 |u-v| 很有用。他们还尝试了其他特征工程技术,但这一技术显示了最好的结果。

最后,三个向量 u、v 和 |u-v|连接起来,乘以可训练的权重矩阵 W,并将乘法结果输入到 softmax 分类器中,该分类器输出对应于不同类别的句子的归一化概率。交叉熵损失函数用于更新模型的权重。

alt

用于解决此目标的最流行的现有问题之一是 NLI(自然语言推理),其中对于定义假设和前提的给定句子 A 和 B,有必要预测假设是否为真(蕴涵),在给定的前提下,错误(矛盾)或不确定(中立)。对于这个问题,推理过程与训练相同。

正如论文中所述,SBERT 模型最初是在两个数据集 SNLI 和 MultiNLI 上进行训练的,这两个数据集包含一百万个句子对,并带有相应的标签蕴含、矛盾或中性。之后,论文研究人员提到了有关 SBERT 调优参数的详细信息:

“我们使用 3 路 softmax 分类器目标函数对一个 epoch 的 SBERT 进行微调。我们使用了 16 的批量大小、学习率为 2e−5 的 Adam 优化器以及超过 10% 的训练数据的线性学习率预热。”

回归目标函数

在这个公式中,在获得向量 u 和 v 后,它们之间的相似度得分直接通过选定的相似度度量来计算。将预测的相似度得分与真实值进行比较,并使用 MSE 损失函数更新模型。默认情况下,作者选择余弦相似度作为相似度度量。

alt

在推理过程中,可以通过以下两种方式之一使用该架构:

  • 通过给定的句子对,可以计算相似度得分。推理工作流程与训练完全相同。
  • 对于给定的句子,可以提取其句子嵌入(在应用池化层之后)以供以后使用。当我们得到大量句子的集合并旨在计算它们之间的成对相似度分数时,这特别有用。通过将每个句子仅运行一次 BERT,我们提取了所有必要的句子嵌入。之后,我们可以直接计算所有向量之间所选的相似度度量(毫无疑问,它仍然需要二次比较次数,但同时我们避免了像以前那样使用 BERT 进行二次推理计算)。

三重态目标函数

三元组目标引入了三元组损失,该损失是根据通常称为锚、正和负的三个句子计算的。假设锚定句和肯定句非常接近,而锚定句和否定句则非常不同。在训练过程中,模型会评估该对(锚,正)与该对(锚,负)相比的接近程度。从数学上讲,以下损失函数被最小化:

alt

间隔 ε 确保正句子与锚点的距离至少比负句子与锚点的距离近 ε。否则,损失将大于0。默认情况下,在这个公式中,作者选择欧氏距离作为向量范数,参数ε设置为1。

三元组 SBERT 架构与前两种架构的不同之处在于,该模型现在并行接受三个输入句子(而不是两个)。

alt

Code

SentenceTransformers 是一个用于构建句子嵌入的最先进的 Python 库。它包含多个针对不同任务的预训练模型。使用 SentenceTransformers 构建嵌入很简单,下面的代码片段中显示了一个示例。

alt

然后构建的嵌入可用于相似性比较。每个模型都是针对特定任务进行训练的,因此参考文档选择合适的相似性度量进行比较始终很重要。

总结

我们已经了解了一种用于获取句子嵌入的高级 NLP 模型。通过将 BERT 推理执行的二次次数减少为线性,SBERT 在保持高精度的同时实现了速度的大幅增长。

为了最终理解这种差异有多么显着,参考论文中描述的例子就足够了,在这个例子中,研究人员试图在 n = 10000 个句子中找到最相似的一对。在现代 V100 GPU 上,此过程使用 BERT 大约需要 65 小时,而使用 SBERT 只需 5 秒!这个例子表明 SBERT 是 NLP 的巨大进步。

Reference

[1]

Source: https://towardsdatascience.com/sbert-deb3d4aef8a4

本文由 mdnice 多平台发布

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

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

相关文章

RabbitMQ生产故障问题分析

1. 问题引发 由某个服务BI-collector-xx队列出现阻塞,影响很整个rabbitMQ集群服务不可用,多个应用MQ生产者服务出现假死状态,系统影响面较广,业务影响很大。当时为了应急处理,恢复系统可用,运维相对粗暴的把…

使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

笔试面试相关记录(5)

(1)给定一个字符串,含有大写、小写字母,空格,数字,需要将其变为满足如下条件: 所有的数字需要换成空格,并且字符串的头尾不包含空格,且整个字符串不包含连续的两个空格。…

网络地址转换技术NAT以及路由器LAN口与WAN口的数据交换

NAT技术 网络地址转换(NAT)技术可以帮助局域网设备通过私有IP地址访问互联网。以下是NAT技术如何实现这一功能的基本原理: 私有IP地址:在一个局域网中,通常使用私有IP地址来为设备分配网络标识。私有IP地址范围包括以…

OT:数字设定框(QSpinBox:处理整数,QDoubleSpinBox:处理浮点数)

widget.h #ifndef WIDGET_H #define WIDGET_H //数字设定框 #include <QWidget> #include <QSpinBox> //处理整数 #include <QDoubleSpinBox> //处理浮点数class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Widget();private:…

RabbitMQ 消息应答

每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…

I Pa?sWorD

2023icpc网络赛第一场 I 题意&#xff1a;题目给出只包含大小写字母&#xff0c;数字以及?的字符串&#xff0c;对于每一个小写字母&#xff0c;这一位字符既有可能是该小写字母&#xff0c;也有可能是该小写字母的对应大写字母&#xff0c;也就是该位的字符有两种可能&#x…

01. pring Cloud微服务系列之 包版本号约定

Spring Cloud微服务系列文章&#xff0c;点击上方合集↑ 1. Java8 目前市场上最常用的是Java8&#xff0c;而Java17则代表着未来的发展趋势。虽然Spring Boot 3已经发布&#xff0c;但它要求最低版本为Java17。然而&#xff0c;考虑到目前很多开发工具库还没有完全适配Java17…

批处理小程序的制作

一、介绍 批处理是一种将一系列计算机任务按照预定义的顺序进行自动化处理的技术。它是通过批处理脚本或命令文件来实现的&#xff0c;可以在不需要人工干预的情况下&#xff0c;批量运行多个命令或程序。 批处理脚本的优点 1. 自动化&#xff1a;批处理可以自动执行重复性任…

数据库----数据查询

1.6 查询语句 语法&#xff1a;select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]1.6.1 字段表达式 mysql> select 锄禾日当午; ------------ | 锄禾日当午 | ------------ | 锄禾日当午 | ---…

5个最好的乐高设计软件

如果你的目标是构建一个由数千个元素组成的乐高套装&#xff0c;你需要首先使用现有的最佳乐高设计软件进行规划。 通过使用本文中介绍的软件&#xff0c;你将学会创造性地思考并在不使用架构部件的情况下进行构建。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 乐高设…

最新AI创作系统+ChatGPT商业运营源码+支持GPT4.0+支持国内AI模型/支持AI绘画

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

多线程的学习上篇

座右铭: 天行健&#xff0c;君子以自强不息;地势坤&#xff0c;君子以厚德载物. 引入进程这个概念的目的 引入进程这个概念,最主要的目的,是为了解决“并发编程"这样的问题. 这是因为CPU进入了多核心的时代 要想进一步提高程序的执行速度,就需要充分的利用CPU 的多核资源…

部署Envoy Sidecar代理:演示如何将Envoy作为Sidecar代理注入到应用容器中

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【pytest】 pytest拓展功能 PermissionError问题

目录 1. pytest-html 1.1 PermissionError: [Errno 13] Permission denied: D:\\software\\python3\\anconda3\\Lib\\site-packages\\pytest_html\\__pycache__\\tmp_ttoasov 1.2错误原因 2. 失败用例重试 3. 用例并行执行 pytest-parallel 1. pytest-html 管理员打开 A…

使用postman测试邮件接口

首先找到token的位置 找到token的值之后 复制接口文档里的地址&#xff0c;在接口文档给的底之前前加api 配置token 在params参数里增加token参数 值复制浏览器里的token参数 发送send就ok了

交换机的工作原理(含实例,华为ensp操作)

目录​​​​​​​ ​​​​​​​1.交换机学习和转发 案例 1.设置静态地址表项 2.配置黑洞mac地址表项 1.交换机学习和转发 交换机工作在数据链路层。当交换机从某个端口收到一个帧时&#xff0c;它并不是向所有的接口转发此帧&#xff0c;而是根据此帧的目的MAC地址&a…

JMeter:接口测试基础介绍

一、什么是接口 接口是非常抽象的概念&#xff0c;先来看下中国最大的综合性辞典《辞海》是怎样定义接口的&#xff1a; 两个不同系统或系统中两个不同特性部分的交接部分。一般分硬件接口和软件接口两种。前者是为连接计算机各部分之间、计算机与计算机之间、计算机与外部系统…

Matlab论文插图绘制模板第114期—带图形标记的图

之前的文章中&#xff0c;分享了Matlab带线标记的图&#xff1a; 带阴影标记的图&#xff1a; 带箭头标记的图&#xff1a; 进一步&#xff0c;分享一下带图形标记的图&#xff0c;先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&…

9.18 QT作业

mainwindow.h QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();signals:void jump(); //自定义跳转信号函数private slots:vo…