bert-base-chinese模型使用教程

向量编码和向量相似度展示
import torch
from transformers import BertTokenizer, BertModel
import numpy as npmodel_name = "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences = ['春眠不觉晓', '大梦谁先觉', '浓睡不消残酒', '东临碣石以观沧海']tokenizer = BertTokenizer.from_pretrained(model_name)
# print(type(tokenizer)) # <class 'transformers.models.bert.tokenization_bert.BertTokenizer'>model = BertModel.from_pretrained(model_name)
# print(type(model)) # <class 'transformers.models.bert.modeling_bert.BertModel'>def test_encode():input_ids = tokenizer.encode('春眠不觉晓', return_tensors='pt') # shape (1, 7)output = model(input_ids)print(output.last_hidden_state.shape)  # shape (1, 7, 768)v = torch.mean(output.last_hidden_state, dim=1)  # shape (1, 768)print(v.shape)  # shape (1, 768)print(output.pooler_output.shape)  # shape (1, 768)

根据 transformers\modeling_outputs.py:196,即 BaseModelOutputWithPoolingAndCrossAttentions 的注释:

@dataclass
class BaseModelOutputWithPoolingAndCrossAttentions(ModelOutput):"""Base class for model's outputs that also contains a pooling of the last hidden states.Args:last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):Sequence of hidden-states at the output of the last layer of the model.pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`):Last layer hidden-state of the first token of the sequence (classification token) after further processingthrough the layers used for the auxiliary pretraining task. E.g. for BERT-family of models, this returnsthe classification token after processing through a linear layer and a tanh activation function. The linearlayer weights are trained from the next sentence prediction (classification) objective during pretraining.hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):Tuple of `torch.FloatTensor` (one for the output of the embeddings, if the model has an embedding layer, +one for the output of each layer) of shape `(batch_size, sequence_length, hidden_size)`.Hidden-states of the model at the output of each layer plus the optional initial embedding outputs.attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`):Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,sequence_length)`.Attentions weights after the attention softmax, used to compute the weighted average in the self-attentionheads.cross_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` and `config.add_cross_attention=True` is passed or when `config.output_attentions=True`):Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,sequence_length)`.Attentions weights of the decoder's cross-attention layer, after the attention softmax, used to compute theweighted average in the cross-attention heads.past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape`(batch_size, num_heads, sequence_length, embed_size_per_head)`) and optionally if`config.is_encoder_decoder=True` 2 additional tensors of shape `(batch_size, num_heads,encoder_sequence_length, embed_size_per_head)`.Contains pre-computed hidden-states (key and values in the self-attention blocks and optionally if`config.is_encoder_decoder=True` in the cross-attention blocks) that can be used (see `past_key_values`input) to speed up sequential decoding."""last_hidden_state: torch.FloatTensor = Nonepooler_output: torch.FloatTensor = Nonehidden_states: Optional[Tuple[torch.FloatTensor, ...]] = Nonepast_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = Noneattentions: Optional[Tuple[torch.FloatTensor, ...]] = Nonecross_attentions: Optional[Tuple[torch.FloatTensor, ...]] = None

1为batch_size,我们出入的就是一个字符串所以batch_size为1。

7为sequence_length,BERT模型会为单句的输入前面加特殊字符[CLS]和后面加特殊字符[SEP],因此为7个字符。

768为hidden_size,即每个字符被编码成768个数字组成的向量。

根据文档的说法,pooler_output向量一般不是很好的句子语义摘要,因此这里采用了将 last_hidden_state 进行池化的方法。

torch.mean(dim)函数

这是常用的池化pooling方法,降低向量的维度,便于运算。

dim不指定任何参数就是所有元素的算术平均值

dim指定为0时,求得是列的平均值。

dim指定为1时,求得是行的平均值;

也就是经过tarch.mean()之后,这句话变成了一个 1X768 的向量,即使用这一个向量来代表着句话的语义。

接下来就可以计算文本相似度得分了,目标为上面给出的四个句子。

def test_similarity():with torch.no_grad():vs = [sentence_embedding(sentence).numpy() for sentence in sentences]nvs = [v / np.linalg.norm(v) for v in vs]  # normalize each vectorm = np.array(nvs).squeeze(1)  # shape (4, 768)print(np.around(m @ m.T, decimals=2))  # pairwise cosine similaritydef sentence_embedding(sentence):input_ids = tokenizer.encode(sentence, return_tensors='pt')output = model(input_ids)return torch.mean(output.last_hidden_state, dim=1)

@符号是矩阵相乘

输出结果 4X4

