基于令牌级 BERT 嵌入的趋势生成句子级嵌入

一、说明
二、直觉
与此相关的第一个问题是:您需要从句子中的多少个标记中派生嵌入才能为整个句子生成有效的嵌入?如果你还记得上一篇文章中的讨论,我们得到了一个向量——派生为句子中最重要的单词——其中包括有关整个句子上下文的信息。但是,为了更好地了解句子上下文,最好为与该最重要的单词在语法上最相关的单词提供这样的向量。我们为什么需要这个?
生活中一个简单的类比可以帮助回答这个问题:如果你坐在塔内的餐厅里欣赏周围的美景,你考虑的景色将不包括塔本身。要拍摄塔楼景观的照片,您首先需要离开塔楼。
好的,我们如何确定与句子中最重要的单词在语法上最相关的单词?(也就是说,您需要根据前面的类比决定拍摄塔的最佳位置)答案是:借助注意力权重,您也可以从BERT模型获得。
三、实现
在遵循本文其余部分讨论的代码之前,您需要参考上一篇文章中提供的示例(我们将使用该示例中定义的模型和派生向量表示)。您需要做的唯一更正如下: 创建模型时,请确保使模型不仅返回隐藏状态,还返回注意力权重:
model = BertModel.from_pretrained(‘bert-base-uncased’,output_hidden_states = True, # so that the model returns all hidden-states.output_attentions = True)
其他所有内容,包括例句,都可以不加修改地使用。实际上,我们只使用第一个例句:“我想要一个苹果。
下面我们将确定语法上最接近最重要单词的单词(在这个特定示例中为 Want)。为此,我们检查所有 12 层中的注意力权重。首先,我们创建一个空数组(我们不计算特殊符号,不包括第一个和最后一个符号):
a = np.empty([0, len(np.sum(outputs[0].attentions[0][0][11].numpy(), axis=0)[1:-1])])
接下来,我们填写注意力权重矩阵:
for i in range(12):a = np.vstack([a,np.sum(outputs[0].attentions[0][0][i].numpy(), axis=0)[1:-1]])
我们对标点符号不感兴趣。因此,我们将删除矩阵中的最后一列:
a = np.delete(a, -1, axis=1)
所以我们的矩阵现在看起来如下(12x4,即 12 层和 4 个单词)
print(a)
[[0.99275106 1.00205731 0.76726311 0.72082734][0.7479955 1.16846883 0.63782167 1.39036024][1.23037624 0.40373796 0.57493907 0.25739866][1.319888 1.21090519 1.37013197 0.7479018 ][0.48407069 1.15729702 0.54152751 0.57587731][0.47308242 0.61861634 0.46330488 0.47692096][1.23776317 1.2546916 0.92190945 1.2607218 ][1.19664812 0.51989007 0.48901123 0.65525496][0.5389185 0.98384732 0.8789593 0.98946768][0.75819892 0.80689037 0.5612824 1.10385513][0.14660755 1.10911655 0.84521955 1.00496972][0.77081972 0.79827666 0.45695013 0.36948431]]
现在让我们确定 Want 的哪些层(索引为 1 的第二列)最受关注:
print(np.argmax(a,axis=1))
b = a[np.argmax(a,axis=1) == 1]
array([1, 3, 0, 2, 1, 1, 3, 0, 3, 3, 1, 1])
接下来,我们可以确定在 Want 处于领先地位的层中,哪个令牌在 Want 之后引起更多关注。为此,我们首先删除“想要”列,然后探索其余三个:
c = np.delete(b, 1, axis=1)
d = np.argmax(c, axis =1)
print(d)
counts = np.bincount(d)
print(np.argmax(counts))
[0 2 2 2 0]
2
上面显示,我们有苹果这个词(在这里删除Want之后,Apple的索引是2)作为与单词Want在语法上最相关的一个。这是意料之中的,因为这些词分别表示直接宾语和及物动词。
_l12_1 = hidden_states[0][12][0][4][:10].numpy()
_l0_1 = hidden_states[0][0][0][4][:10].numpy()
_l0_12_1 = np.log(_l12_1/_l0_1)
_l0_12_1 = np.where(np.isnan(_l0_12_1), 0, _l0_12_1)
现在让我们比较一下从单词Apple和Want的嵌入派生的向量。
print(_l0_12_1)
array([ 3.753544 , 1.4458075 , -0.56288993, -0.44559467, 0.9137548 ,0.33285233, 0. , 0. , 0. , 0. ],dtype=float32)print(l0_12_1) # this vector has been defined in the previous post
array([ 0. , 0. , 0. , 0. , -0.79848075,0.6715901 , 0.30298436, -1.6455574 , 0.1162319 , 0. ],dtype=float32)
如您所见,上述两个向量中的一对匹配元素中的一个值在大多数情况下为零,而另一个值为非零 — 即向量看起来互补(记住塔视图类比:从塔上可以看到相邻的景点,但为了看到塔本身——也许是主要景点——你需要离开它)所以, 您可以安全地按元素对这些向量求和,以将可用信息组合到单个向量中。
s = _l0_12_1 + l0_12_1
print(s)
array([ 3.753544 , 1.4458075 , -0.56288993, -0.44559467, 0.11527407,1.0044425 , 0.30298436, -1.6455574 , 0.1162319 , 0. ],dtype=float32)
上面的向量接下来可以用作句子级分类的输入。
四、结论
本文提供了从静态嵌入转向上下文嵌入时如何根据令牌级 BERT 嵌入的趋势生成句子级嵌入的直观信息以及代码。然后,可以将此句子级嵌入用作BERT生成的用于句子分类的CLS令牌嵌入的替代方法,这意味着您可以尝试这两种方法,看看哪一个最适合您的特定问题。
相关文章:
基于令牌级 BERT 嵌入的趋势生成句子级嵌入
一、说明 句子(短语或段落)级别嵌入通常用作许多 NLP 分类问题的输入,例如,在垃圾邮件检测和问答 (QA) 系统中。在我上一篇文章发现不同级别的BERT嵌入的趋势中,我讨论了如何生成一个向量表示&a…...
计算机视觉目标检测性能指标
目录 精确率(Precision)和召回率(Recall) F1分数(F1 Score) IoU(Intersection over Union) P-R曲线(Precision-Recall Curve)和 AP mAP(mean…...
什么是webpack?如何在项目中安装配置webpack?
webpack 是前端项目工程化的具体解决方案。 它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能优化等强大的功能。 让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。目前企业…...
linux两台服务器互相备份文件(sshpass + crontab)
crontab crontab是linux系统自带的定时调度软件,可用于设置周期性被执行的指令,一般用在每天的非高峰负荷时间段运行作业,可在无需人工干预的情况下运行作业。支持在一周或一月中的不同时段运行。 crontab命令允许用户提交、编辑或删除相应的…...
Flask框架-配置日志(1):flask使用日志
一、项目结构 study_flask --| apps/ --| __init__.py --| base/ --| logger.py --| __init__.py --| app.py 二、配置日志功能 1、base/logger.py import os import logging from datetime import datetime,date,timedelta from logging.handlers import RotatingFileHandl…...
每天一道leetcode:1192. 查找集群内的关键连接(图论困难tarjan算法)
今日份题目: 力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络,connections[i] [a, b] 表示服务器 a …...
解决Windows系统远程登陆后vscdoe无法输入字符,键盘没有反应,鼠标可以点击,没有反应
文章目录 前言操作过程 前言 使用vscode编译器时,通过远程登录或者屏幕锁屏解锁后,vscode出现无法输入字符内容,但vscode没有死机,切换到其他软件的窗口再切换回来后,可以使用鼠标点击,但是只要使用键盘输…...
axios同一个接口,同时接收 文件 或者 数据
1、前端代码 const service axios.create({baseURL: "http://192.168.2.200:8080/api",timeout: 180000 })// 响应拦截 service.interceptors.response.use(async response > {if(response){// 请求时设置返回blob, 但是实际上可能返回的是json的情况if (respon…...
【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云
【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版,是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless,使用…...
算法通关村第九关 | 二叉树查找和搜索树原理
1. 二分查找的扩展问题 1.1山脉数组的巅峰索引 LeetCode852:题目核心意思是在数组中,从0到i是递增的,从i1到数组最后是递减的,让你找到这个最高点。 三种情况: mid在上升阶段的时候,满足arr[mid] > a…...
jenkins gitlab 安装
目录 一 准备安装环境 二 安装gitlab软件 三 配置gitlab 四 重新加载配置启动gitlab 五 修改密码 五 创建用户组 一 准备安装环境 sudo yum update sudo yum install -y curl policycoreutils-python openssh-server安装 Postfix 邮件服务器,以便 Git…...
Vue2(组件开发)
目录 前言一,组件的使用二,插槽slot三,refs和parent四,父子组件间的通信4.1,父传子 :父传子的时候,通过属性传递4.2,父组件监听自定义事件 五,非父子组件的通信六&#x…...
(二)结构型模式:8、代理模式(Proxy Pattern)(C++示例)
目录 1、代理模式(Proxy Pattern)含义 2、代理模式的UML图学习 3、代理模式的应用场景 4、代理模式的优缺点 5、C实现代理模式的实例 1、代理模式(Proxy Pattern)含义 代理模式(Proxy),为…...
代码审计-ASP.NET项目-未授权访问漏洞
代码审计必备知识点: 1、代码审计开始前准备: 环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集: 审计目标的程序名,版本,当前环境(系统,中间件…...
爬虫逆向实战(十四)--某培训平台登录
一、数据接口分析 主页地址:某培训平台 1、抓包 通过抓包可以发现登录是表单提交到j_spring_security_check 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个j_password加密参数 请求头是否加密? 无响应是…...
GT Code - 图译算法编辑器(集成QT、C++、C、Linux、Git、java、web、go、高并发、服务器、分布式、网络编程、云计算、大数据项目)
目录 项目概述 发文意义 项目介绍 功能分析 设计概要 功能展示 项目文档 项目概述 “GT Code 图译算法编辑器”是一款跨平台、轻量级的代码编辑器,主要面向软件开发人员,它实现了编辑、编译、绘制代码流程图、生成调试演示动画等功能,以…...
# 快速评估立功科技基于S32K324的TMS方案
文章目录 1.前言2.立功科技的TMS方案介绍2.1 介绍资料2.2 简要介绍 3.S32K3_TriMotor评估板测试3.1 环境搭建S32 Design Studio for S32 Platform 3.4安装RTD 2.0.0安装Freemaster 3.2 3.2 例程测试3.3 例程适配3.4 双核烧录3.5 测试 1.前言 最近和一些做汽车水泵/风机的客户交…...
docker+haror
docker 2013年诞生,推荐单容器只运行一个程序或进程,形成一个分布式的应用模型。 总结下来就是:docker带来启动流程更快,运行效率较高、资源损耗较小,属于轻量级的服务。 docker的安装 推荐的一键化安装的脚本&#…...
Shell编程——弱数据类型的脚本语言快速入门指南
目录 Linux Shell 数据类型 变量类型 运算符 算术运算符 赋值运算符 拼接运算符 比较运算符 关系运算符 控制结构 顺序结构 条件分支结构 if 条件语句 case 分支语句 循环结构 for 循环 while 循环 until 循环 break 语句 continue语句 函数 函数定义 …...
iOS textView支持超链接跳转
将某些文字变成高量可以点击的超链接核心功能代码 attri.addAttribute(NSAttributedString.Key.link, value:NSURL.init(string: "dctt:p/userPrivacy.html")!, range: NSRange.init(location: s.count - 4, length: 4) )textView.linkTextAttributes [NSAttributed…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
