基于令牌级 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…...

大牛分析相机镜头光学中疑难问题
1、变焦和对焦有什么区别? 变焦就是改变镜头的焦距(准确说是像距),以改变拍摄的视角,也就是通常所说的把被摄体拉近或推远。例如18-55mm和70-200mm镜头就是典型的变焦镜头。焦距越长,视角越窄。 对焦通常指调整镜片组和底片(传感器平面)之间的距离,从而使被摄物在CC…...

xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型
urdf文件很直白,每个零件的</link> </joint>都要编写一遍,每个零件数据都要自己算出来结果,很麻烦,但是用起来很简单。xacro写的模型文件可以把好多常量提前定义出来,不同大小的机器人只要只要改一下常量…...

前端图片转base64,并使用canvas对图片进行压缩
目录 1.图片转base64的应用场景 2.图片转base64代码 3.对上传的图片进行压缩 1.图片转base64的应用场景 图片转base64通常用在用户上传图片的情况下使用,他的作用就是让用户看到预览的图片不受网络的影响。 这是传统的文件传输的流程:首先是用户选择…...

电脑键盘打不了字按哪个键恢复?最新分享!
“有没有朋友知道电脑键盘为什么会莫名其妙就打不了字?明明用得好好的,突然就打不了字了,真的让人很迷惑!有什么方法可以解决吗?” 电脑键盘为我们的办公提供了很大的方便,我们可以利用键盘输入我们需要的文…...

ue5读取外部文件
准备环境 我的环境是win10,ue5.1.1,cpux86。 创建工程时,需要选择C模式 这样在Content Browser中会出现C Classes文件夹,下面有一个本项目命名的文件夹,鼠标右键可以看到New C Class选项。 新建类的时候选择父类Blue…...

【ARM】Day4 点亮LED灯
1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1,LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …...

TiDB基础介绍、应用场景及架构
1. 什么是newsql NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性。 NewSQL是指这样一类新式的关系型数据库管理系统,针对OLTP(读-写&…...

深入学习前端开发,掌握HTML、CSS、JavaScript等技术
课程链接: 链接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取码: i654 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍: 第1周:HTML5基础语法与标签 …...

python编程小游戏 五子棋,python编程小游戏简单的
大家好,本文将围绕python编程小游戏如何停止展开说明,python编程小游戏日语教程是一个很多人都想弄明白的事情,想搞清楚python编程小游戏超级玛丽需要先了解以下几个事情。 今天分享一个有趣的Python游戏库freegames,它里面包含经…...

spring ico容器 spring注入方式 spring与tomcat整合
一、简介 1、什么是spring? Spring是一个开源的轻量级Java应用开发框架,它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Ori…...