[[1.   0.75 0.83 0.57][0.75 1.   0.72 0.51][0.83 0.72 1.   0.58][0.57 0.51 0.58 1.  ]]
春眠不觉晓大梦谁先觉浓睡不消残酒东临碣石以观沧海
春眠不觉晓10.750.830.57
大梦谁先觉0.7510.720.51
浓睡不消残酒0.830.7210.58
东临碣石以观沧海0.570.510.581

with torch.no_grad() 的作用是将模型状态置为推断(inference),即在计算过程中不进行梯度计算和反向传播操作。

关于 last_hidden_state 与 pooler_output

看bert中文文本分类任务,发现训练输出结果向量仅使用了第一个token的向量,而一句话中的第一个位置是特殊字符[CLS],那么该如何理解呢?

BERT在第一句前会加一个[CLS]标志,CLS 就是 classification 分类之意,即 CLS 的作用就是它能代表整句话的意思,使用它就可以对整句话进行分类。用于下游的分类任务等。

为什么选它呢,因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。具体来说,self-attention是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过BERT的12层,每次词的embedding融合了所有词的信息,可以去更好的表示自己的语义。而[CLS]位本身没有语义,经过12层,得到的是attention后所有词的加权平均,相比其他正常词,可以更好的表征句子语义。

当然,也可以通过对最后一层所有词的embedding做pooling池化处理去表征句子语义,最常用的池化方法就是平均法mean。

从上面的打印信息我们可以知道 pooler_output 的结果也是 1X768,与 torch.mean() 的维度一样,可以理解为它是经过模型池化后的结果。pooler_output是通过应用一个线性层和一个激活函数(通常是Tanh)到last_hidden_state的第一个token(即[CLS]标记)的隐藏状态来生成的。这个输出通常用于分类任务,因为它编码了整个序列的信息。

BERT下游NLP任务的微调

https://zhuanlan.zhihu.com/p/149779660

在BERT原论文的设计中,下游NLP任务被分成如下几类:

  1. 句子对分类型任务,如GLUE的MNLI、QQP、MRPC等
  2. 单句分类型任务,如GLUE的STS-2、CoLA等
  3. 问答/阅读理解型任务,需要根据问题,在备选回答文本中标识出答案部分,如SQuAD
  4. 单句标注任务,给每个token打上标签,如POS词性标注、NER命名实例识别任务

一般来说,以上4类任务已经基本上可以涵盖大部分下游NLP任务了。

我们在上节指定的sst-2任务实际上就是一类“单句分类”型NLP任务,利用run_glue.py脚本,我们可以几乎不用写代码就可以完成微调。GLUE基准测试集一共包括9种不同类型的数据集,如下表小结。

在这里插入图片描述

动手写BERT系列 https://www.bilibili.com/video/av258262103?vd_source=0c75dc193ee55511d0515b3a8c375bd0&spm_id_from=333.788.videopod.sections

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mutable用法

mutable 关键字用于允许类的某个成员变量在 const 成员函数中被修改。通常&#xff0c;const 成员函数不能改变对象的任何成员变量&#xff0c;但将成员变量声明为 mutable 可以例外 class Hero { public:Hero():m_Hp(0), m_getHpCounter(0){}int getHp() const {m_getHpCounte…

map和set和pair

目录 一.序列式容器和关联式容器 一.set set类的介绍&#xff1a; Construct &#xff1a;set的初始化 insert&#xff1a;插入 ​编辑find&#xff1a;查找 erase&#xff1a;删除 set查找范围的函数&#xff1a;​编辑 二.map 2.1map介绍 2.2pair类型介绍 在map的i…

BEV数据集标注成本高?BEVPose:减少对标注数据依赖!

引言 本文提出了一个名为BEVPose的框架&#xff0c;通过利用自监督和传感器位姿信息&#xff0c;实现相机和激光雷达数据的多模态BEV表示对齐&#xff0c;显著减少了对标注数据的依赖。BEVPose在BEV地图分割任务中表现出色&#xff0c;能够超越全监督的方法&#xff0c;同时提升…

AI - 使用LangChain构建简单LLM应用程序

AI - 使用LangChain构建简单LLM应用程序 什么是LLM LLM&#xff08;Large Language Model&#xff0c;大型语言模型&#xff09;是一种由大量文本数据训练而成的深度学习模型&#xff0c;能够理解和生成自然语言。例如&#xff0c;GPT-3就是一种流行的LLM&#xff0c;可以用于…

linux shell脚本学习(1):shell脚本基本概念与操作

1.什么是shell脚本 linux系统中&#xff0c;shell脚本或称之为bash shell程序&#xff0c;通常是由vim编辑&#xff0c;由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…

Linux云计算 |【第五阶段】CLOUD-DAY6

主要内容&#xff1a; 了解Kubernetes的架构、搭建Kubernetes集群 一、Kubernetes 概述 Kubernetes 这个名字来自希腊语&#xff0c;意思是“舵手”或“领航员”&#xff1b;K8S 是 Kubernetes 的缩写&#xff0c;其中“8”代表字母“ubernete”中的8个字母。Kubernetes 是由…

无人机之中继通信技术篇

一、定义与原理 无人机中继通信技术是指通过无人机搭载中继设备&#xff0c;将信号从一个地点传输到另一个地点&#xff0c;从而延长通信距离并保持较好的通信质量。其原理类似于传统的中继通信&#xff0c;即在两个终端站之间设置若干中继站&#xff0c;中继站将前站送来的信号…

【深度学习基础】深入理解 卷积与卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 卷积 1.1 …

数字身份发展趋势前瞻:身份韧性与安全

身份韧性与安全是身份与访问管理IAM发展的重要趋势&#xff0c;身份既是防御者的盾牌&#xff0c;也是攻击者的目标。面对日益复杂的网络威胁和不断增长的身份盗窃风险&#xff0c;身份韧性与安全不仅仅涉及产品的防御能力&#xff0c;还包括应对突发事件、快速恢复的弹性和灵活…

QChart中柱形图的简单使用并实现【Qt】

预备工作 如果qt没下载去下载一个&#xff0c;下载太慢了可以试试它[点击跳转]  (https://blog.csdn.net/qq_19319481/article/details/131655379)。   如果已经下载了qt发现自己的组件中没有QCharts&#xff0c;可以去试试它点击跳转。 都搞定了以后在pro文件里面添加QT …

智能语音机器人智能在哪里?AI人工智能电话机器人部署

随着科技的不断进步&#xff0c;人工智能已经成为了我们生活中不可或缺的一部分。AI人工智能机器人电话正是其中的一种形式&#xff0c;可以帮助企业或组织更好地实现电话营销的目标&#xff0c;那么智能语音机器人智能在哪里?我们来看看&#xff1a; 智能语音机器人&#xf…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中&#xff0c;通过特定的方法或策略来准确识别和定位页面上的元素&#xff0c;以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

Unity 使用Netcode实现用户登录和登出

Unity之NetCode for GameObjets 基本使用 说明思路相关API代码实现Tips 说明 最近项目需要联机&#xff0c;项目方案选用Unity提供的NetCode for GameObjets&#xff08;以下简称NGO&#xff09;&#xff0c;踩了不少坑&#xff0c;本文不介绍基础使用&#xff0c;围绕双端&…

专业网页设计服务重要是什么

当在搜索引擎中键入“网页设计”&#xff0c;您将获得超过2000万个相关结果。在如此众多的网站制作公司中&#xff0c;应该如何做出明智的选择呢&#xff1f;首先&#xff0c;让我们深入探讨一下网页设计的重要性。网站设计需要综合各种不同领域的专业知识&#xff0c;它是一个…

【UART异步串口协议及verilog实现】

UART异步串口协议 1 UART1.1 数据格式1.2 波特率 2 UART的发送和接收模块2.1 uart发送模块2.2 uart的接收模块 【博客首发于微信公众号《 漫谈芯片与编程》】 本篇文章介绍常用的芯片外围低速协议&#xff1a;UART&#xff1b; 1 UART UART是异步串行传输协议&#xff0c;即…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

仿真APP助力汽车零部件厂商打造核心竞争力

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。 在汽车产业快速发展的今天&#xff0c;汽车零部件…

【Nginx】前端项目开启 Gzip 压缩大幅提高页面加载速度

背景 Gzip 是一种文件压缩算法&#xff0c;减少文件大小&#xff0c;节省带宽从而提减少网络传输时间&#xff0c;网站会更快更丝滑。 // nginx roothcss-ecs-1d22:/etc/nginx# nginx -v nginx version: nginx/1.24.0// node ndde v18.20.1// dependencies "vue": …

【Linux】从零开始使用多路转接IO --- epoll

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点…

CSS中常见的两列布局、三列布局、百分比和多行多列布局!

目录 一、两列布局 1、前言&#xff1a; 2. 两列布局的常见用法 两列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 二、三列布局 1.前言 2. 三列布局的常见用法 三列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 三、多行多列 1.前言 2&…